private static PartitionId.Builder forNamespace(@Nullable String namespace) { PartitionId.Builder partitionBuilder = PartitionId.newBuilder(); // Namespace either being null or empty represents the default namespace. // Datastore Client libraries expect users to not set the namespace proto field in // either of these cases. if (!Strings.isNullOrEmpty(namespace)) { partitionBuilder.setNamespaceId(namespace); } return partitionBuilder; }
/** * Get key */ public Key getKey(String name) { Key.Builder keyBuilder = Key.newBuilder(); // Set namespace PartitionId partitionId = PartitionId.newBuilder() .setProjectId(projectId).setNamespaceId(namespace).build(); keyBuilder.setPartitionId(partitionId); // Set parent paths if (parents != null && parents.size() > 0) { for (String parentKey : parents.keySet()) { Key.PathElement.Builder parentPath = Key.PathElement.newBuilder().setKind(parentKey).setName(parents.get(parentKey)); keyBuilder.addPath(parentPath); } } // Set main kind Key.PathElement.Builder path = Key.PathElement.newBuilder().setKind(kind).setName(name); keyBuilder.addPath(path); return keyBuilder.build(); }
/** A helper function to create the ancestor key for all created and queried entities. */ static Key makeAncestorKey(@Nullable String namespace, String kind, String ancestor) { Key.Builder keyBuilder = makeKey(kind, ancestor); if (namespace != null) { keyBuilder.getPartitionIdBuilder().setNamespaceId(namespace); } return keyBuilder.build(); }
if (namespace() != null && namespace().get() != null) { keyBuilder.setPartitionId( PartitionId.newBuilder().setProjectId("").setNamespaceId(namespace().get()));
@Override public ListenableFuture<QueryResult> executeAsync(final Query statement, final ListenableFuture<TransactionResult> txn) { final ListenableFuture<Response> httpResponse = Futures.transformAsync(txn, result -> { final String namespace = config.getNamespace(); final RunQueryRequest.Builder request = RunQueryRequest.newBuilder() .setQuery(statement.getPb(namespace != null ? namespace : "")); if (namespace != null) { request.setPartitionId(PartitionId.newBuilder().setNamespaceId(namespace)); } final ByteString transaction = result.getTransaction(); if (transaction != null) { request.setReadOptions(ReadOptions.newBuilder().setTransaction(transaction)); } final ProtoHttpContent payload = new ProtoHttpContent(request.build()); return ListenableFutureAdapter.asGuavaFuture(prepareRequest("runQuery", payload).execute()); }, MoreExecutors.directExecutor()); return Futures.transformAsync(httpResponse, response -> { if (!isSuccessful(response.getStatusCode())) { throw new DatastoreException(response.getStatusCode(), response.getResponseBody()); } final RunQueryResponse query = RunQueryResponse.parseFrom(streamResponse(response)); return Futures.immediateFuture(QueryResult.build(query)); }, MoreExecutors.directExecutor()); } }
/** * Build an entity for the given ancestorKey, kind, namespace and value. * * @param largePropertySize if greater than 0, add an unindexed property of the given size. */ static Entity makeEntity( Long value, Key ancestorKey, String kind, @Nullable String namespace, int largePropertySize) { Entity.Builder entityBuilder = Entity.newBuilder(); Key.Builder keyBuilder = makeKey(ancestorKey, kind, UUID.randomUUID().toString()); // NOTE: Namespace is not inherited between keys created with DatastoreHelper.makeKey, so // we must set the namespace on keyBuilder. TODO: Once partitionId inheritance is added, // we can simplify this code. if (namespace != null) { keyBuilder.getPartitionIdBuilder().setNamespaceId(namespace); } entityBuilder.setKey(keyBuilder.build()); entityBuilder.putProperties("value", makeValue(value).build()); if (largePropertySize > 0) { entityBuilder.putProperties( "unindexed_value", makeValue(new String(new char[largePropertySize]).replace("\0", "A")) .setExcludeFromIndexes(true) .build()); } return entityBuilder.build(); }
QueryResultsImpl( DatastoreImpl datastore, com.google.datastore.v1.ReadOptions readOptionsPb, Query<T> query) { this.datastore = datastore; this.readOptionsPb = readOptionsPb; this.query = query; queryResultType = query.getType(); com.google.datastore.v1.PartitionId.Builder pbBuilder = com.google.datastore.v1.PartitionId.newBuilder(); pbBuilder.setProjectId(datastore.getOptions().getProjectId()); if (query.getNamespace() != null) { pbBuilder.setNamespaceId(query.getNamespace()); } else if (datastore.getOptions().getNamespace() != null) { pbBuilder.setNamespaceId(datastore.getOptions().getNamespace()); } partitionIdPb = pbBuilder.build(); sendRequest(); if (runQueryResponsePb.getBatch().getSkippedResults() > 0) { cursor = runQueryResponsePb.getBatch().getSkippedCursor(); } else { cursor = mostRecentQueryPb.getStartCursor(); } }
@ProcessElement public void processElement(ProcessContext c) throws InvalidProtocolBufferException { String entityJson = c.element(); Entity.Builder entityBuilder = Entity.newBuilder(); entityJsonParser.merge(entityJson, entityBuilder); // Build entity who's key has an empty project Id. // This allows DatastoreIO to handle what project Entities are loaded into Key k = entityBuilder.build().getKey(); entityBuilder.setKey(Key.newBuilder() .addAllPath(k.getPathList()) .setPartitionId(PartitionId.newBuilder() .setProjectId("") .setNamespaceId(k.getPartitionId().getNamespaceId()))); c.output(entityBuilder.build()); } }
com.google.datastore.v1.Key toPb() { com.google.datastore.v1.Key.Builder keyPb = com.google.datastore.v1.Key.newBuilder(); com.google.datastore.v1.PartitionId.Builder partitionIdPb = com.google.datastore.v1.PartitionId.newBuilder(); partitionIdPb.setProjectId(projectId); partitionIdPb.setNamespaceId(namespace); keyPb.setPartitionId(partitionIdPb.build()); for (PathElement pathEntry : path) { keyPb.addPath(pathEntry.toPb()); } return keyPb.build(); } }
com.google.datastore.v1.Key getPb(final String namespace) { if (namespace == null) { return key; } else { return com.google.datastore.v1.Key .newBuilder(key) .setPartitionId( com.google.datastore.v1.PartitionId .newBuilder().setNamespaceId(namespace)).build(); } }
/** * Set the namespace for this {@code Key}. * * @param namespace the namespace to set. * @return this key builder. */ public Builder namespace(final String namespace) { key.setPartitionId( com.google.datastore.v1.PartitionId.newBuilder().setNamespaceId(namespace)); return this; }
/** Build a datastore query request. */ private static RunQueryRequest makeRequest(Query query, @Nullable String namespace) { RunQueryRequest.Builder requestBuilder = RunQueryRequest.newBuilder().setQuery(query); if (namespace != null) { requestBuilder.getPartitionIdBuilder().setNamespaceId(namespace); } return requestBuilder.build(); }
QueryResultsImpl( DatastoreImpl datastore, com.google.datastore.v1.ReadOptions readOptionsPb, Query<T> query) { this.datastore = datastore; this.readOptionsPb = readOptionsPb; this.query = query; queryResultType = query.getType(); com.google.datastore.v1.PartitionId.Builder pbBuilder = com.google.datastore.v1.PartitionId.newBuilder(); pbBuilder.setProjectId(datastore.getOptions().getProjectId()); if (query.getNamespace() != null) { pbBuilder.setNamespaceId(query.getNamespace()); } else if (datastore.getOptions().getNamespace() != null) { pbBuilder.setNamespaceId(datastore.getOptions().getNamespace()); } partitionIdPb = pbBuilder.build(); sendRequest(); if (runQueryResponsePb.getBatch().getSkippedResults() > 0) { cursor = runQueryResponsePb.getBatch().getSkippedCursor(); } else { cursor = mostRecentQueryPb.getStartCursor(); } }
com.google.datastore.v1.Key toPb() { com.google.datastore.v1.Key.Builder keyPb = com.google.datastore.v1.Key.newBuilder(); com.google.datastore.v1.PartitionId.Builder partitionIdPb = com.google.datastore.v1.PartitionId.newBuilder(); partitionIdPb.setProjectId(projectId); partitionIdPb.setNamespaceId(namespace); keyPb.setPartitionId(partitionIdPb.build()); for (PathElement pathEntry : path) { keyPb.addPath(pathEntry.toPb()); } return keyPb.build(); } }