-
Notifications
You must be signed in to change notification settings - Fork 1
How to use the java query api
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("==========");
}