Query createExecutableQuery(Map<Integer, Object> resolvedParameters) { // building a stack of parameter values, so that the builders can pull them // according to their needs (zero, one or more parameters) // avoids to manage a current parameter index state here. Stack<Object> parametersStack = new Stack<>(); if (!resolvedParameters.isEmpty()) { Integer maxParameterIndex = Collections.max(resolvedParameters.keySet()); for (int i = 0; i <= maxParameterIndex; i++) { parametersStack.add(0, resolvedParameters.get(i)); } } List<Filter> filters = new ArrayList<>(); for (FilterBuilder filterBuilder : filterBuilders) { filters.addAll(filterBuilder.build(parametersStack)); } return new Query(new Filters(filters)); } }
/** * Convenience method to chain filters using {@link BooleanOperator#OR}. * * @param filter to be chained. * @return new {@link Filters} object containing both filters. */ public Filters or(Filter filter) { filter.setBooleanOperator(BooleanOperator.OR); return new Filters(this, filter); }
/** * Convenience method to chain filters using {@link BooleanOperator#AND}. * * @param filter to be chained * @return new {@link Filters} object containing both filters. */ public Filters and(Filter filter) { filter.setBooleanOperator(BooleanOperator.AND); return new Filters(this, filter); }
@Test public void findByPropertyEmbeddedDelimiter() throws Exception { query = nodeQueryStatements.findByType("Cookbooks", new Filters().add(new Filter("title", ComparisonOperator.EQUALS, "Mrs Beeton's Household Recipes")), 1); assertThat(query.getStatement()).isEqualTo( "MATCH (n:`Cookbooks`) WHERE n.`title` = { `title_0` } WITH n MATCH p=(n)-[*0..1]-(m) RETURN p, ID(n)"); assertThat(mapper.writeValueAsString(query.getParameters())) .isEqualTo("{\"title_0\":\"Mrs Beeton's Household Recipes\"}"); }
@Test public void findByPropertyStandardForm() throws Exception { query = nodeQueryStatements .findByType("Asteroid", new Filters().add(new Filter("diameter", ComparisonOperator.EQUALS, 6.02E1)), 1); assertThat(query.getStatement()).isEqualTo( "MATCH (n:`Asteroid`) WHERE n.`diameter` = { `diameter_0` } WITH n MATCH p=(n)-[*0..1]-(m) RETURN p, ID(n)"); assertThat(mapper.writeValueAsString(query.getParameters())).isEqualTo("{\"diameter_0\":60.2}"); }
@Test public void findByPropertyDecimal() throws Exception { query = nodeQueryStatements .findByType("Asteroid", new Filters().add(new Filter("diameter", ComparisonOperator.EQUALS, 60.2)), 1); assertThat(query.getStatement()).isEqualTo( "MATCH (n:`Asteroid`) WHERE n.`diameter` = { `diameter_0` } WITH n MATCH p=(n)-[*0..1]-(m) RETURN p, ID(n)"); assertThat(mapper.writeValueAsString(query.getParameters())).isEqualTo("{\"diameter_0\":60.2}"); }
@Test public void findByPropertyWildcardLike() throws JsonProcessingException { Filter filter = new Filter("ref", ComparisonOperator.LIKE, "*nia"); query = nodeQueryStatements.findByType("Asteroid", new Filters().add(filter), 1); assertThat(mapper.writeValueAsString(query.getParameters())).isEqualTo("{\"ref_0\":\"(?i).*nia\"}"); }
/** * @throws Exception * @see DATAGRAPH-595 */ @Test public void testFindByPropertyInfiniteDepth() throws Exception { assertThat(queryStatements.findByType("Asteroid", new Filters().add(new Filter("diameter", EQUALS, 60.2)), -1) .getStatement()).isEqualTo( "MATCH (n:`Asteroid`) WHERE n.`diameter` = { `diameter_0` } WITH n MATCH p=(n)-[*0..]-(m) RETURN p, ID(n)"); }
@Test public void testFindByProperty() throws Exception { assertThat( query.findByType("ORBITS", new Filters().add(new Filter("distance", EQUALS, 60.2)), 4).getStatement()) .isEqualTo("MATCH (n)-[r0:`ORBITS`]->(m) WHERE r0.`distance` = { `distance_0` } " + "WITH DISTINCT(r0) as r0,startnode(r0) AS n, endnode(r0) AS m MATCH p1 = (n)-[*0..4]-() " + "WITH r0, COLLECT(DISTINCT p1) AS startPaths, m MATCH p2 = (m)-[*0..4]-() " + "WITH r0, startPaths, COLLECT(DISTINCT p2) AS endPaths " + "WITH r0,startPaths + endPaths AS paths " + "UNWIND paths AS p RETURN DISTINCT p, ID(r0)"); }
@Test public void testDeleteWithLabelAndFilters() throws Exception { CypherQuery query = statements .delete("INFLUENCE", new Filters().add(new Filter("score", ComparisonOperator.EQUALS, -12.2))); assertThat(query.getStatement()).isEqualTo( "MATCH (n:`INFLUENCE`) " + "WHERE n.`score` = { `score_0` } " + "WITH n " + "OPTIONAL MATCH (n)-[r0]-() " + "DELETE r0, n"); }
@Test public void testDeleteWithTypeAndFilters() throws Exception { CypherQuery query = statements .delete("INFLUENCE", new Filters().add(new Filter("score", ComparisonOperator.EQUALS, -12.2))); assertThat(query.getStatement()) .isEqualTo("MATCH (n)-[r0:`INFLUENCE`]->(m) WHERE r0.`score` = { `score_0` } DELETE r0"); }
@Test public void testFindByProperty() throws Exception { String statement = queryStatements.findByType("Asteroid", new Filters().add(new Filter("diameter", ComparisonOperator.EQUALS, 60.2)), 4).getStatement(); assertThat(statement).isEqualTo( "MATCH (n:`Asteroid`) WHERE n.`diameter` = { `diameter_0` } WITH n MATCH p=(n)-[*0..4]-(m) RETURN p, ID(n)"); }
/** * @throws Exception * @see DATAGRAPH-904 */ @Test public void testFindByPropertyGreaterThanEqual() throws Exception { Filter parameter = new Filter("diameter", ComparisonOperator.GREATER_THAN_EQUAL, 60); assertThat(queryStatements.findByType("Asteroid", new Filters().add(parameter), 4).getStatement()).isEqualTo( "MATCH (n:`Asteroid`) WHERE n.`diameter` >= { `diameter_0` } WITH n MATCH p=(n)-[*0..4]-(m) RETURN p, ID(n)"); }
/** * @throws Exception * @see DATAGRAPH-904 */ @Test public void testFindByPropertyLessThanEqual() throws Exception { Filter parameter = new Filter("diameter", ComparisonOperator.LESS_THAN_EQUAL, 60); assertThat(queryStatements.findByType("Asteroid", new Filters().add(parameter), 4).getStatement()) .isEqualTo("MATCH (n:`Asteroid`) WHERE n.`diameter` <= { `diameter_0` } " + "WITH n MATCH p=(n)-[*0..4]-(m) RETURN p, ID(n)"); }
@Test /** * @see DATAGRAPH-781 * @throws Exception */ public void testFindByPropertyWithInfiniteValue() throws Exception { PagingAndSortingQuery pagingAndSortingQuery = queryStatements .findByType("Asteroid", new Filters().add(new Filter("albedo", ComparisonOperator.EQUALS, -12.2)), 0); assertThat(pagingAndSortingQuery.getStatement()) .isEqualTo("MATCH (n:`Asteroid`) WHERE n.`albedo` = { `albedo_0` } WITH n RETURN n"); assertThat((double) pagingAndSortingQuery.getParameters().get("albedo_0")).isEqualTo(-12.2, within(0.005)); }
@Test public void testFindByProperty() throws Exception { assertThat( query.findByType("ORBITS", new Filters().add(new Filter("distance", ComparisonOperator.EQUALS, 60.2)), 1) .setPagination(new Pagination(0, 4)).getStatement()) .isEqualTo( "MATCH (n)-[r0:`ORBITS`]->(m) WHERE r0.`distance` = { `distance_0` } WITH DISTINCT(r0) as r0,startnode(r0) AS n, endnode(r0) AS m SKIP 0 LIMIT 4 MATCH p1 = (n)-[*0..1]-() WITH r0, COLLECT(DISTINCT p1) AS startPaths, m MATCH p2 = (m)-[*0..1]-() WITH r0, startPaths, COLLECT(DISTINCT p2) AS endPaths WITH r0,startPaths + endPaths AS paths UNWIND paths AS p RETURN DISTINCT p, ID(r0)"); } }
/** * @see DATAGRAPH-445 */ @Test public void testFindByChainedOredProperties() { Filter planetParam = new Filter("name", ComparisonOperator.EQUALS, "Earth"); Filter moonParam = new Filter("name", ComparisonOperator.EQUALS, "Moon"); assertThat(queryStatements.findByType("Asteroid", new Filters().add(planetParam).or(moonParam), 1).getStatement()) .isEqualTo("MATCH (n:`Asteroid`) WHERE n.`name` = { `name_0` } " + "OR n.`name` = { `name_1` } WITH n MATCH p=(n)-[*0..1]-(m) RETURN p, ID(n)"); }
@Test public void testFindByDistance() { DistanceComparison function = new DistanceComparison(new DistanceFromPoint(37.4d, 112.9d, 1000.0d)); Filters filters = new Filters().add(new Filter(function, ComparisonOperator.EQUALS)); String statement = queryStatements.findByType("Restaurant", filters, 4).getStatement(); assertThat(statement).isEqualTo( "MATCH (n:`Restaurant`) WHERE distance(point({latitude: n.latitude, longitude: n.longitude}),point({latitude:{lat}, longitude:{lon}})) = {distance} WITH n MATCH p=(n)-[*0..4]-(m) RETURN p, ID(n)"); }
@Test(expected = InvalidDepthException.class) public void testFindByPropertyInfiniteDepth() throws Exception { query.findByType("ORBITS", new Filters().add(new Filter("period", ComparisonOperator.EQUALS, 2103.776)), -1) .getStatement(); }
/** * @see Issue 73 */ @Test(expected = MissingOperatorException.class) public void testFindByMultipleAndPropertiesWithMissingBooleanOperator() { Filter nameParam = new Filter("name", ComparisonOperator.EQUALS, "AST-1"); Filter diameterParam = new Filter("diameter", ComparisonOperator.LESS_THAN, 60); queryStatements.findByType("Asteroid", new Filters().add(nameParam).add(diameterParam), 2).getStatement(); } }