/** 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; }
/** * Create a page object to hold the results of the query. * * @param query - the query. * @param options - the fetch option. * @return the page representation of the query. */ private Page getPage(final Query query, final FetchOptions options) { final DatastoreService data = DatastoreServiceFactory.getDatastoreService(); final PreparedQuery p = data.prepare(query); final QueryResultIterator<Entity> iterator = p.asQueryResultIterator(options); final List<String> list = new ArrayList<String>(); Cursor start = null; while (iterator.hasNext()) { final Entity e = iterator.next(); // Sometimes I use String keys, so that needs to be // supported here. String id = e.getKey().getName(); if (id == null) { id = Long.toString(e.getKey().getId()); } // Get the property name we are sorting on so we can // grab its value. final String propertyName = query.getSortPredicates().get(0).getPropertyName(); final Object property = e.getProperty(propertyName); // Tack on the id so we can verify the order of the entities. list.add(property + "-" + id); // Set the start cursor to the first entity retrieved. if (start == null) { start = iterator.getCursor(); } } // Set the end cursor to the last entity retrieved. final Cursor end = iterator.getCursor(); // Create a new page to return. final Page page = new Page(list, start, end); return page; }