// 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());
  }