/** 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;
  }