@Override public Set<String> getRootPipelinesDisplayName() { Query query = new Query(JobRecord.DATA_STORE_KIND); query.addProjection( new PropertyProjection(JobRecord.ROOT_JOB_DISPLAY_NAME, String.class)); query.setDistinct(true); final PreparedQuery preparedQuery = dataStore.prepare(query); return tryFiveTimes(new Operation<Set<String>>("getRootPipelinesDisplayName") { @Override public Set<String> call() { Set<String> pipelines = new LinkedHashSet<>(); for (Entity entity : preparedQuery.asIterable()) { pipelines.add((String) entity.getProperty(JobRecord.ROOT_JOB_DISPLAY_NAME)); } return pipelines; } }); }
query.addProjection(new PropertyProjection(property, null));
@Test public void testQueryOrder() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("intData", Integer.class)); query.addSort("stringData", Query.SortDirection.DESCENDING); List<Entity> results = service.prepare(query).asList(fetchOption); assertEquals(count, results.size()); int first = new Integer(results.get(0).getProperty("intData").toString()); int last = new Integer(results.get(count - 1).getProperty("intData").toString()); assertTrue(first > last); }
@Test public void testListQuery() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringList", String.class)); query.addProjection(new PropertyProjection("intList", Integer.class)); List<Entity> results = service.prepare(query).asList(fetchOption); // Distinct stringList data 2 * Distinct intList data 3 * entity's count 10 assertEquals(60, results.size()); Entity e = results.get(0); assertEquals(2, e.getProperties().size()); assertTrue(e.getProperties().containsKey("stringList")); assertTrue(e.getProperties().containsKey("intList")); }
@Test(expected = IllegalArgumentException.class) public void testWrongType() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringData", Integer.class)); service.prepare(query).asIterator(fetchOption).next(); }
@Test public void testProjection() { Query query = new Query(kindName, rootKey); Projection pp = new PropertyProjection("stringData", String.class); assertEquals("stringData", pp.getName()); query.addProjection(pp); assertEquals(1, query.getProjections().size()); pp = new PropertyProjection("intData", Integer.class); query.addProjection(pp); for (Projection p : query.getProjections()) { String pName = p.getName(); assertTrue(pName.endsWith("stringData") || pName.endsWith("intData")); } }
private void checkQueryType(String property, Class<?> type) { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection(property, type)); String sql = "SELECT " + property + " FROM " + kindName + " WHERE __ancestor__ is " + rootKey; assertEquals(sql.toLowerCase(), query.toString().toLowerCase()); List<Entity> results = service.prepare(query).asList(fetchOption); for (Entity e : results) { assertEquals(1, e.getProperties().size()); assertTrue(e.getProperties().containsKey(property)); } }
@Test public void testBasicQuery() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringData", String.class)); query.addProjection(new PropertyProjection("intData", Integer.class)); String sql = "SELECT stringData, intData FROM " + kindName + " WHERE __ancestor__ is " + rootKey; assertEquals(sql.toLowerCase(), query.toString().toLowerCase()); List<Entity> results = service.prepare(query).asList(fetchOption); assertEquals(count, results.size()); for (Entity e : results) { assertEquals(2, e.getProperties().size()); assertTrue(e.getProperties().containsKey("stringData")); assertTrue(e.getProperties().containsKey("intData")); } }
private void checkQueryWithLimit(int limit) { FetchOptions fo = FetchOptions.Builder.withLimit(limit); Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringData", String.class)); List<Entity> results = service.prepare(query).asList(fo); assertEquals(limit, results.size()); } }
@Test public void testQueryFilter() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringData", String.class)); query.setFilter(new FilterPredicate("intData", FilterOperator.NOT_EQUAL, 50)); query.addSort("intData"); List<Entity> results = service.prepare(query).asList(fetchOption); assertEquals(count - 1, results.size()); for (Entity e : results) { assertTrue(e.getProperty("stringData").toString().contains("5") == false); } }
@Test public void testDistinctMix() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringData", String.class)); query.addProjection(new PropertyProjection("floatData", Float.class)); query.setDistinct(true); assertEquals(7, service.prepare(query).countEntities(fo)); assertTrue(query.getDistinct()); // distinct false query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringData", String.class)); query.addProjection(new PropertyProjection("floatData", Float.class)); query.setDistinct(false); assertEquals(count, service.prepare(query).countEntities(fo)); assertFalse(query.getDistinct()); }
@Test public void testCount() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringData", String.class)); assertEquals(count, service.prepare(query).countEntities(fetchOption)); }
protected List<Entity> doQuery(String kind, String pName, Class<?> type, boolean indexed) { FetchOptions fo = FetchOptions.Builder.withDefaults(); Query query = new Query(kind, rootKey); if (indexed) { query.addProjection(new PropertyProjection(pName, type)); query.addSort(pName); } return service.prepare(query).asList(fo); }
@Test public void testProjectionQueryOperatingOnlyOnASinglePropertyDoesNotRequireConfiguredIndex() throws Exception { executeQuery(new Query("Unindexed") .addProjection(new PropertyProjection("someProperty", null))); executeQuery(new Query("Unindexed") .addProjection(new PropertyProjection("someProperty", null)) .setFilter(new Query.FilterPredicate("someProperty", GREATER_THAN, "a"))); executeQuery(new Query("Unindexed") .addProjection(new PropertyProjection("someProperty", null)) .setFilter(new Query.FilterPredicate("someProperty", GREATER_THAN, "a")) .addSort("someProperty")); executeQuery(new Query("Unindexed") .addProjection(new PropertyProjection("someProperty", null)) .setFilter(new Query.FilterPredicate("someProperty", GREATER_THAN, "a")) .addSort("someProperty", Query.SortDirection.DESCENDING)); }
@Test public void testDistinctFilter() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringData", String.class)); query.addProjection(new PropertyProjection("floatData", Float.class)); query.setFilter(new FilterPredicate("stringData", Query.FilterOperator.NOT_EQUAL, "string1")); query.addSort("stringData", Query.SortDirection.DESCENDING); query.setDistinct(true); assertEquals(5, service.prepare(query).countEntities(fo)); assertTrue(query.getDistinct()); }
@Test public void testDistinctSort() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringData", String.class)); query.addProjection(new PropertyProjection("floatData", Float.class)); query.addSort("stringData", Query.SortDirection.DESCENDING); query.setDistinct(true); assertEquals(7, service.prepare(query).countEntities(fo)); assertTrue(query.getDistinct()); query.addSort("floatData", Query.SortDirection.DESCENDING); assertEquals(7, service.prepare(query).countEntities(fo)); }
@Test public void testDistinctStr() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringData", String.class)); query.setDistinct(true); assertTrue(query.getDistinct()); // distinct false query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringData", String.class)); query.setDistinct(false); assertEquals(count, service.prepare(query).countEntities(fo)); assertFalse(query.getDistinct()); }
@Test public void testDistinctFilter2() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("stringData", String.class)); query.addProjection(new PropertyProjection("floatData", Float.class)); query.setFilter(new FilterPredicate("stringData", Query.FilterOperator.GREATER_THAN, "string0")); query.addSort("stringData", Query.SortDirection.DESCENDING); query.addSort("floatData", Query.SortDirection.DESCENDING); query.setDistinct(true); assertEquals(2, service.prepare(query).countEntities(fo)); assertTrue(query.getDistinct()); } }
@Test public void testWithPropertyProjection() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("geoptData", GeoPt.class)); Filter filter1 = Query.CompositeFilterOperator.or( Query.FilterOperator.LESS_THAN.of("intList", 5), Query.FilterOperator.GREATER_THAN.of("intList", 90)); Filter filter2 = Query.FilterOperator.EQUAL.of("intList", 52); query.setFilter(Query.CompositeFilterOperator.and(filter1, filter2)); // sql statement String sql = "SELECT geoptData FROM " + kindName; sql += " WHERE ((intList < 5 or intList > 90) AND intList = 52)"; sql += " AND __ancestor__ is " + rootKey; assertEquals(sql.toLowerCase(), query.toString().toLowerCase()); // check query result List<Entity> results = service.prepare(query).asList(fo); Assert.assertTrue(results.size() > 0); assertEquals(new GeoPt((float) (2.12), (float) (2.98)), results.get(0).getProperty("geoptData")); for (Entity e : results) { assertEquals(1, e.getProperties().size()); assertTrue(e.getProperties().containsKey("geoptData")); } }
@Test public void testDistinctNum() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("floatData", Float.class)); query.setDistinct(true); assertEquals(4, service.prepare(query).countEntities(fo)); assertTrue(query.getDistinct()); query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("floatData", Float.class)); query.setDistinct(false); assertEquals(count, service.prepare(query).countEntities(fo)); assertFalse(query.getDistinct()); }