@Override public String getOrder() { switch (order()) { case ASCENDING: return QueryObjectModelConstants.JCR_ORDER_ASCENDING; case DESCENDING: return QueryObjectModelConstants.JCR_ORDER_DESCENDING; } assert false; return null; }
@Override public String getOrder() { switch (order()) { case ASCENDING: return QueryObjectModelConstants.JCR_ORDER_ASCENDING; case DESCENDING: return QueryObjectModelConstants.JCR_ORDER_DESCENDING; } assert false; return null; }
@Override public void visit( Ordering ordering ) { ordering.getOperand().accept(this); append(' ').append(ordering.order().symbol()); }
@Override public void visit( Ordering ordering ) { ordering.getOperand().accept(this); append(' ').append(ordering.order().symbol()); }
@Test public void shouldParserOrderByWithTwoOrderings() { List<Ordering> orderBy = parser.parseOrderBy(tokens("ORDER BY NAME(tableA) ASC, SCORE(tableB) DESC"), typeSystem, mock(Source.class)); assertThat(orderBy.size(), is(2)); Ordering first = orderBy.get(0); assertThat(first.getOperand(), is(instanceOf(NodeName.class))); assertThat(first.order(), is(Order.ASCENDING)); Ordering second = orderBy.get(1); assertThat(second.getOperand(), is(instanceOf(FullTextSearchScore.class))); assertThat(second.order(), is(Order.DESCENDING)); }
@Test public void shouldParserOrderByWithOneOrdering() { List<Ordering> orderBy = parser.parseOrderBy(tokens("ORDER BY NAME(tableA) ASC"), typeSystem, mock(Source.class)); assertThat(orderBy.size(), is(1)); Ordering first = orderBy.get(0); assertThat(first.getOperand(), is(instanceOf(NodeName.class))); assertThat(first.order(), is(Order.ASCENDING)); }
@Test public void shouldParserOrderByWithMultipleOrderings() { List<Ordering> orderBy = parser.parseOrderBy(tokens("ORDER BY NAME(tableA) ASC, SCORE(tableB) DESC, LENGTH(tableC.id) ASC"), typeSystem, mock(Source.class)); assertThat(orderBy.size(), is(3)); Ordering first = orderBy.get(0); assertThat(first.getOperand(), is(instanceOf(NodeName.class))); assertThat(first.order(), is(Order.ASCENDING)); Ordering second = orderBy.get(1); assertThat(second.getOperand(), is(instanceOf(FullTextSearchScore.class))); assertThat(second.order(), is(Order.DESCENDING)); Ordering third = orderBy.get(2); assertThat(third.getOperand(), is(instanceOf(Length.class))); assertThat(third.order(), is(Order.ASCENDING)); }
/** * Create an {@link ExtractFromRow} instance that produces for given row a single object that can be used to sort all rows in * the specified order. * * @param ordering the specification of the sort order; may not be null or empty * @param sourceNamesByAlias the map of selector names keyed by their aliases; may not be null but may be empty * @param context the context in which the query is to be executed; may not be null * @param columns the result column definition; may not be null * @param sources the query sources for the repository; may not be null * @return the extractor; never null */ protected ExtractFromRow createSortingExtractor( Ordering ordering, Map<SelectorName, SelectorName> sourceNamesByAlias, QueryContext context, Columns columns, QuerySources sources ) { DynamicOperand operand = ordering.getOperand(); TypeFactory<?> defaultType = context.getTypeSystem().getStringFactory();// only when ordered column is residual or not // defined ExtractFromRow extractor = createExtractFromRow(operand, context, columns, sources, defaultType, false, false); return RowExtractors.extractorWith(extractor, ordering.order(), ordering.nullOrder()); }
@Test public void shouldParseOrderingFromDynamicOperandFollowedByAscendingKeyword() { Ordering ordering = parser.parseOrdering(tokens("NAME(tableA) ASC"), typeSystem, mock(Source.class)); assertThat(ordering.getOperand(), is(instanceOf(NodeName.class))); assertThat(ordering.order(), is(Order.ASCENDING)); }
@Test public void shouldParseOrderingFromDynamicOperandFollowedByDecendingKeyword() { Ordering ordering = parser.parseOrdering(tokens("NAME(tableA) DESC"), typeSystem, mock(Source.class)); assertThat(ordering.getOperand(), is(instanceOf(NodeName.class))); assertThat(ordering.order(), is(Order.DESCENDING)); }
@Test public void shouldParseOrderingFromDynamicOperandAndDefaultToAscendingWhenNotFollowedByAscendingOrDescendingKeyword() { Ordering ordering = parser.parseOrdering(tokens("NAME(tableA) OTHER"), typeSystem, mock(Source.class)); assertThat(ordering.getOperand(), is(instanceOf(NodeName.class))); assertThat(ordering.order(), is(Order.ASCENDING)); }
/** * Create an {@link ExtractFromRow} instance that produces for given row a single object that can be used to sort all rows in * the specified order. * * @param ordering the specification of the sort order; may not be null or empty * @param sourceNamesByAlias the map of selector names keyed by their aliases; may not be null but may be empty * @param context the context in which the query is to be executed; may not be null * @param columns the result column definition; may not be null * @param sources the query sources for the repository; may not be null * @return the extractor; never null */ protected ExtractFromRow createSortingExtractor( Ordering ordering, Map<SelectorName, SelectorName> sourceNamesByAlias, QueryContext context, Columns columns, QuerySources sources ) { DynamicOperand operand = ordering.getOperand(); TypeFactory<?> defaultType = context.getTypeSystem().getStringFactory();// only when ordered column is residual or not // defined ExtractFromRow extractor = createExtractFromRow(operand, context, columns, sources, defaultType, false, false); return RowExtractors.extractorWith(extractor, ordering.order(), ordering.nullOrder()); }
@Override public void visit( Ordering ordering ) { ordering.getOperand().accept(this); append(' ').append(ordering.order().symbol()); append(' ').append(ordering.nullOrder().symbol()); } }
@Override public void visit( Ordering ordering ) { ordering.getOperand().accept(this); append(' ').append(ordering.order().symbol()); append(' ').append(ordering.nullOrder().symbol()); } }
DynamicOperand newOperand = replaceViewReferences(context, operand, mappings, node); if (newOperand != operand) { ordering = new Ordering(newOperand, ordering.order(), ordering.nullOrder());
DynamicOperand newOperand = replaceViewReferences(context, operand, mappings, node); if (newOperand != operand) { ordering = new Ordering(newOperand, ordering.order(), ordering.nullOrder());
@Test public void shouldParseSelectWithOrderByClause() { query = parse("SELECT car:model FROM car:Car WHERE car:model IS NOT NULL ORDER BY car:model ASC"); // SELECT car:model ... assertThat(query.columns().size(), is(1)); assertThat(query.columns().get(0).selectorName(), is(selectorName("car:Car"))); assertThat(query.columns().get(0).getColumnName(), is("car:model")); assertThat(query.columns().get(0).getPropertyName(), is("car:model")); // FROM ... NamedSelector selector = (NamedSelector)query.source(); assertThat(selector.name(), is(selectorName("car:Car"))); assertThat(selector.aliasOrName(), is(selectorName("car:Car"))); assertThat(selector.alias(), is(nullValue())); // WHERE ... PropertyExistence constraint = isPropertyExistence(query.constraint()); assertThat(constraint.getPropertyName(), is("car:model")); assertThat(constraint.selectorName(), is(selectorName("car:Car"))); // ORDER BY ... assertThat(query.orderings().size(), is(1)); Ordering ordering = query.orderings().get(0); assertThat(ordering.order(), is(Order.ASCENDING)); assertThat(ordering.getOperand(), is((DynamicOperand)propertyValue(selectorName("car:Car"), "car:model"))); }
@Test public void shouldParseSelectWithOrderByClause() { query = parse("SELECT [car:model] FROM [car:Car] WHERE [car:model] IS NOT NULL ORDER BY [car:model] ASC"); // SELECT car:model ... assertThat(query.columns().size(), is(1)); assertThat(query.columns().get(0).selectorName(), is(selectorName("car:Car"))); assertThat(query.columns().get(0).getColumnName(), is("car:model")); assertThat(query.columns().get(0).getPropertyName(), is("car:model")); // FROM ... NamedSelector selector = (NamedSelector)query.source(); assertThat(selector.name(), is(selectorName("car:Car"))); assertThat(selector.aliasOrName(), is(selectorName("car:Car"))); assertThat(selector.alias(), is(nullValue())); // WHERE ... PropertyExistence constraint = isPropertyExistence(query.constraint()); assertThat(constraint.getPropertyName(), is("car:model")); assertThat(constraint.selectorName(), is(selectorName("car:Car"))); // ORDER BY ... assertThat(query.orderings().size(), is(1)); Ordering ordering = query.orderings().get(0); assertThat(ordering.order(), is(Order.ASCENDING)); assertThat(ordering.getOperand(), is((DynamicOperand)propertyValue(selectorName("car:Car"), "car:model"))); }