private static boolean sortAlreadyExists(String prop, Query.SortDirection dir, Query datastoreQuery) { for (Query.SortPredicate sp : datastoreQuery.getSortPredicates()) { if (sp.getPropertyName().equals(prop) && sp.getDirection() == dir) { return true; } } return false; }
List<SortPredicate> sortPreds = primaryDatastoreQuery.getSortPredicates(); if (sortPreds.size() > 0) { str.append(" Sort : ");
SortPredicate[] sorts = this.actual.getSortPredicates().toArray(new SortPredicate[this.actual.getSortPredicates().size()]); Arrays.sort(sorts, new Comparator<SortPredicate>() { @Override for (SortPredicate sort: this.actual.getSortPredicates())
private void validateJoinQuery(QueryData qd, DatastoreQuery query, String joinSortProp) { // all filters on the primary must be equality for (Query.FilterPredicate fp : qd.primaryDatastoreQuery.getFilterPredicates()) { if (fp.getOperator() != Query.FilterOperator.EQUAL) { throw query.new UnsupportedDatastoreFeatureException( "Filter on property '" + fp.getPropertyName() + "' uses operator '" + fp.getOperator() + "'. Joins are only supported when all filters are 'equals' filters."); } } // all filters on the join must be equality for (Query.FilterPredicate fp : qd.joinQuery.getFilterPredicates()) { if (fp.getOperator() != Query.FilterOperator.EQUAL) { throw query.new UnsupportedDatastoreFeatureException( "Filter on property '" + fp.getPropertyName() + "' uses operator '" + fp.getOperator() + "'. Joins are only supported when all filters are 'equals' filters."); } } List<Query.SortPredicate> primarySorts = qd.primaryDatastoreQuery.getSortPredicates(); // There must be 0 or 1 sort orders total. // If there is a sort order it must be on the join column in ascending order. // TODO(maxr): support sorting by join column in descending order if (primarySorts.size() > 1 || !qd.joinQuery.getSortPredicates().isEmpty() || (!primarySorts.isEmpty() && (!primarySorts.get(0).getPropertyName().equals(joinSortProp) || primarySorts.get(0).getDirection() != Query.SortDirection.ASCENDING))) { throw query.new UnsupportedDatastoreFeatureException( "Joins can only be sorted by the join column in " + "ascending order (in this case '" + joinSortProp +"')"); } }
@Test public void testSortPredicates() { Query query = new Query(kindName, rootKey); query.addSort("intData", Query.SortDirection.DESCENDING); List<Entity> es = service.prepare(query).asList(fo); assertEquals((long) 40, es.get(0).getProperty("intData")); List<Query.SortPredicate> qsp = query.getSortPredicates(); assertEquals("check SortPredicate name", "intData", qsp.get(0).getPropertyName()); assertEquals("check SortPredicate direction", Query.SortDirection.DESCENDING, qsp.get(0).getDirection()); }
/** * Make a new Query object that is exactly like the old. Too bad Query isn't Cloneable. */ protected com.google.appengine.api.datastore.Query cloneRawQuery(com.google.appengine.api.datastore.Query orig) { com.google.appengine.api.datastore.Query copy = new com.google.appengine.api.datastore.Query(orig.getKind(), orig.getAncestor()); for (FilterPredicate filter: orig.getFilterPredicates()) copy.addFilter(filter.getPropertyName(), filter.getOperator(), filter.getValue()); for (SortPredicate sort: orig.getSortPredicates()) copy.addSort(sort.getPropertyName(), sort.getDirection()); // This should be impossible but who knows what might happen in the future if (orig.isKeysOnly()) copy.setKeysOnly(); return copy; }
String keyProperty = qd.primaryDatastoreQuery.getSortPredicates().get(0).getPropertyName(); Iterable<Entity> primaryResult; Iterator<Entity> joinResult;
qd.primaryDatastoreQuery.getSortPredicates().isEmpty()) {