/** * Compare the values used in the two comparisons * * @param context the query context; may not be null * @param comparison1 the first comparison object; may not be null * @param comparison2 the second comparison object; may not be null * @return 0 if the values are the same, less than 0 if the first comparison's value is less than the second's, or greater * than 0 if the first comparison's value is greater than the second's */ protected int compareStaticOperands( QueryContext context, Comparison comparison1, Comparison comparison2 ) { Object value1 = getValue(context, comparison1.getOperand2()); Object value2 = getValue(context, comparison2.getOperand2()); return ValueComparators.OBJECT_COMPARATOR.compare(value1, value2); }
/** * Compare the values used in the two comparisons * * @param context the query context; may not be null * @param comparison1 the first comparison object; may not be null * @param comparison2 the second comparison object; may not be null * @return 0 if the values are the same, less than 0 if the first comparison's value is less than the second's, or greater * than 0 if the first comparison's value is greater than the second's */ protected int compareStaticOperands( QueryContext context, Comparison comparison1, Comparison comparison2 ) { Object value1 = getValue(context, comparison1.getOperand2()); Object value2 = getValue(context, comparison2.getOperand2()); return ValueComparators.OBJECT_COMPARATOR.compare(value1, value2); }
@Override public void visit( Comparison obj ) { // The dynamic operand itself will be visited by the validator as it walks the comparison object. verifyComparison(obj.getOperand1(), obj.operator(), obj.getOperand2()); }
@Override public void visit( Comparison obj ) { // The dynamic operand itself will be visited by the validator as it walks the comparison object. verifyComparison(obj.getOperand1(), obj.operator(), obj.getOperand2()); }
@Override public void visit( Comparison comparison ) { strategy.visit(comparison); enqueue(comparison.getOperand1()); enqueue(comparison.getOperand2()); visitNext(); }
@Override public void visit( Comparison comparison ) { strategy.visit(comparison); enqueue(comparison.getOperand1()); enqueue(comparison.getOperand2()); visitNext(); }
@Override protected ConstraintBuilder setConstraint( Constraint constraint ) { Comparison comparison = (Comparison)constraint; return delegate.setConstraint(new Comparison(new UpperCase(comparison.getOperand1()), comparison.operator(), comparison.getOperand2())); } }
@Override protected ConstraintBuilder setConstraint( Constraint constraint ) { Comparison comparison = (Comparison)constraint; return delegate.setConstraint(new Comparison(new LowerCase(comparison.getOperand1()), comparison.operator(), comparison.getOperand2())); } }
@Override protected ConstraintBuilder setConstraint( Constraint constraint ) { Comparison comparison = (Comparison)constraint; return delegate.setConstraint(new Comparison(new UpperCase(comparison.getOperand1()), comparison.operator(), comparison.getOperand2())); } }
@Override protected ConstraintBuilder setConstraint( Constraint constraint ) { Comparison comparison = (Comparison)constraint; return delegate.setConstraint(new Comparison(new LowerCase(comparison.getOperand1()), comparison.operator(), comparison.getOperand2())); } }
@Override public void visit( Comparison comparison ) { comparison.getOperand1().accept(this); append(' ').append(comparison.operator().symbol()).append(' '); comparison.getOperand2().accept(this); }
@Override public void visit( Comparison comparison ) { comparison.getOperand1().accept(this); append(' ').append(comparison.operator().symbol()).append(' '); comparison.getOperand2().accept(this); }
@Test public void shouldParseSelectStarFromSingleSourceWithWhereContainingPathLikeConstraint() { query = parse("SELECT * FROM [mgnl:content] WHERE PATH() LIKE '/modules/%/templates'"); 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 ... Comparison comparison = isComparison(query.constraint()); assertThat(comparison.getOperand1(), is((DynamicOperand)nodePath(selectorName("mgnl:content")))); assertThat(comparison.getOperand2(), is((StaticOperand)literal("/modules/%/templates"))); }
@Test public void shouldParseSelectStarFromSingleSourceWithWhereContainingPathLikeConstraint() { query = parse("SELECT * FROM mgnl:content WHERE jcr:path LIKE '/modules/%/templates'"); 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 ... Comparison comparison = isComparison(query.constraint()); assertThat(comparison.getOperand1(), is((DynamicOperand)nodePath(selectorName("mgnl:content")))); assertThat(comparison.getOperand2(), is((StaticOperand)literal("/modules/%/templates"))); }
@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"))); }
/** * Tests that the child nodes (but no grandchild nodes) are returned. */ @Test public void shouldParseSelectWithChildAxisCriteria() { query = parse("SELECT * FROM nt:base WHERE jcr:path LIKE '/a/b/%' AND NOT jcr:path LIKE '/a/b/%/%'"); // SELECT * ... assertThat(query.columns().isEmpty(), is(true)); // FROM ... NamedSelector selector = (NamedSelector)query.source(); assertThat(selector.name(), is(selectorName("nt:base"))); assertThat(selector.aliasOrName(), is(selectorName("nt:base"))); assertThat(selector.alias(), is(nullValue())); // WHERE ... And and = isAnd(query.constraint()); Comparison comparison1 = isComparison(and.left()); assertThat(comparison1.getOperand1(), is((DynamicOperand)nodePath(selectorName("nt:base")))); assertThat(comparison1.getOperand2(), is((StaticOperand)literal("/a/b/%"))); Not not = isNot(and.right()); Comparison comparison2a = isComparison(not.getConstraint()); assertThat(comparison2a.getOperand1(), is((DynamicOperand)nodePath(selectorName("nt:base")))); assertThat(comparison2a.getOperand2(), is((StaticOperand)literal("/a/b/%/%"))); }
/** * Tests that the child nodes (but no grandchild nodes) are returned. */ @Test public void shouldParseSelectWithChildAxisCriteria() { query = parse("SELECT * FROM [nt:base] WHERE PATH() LIKE '/a/b/%' AND NOT PATH() LIKE '/a/b/%/%'"); // SELECT * ... assertThat(query.columns().isEmpty(), is(true)); // FROM ... NamedSelector selector = (NamedSelector)query.source(); assertThat(selector.name(), is(selectorName("nt:base"))); assertThat(selector.aliasOrName(), is(selectorName("nt:base"))); assertThat(selector.alias(), is(nullValue())); // WHERE ... And and = isAnd(query.constraint()); Comparison comparison1 = isComparison(and.left()); assertThat(comparison1.getOperand1(), is((DynamicOperand)nodePath(selectorName("nt:base")))); assertThat(comparison1.getOperand2(), is((StaticOperand)literal("/a/b/%"))); Not not = isNot(and.right()); Comparison comparison2a = isComparison(not.getConstraint()); assertThat(comparison2a.getOperand1(), is((DynamicOperand)nodePath(selectorName("nt:base")))); assertThat(comparison2a.getOperand2(), is((StaticOperand)literal("/a/b/%/%"))); }
@Test public void shouldParseSelectStarFromEquijoinAndAdditionalCriteria() { query = parse("SELECT * FROM modetest:queryable, mix:referenceable WHERE modetest:queryable.jcr:path = mix:referenceable.jcr:path AND jcr:path LIKE '/testroot/someQueryableNodeD/%'"); // SELECT * ... assertThat(query.columns().isEmpty(), is(true)); // FROM ... Join join = isJoin(query.source()); assertThat(join.getLeft(), is((Source)namedSelector(selectorName("modetest:queryable")))); assertThat(join.getRight(), is((Source)namedSelector(selectorName("mix:referenceable")))); assertThat(join.type(), is(JoinType.INNER)); SameNodeJoinCondition joinCondition = isSameNodeJoinCondition(join.getJoinCondition()); assertThat(joinCondition.selector1Name(), is(selectorName("modetest:queryable"))); assertThat(joinCondition.selector2Name(), is(selectorName("mix:referenceable"))); assertThat(joinCondition.getSelector2Path(), is(nullValue())); // WHERE ... Comparison comparison = isComparison(query.constraint()); assertThat(comparison.getOperand1(), is((DynamicOperand)nodePath(selectorName("modetest:queryable")))); assertThat(comparison.getOperand2(), is((StaticOperand)literal("/testroot/someQueryableNodeD/%"))); }
@Test public void shouldParseSelectStarFromEquijoinAndAdditionalCriteria() { query = parse("SELECT * FROM [modetest:queryable] JOIN [mix:referenceable] ON ISSAMENODE([modetest:queryable],[mix:referenceable]) WHERE PATH([modetest:queryable]) LIKE '/testroot/someQueryableNodeD/%'"); // SELECT * ... assertThat(query.columns().isEmpty(), is(true)); // FROM ... Join join = isJoin(query.source()); assertThat(join.getLeft(), is((Source)namedSelector(selectorName("modetest:queryable")))); assertThat(join.getRight(), is((Source)namedSelector(selectorName("mix:referenceable")))); assertThat(join.type(), is(JoinType.INNER)); SameNodeJoinCondition joinCondition = isSameNodeJoinCondition(join.getJoinCondition()); assertThat(joinCondition.selector1Name(), is(selectorName("modetest:queryable"))); assertThat(joinCondition.selector2Name(), is(selectorName("mix:referenceable"))); assertThat(joinCondition.getSelector2Path(), is(nullValue())); // WHERE ... Comparison comparison = isComparison(query.constraint()); assertThat(comparison.getOperand1(), is((DynamicOperand)nodePath(selectorName("modetest:queryable")))); assertThat(comparison.getOperand2(), is((StaticOperand)literal("/testroot/someQueryableNodeD/%"))); }