Using Sketches with the REST API
This page explains some nuances and special steps required when using classes from the Sketches library with the REST API.
Sketches Library
To learn more about the Sketches library see advanced properties reference page.
The sketches library is included with the Map and Accumulo stores. The
SketchesJsonModules
are returned in String format by the getJsonSerialiserModules method in the
Map
and Accumulo
property stores. The modules are then loaded by the JSONSerialiser
and used during the deserialisation of the REST JSON queries.
HyperLogLogPlus
The HyperLogLogPlus sketch can be used to store an approximation of
cardinality of an element. The JSON of the query is converted to Java
objects during desialisation using the JSONSerialiser. During the
deserialisation the HyperLogLogPlus JSON representation is converted to a
HyperLogLogPlus Java object using the ObjectMapper module which uses the
HyperLogLogPlusJsonDeserialiser.
In order to convert the offer values (which are offered to the
HyperLogLogPlus on instantiation) to Java objects, the JSON values
need to contain the special string field class containing the class name
of the object. The deserialiser uses this class field when deserialising
using the JSONSerialiser
deserialise method. The HyperLogLogPlus object is instantiated and offered
the values. The object can then be serialised and stored in the datastore.
For Gaffer, at present only the ClearSpring
algorithm is used which requires that the object is offered using its toString
representation of the object.
Note
As the algorithm uses the toString method, any user defined type
introduced must override the toString method returning meaningful string
value representing the object rather than the default class instance
identifier. User defined types can be introduced by either adding further
types
to Gaffer or by adding a JAR with the extra type(s) to the Gaffer
classpath on startup.
The HyperLogLogPlusJsonDesialiser deserialises from JSON to Java using the
HyperLogLogPlusWithOffers
object. The HyperLogLogPlusWithOffers includes the following annotation on
the List field:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "class")
private List<?> offers = new ArrayList<>();
This signals to the Jackson ObjectMapper that it needs to look for the
class field in each object and translate to the correct object type.
Java types are converted to the correct format by Jackson
ObjectMapper automatically. Here are some examples of the values:
"offers": ["valueA", "value2",...]
"offers": [1, 2,...]
"offers": [1.1, 2.2,...]
"offers": [1.1, 2.2,...]
"offers": [12345678910111121314,...]
"offers": [true,false,...]
The user defined types require that the class field is added to the JSON
object, so it knows how to convert to the correct format on deserialisation.
Here are the Gaffer user defined types:
Note
The subclass fields must also have the class field set (for
example, the keySerialiser CustoMap type) if not a standard Java Object
so that the Jackson ObjectMapper knows how to convert the correct values
to Java objects.
Composing using Java
If you are composing the HyperLogLogPlus with offers using Java before
converting to JSON and sending via REST, you need ensure that the offer
objects are translated to JSON with the correct class field added.
To make sure of this, you could add the sketches-library JAR and use the
HyperLogLogPlusWithOffers
object to construct your query. This way you know that all the objects have the
correct field added. You can then convert the HyperLogLogPlusWithOffers to
JSON using the
JSONSerialiser
serialisation method. If you want to create your own class instead, ensure
that the offers list has the correct annotation so the class is added on
conversion using by the Jackson ObjectMapper:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "class")
private List<?> offers = new ArrayList<>();
Composing using Python
To be added.
HyperLogLogPlus Example
For a HyperLogLogPlus example see this section on the advanced properties reference page.
Adding user defined types
To add a user defined type you must ensure that:
- the type is on the
Gafferclasspath - the type must override the
toStringmethod - the type contains the correct annotations if you are converting from
JavatoJSONbefore sending viaREST
The following user defined type example features the annotation required as
well as the @Override of the toString method:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "class")
public class ExampleType implements Comparable<ExampleType>, Serializable {
private String value...;
// getters and setters
@Override
public String toString() {
return ...;
}
}
Created: January 23, 2023