@Override public void visit( Or or ) { strategy.visit(or); enqueue(or.left()); enqueue(or.right()); visitNext(); }
@Override public void visit( Or or ) { strategy.visit(or); enqueue(or.left()); enqueue(or.right()); visitNext(); }
@Override public void visit( Or or ) { append('('); or.left().accept(this); append(" OR "); or.right().accept(this); append(')'); }
@Override public void visit( Or or ) { append('('); or.left().accept(this); append(" OR "); or.right().accept(this); append(')'); }
protected ConstraintBuilder buildLogicalConstraint() { if (negateConstraint && constraint != null) { constraint = new Not(constraint); negateConstraint = false; } if (left != null && constraint != null) { if (and) { // If the left constraint is an OR, we need to rearrange things since AND is higher precedence ... if (left instanceof Or && implicitParentheses) { Or previous = (Or)left; constraint = new Or(previous.left(), new And(previous.right(), constraint)); } else { constraint = new And(left, constraint); } } else { constraint = new Or(left, constraint); } left = null; } return this; }
protected ConstraintBuilder buildLogicalConstraint() { if (negateConstraint && constraint != null) { constraint = new Not(constraint); negateConstraint = false; } if (left != null && constraint != null) { if (and) { // If the left constraint is an OR, we need to rearrange things since AND is higher precedence ... if (left instanceof Or && implicitParentheses) { Or previous = (Or)left; constraint = new Or(previous.left(), new And(previous.right(), constraint)); } else { constraint = new And(left, constraint); } } else { constraint = new Or(left, constraint); } left = null; } return this; }
Constraint left = or.left(); Constraint right = or.right(); Constraint newLeft = rewrite(context, left);
@Test public void shouldParseConstraintFromStringWithOrExpressionWithNoParentheses() { NamedSelector selector = new NamedSelector(selectorName("tableA")); Constraint constraint = parser.parseConstraint(tokens("ISSAMENODE('/a/b/c') OR CONTAINS(p1,term1)"), typeSystem, selector); assertThat(constraint, is(instanceOf(Or.class))); Or or = (Or)constraint; assertThat(or.left(), is(instanceOf(SameNode.class))); SameNode same = (SameNode)or.left(); assertThat(same.selectorName(), is(selectorName("tableA"))); assertThat(same.getPath(), is("/a/b/c")); assertThat(or.right(), is(instanceOf(FullTextSearch.class))); FullTextSearch search = (FullTextSearch)or.right(); assertThat(search.selectorName(), is(selectorName("tableA"))); assertThat(search.getPropertyName(), is("p1")); assertThat(search.fullTextSearchExpression(), is("term1")); }
Constraint left = or.left(); Constraint right = or.right(); Constraint newLeft = rewrite(context, left);
@Test public void shouldParseConstraintFromStringWithParenthesesAndConjunctionAndDisjunctions() { NamedSelector selector = new NamedSelector(selectorName("tableA")); Constraint constraint = parser.parseConstraint(tokens("ISSAMENODE('/a/b') OR (ISSAMENODE('/c/d') AND ISSAMENODE('/e/f'))"), typeSystem, selector); assertThat(constraint, is(instanceOf(Or.class))); Or or = (Or)constraint; assertThat(or.left(), is(instanceOf(SameNode.class))); SameNode first = (SameNode)or.left(); assertThat(first.selectorName(), is(selectorName("tableA"))); assertThat(first.getPath(), is("/a/b")); assertThat(or.right(), is(instanceOf(And.class))); And and = (And)or.right(); assertThat(and.left(), is(instanceOf(SameNode.class))); SameNode second = (SameNode)and.left(); assertThat(second.selectorName(), is(selectorName("tableA"))); assertThat(second.getPath(), is("/c/d")); assertThat(and.right(), is(instanceOf(SameNode.class))); SameNode third = (SameNode)and.right(); assertThat(third.selectorName(), is(selectorName("tableA"))); assertThat(third.getPath(), is("/e/f")); }
} else if (constraint instanceof Or) { Or or = (Or)constraint; constraint = new Or(rewriteConstraint(or.left()), rewriteConstraint(or.right()));
} else if (constraint instanceof Or) { Or or = (Or)constraint; constraint = new Or(rewriteConstraint(or.left()), rewriteConstraint(or.right()));
@Test public void shouldParseSelectStarFromSingleSourceWithWhereContainingTwoPathLikeConstraints() { query = parse("SELECT * FROM mgnl:content WHERE jcr:path LIKE '/modules/%/templates' or jcr:path like '/modules/%/other'"); assertThat(query.source(), is(instanceOf(NamedSelector.class))); // SELECT * ... assertThat(query.columns().isEmpty(), is(true)); // FROM ... NamedSelector selector = (NamedSelector)query.source(); assertThat(selector.name(), is(selectorName("mgnl:content"))); assertThat(selector.aliasOrName(), is(selectorName("mgnl:content"))); assertThat(selector.alias(), is(nullValue())); // WHERE ... Or and = isOr(query.constraint()); Comparison comparison1 = isComparison(and.left()); assertThat(comparison1.getOperand1(), is((DynamicOperand)nodePath(selectorName("mgnl:content")))); assertThat(comparison1.getOperand2(), is((StaticOperand)literal("/modules/%/templates"))); Comparison comparison2 = isComparison(and.right()); assertThat(comparison2.getOperand1(), is((DynamicOperand)nodePath(selectorName("mgnl:content")))); assertThat(comparison2.getOperand2(), is((StaticOperand)literal("/modules/%/other"))); }
@Test public void shouldParseSelectStarFromSingleSourceWithWhereContainingTwoPathLikeConstraints() { query = parse("SELECT * FROM [mgnl:content] WHERE PATH() LIKE '/modules/%/templates' or PATH() like '/modules/%/other'"); assertThat(query.source(), is(instanceOf(NamedSelector.class))); // SELECT * ... assertThat(query.columns().isEmpty(), is(true)); // FROM ... NamedSelector selector = (NamedSelector)query.source(); assertThat(selector.name(), is(selectorName("mgnl:content"))); assertThat(selector.aliasOrName(), is(selectorName("mgnl:content"))); assertThat(selector.alias(), is(nullValue())); // WHERE ... Or and = isOr(query.constraint()); Comparison comparison1 = isComparison(and.left()); assertThat(comparison1.getOperand1(), is((DynamicOperand)nodePath(selectorName("mgnl:content")))); assertThat(comparison1.getOperand2(), is((StaticOperand)literal("/modules/%/templates"))); Comparison comparison2 = isComparison(and.right()); assertThat(comparison2.getOperand1(), is((DynamicOperand)nodePath(selectorName("mgnl:content")))); assertThat(comparison2.getOperand2(), is((StaticOperand)literal("/modules/%/other"))); }
Constraint oldLeft = or.left(); Constraint oldRight = or.right(); Constraint newLeft = rewriteCriteria(context, oldLeft);