private static boolean canSortByProperty(List<OrderEntry> sortOrder) { if (sortOrder.isEmpty()) { return false; } // If jcr:score is the only sort order then opt out return sortOrder.size() != 1 || !JCR_SCORE.equals(sortOrder.get(0).getPropertyName()); }
private List<OrderEntry> createSortOrder(IndexDefinition.IndexingRule rule) { if (sortOrder == null) { return Collections.emptyList(); } List<OrderEntry> orderEntries = newArrayListWithCapacity(sortOrder.size()); for (OrderEntry o : sortOrder) { PropertyDefinition pd = rule.getConfig(o.getPropertyName()); if (pd != null && pd.ordered && o.getPropertyType() != null && !o.getPropertyType().isArray()) { orderEntries.add(o); // can manage any order desc/asc result.sortedProperties.add(pd); } else if (o.getPropertyName().equals(IndexDefinition.NATIVE_SORT_ORDER.getPropertyName())) { // Supports jcr:score descending natively orderEntries.add(IndexDefinition.NATIVE_SORT_ORDER); } for (PropertyDefinition functionIndex : rule.getFunctionRestrictions()) { if (o.getPropertyName().equals(functionIndex.function)) { // can manage any order desc/asc orderEntries.add(o); result.sortedProperties.add(functionIndex); } } } //TODO Should we return order entries only when all order clauses are satisfied return orderEntries; }
private static Sort getSort(IndexPlan plan) { List<OrderEntry> sortOrder = plan.getSortOrder(); if (sortOrder == null || sortOrder.isEmpty()) { return null; } sortOrder = removeNativeSort(sortOrder); List<SortField> fieldsList = newArrayListWithCapacity(sortOrder.size()); PlanResult planResult = getPlanResult(plan); for (int i = 0; i < sortOrder.size(); i++) { OrderEntry oe = sortOrder.get(i); PropertyDefinition pd = planResult.getOrderedProperty(i); boolean reverse = oe.getOrder() != OrderEntry.Order.ASCENDING; String propName = oe.getPropertyName(); propName = FieldNames.createDocValFieldName(propName); fieldsList.add(new SortField(propName, toLuceneSortType(oe, pd), reverse)); } if (fieldsList.isEmpty()) { return null; } else { return new Sort(fieldsList.toArray(new SortField[0])); } }
if (JcrConstants.JCR_PATH.equals(orderEntry.getPropertyName())) { sortingField = partialEscape(configuration.getPathField()).toString(); } else if (JcrConstants.JCR_SCORE.equals(orderEntry.getPropertyName())) { sortingField = "score"; } else { if (orderEntry.getPropertyName().indexOf('/') >= 0) { log.warn("cannot sort on relative properties, ignoring {} clause", orderEntry); continue; // sorting by relative properties not supported until index time aggregation is supported sortingField = partialEscape(getSortingField(orderEntry.getPropertyType().tag(), orderEntry.getPropertyName())).toString();
if (JcrConstants.JCR_PATH.equals(orderEntry.getPropertyName())) { sortingField = partialEscape(configuration.getPathField()).toString(); } else if (JcrConstants.JCR_SCORE.equals(orderEntry.getPropertyName())) { sortingField = "score"; } else { if (orderEntry.getPropertyName().indexOf('/') >= 0) { log.warn("cannot sort on relative properties, ignoring {} clause", orderEntry); continue; // sorting by relative properties not supported until index time aggregation is supported sortingField = partialEscape(getSortingField(orderEntry.getPropertyType().tag(), orderEntry.getPropertyName())).toString();
PropertyDefinition pd = planResult.getOrderedProperty(i); PropertyRestriction orderRest = new PropertyRestriction(); orderRest.propertyName = oe.getPropertyName(); Query q = createQuery(oe.getPropertyName(), orderRest, pd); if (q != null) { qs.add(q);
PropertyDefinition pd = planResult.getOrderedProperty(i); PropertyRestriction orderRest = new PropertyRestriction(); orderRest.propertyName = oe.getPropertyName(); Query q = createQuery(oe.getPropertyName(), orderRest, pd); if (q != null) { qs.add(q);
if (!pn.equals(e.getPropertyName())) {
if (!pn.equals(e.getPropertyName())) {
if (!pn.equals(e.getPropertyName())) {
private static Sort getSort(IndexPlan plan) { List<OrderEntry> sortOrder = plan.getSortOrder(); if (sortOrder == null || sortOrder.isEmpty()) { return null; } sortOrder = removeNativeSort(sortOrder); List<SortField> fieldsList = newArrayListWithCapacity(sortOrder.size()); PlanResult planResult = getPlanResult(plan); for (int i = 0; i < sortOrder.size(); i++) { OrderEntry oe = sortOrder.get(i); PropertyDefinition pd = planResult.getOrderedProperty(i); boolean reverse = oe.getOrder() != OrderEntry.Order.ASCENDING; String propName = oe.getPropertyName(); propName = FieldNames.createDocValFieldName(propName); fieldsList.add(new SortField(propName, toLuceneSortType(oe, pd), reverse)); } if (fieldsList.isEmpty()) { return null; } else { return new Sort(fieldsList.toArray(new SortField[0])); } }
private static SortField.Type toLuceneSortType(OrderEntry oe, PropertyDefinition defn) { Type<?> t = oe.getPropertyType(); checkState(t != null, "Type cannot be null"); checkState(!t.isArray(), "Array types are not supported"); int type = getPropertyType(defn, oe.getPropertyName(), t.tag()); switch (type) { case PropertyType.LONG: case PropertyType.DATE: return SortField.Type.LONG; case PropertyType.DOUBLE: return SortField.Type.DOUBLE; default: //TODO Check about SortField.Type.STRING_VAL return SortField.Type.STRING; } }
private static SortField.Type toLuceneSortType(OrderEntry oe, PropertyDefinition defn) { Type<?> t = oe.getPropertyType(); checkState(t != null, "Type cannot be null"); checkState(!t.isArray(), "Array types are not supported"); int type = getPropertyType(defn, oe.getPropertyName(), t.tag()); switch (type) { case PropertyType.LONG: case PropertyType.DATE: return SortField.Type.LONG; case PropertyType.DOUBLE: return SortField.Type.DOUBLE; default: //TODO Check about SortField.Type.STRING_VAL return SortField.Type.STRING; } }
/** * Identifies the default sort order used by the index (@jcr:score descending) * * @param oe order entry * @return */ private static boolean isNativeSort(OrderEntry oe) { return oe.getPropertyName().equals(NATIVE_SORT_ORDER.getPropertyName()); }
/** * Identifies the default sort order used by the index (@jcr:score descending) * * @param oe order entry * @return */ private static boolean isNativeSort(OrderEntry oe) { return oe.getPropertyName().equals(NATIVE_SORT_ORDER.getPropertyName()); }