// Search for nearby places @Override public CursorPage<DProduct, String> searchForNearby( int pageSize, String cursor, Float latitude, Float longitude, int radius, RnrService.SortOrder sortOrder) { // Build the query string String queryString = String.format("distance(location, geopoint(%f, %f)) < %d", latitude, longitude, radius); // Sort expression SortExpression sortExpression = null; switch (sortOrder) { case DISTANCE: String sortString = String.format("distance(location, geopoint(%f, %f))", latitude, longitude); sortExpression = SortExpression.newBuilder() .setExpression(sortString) .setDirection(SortExpression.SortDirection.ASCENDING) .setDefaultValueNumeric(radius + 1) .build(); break; case TOP_RATED: sortExpression = SortExpression.newBuilder() .setExpression("averageRating") .setDirection(SortExpression.SortDirection.DESCENDING) .setDefaultValue("") .build(); break; case MOST_LIKED: sortExpression = SortExpression.newBuilder() .setExpression("likeCount") .setDirection(SortExpression.SortDirection.DESCENDING) .setDefaultValue("") .build(); break; case MOST_THUMBS_UP: sortExpression = SortExpression.newBuilder() .setExpression("thumbsUp") .setDirection(SortExpression.SortDirection.DESCENDING) .setDefaultValue("") .build(); break; } // Options QueryOptions options = null; QueryOptions.Builder builder = QueryOptions.newBuilder() .setSortOptions(SortOptions.newBuilder().addSortExpression(sortExpression)) .setLimit(pageSize); if (null != cursor) builder.setCursor(com.google.appengine.api.search.Cursor.newBuilder().build(cursor)); // Build query com.google.appengine.api.search.Query query = com.google.appengine.api.search.Query.newBuilder().setOptions(options).build(queryString); return searchInIndexWithQuery(query, getLocationIndex()); }