public ProjectionEntityQuery newProjectionQuery() { Preconditions.checkState(!projection.isEmpty(), "You must have projections to create a projection query"); final Builder builder = build(Query::newProjectionEntityQueryBuilder); Queries.addProjection(builder, projection); Queries.addDistinctOn(builder, distinctOnAll ? projection : distinctOn); return builder.build(); }
/** * The Builder api is programmer-hostile */ public static void addProjection(final ProjectionEntityQuery.Builder builder, final List<String> projection) { if (!projection.isEmpty()) { builder.addProjection(projection.get(0), projection.subList(1, projection.size()).toArray(new String[projection.size() - 1])); } }
Query<ProjectionEntity> scKeyProjectionQuery = Query.newProjectionEntityQueryBuilder() .addProjection("__key__") .setNamespace(NAMESPACE) .setKind(KIND1) .setFilter(PropertyFilter.hasAncestor(ROOT_KEY)) .build();
.setKind(_model.getKind()) .setProjection(_model.getExpiry()) .setFilter(CompositeFilter.and(PropertyFilter.eq(_model.getId(), id), PropertyFilter.eq(_model.getContextPath(), _context.getCanonicalContextPath()), PropertyFilter.eq(_model.getVhost(), _context.getVhost()))) .build();
Set<ExpiryInfo> info = new HashSet<>(); Query<ProjectionEntity> query = Query.newProjectionEntityQueryBuilder() .setKind(_model.getKind()) .setProjection(_model.getId(), _model.getLastNode(), _model.getExpiry()) .setFilter(CompositeFilter.and(PropertyFilter.gt(_model.getExpiry(), 0), PropertyFilter.le(_model.getExpiry(), now))) .setLimit(_maxResults) .build();
/** * Check to see if indexes are available, in which case * we can do more performant queries. * @return <code>true</code> if indexes are available */ protected boolean checkIndexes() { try { Query<ProjectionEntity> query = Query.newProjectionEntityQueryBuilder() .setKind(_model.getKind()) .setProjection(_model.getExpiry()) .setFilter(PropertyFilter.eq(_model.getId(), "-")) .build(); _datastore.run(query); return true; } catch (DatastoreException e) { //need to assume that the problem is the index doesn't exist, because there //is no specific code for that if (LOG.isDebugEnabled()) LOG.debug("Check for indexes", e); return false; } }
/** * Returns a new {@link StructuredQuery} builder for projection queries. * * <p>Example of creating and running a projection entity query. * * <pre>{@code * String kind = "my_kind"; * String property = "my_property"; * Query<ProjectionEntity> query = Query.newProjectionEntityQueryBuilder() * .setKind(kind) * .addProjection(property) * .build(); * QueryResults<ProjectionEntity> results = datastore.run(query); * // Use results * }</pre> */ public static ProjectionEntityQuery.Builder newProjectionEntityQueryBuilder() { return new ProjectionEntityQuery.Builder(); } }
@SuppressWarnings("unchecked") static <V> StructuredQuery<V> fromPb( ResultType<?> resultType, String namespace, com.google.datastore.v1.Query queryPb) { BuilderImpl<?, ?> builder; if (resultType.equals(ResultType.ENTITY)) { builder = new EntityQuery.Builder(); } else if (resultType.equals(ResultType.KEY)) { builder = new KeyQuery.Builder(); } else { builder = new ProjectionEntityQuery.Builder(); } return (StructuredQuery<V>) builder.setNamespace(namespace).mergeFrom(queryPb).build(); } }
@Override public Builder toBuilder() { return new Builder(this); } }
Query.newProjectionEntityQueryBuilder().setKind(KIND1).setProjection("__key__").build(); StructuredQuery<ProjectionEntity> scKeyOnlyProjectionQuery = Query.newProjectionEntityQueryBuilder() .setKind(KIND1) .setFilter(PropertyFilter.hasAncestor(ROOT_KEY)) .setProjection("__key__") .build(); Iterator<ProjectionEntity> results3 = getStronglyConsistentResults(scKeyOnlyProjectionQuery, keyOnlyProjectionQuery); .setKind(KIND2) .setProjection("age") .setFilter(PropertyFilter.gt("age", 18)) .setDistinctOn("age") .setOrderBy(OrderBy.asc("age")) .setLimit(10) .build(); .setKind(KIND2) .setFilter(PropertyFilter.hasAncestor(ROOT_KEY)) .setProjection("age") .setFilter(PropertyFilter.gt("age", 18)) .setDistinctOn("age") .setOrderBy(OrderBy.asc("age")) .setLimit(10) .build();
Query.newProjectionEntityQueryBuilder().setKind(KIND1).setProjection("__key__").build(); QueryResults<ProjectionEntity> results3 = datastore.run(keyOnlyProjectionQuery); assertTrue(results3.hasNext()); .setKind(KIND2) .setProjection("age") .setFilter(PropertyFilter.gt("age", 18)) .setDistinctOn("age") .setOrderBy(OrderBy.asc("age")) .setLimit(10) .build();
/** * Returns a new {@link StructuredQuery} builder for projection queries. * * <p>Example of creating and running a projection entity query. * * <pre>{@code * String kind = "my_kind"; * String property = "my_property"; * Query<ProjectionEntity> query = Query.newProjectionEntityQueryBuilder() * .setKind(kind) * .addProjection(property) * .build(); * QueryResults<ProjectionEntity> results = datastore.run(query); * // Use results * }</pre> */ public static ProjectionEntityQuery.Builder newProjectionEntityQueryBuilder() { return new ProjectionEntityQuery.Builder(); } }
/** Example of creating and running a projection entity query. */ // [TARGET newProjectionEntityQueryBuilder()] // [VARIABLE "my_kind"] // [VARIABLE "my_property"] public QueryResults<ProjectionEntity> newProjectionEntityQuery(String kind, String property) { // [START newProjectionEntityQuery] Query<ProjectionEntity> query = Query.newProjectionEntityQueryBuilder().setKind(kind).addProjection(property).build(); QueryResults<ProjectionEntity> results = datastore.run(query); // Use results // [END newProjectionEntityQuery] return results; } }
@SuppressWarnings("unchecked") static <V> StructuredQuery<V> fromPb( ResultType<?> resultType, String namespace, com.google.datastore.v1.Query queryPb) { BuilderImpl<?, ?> builder; if (resultType.equals(ResultType.ENTITY)) { builder = new EntityQuery.Builder(); } else if (resultType.equals(ResultType.KEY)) { builder = new KeyQuery.Builder(); } else { builder = new ProjectionEntityQuery.Builder(); } return (StructuredQuery<V>) builder.setNamespace(namespace).mergeFrom(queryPb).build(); } }
@Override public Builder toBuilder() { return new Builder(this); } }
@Test public void mergeFrom() { compareMergedQuery( ENTITY_QUERY, new EntityQuery.Builder().mergeFrom(ENTITY_QUERY.toPb()).build()); compareMergedQuery(KEY_QUERY, new KeyQuery.Builder().mergeFrom(KEY_QUERY.toPb()).build()); compareMergedQuery( PROJECTION_QUERY, new ProjectionEntityQuery.Builder().mergeFrom(PROJECTION_QUERY.toPb()).build()); }