Skip to content

How to use the java query api

Carsten Hufe edited this page Dec 20, 2013 · 3 revisions

First before you start, you should add the JumboDB coonnectors to your project as explained in How to use the JumboDB connectors.

Done? Usally the Java Query API is exactly the same as the JSON queries explained under: Sample queries for twitter data. The reason is there is a Java bean called JumboQuery which will be translated and parsed directly to JSON via Jackson mapper.

So lets start. I will show the same examples as you have seen on the JSON queries page. For the Mapping I'm going to use a Map and not a specific bean for simplicity.

Query on a geo spatial index with a specific point and range of 5000 meters:

JumboQueryConnection jumboDriver = new JumboQueryConnection("localhost", 12002);
JumboQuery query = new JumboQuery();

// query
query.addIndexQuery("coordinates", 
     Arrays.asList(new QueryClause(QueryOperation.GEO_WITHIN_RANGE_METER, 
         Arrays.asList(Arrays.asList(48.140, 11.562), 5000))));
List<Map> daily = jumboDriver.find("twitter", Map.class, query);
for (Map map : daily) {
    System.out.println(map.get("created_at") + " (" + ((Map)map.get("user")).get("screen_name") + ")" + " -> " + map.get("text"));
    System.out.println("==========");
}

Query on a geospatial index for a boundary box:

JumboQueryConnection jumboDriver = new JumboQueryConnection("localhost", 12002);
JumboQuery query = new JumboQuery();

// query
query.addIndexQuery("coordinates", 
     Arrays.asList(new QueryClause(QueryOperation.GEO_BOUNDARY_BOX, 
        Arrays.asList(Arrays.asList(26.29859, 44.79119), Arrays.asList(26.2869, 44.8163)))));

List<Map> daily = jumboDriver.find("twitter", Map.class, query);
for (Map map : daily) {
    System.out.println(map.get("created_at") + " (" + ((Map)map.get("user")).get("screen_name") + ")" + " -> " + map.get("text"));
    System.out.println("==========");
}

Query on a numeric index: User followers count must be bigger than 10000000

JumboQueryConnection jumboDriver = new JumboQueryConnection("localhost", 12002);
JumboQuery query = new JumboQuery();

// query
query.addIndexQuery("user_followers_count", Arrays.asList(new QueryClause(QueryOperation.GT, 10000000)));

List<Map> daily = jumboDriver.find("twitter", Map.class, query);
for (Map map : daily) {
    System.out.println(map.get("created_at") + " (" + ((Map)map.get("user")).get("screen_name") + ")" + " -> " + map.get("text"));
    System.out.println("==========");
}

Query on a datetime index with between:

JumboQueryConnection jumboDriver = new JumboQueryConnection("localhost", 12002);
JumboQuery query = new JumboQuery();

// query
query.addIndexQuery("created_at",  
    Arrays.asList(new QueryClause(QueryOperation.BETWEEN, 
       Arrays.asList("2013-05-02 22:13:00", "2013-05-02 22:15:00"))));


List<Map> daily = jumboDriver.find("twitter", Map.class, query);
for (Map map : daily) {
    System.out.println(map.get("created_at") + " (" + ((Map)map.get("user")).get("screen_name") + ")" + " -> " + map.get("text"));
    System.out.println("==========");
}

Query on a non-index JSON field (field names separated by point), do a full scan, User followers count must be bigger than 10000000.

JumboQueryConnection jumboDriver = new JumboQueryConnection("localhost", 12002);
JumboQuery query = new JumboQuery();

// query
query.addJsonQuery("user.followers_count", Arrays.asList(new QueryClause(QueryOperation.GT, 10000)));

List<Map> daily = jumboDriver.find("twitter", Map.class, query);
for (Map map : daily) {
    System.out.println(map.get("created_at") + " (" + ((Map)map.get("user")).get("screen_name") + ")" + " -> " + map.get("text"));
    System.out.println("==========");
}

Combining queries on indexes and JSON fields (first the index will be queried, after that the json queries will be applied on the result set).

JumboQueryConnection jumboDriver = new JumboQueryConnection("localhost", 12002);
JumboQuery query = new JumboQuery();

// query
query.addIndexQuery("created_at",  Arrays.asList(new QueryClause(QueryOperation.GT, "2013-05-03 00:00:59")));
query.addJsonQuery("user.followers_count", Arrays.asList(new QueryClause(QueryOperation.GT, 10000)));

List<Map> daily = jumboDriver.find("twitter", Map.class, query);
for (Map map : daily) {
    System.out.println(map.get("created_at") + " (" + ((Map)map.get("user")).get("screen_name") + ")" + " -> " + map.get("text"));
    System.out.println("==========");
}

Query on multiple JSON fields (query on two points with a range of 100000 meters, different clauses are executed as or, but different jsonQueries are executed as and. After the result was found for the two points and ranges, the result will be additionally filtered by users.followers_count) If you query multiple indexes, the jsonQueries will be applied to all indexes!

JumboQueryConnection jumboDriver = new JumboQueryConnection("localhost", 12002);
JumboQuery query = new JumboQuery();

// query
query.addJsonQuery("geo.coordinates", Arrays.asList(
     new QueryClause(QueryOperation.GEO_WITHIN_RANGE_METER, 
            Arrays.asList(Arrays.asList(48.140, 11.562), 100000)), 
     new QueryClause(QueryOperation.GEO_WITHIN_RANGE_METER, 
            Arrays.asList(Arrays.asList(26.29859, 44.79119), 100000))));
query.addJsonQuery("user.followers_count", Arrays.asList(new QueryClause(QueryOperation.GT, 10000)));

List<Map> daily = jumboDriver.find("twitter", Map.class, query);
for (Map map : daily) {
    System.out.println(map.get("created_at") + " (" + ((Map)map.get("user")).get("screen_name") + ")" + " -> " + map.get("text"));
    System.out.println("==========");
}

Subqueries, find all datasets within a range of 100000 meters with more than 10000 followers. The full scan will only be executed on datasets which exactly matches the queried index, because the scan is a child of the index queries. This is usally more performant than querying two indexes and let the database merge the result.

JumboQueryConnection jumboDriver = new JumboQueryConnection("localhost", 12002);
JumboQuery query = new JumboQuery();

// query
JsonQuery subQuery = new JsonQuery("user.followers_count", 
         Arrays.asList(new QueryClause(QueryOperation.GT, 10000)));
query.addIndexQuery("coordinates", 
     Arrays.asList(new QueryClause(QueryOperation.GEO_WITHIN_RANGE_METER, 
         Arrays.asList(Arrays.asList(48.132, 11.560), 100000), Arrays.asList(subQuery))));

List<Map> daily = jumboDriver.find("twitter", Map.class, query);
for (Map map : daily) {
    System.out.println(map.get("created_at") + " (" + ((Map)map.get("user")).get("screen_name") + ")" + " -> " + map.get("text"));
    System.out.println("==========");
}