@Override public FilterExpression visit(OrNode node, Class entityType) { List<Node> children = node.getChildren(); if (children.size() < 2) { throw new RSQLParseException("Logical OR requires two arguments"); } FilterExpression left = children.get(0).accept(this, entityType); FilterExpression right = children.get(1).accept(this, entityType); OrFilterExpression orFilterExpression = new OrFilterExpression(left, right); for (int idx = 2; idx < children.size(); idx++) { right = children.get(idx).accept(this, entityType); orFilterExpression = new OrFilterExpression(orFilterExpression, right); } return orFilterExpression; }
@Override public FilterExpression visit(OrNode node, Class entityType) { List<Node> children = node.getChildren(); if (children.size() < 2) { throw new RSQLParseException("Logical OR requires two arguments"); } FilterExpression left = children.get(0).accept(this, entityType); FilterExpression right = children.get(1).accept(this, entityType); OrFilterExpression orFilterExpression = new OrFilterExpression(left, right); for (int idx = 2; idx < children.size(); idx++) { right = children.get(idx).accept(this, entityType); orFilterExpression = new OrFilterExpression(orFilterExpression, right); } return orFilterExpression; }
@Override public FilterExpression visitOrExpression(OrFilterExpression expression) { FilterExpression left = expression.getLeft(); FilterExpression right = expression.getRight(); return new OrFilterExpression(left.accept(this), right.accept(this)); }
@Override public FilterExpression visitOrExpression(OrFilterExpression expression) { return new OrFilterExpression( expression.getLeft().accept(this), expression.getRight().accept(this)); }
@Override public FilterExpression visitOrExpression(OrFilterExpression expression) { return new OrFilterExpression( expression.getLeft().accept(this), expression.getRight().accept(this)); }
@Override public FilterExpression visitOrExpression(OrFilterExpression expression) { FilterExpression left = expression.getLeft(); FilterExpression right = expression.getRight(); return new OrFilterExpression(left.accept(this), right.accept(this)); }
allFieldsFilterExpression = new OrFilterExpression(allFieldsFilterExpression, fieldExpression); } else { allFieldsFilterExpression = fieldExpression;
allFieldsFilterExpression = new OrFilterExpression(allFieldsFilterExpression, fieldExpression); } else { allFieldsFilterExpression = fieldExpression;
@Override public FilterExpression visitOR(ExpressionParser.ORContext ctx) { FilterExpression left = visit(ctx.left); FilterExpression right = visit(ctx.right); if (expressionWillNotFilter(left)) { return left; } if (expressionWillNotFilter(right)) { return right; } boolean leftFails = expressionWillFail(left); boolean rightFails = expressionWillFail(right); if (leftFails && rightFails) { return FALSE_USER_CHECK_EXPRESSION; } if (leftFails) { return right; } if (rightFails) { return left; } return new OrFilterExpression(left, right); }
@Override public FilterExpression visitOR(ExpressionParser.ORContext ctx) { FilterExpression left = visit(ctx.left); FilterExpression right = visit(ctx.right); if (expressionWillNotFilter(left)) { return left; } if (expressionWillNotFilter(right)) { return right; } boolean leftFails = expressionWillFail(left); boolean rightFails = expressionWillFail(right); if (leftFails && rightFails) { return FALSE_USER_CHECK_EXPRESSION; } if (leftFails) { return right; } if (rightFails) { return left; } return new OrFilterExpression(left, right); }
@Test public void testHQLQueryVisitor() throws Exception { List<Path.PathElement> p1Path = Arrays.asList( new Path.PathElement(Book.class, Author.class, "authors"), new Path.PathElement(Author.class, String.class, "name") ); FilterPredicate p1 = new InPredicate(new Path(p1Path), "foo", "bar"); List<Path.PathElement> p2Path = Arrays.asList( new Path.PathElement(Book.class, String.class, "name") ); FilterPredicate p2 = new InPredicate(new Path(p2Path), "blah"); List<Path.PathElement> p3Path = Arrays.asList( new Path.PathElement(Book.class, String.class, "genre") ); FilterPredicate p3 = new InPredicate(new Path(p3Path), "scifi"); OrFilterExpression or = new OrFilterExpression(p2, p3); AndFilterExpression and = new AndFilterExpression(or, p1); NotFilterExpression not = new NotFilterExpression(and); HQLFilterOperation filterOp = new HQLFilterOperation(); String query = filterOp.apply(not, false); String p1Params = p1.getParameters().stream() .map(FilterPredicate.FilterParameter::getPlaceholder).collect(Collectors.joining(", ")); String p2Params = p2.getParameters().stream() .map(FilterPredicate.FilterParameter::getPlaceholder).collect(Collectors.joining(", ")); String p3Params = p3.getParameters().stream() .map(FilterPredicate.FilterParameter::getPlaceholder).collect(Collectors.joining(", ")); String expected = "WHERE NOT (((name IN (" + p2Params + ") OR genre IN (" + p3Params + ")) " + "AND authors.name IN (" + p1Params + ")))"; Assert.assertEquals(query, expected); }
new Path(publisherNamePath), "Pub1"); OrFilterExpression expression = new OrFilterExpression(titlePredicate, publisherNamePredicate);
new Path(publisherNamePath), "Pub1"); OrFilterExpression expression = new OrFilterExpression(titlePredicate, publisherNamePredicate);
@Test public void testFilterJoinClause() { List<Path.PathElement> chapterTitlePath = Arrays.asList( new Path.PathElement(Author.class, Book.class, BOOKS), new Path.PathElement(Book.class, Chapter.class, "chapters"), new Path.PathElement(Chapter.class, String.class, TITLE) ); FilterPredicate titlePredicate = new InPredicate( new Path(chapterTitlePath), ABC, DEF); FilterPredicate titlePredicateDuplicate = new InPredicate( new Path(chapterTitlePath), ABC, DEF); List<Path.PathElement> publisherNamePath = Arrays.asList( new Path.PathElement(Author.class, Book.class, BOOKS), new Path.PathElement(Book.class, Publisher.class, PUBLISHER), new Path.PathElement(Publisher.class, String.class, NAME) ); FilterPredicate publisherNamePredicate = new InPredicate( new Path(publisherNamePath), "Pub1"); OrFilterExpression orExpression = new OrFilterExpression(titlePredicate, publisherNamePredicate); AndFilterExpression andExpression = new AndFilterExpression(orExpression, titlePredicateDuplicate); String actual = getJoinClauseFromFilters(andExpression); String expected = " LEFT JOIN example_Author.books example_Author_books " + "LEFT JOIN example_Author_books.chapters example_Book_chapters " + "LEFT JOIN example_Author_books.publisher example_Book_publisher "; Assert.assertEquals(actual, expected); }
@Override public FilterExpression visitNotExpression(NotFilterExpression fe) { FilterExpression inner = fe.getNegated(); if (inner instanceof AndFilterExpression) { AndFilterExpression and = (AndFilterExpression) inner; FilterExpression left = new NotFilterExpression(and.getLeft()).accept(this); FilterExpression right = new NotFilterExpression(and.getRight()).accept(this); return new OrFilterExpression(left, right); } if (inner instanceof OrFilterExpression) { OrFilterExpression or = (OrFilterExpression) inner; FilterExpression left = new NotFilterExpression(or.getLeft()).accept(this); FilterExpression right = new NotFilterExpression(or.getRight()).accept(this); return new AndFilterExpression(left, right); } if (inner instanceof NotFilterExpression) { NotFilterExpression not = (NotFilterExpression) inner; return (not.getNegated()).accept(this); } if (inner instanceof FilterPredicate) { FilterPredicate filter = (FilterPredicate) inner; return filter.negate(); } return inner; } }
@Override public FilterExpression visitNotExpression(NotFilterExpression fe) { FilterExpression inner = fe.getNegated(); if (inner instanceof AndFilterExpression) { AndFilterExpression and = (AndFilterExpression) inner; FilterExpression left = new NotFilterExpression(and.getLeft()).accept(this); FilterExpression right = new NotFilterExpression(and.getRight()).accept(this); return new OrFilterExpression(left, right); } if (inner instanceof OrFilterExpression) { OrFilterExpression or = (OrFilterExpression) inner; FilterExpression left = new NotFilterExpression(or.getLeft()).accept(this); FilterExpression right = new NotFilterExpression(or.getRight()).accept(this); return new AndFilterExpression(left, right); } if (inner instanceof NotFilterExpression) { NotFilterExpression not = (NotFilterExpression) inner; return (not.getNegated()).accept(this); } if (inner instanceof FilterPredicate) { FilterPredicate filter = (FilterPredicate) inner; return filter.negate(); } return inner; } }