com.google.appengine.api.search.SortExpression

Here are the examples of the java api class com.google.appengine.api.search.SortExpression taken from open source projects.

1. PlacesHelper#getPlaces()

Project: solutions-mobile-shopping-assistant-backend-java
File: PlacesHelper.java
static List<PlaceInfo> getPlaces(GeoPt location, long distanceInMeters, int resultCount) {
    // TODO(user): Use memcache
    String geoPoint = "geopoint(" + location.getLatitude() + ", " + location.getLongitude() + ")";
    String query = "distance(place_location, " + geoPoint + ") < " + distanceInMeters;
    String locExpr = "distance(place_location, " + geoPoint + ")";
    SortExpression sortExpr = SortExpression.newBuilder().setExpression(locExpr).setDirection(SortExpression.SortDirection.ASCENDING).setDefaultValueNumeric(distanceInMeters + 1).build();
    Query searchQuery = Query.newBuilder().setOptions(QueryOptions.newBuilder().setSortOptions(SortOptions.newBuilder().addSortExpression(sortExpr))).build(query);
    Results<ScoredDocument> results = getIndex().search(searchQuery);
    if (results.getNumberFound() == 0) {
        // geo-location doesn't work under dev_server
        if (environment.value() == Development) {
            // return all documents
            results = getIndex().search("value > 0");
        }
    }
    List<PlaceInfo> places = new ArrayList<PlaceInfo>();
    for (ScoredDocument document : results) {
        if (places.size() >= resultCount) {
            break;
        }
        GeoPoint p = document.getOnlyField("place_location").getGeoPoint();
        PlaceInfo place = new PlaceInfo();
        place.setplaceID(document.getOnlyField("id").getText());
        place.setName(document.getOnlyField("name").getText());
        place.setAddress(document.getOnlyField("address").getText());
        place.setLocation(new GeoPt((float) p.getLatitude(), (float) p.getLongitude()));
        // and use double comparison with epsilon set to 0.0001
        if (Math.abs(p.getLatitude()) <= 0.0001 && Math.abs(p.getLongitude()) <= 0.0001) {
            // set a fake distance of 5+ km
            place.setDistanceInKilometers(5 + places.size());
        } else {
            double distance = distanceInMeters / 1000;
            try {
                distance = getDistanceInKm(p.getLatitude(), p.getLongitude(), location.getLatitude(), location.getLongitude());
            } catch (Exception e) {
                log.warning("Exception when calculating a distance: " + e.getMessage());
            }
            place.setDistanceInKilometers(distance);
        }
        places.add(place);
    }
    return places;
}