MultiMap and SetMap are now implemented for Java. Java API is now complete.
MultiMap allows creating deeply nested Map.
//create a root map
MultiMap<String, Integer, String, Void> root =
MemoryMultiMap.functionsOff(
stringSerializer(), //nested Map key type
intSerializer(), //key type
stringSerializer() //value type
).get();
//first child map
MultiMap<String, Integer, String, Void> child1 = root.child("first child");
child1.put(1, "child1's value 1");
SetMap provides Map like API for Set. Useful for application that always fetch the value with the key. It stores both key & value in the same location for faster seeks and reduced IOps.
Improved MultiMap performance and reduced storage cost
MultiMap previously stored parent key bytes within child key bytes. Now deeply nested Map do not have any extra storage cost over a root MultiMap. This also improved read and write performance.
Deeply nested MultiMap has constant performance regardless of the depth.
Access to all nested child MultiMap nodes
//get all children of root map
Stream<MultiMap<String, Integer, String, Void>> children = root.children();
//get all children of root map and all it's grand children.
Stream<MultiMap<String, Integer, String, Void>> child = root.childrenFlatten();
Functions
Shorter syntax for enabling functions
Java
Create functions without need to specify the return type. All java functions types are under PureFunctionJava.
//function that appends "updated" to old value
OnValue<Integer, String> myFunction =
(String value) ->
Apply.update(value + " updated");
Syntax shortened for enabling functions - PureFunction.Map[Int, String]. All Scala function types are under PureFunctionScala.
val map = persistent.Map[Int, String, PureFunction.Map[Int, String], Bag.Less]("my_map")
To register function supply implicit functions List.
//sample function that appends "updated" to old value
val myFunction: OnValue[String] = (value: String) => Apply.Update(value + " updated")
implicit val myFunctions = Functions[PureFunction.Map[Int, String]](myFunction)
Added new function types
OnKey - reads the key
OnKeyDeadline (Scala) & OnKeyExpiration (Java) - reads the key and deadline
OnKeyValue - reads the key and value
OnValue - reads the value
OnValueDeadline (Scala) & OnValueExpiration (Java) - reads the value and deadline
OnKeyValueValueDeadline (Scala) & OnKeyValueValueExpiration (Java) - read the key, value and deadline.
Improve Serialisers
Java
Use Slice<T> to easily build custom serialisers. ByteOps.Java removes the need to cast java.lang.Byte to scala.Byte during runtime.
new Serializer<String>() {
@Override
public Slice<Byte> write(String data) {
return Slice.writeStringUTF8(data, ByteOps.Java());
}
@Override
public String read(Slice<Byte> slice) {
return slice.readStringUTF8(ByteOps.Java());
}
};
Scala
Easily serialise case classes using Bookpickle
import swaydb._
import boopickle.Default._
case class MyClass(id: Int, value: String)
implicit val serialiser = swaydb.serializers.BooPickle[MyClass]
val set = memory.Set[MyClass, Nothing, Bag.Less]()
Better Scala and Java interop
Scala functions can be shared with Java and vice versa. Scala instance can also be accessed from Java.