use of uk.gov.gchq.koryphe.tuple.binaryoperator.TupleAdaptedBinaryOperator in project Gaffer by gchq.
the class ViewElementDefinitionTest method shouldJsonSerialiseAndDeserialise.
@Test
public void shouldJsonSerialiseAndDeserialise() throws SerialisationException {
// Given
final ViewElementDefinition elementDef = new ViewElementDefinition.Builder().transientProperty(TestPropertyNames.PROP_1, String.class).transientProperty(TestPropertyNames.PROP_2, String.class).properties(TestPropertyNames.COUNT, TestPropertyNames.DATE).preAggregationFilter(new ElementFilter.Builder().select(TestPropertyNames.COUNT).execute(new IsMoreThan(5)).build()).aggregator(new ElementAggregator.Builder().select(TestPropertyNames.COUNT).execute(new Max()).build()).postAggregationFilter(new ElementFilter.Builder().select(TestPropertyNames.COUNT).execute(new IsLessThan(10)).build()).transformer(new ElementTransformer.Builder().select(TestPropertyNames.COUNT).execute(new TestTransform()).project(TestPropertyNames.PROP_1).build()).postTransformFilter(new ElementFilter.Builder().select(TestPropertyNames.PROP_1).execute(new IsEqual("9")).build()).build();
// When
final byte[] json = JSONSerialiser.serialise(elementDef, true);
final ViewElementDefinition deserialisedElementDef = JSONSerialiser.deserialise(json, ViewElementDefinition.class);
assertEquals(Sets.newHashSet(TestPropertyNames.COUNT, TestPropertyNames.DATE), deserialisedElementDef.getProperties());
assertNull(deserialisedElementDef.getExcludeProperties());
final List<TupleAdaptedPredicate<String, ?>> preFilterComponents = deserialisedElementDef.getPreAggregationFilter().getComponents();
assertThat(preFilterComponents).hasSize(1);
assertArrayEquals(new String[] { TestPropertyNames.COUNT }, preFilterComponents.get(0).getSelection());
assertEquals(new IsMoreThan(5), preFilterComponents.get(0).getPredicate());
final List<TupleAdaptedBinaryOperator<String, ?>> aggComponents = deserialisedElementDef.getAggregator().getComponents();
assertThat(aggComponents).hasSize(1);
assertArrayEquals(new String[] { TestPropertyNames.COUNT }, aggComponents.get(0).getSelection());
assertEquals(new Max(), aggComponents.get(0).getBinaryOperator());
final List<TupleAdaptedPredicate<String, ?>> postFilterComponents = deserialisedElementDef.getPostAggregationFilter().getComponents();
assertThat(postFilterComponents).hasSize(1);
assertArrayEquals(new String[] { TestPropertyNames.COUNT }, postFilterComponents.get(0).getSelection());
assertEquals(new IsLessThan(10), postFilterComponents.get(0).getPredicate());
final List<TupleAdaptedFunction<String, ?, ?>> transformComponents = deserialisedElementDef.getTransformer().getComponents();
assertThat(transformComponents).hasSize(1);
assertArrayEquals(new String[] { TestPropertyNames.COUNT }, transformComponents.get(0).getSelection());
assertEquals(new TestTransform(), transformComponents.get(0).getFunction());
assertArrayEquals(new String[] { TestPropertyNames.PROP_1 }, transformComponents.get(0).getProjection());
final List<TupleAdaptedPredicate<String, ?>> postTransformFilterComponents = deserialisedElementDef.getPostTransformFilter().getComponents();
assertThat(postTransformFilterComponents).hasSize(1);
assertArrayEquals(new String[] { TestPropertyNames.PROP_1 }, postTransformFilterComponents.get(0).getSelection());
assertEquals(new IsEqual("9"), postTransformFilterComponents.get(0).getPredicate());
}
use of uk.gov.gchq.koryphe.tuple.binaryoperator.TupleAdaptedBinaryOperator in project Gaffer by gchq.
the class SchemaTest method testLoadingSchemaFromJson.
@Test
public void testLoadingSchemaFromJson() {
// Edge definitions
SchemaElementDefinition edgeDefinition = schema.getEdge(TestGroups.EDGE);
assertNotNull(edgeDefinition);
assertEquals(EDGE_DESCRIPTION, edgeDefinition.getDescription());
final Map<String, String> propertyMap = edgeDefinition.getPropertyMap();
assertThat(propertyMap).hasSize(3);
assertEquals("prop.string", propertyMap.get(TestPropertyNames.PROP_2));
assertEquals("prop.date", propertyMap.get(TestPropertyNames.DATE));
assertEquals("timestamp", propertyMap.get(TestPropertyNames.TIMESTAMP));
assertEquals(Sets.newLinkedHashSet(Collections.singletonList(TestPropertyNames.DATE)), edgeDefinition.getGroupBy());
// Check validator
ElementFilter validator = edgeDefinition.getValidator();
List<TupleAdaptedPredicate<String, ?>> valContexts = validator.getComponents();
int index = 0;
TupleAdaptedPredicate<String, ?> tuplePredicate = valContexts.get(index++);
assertTrue(tuplePredicate.getPredicate() instanceof IsA);
assertThat(tuplePredicate.getSelection()).hasSize(1);
assertEquals(IdentifierType.SOURCE.name(), tuplePredicate.getSelection()[0]);
tuplePredicate = valContexts.get(index++);
assertTrue(tuplePredicate.getPredicate() instanceof IsA);
assertThat(tuplePredicate.getSelection()).hasSize(1);
assertEquals(IdentifierType.DESTINATION.name(), tuplePredicate.getSelection()[0]);
tuplePredicate = valContexts.get(index++);
assertTrue(tuplePredicate.getPredicate() instanceof IsA);
assertThat(tuplePredicate.getSelection()).hasSize(1);
assertEquals(IdentifierType.DIRECTED.name(), tuplePredicate.getSelection()[0]);
tuplePredicate = valContexts.get(index++);
assertTrue(tuplePredicate.getPredicate() instanceof ExampleFilterFunction);
assertThat(tuplePredicate.getSelection()).hasSize(1);
assertEquals(IdentifierType.DIRECTED.name(), tuplePredicate.getSelection()[0]);
tuplePredicate = valContexts.get(index++);
assertTrue(tuplePredicate.getPredicate() instanceof IsA);
assertThat(tuplePredicate.getSelection()).hasSize(1);
assertEquals(TestPropertyNames.PROP_2, tuplePredicate.getSelection()[0]);
tuplePredicate = valContexts.get(index++);
assertTrue(tuplePredicate.getPredicate() instanceof ExampleFilterFunction);
assertThat(tuplePredicate.getSelection()).hasSize(1);
assertEquals(TestPropertyNames.PROP_2, tuplePredicate.getSelection()[0]);
tuplePredicate = valContexts.get(index++);
assertTrue(tuplePredicate.getPredicate() instanceof IsA);
assertThat(tuplePredicate.getSelection()).hasSize(1);
assertEquals(TestPropertyNames.DATE, tuplePredicate.getSelection()[0]);
tuplePredicate = valContexts.get(index++);
assertTrue(tuplePredicate.getPredicate() instanceof IsA);
assertThat(tuplePredicate.getSelection()).hasSize(1);
assertEquals(TestPropertyNames.TIMESTAMP, tuplePredicate.getSelection()[0]);
assertEquals(index, valContexts.size());
TypeDefinition type = edgeDefinition.getPropertyTypeDef(TestPropertyNames.DATE);
assertEquals(Date.class, type.getClazz());
assertEquals(DATE_TYPE_DESCRIPTION, type.getDescription());
assertNull(type.getSerialiser());
assertTrue(type.getAggregateFunction() instanceof ExampleAggregateFunction);
// Entity definitions
SchemaElementDefinition entityDefinition = schema.getEntity(TestGroups.ENTITY);
assertNotNull(entityDefinition);
assertEquals(ENTITY_DESCRIPTION, entityDefinition.getDescription());
assertTrue(entityDefinition.containsProperty(TestPropertyNames.PROP_1));
type = entityDefinition.getPropertyTypeDef(TestPropertyNames.PROP_1);
assertEquals(0, entityDefinition.getGroupBy().size());
assertEquals(STRING_TYPE_DESCRIPTION, type.getDescription());
assertEquals(String.class, type.getClazz());
assertNull(type.getSerialiser());
assertTrue(type.getAggregateFunction() instanceof ExampleAggregateFunction);
validator = entityDefinition.getValidator();
valContexts = validator.getComponents();
index = 0;
tuplePredicate = valContexts.get(index++);
assertTrue(tuplePredicate.getPredicate() instanceof IsXMoreThanY);
assertThat(tuplePredicate.getSelection()).hasSize(2);
assertEquals(TestPropertyNames.PROP_1, tuplePredicate.getSelection()[0]);
assertEquals(TestPropertyNames.VISIBILITY, tuplePredicate.getSelection()[1]);
tuplePredicate = valContexts.get(index++);
assertTrue(tuplePredicate.getPredicate() instanceof IsA);
assertThat(tuplePredicate.getSelection()).hasSize(1);
assertEquals(IdentifierType.VERTEX.name(), tuplePredicate.getSelection()[0]);
tuplePredicate = valContexts.get(index++);
assertTrue(tuplePredicate.getPredicate() instanceof IsA);
assertThat(tuplePredicate.getSelection()).hasSize(1);
assertEquals(TestPropertyNames.PROP_1, tuplePredicate.getSelection()[0]);
final ElementAggregator aggregator = edgeDefinition.getFullAggregator();
final List<TupleAdaptedBinaryOperator<String, ?>> aggContexts = aggregator.getComponents();
assertThat(aggContexts).hasSize(3);
TupleAdaptedBinaryOperator<String, ?> aggContext = aggContexts.get(0);
assertTrue(aggContext.getBinaryOperator() instanceof ExampleAggregateFunction);
assertThat(aggContext.getSelection()).hasSize(1);
assertEquals(TestPropertyNames.PROP_2, aggContext.getSelection()[0]);
aggContext = aggContexts.get(1);
assertTrue(aggContext.getBinaryOperator() instanceof ExampleAggregateFunction);
assertThat(aggContext.getSelection()).hasSize(1);
assertEquals(TestPropertyNames.DATE, aggContext.getSelection()[0]);
TypeDefinition mapTypeDef = schema.getType(TestTypes.PROP_MAP);
assertEquals(LinkedHashMap.class, mapTypeDef.getClazz());
assertEquals(MAP_TYPE_DESCRIPTION, mapTypeDef.getDescription());
Serialiser serialiser = mapTypeDef.getSerialiser();
assertEquals(MapSerialiser.class, serialiser.getClass());
MapSerialiser mapSerialiser = (MapSerialiser) serialiser;
assertEquals(StringSerialiser.class, mapSerialiser.getKeySerialiser().getClass());
assertEquals(RawLongSerialiser.class, mapSerialiser.getValueSerialiser().getClass());
assertNull(mapSerialiser.getMapClass());
}
use of uk.gov.gchq.koryphe.tuple.binaryoperator.TupleAdaptedBinaryOperator in project Gaffer by gchq.
the class ElementAggregatorTest method shouldBuildAggregator.
@Test
public void shouldBuildAggregator() {
// Given
final String property1 = "property 1";
final String property2a = "property 2a";
final String property2b = "property 2b";
final String property3 = "property 3";
final BinaryOperator func1 = mock(BinaryOperator.class);
final BinaryOperator func2 = mock(BinaryOperator.class);
final BinaryOperator func3 = mock(BinaryOperator.class);
// When - check you can build the selection/function in any order,
// although normally it will be done - select then execute.
final ElementAggregator aggregator = new ElementAggregator.Builder().select(property1).execute(func1).select(property2a, property2b).execute(func2).select(property3).execute(func3).build();
// Then
int i = 0;
TupleAdaptedBinaryOperator<String, ?> adaptedFunction = aggregator.getComponents().get(i++);
assertEquals(1, adaptedFunction.getSelection().length);
assertEquals(property1, adaptedFunction.getSelection()[0]);
assertSame(func1, adaptedFunction.getBinaryOperator());
adaptedFunction = aggregator.getComponents().get(i++);
assertThat(adaptedFunction.getSelection()).hasSize(2);
assertEquals(property2a, adaptedFunction.getSelection()[0]);
assertEquals(property2b, adaptedFunction.getSelection()[1]);
assertSame(func2, adaptedFunction.getBinaryOperator());
adaptedFunction = aggregator.getComponents().get(i++);
assertSame(func3, adaptedFunction.getBinaryOperator());
assertThat(adaptedFunction.getSelection()).hasSize(1);
assertEquals(property3, adaptedFunction.getSelection()[0]);
assertEquals(i, aggregator.getComponents().size());
}
use of uk.gov.gchq.koryphe.tuple.binaryoperator.TupleAdaptedBinaryOperator in project Gaffer by gchq.
the class AggregateValidator method validateAggregatePropertyClasses.
/**
* Validates that the binary operators to be executed are assignable to the corresponding non-transient properties
*
* @param elementDef The SchemaElementDefinition to validate against
* @param pair AggregatePair, containing a String array of groupBy properties, and an ElementAggregator
* @return ValidationResult of the validation
*/
private ValidationResult validateAggregatePropertyClasses(final SchemaElementDefinition elementDef, final AggregatePair pair) {
final ValidationResult result = new ValidationResult();
if (null != elementDef) {
final ElementAggregator aggregator = pair.getElementAggregator();
if (null != aggregator) {
final List<TupleAdaptedBinaryOperator<String, ?>> components = aggregator.getComponents();
for (final TupleAdaptedBinaryOperator<String, ?> component : components) {
final String[] selection = component.getSelection();
final Class[] selectionClasses = Arrays.stream(selection).map(elementDef::getPropertyClass).toArray(Class[]::new);
final Map<String, String> properties = elementDef.getPropertyMap();
if (!properties.isEmpty()) {
if (null == component.getBinaryOperator()) {
result.addError(aggregator.getClass().getSimpleName() + " contains a null function.");
}
for (int i = 0; i < selectionClasses.length; i++) {
if (properties.containsKey(selection[i])) {
final Signature inputSig = Signature.getInputSignature(component.getBinaryOperator());
result.add(inputSig.assignable(selectionClasses[i]));
}
}
}
}
}
}
return result;
}
use of uk.gov.gchq.koryphe.tuple.binaryoperator.TupleAdaptedBinaryOperator in project Gaffer by gchq.
the class AggregateValidator method validateElementAggregator.
private ValidationResult validateElementAggregator(final Map.Entry<String, ?> entry, final Schema schema) {
final ValidationResult result = new ValidationResult();
List<TupleAdaptedBinaryOperator<String, ?>> aggregateFunctions = new ArrayList<>();
final SchemaElementDefinition schemaElement = schema.getElement(entry.getKey());
if (null != schemaElement) {
aggregateFunctions = schemaElement.getOriginalAggregateFunctions();
}
List<BinaryOperator<?>> schemaOperators = new ArrayList<>();
if (null != aggregateFunctions) {
schemaOperators = Streams.toStream(aggregateFunctions).map(AdaptedBinaryOperator::getBinaryOperator).collect(Collectors.toList());
}
if (schemaOperators.contains(null)) {
result.addError("Schema contains an ElementAggregator with a null function.");
}
final AggregatePair pair = (AggregatePair) entry.getValue();
final ElementAggregator aggregator = pair.getElementAggregator();
if (null != aggregator && null != aggregator.getComponents()) {
for (final TupleAdaptedBinaryOperator<String, ?> adaptedFunction : aggregator.getComponents()) {
if (null == adaptedFunction.getBinaryOperator()) {
result.addError(aggregator.getClass().getSimpleName() + " contains a null function.");
}
}
}
return result;
}
Aggregations