use of uk.gov.gchq.koryphe.impl.predicate.IsIn in project Gaffer by gchq.
the class AbstractLoaderIT method shouldGetElementsWithMatchedVertexFilter.
@TraitRequirement({ StoreTrait.MATCHED_VERTEX, StoreTrait.QUERY_AGGREGATION })
@Test
public void shouldGetElementsWithMatchedVertexFilter() throws Exception {
// Then
final View view = new Builder().edge(TestGroups.EDGE, new ViewElementDefinition.Builder().preAggregationFilter(new ElementFilter.Builder().select(IdentifierType.ADJACENT_MATCHED_VERTEX.name()).execute(new IsIn(DEST_DIR_1, DEST_DIR_2, DEST_DIR_3)).build()).build()).build();
final GetElements op = new GetElements.Builder().input(new EntitySeed(SOURCE_DIR_1), new EntitySeed(DEST_DIR_2), new EntitySeed(SOURCE_DIR_3)).view(view).build();
// When
final CloseableIterable<? extends Element> results = graph.execute(op, getUser());
// Then
assertElementEquals(getQuerySummarisedEdges(view).stream().filter(Edge::isDirected).filter(edge -> {
final List<String> vertices = Lists.newArrayList(SOURCE_DIR_1, DEST_DIR_2, SOURCE_DIR_3);
return vertices.contains(edge.getMatchedVertexValue());
}).filter(edge -> {
final List<String> vertices = Lists.newArrayList(DEST_DIR_1, DEST_DIR_2, DEST_DIR_3);
return vertices.contains(edge.getAdjacentMatchedVertexValue());
}).collect(toList()), results);
}
use of uk.gov.gchq.koryphe.impl.predicate.IsIn in project Gaffer by gchq.
the class FilterHandlerTest method shouldFilterBasedOnAdjacentMatchedVertex.
@Test
public void shouldFilterBasedOnAdjacentMatchedVertex() throws OperationException {
// Given
final Schema schema = new Schema.Builder().edge(TestGroups.EDGE, new SchemaEdgeDefinition.Builder().source("vertex").destination("vertex").property(TestPropertyNames.COUNT, "count.long").build()).type("vertex", new TypeDefinition(String.class)).type("count.long", new TypeDefinition(Long.class)).build();
given(store.getSchema()).willReturn(schema);
final Filter filter = new Filter.Builder().input(new Edge.Builder().group(TestGroups.EDGE).source("srcVal1").dest("destVal1").matchedVertex(EdgeId.MatchedVertex.SOURCE).build(), new Edge.Builder().group(TestGroups.EDGE).source("srcVal2").dest("destVal2").matchedVertex(EdgeId.MatchedVertex.SOURCE).build(), new Edge.Builder().group(TestGroups.EDGE).source("srcVal3").dest("destVal3").matchedVertex(EdgeId.MatchedVertex.DESTINATION).build(), new Edge.Builder().group(TestGroups.EDGE).source("srcVal4").dest("destVal4").matchedVertex(EdgeId.MatchedVertex.DESTINATION).build()).edge(TestGroups.EDGE, new ElementFilter.Builder().select(IdentifierType.ADJACENT_MATCHED_VERTEX.name()).execute(new IsIn("destVal1", "srcVal3")).build()).build();
// When
final Iterable<? extends Element> results = handler.doOperation(filter, context, store);
// Then
ElementUtil.assertElementEquals(Arrays.asList(new Edge.Builder().group(TestGroups.EDGE).source("srcVal1").dest("destVal1").matchedVertex(EdgeId.MatchedVertex.SOURCE).build(), new Edge.Builder().group(TestGroups.EDGE).source("srcVal3").dest("destVal3").matchedVertex(EdgeId.MatchedVertex.SOURCE).build()), results);
}
use of uk.gov.gchq.koryphe.impl.predicate.IsIn in project Gaffer by gchq.
the class FiltersToOperationConverter method getFunctionsFromFilter.
/**
* Converts a Spark {@link Filter} to a map from group to a list of Gaffer {@link TupleAdaptedPredicate}s.
* <p>
* Note that Spark also applies all the filters provided to the {@code buildScan(String[], Filter[])} method
* so not implementing some of the provided {@link Filter}s in Gaffer will not cause errors. However, as many as
* possible should be implemented so that as much filtering as possible happens in iterators running in Accumulo's
* tablet servers (this avoids unnecessary data transfer from Accumulo to Spark).
*
* @param filter The {@link Filter} to transform.
* @return A map from {@link String} to {@link TupleAdaptedPredicate}s implementing the provided {@link Filter}.
*/
private Map<String, List<TupleAdaptedPredicate<String, ?>>> getFunctionsFromFilter(final Filter filter) {
final Map<String, List<TupleAdaptedPredicate<String, ?>>> map = new HashMap<>();
if (filter instanceof EqualTo) {
// Not dealt with as requires a Predicate<?> that returns null if either the controlValue or the
// test value is null - the API of Predicate<?> doesn't permit this.
} else if (filter instanceof EqualNullSafe) {
final EqualNullSafe equalNullSafe = (EqualNullSafe) filter;
final Predicate<?> isEqual = new IsEqual(equalNullSafe.value());
final Set<String> relevantGroups = getGroupsFromFilter(filter);
if (null != relevantGroups) {
for (final String group : relevantGroups) {
if (!map.containsKey(group)) {
map.put(group, new ArrayList<>());
}
map.get(group).add(new TupleAdaptedPredicate<>(isEqual, new String[] { equalNullSafe.attribute() }));
}
}
LOGGER.debug("Converted {} to IsEqual ({})", filter, equalNullSafe.attribute());
} else if (filter instanceof GreaterThan) {
final GreaterThan greaterThan = (GreaterThan) filter;
final Predicate<?> isMoreThan = new IsMoreThan((Comparable<?>) greaterThan.value(), false);
final Set<String> relevantGroups = getGroupsFromFilter(filter);
if (null != relevantGroups) {
for (final String group : relevantGroups) {
if (!map.containsKey(group)) {
map.put(group, new ArrayList<>());
}
map.get(group).add(new TupleAdaptedPredicate<>(isMoreThan, new String[] { greaterThan.attribute() }));
}
}
LOGGER.debug("Converted {} to isMoreThan ({})", filter, greaterThan.attribute());
} else if (filter instanceof GreaterThanOrEqual) {
final GreaterThanOrEqual greaterThan = (GreaterThanOrEqual) filter;
final Predicate<?> isMoreThan = new IsMoreThan((Comparable<?>) greaterThan.value(), true);
final Set<String> relevantGroups = getGroupsFromFilter(filter);
if (null != relevantGroups) {
for (final String group : relevantGroups) {
if (!map.containsKey(group)) {
map.put(group, new ArrayList<>());
}
map.get(group).add(new TupleAdaptedPredicate<>(isMoreThan, new String[] { greaterThan.attribute() }));
}
}
LOGGER.debug("Converted {} to IsMoreThan ({})", filter, greaterThan.attribute());
} else if (filter instanceof LessThan) {
final LessThan lessThan = (LessThan) filter;
final Predicate<?> isLessThan = new IsLessThan((Comparable<?>) lessThan.value(), false);
final Set<String> relevantGroups = getGroupsFromFilter(filter);
if (null != relevantGroups) {
for (final String group : relevantGroups) {
if (!map.containsKey(group)) {
map.put(group, new ArrayList<>());
}
map.get(group).add(new TupleAdaptedPredicate<>(isLessThan, new String[] { lessThan.attribute() }));
}
}
LOGGER.debug("Converted {} to IsLessThan ({})", filter, lessThan.attribute());
} else if (filter instanceof LessThanOrEqual) {
final LessThanOrEqual lessThan = (LessThanOrEqual) filter;
final Predicate<?> isLessThan = new IsLessThan((Comparable<?>) lessThan.value(), true);
final Set<String> relevantGroups = getGroupsFromFilter(filter);
if (null != relevantGroups) {
for (final String group : relevantGroups) {
if (!map.containsKey(group)) {
map.put(group, new ArrayList<>());
}
map.get(group).add(new TupleAdaptedPredicate<>(isLessThan, new String[] { lessThan.attribute() }));
}
}
LOGGER.debug("Converted {} to LessThanOrEqual ({})", filter, lessThan.attribute());
} else if (filter instanceof In) {
final In in = (In) filter;
final Predicate<?> isIn = new IsIn(new HashSet<>(Arrays.asList(in.values())));
final Set<String> relevantGroups = getGroupsFromFilter(filter);
if (null != relevantGroups) {
for (final String group : relevantGroups) {
if (!map.containsKey(group)) {
map.put(group, new ArrayList<>());
}
map.get(group).add(new TupleAdaptedPredicate<>(isIn, new String[] { in.attribute() }));
}
}
LOGGER.debug("Converted {} to IsIn ({})", filter, in.attribute());
} else if (filter instanceof IsNull) {
final IsNull isNull = (IsNull) filter;
final Predicate<?> doesntExist = new Not<>(new Exists());
final Set<String> relevantGroups = getGroupsFromFilter(filter);
if (null != relevantGroups) {
for (final String group : relevantGroups) {
if (!map.containsKey(group)) {
map.put(group, new ArrayList<>());
}
map.get(group).add(new TupleAdaptedPredicate<>(doesntExist, new String[] { isNull.attribute() }));
}
}
LOGGER.debug("Converted {} to Not(Exists) ({})", filter, isNull.attribute());
} else if (filter instanceof IsNotNull) {
final IsNotNull isNotNull = (IsNotNull) filter;
final Predicate<?> exists = new Exists();
final Set<String> relevantGroups = getGroupsFromFilter(filter);
if (null != relevantGroups) {
for (final String group : relevantGroups) {
if (!map.containsKey(group)) {
map.put(group, new ArrayList<>());
}
map.get(group).add(new TupleAdaptedPredicate<>(exists, new String[] { isNotNull.attribute() }));
}
}
LOGGER.debug("Converted {} to Exists ({})", filter, isNotNull.attribute());
} else if (filter instanceof And) {
final And and = (And) filter;
final Map<String, List<TupleAdaptedPredicate<String, ?>>> left = getFunctionsFromFilter(and.left());
final Map<String, List<TupleAdaptedPredicate<String, ?>>> right = getFunctionsFromFilter(and.right());
final Set<String> relevantGroups = getGroupsFromFilter(filter);
if (null != relevantGroups) {
for (final String group : relevantGroups) {
final List<TupleAdaptedPredicate<String, ?>> concatFilters = new ArrayList<>();
if (null != left.get(group)) {
concatFilters.addAll(left.get(group));
}
if (null != right.get(group)) {
concatFilters.addAll(right.get(group));
}
if (!map.containsKey(group)) {
map.put(group, new ArrayList<>());
}
map.get(group).addAll(concatFilters);
}
}
LOGGER.debug("Converted {} to list of filters ({})", filter, StringUtils.join(map.entrySet(), ','));
}
return map;
}
use of uk.gov.gchq.koryphe.impl.predicate.IsIn in project Gaffer by gchq.
the class GetElementsIT method shouldGetElementsWithMatchedVertexFilter.
@Test
@TraitRequirement(StoreTrait.MATCHED_VERTEX)
public void shouldGetElementsWithMatchedVertexFilter() throws Exception {
// Given
final User user = new User();
final GetElements op = new GetElements.Builder().input(new EntitySeed(SOURCE_DIR_1), new EntitySeed(DEST_DIR_2), new EntitySeed(SOURCE_DIR_3)).view(new View.Builder().edge(TestGroups.EDGE, new ViewElementDefinition.Builder().preAggregationFilter(new ElementFilter.Builder().select(IdentifierType.ADJACENT_MATCHED_VERTEX.name()).execute(new IsIn(DEST_DIR_1, DEST_DIR_2, DEST_DIR_3)).build()).build()).build()).build();
// When
final CloseableIterable<? extends Element> results = graph.execute(op, user);
// Then
ElementUtil.assertElementEquals(Arrays.asList(new Edge.Builder().group(TestGroups.EDGE).source(SOURCE_DIR_1).dest(DEST_DIR_1).directed(true).matchedVertex(EdgeId.MatchedVertex.SOURCE).property(TestPropertyNames.INT, 1).property(TestPropertyNames.COUNT, 1L).build(), new Edge.Builder().group(TestGroups.EDGE).source(SOURCE_DIR_3).dest(DEST_DIR_3).directed(true).matchedVertex(EdgeId.MatchedVertex.SOURCE).property(TestPropertyNames.INT, 1).property(TestPropertyNames.COUNT, 1L).build()), results);
}
use of uk.gov.gchq.koryphe.impl.predicate.IsIn in project Gaffer by gchq.
the class GraphHooksIT method shouldResolveNamedViewWithinNamedOperation.
@Test
public void shouldResolveNamedViewWithinNamedOperation() throws OperationException {
// Given
final Edge edge1 = getEdges().get(new EdgeSeed(SOURCE_1, DEST_1, false)).emptyClone();
edge1.putProperty(TestPropertyNames.INT, 100);
final Edge edge2 = edge1.emptyClone();
edge2.putProperty(TestPropertyNames.INT, 101);
graph.execute(new AddElements.Builder().input(edge1, edge2).build(), getUser());
final AddNamedView addNamedView = new AddNamedView.Builder().name("Test View").view(new View.Builder().edge(TestGroups.EDGE, new ViewElementDefinition.Builder().preAggregationFilter(new ElementFilter.Builder().select(TestPropertyNames.INT).execute(new IsIn(Arrays.asList((Object) 100))).build()).build()).build()).overwrite(true).build();
graph.execute(addNamedView, getUser());
final AddNamedOperation addNamedOperation = new AddNamedOperation.Builder().operationChain(new OperationChain.Builder().first(new GetAllElements.Builder().view(new NamedView.Builder().name("Test View").build()).build()).build()).description("named operation GetAllElements test query").name("GetAllElements test").labels(Arrays.asList("label 1", "Label 2")).overwrite(true).build();
graph.execute(addNamedOperation, getUser());
final NamedOperation<EntityId, CloseableIterable<? extends Element>> operation = new NamedOperation.Builder<EntityId, CloseableIterable<? extends Element>>().name("GetAllElements test").input(new EntitySeed("10")).build();
// When
final CloseableIterable<? extends Element> results = graph.execute(operation, getUser());
// Then
final List<Element> resultList = Lists.newArrayList(results);
assertThat(resultList).hasSize(1).contains((Element) edge1);
}
Aggregations