diff --git a/.github/.OwlBot.yaml b/.github/.OwlBot-hermetic.yaml similarity index 90% rename from .github/.OwlBot.yaml rename to .github/.OwlBot-hermetic.yaml index d89045599..02f0dd37b 100644 --- a/.github/.OwlBot.yaml +++ b/.github/.OwlBot-hermetic.yaml @@ -11,9 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - -docker: - image: "gcr.io/cloud-devrel-public-resources/owlbot-java:latest" deep-remove-regex: - "/proto-google-.*/src" @@ -29,4 +26,4 @@ deep-copy-regex: dest: "/owl-bot-staging/$1/grpc-google-cloud-datastore-admin-$1/src" # Admin & Data APIs share the same wrapper library. - source: "/google/datastore/admin/(v.*)/.*-java/gapic-google-.*/src" - dest: "/owl-bot-staging/$1/google-cloud-datastore/src" \ No newline at end of file + dest: "/owl-bot-staging/$1/google-cloud-datastore/src" diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml deleted file mode 100644 index 6167135e9..000000000 --- a/.github/.OwlBot.lock.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -docker: - image: gcr.io/cloud-devrel-public-resources/owlbot-java:latest - digest: sha256:81c3ec554428c8ff6c92f0d58668b7ef52265d053a82284c97a326745e786949 -# created: 2024-03-27T17:59:25.436353226Z diff --git a/.github/release-please.yml b/.github/release-please.yml index 53b119627..cbb5be49c 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -30,3 +30,7 @@ branches: handleGHRelease: true releaseType: java-backport branch: 2.17.x + - bumpMinorPreMajor: true + handleGHRelease: true + releaseType: java-backport + branch: 2.19.x diff --git a/.github/scripts/hermetic_library_generation.sh b/.github/scripts/hermetic_library_generation.sh new file mode 100644 index 000000000..6c3f22d8f --- /dev/null +++ b/.github/scripts/hermetic_library_generation.sh @@ -0,0 +1,117 @@ +#!/bin/bash +set -e +# This script should be run at the root of the repository. +# This script is used to, when a pull request changes the generation +# configuration (generation_config.yaml by default): +# 1. Find whether the last commit in this pull request contains changes to +# the generation configuration and exit early if it doesn't have such a change +# since the generation result would be the same. +# 2. Compare generation configurations in the current branch (with which the +# pull request associated) and target branch (into which the pull request is +# merged); +# 3. Generate changed libraries using library_generation image; +# 4. Commit the changes to the pull request, if any. +# 5. Edit the PR body with generated pull request description, if applicable. + +# The following commands need to be installed before running the script: +# 1. git +# 2. gh +# 3. docker + +# The parameters of this script is: +# 1. target_branch, the branch into which the pull request is merged. +# 2. current_branch, the branch with which the pull request is associated. +# 3. [optional] generation_config, the path to the generation configuration, +# the default value is generation_config.yaml in the repository root. +while [[ $# -gt 0 ]]; do +key="$1" +case "${key}" in + --target_branch) + target_branch="$2" + shift + ;; + --current_branch) + current_branch="$2" + shift + ;; + --generation_config) + generation_config="$2" + shift + ;; + *) + echo "Invalid option: [$1]" + exit 1 + ;; +esac +shift +done + +if [ -z "${target_branch}" ]; then + echo "missing required argument --target_branch" + exit 1 +fi + +if [ -z "${current_branch}" ]; then + echo "missing required argument --current_branch" + exit 1 +fi + +if [ -z "${generation_config}" ]; then + generation_config=generation_config.yaml + echo "Using default generation config: ${generation_config}" +fi + +workspace_name="/workspace" +baseline_generation_config="baseline_generation_config.yaml" +message="chore: generate libraries at $(date)" + +git checkout "${target_branch}" +git checkout "${current_branch}" +# if the last commit doesn't contain changes to generation configuration, +# do not generate again as the result will be the same. +change_of_last_commit="$(git diff-tree --no-commit-id --name-only HEAD~1..HEAD -r)" +if [[ ! ("${change_of_last_commit}" == *"${generation_config}"*) ]]; then + echo "The last commit doesn't contain any changes to the generation_config.yaml, skipping the whole generation process." || true + exit 0 +fi +# copy generation configuration from target branch to current branch. +git show "${target_branch}":"${generation_config}" > "${baseline_generation_config}" +config_diff=$(diff "${generation_config}" "${baseline_generation_config}" || true) + +# parse image tag from the generation configuration. +image_tag=$(grep "gapic_generator_version" "${generation_config}" | cut -d ':' -f 2 | xargs) + +# run hermetic code generation docker image. +docker run \ + --rm \ + -u "$(id -u):$(id -g)" \ + -v "$(pwd):${workspace_name}" \ + gcr.io/cloud-devrel-public-resources/java-library-generation:"${image_tag}" \ + --baseline-generation-config-path="${workspace_name}/${baseline_generation_config}" \ + --current-generation-config-path="${workspace_name}/${generation_config}" + + +# commit the change to the pull request. +if [[ $(basename $(pwd)) == "google-cloud-java" ]]; then + git add java-* pom.xml gapic-libraries-bom/pom.xml versions.txt +else + # The image leaves intermediate folders and files it works with. Here we remove them + rm -rdf output googleapis "${baseline_generation_config}" + git add --all -- ':!pr_description.txt' +fi +changed_files=$(git diff --cached --name-only) +if [[ "${changed_files}" == "" ]]; then + echo "There is no generated code change with the generation config change ${config_diff}." + echo "Skip committing to the pull request." + exit 0 +fi + +echo "Configuration diff:" +echo "${config_diff}" +git commit -m "${message}" +git push +# set pr body if pr_description.txt is generated. +if [[ -f "pr_description.txt" ]]; then + pr_num=$(gh pr list -s open -H "${current_branch}" -q . --json number | jq ".[] | .number") + gh pr edit "${pr_num}" --body "$(cat pr_description.txt)" +fi diff --git a/.github/scripts/update_generation_config.sh b/.github/scripts/update_generation_config.sh new file mode 100644 index 000000000..561a31304 --- /dev/null +++ b/.github/scripts/update_generation_config.sh @@ -0,0 +1,121 @@ +#!/bin/bash +set -e +# This script should be run at the root of the repository. +# This script is used to update googleapis_commitish, gapic_generator_version, +# and libraries_bom_version in generation configuration at the time of running +# and create a pull request. + +# The following commands need to be installed before running the script: +# 1. git +# 2. gh +# 3. jq + +# Utility functions +# Get the latest released version of a Maven artifact. +function get_latest_released_version() { + local group_id=$1 + local artifact_id=$2 + latest=$(curl -s "https://search.maven.org/solrsearch/select?q=g:${group_id}+AND+a:${artifact_id}&core=gav&rows=500&wt=json" | jq -r '.response.docs[] | select(.v | test("^[0-9]+(\\.[0-9]+)*$")) | .v' | sort -V | tail -n 1) + echo "${latest}" +} + +# Update a key to a new value in the generation config. +function update_config() { + local key_word=$1 + local new_value=$2 + local file=$3 + echo "Update ${key_word} to ${new_value} in ${file}" + sed -i -e "s/^${key_word}.*$/${key_word}: ${new_value}/" "${file}" +} + +# The parameters of this script is: +# 1. base_branch, the base branch of the result pull request. +# 2. repo, organization/repo-name, e.g., googleapis/google-cloud-java +# 3. [optional] generation_config, the path to the generation configuration, +# the default value is generation_config.yaml in the repository root. +while [[ $# -gt 0 ]]; do +key="$1" +case "${key}" in + --base_branch) + base_branch="$2" + shift + ;; + --repo) + repo="$2" + shift + ;; + --generation_config) + generation_config="$2" + shift + ;; + *) + echo "Invalid option: [$1]" + exit 1 + ;; +esac +shift +done + +if [ -z "${base_branch}" ]; then + echo "missing required argument --base_branch" + exit 1 +fi + +if [ -z "${repo}" ]; then + echo "missing required argument --repo" + exit 1 +fi + +if [ -z "${generation_config}" ]; then + generation_config="generation_config.yaml" + echo "Use default generation config: ${generation_config}" +fi + +current_branch="generate-libraries-${base_branch}" +title="chore: Update generation configuration at $(date)" + +# try to find a open pull request associated with the branch +pr_num=$(gh pr list -s open -H "${current_branch}" -q . --json number | jq ".[] | .number") +# create a branch if there's no open pull request associated with the +# branch; otherwise checkout the pull request. +if [ -z "${pr_num}" ]; then + git checkout -b "${current_branch}" +else + gh pr checkout "${pr_num}" +fi + +mkdir tmp-googleapis +# use partial clone because only commit history is needed. +git clone --filter=blob:none https://github.com/googleapis/googleapis.git tmp-googleapis +pushd tmp-googleapis +git pull +latest_commit=$(git rev-parse HEAD) +popd +rm -rf tmp-googleapis +update_config "googleapis_commitish" "${latest_commit}" "${generation_config}" + +# update gapic-generator-java version to the latest +latest_version=$(get_latest_released_version "com.google.api" "gapic-generator-java") +update_config "gapic_generator_version" "${latest_version}" "${generation_config}" + +# update libraries-bom version to the latest +latest_version=$(get_latest_released_version "com.google.cloud" "libraries-bom") +update_config "libraries_bom_version" "${latest_version}" "${generation_config}" + +git add "${generation_config}" +changed_files=$(git diff --cached --name-only) +if [[ "${changed_files}" == "" ]]; then + echo "The latest generation config is not changed." + echo "Skip committing to the pull request." + exit 0 +fi +git commit -m "${title}" +if [ -z "${pr_num}" ]; then + git remote add remote_repo https://cloud-java-bot:"${GH_TOKEN}@github.com/${repo}.git" + git fetch -q --unshallow remote_repo + git push -f remote_repo "${current_branch}" + gh pr create --title "${title}" --head "${current_branch}" --body "${title}" --base "${base_branch}" +else + git push + gh pr edit "${pr_num}" --title "${title}" --body "${title}" +fi diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 0159d7ae3..fce568dc2 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -15,7 +15,6 @@ branchProtectionRules: - units (11) - 'Kokoro - Test: Integration' - cla/google - - OwlBot Post Processor - 'Kokoro - Test: Java GraalVM Native Image' - 'Kokoro - Test: Java 17 GraalVM Native Image' - javadoc @@ -62,7 +61,6 @@ branchProtectionRules: - units (11) - 'Kokoro - Test: Integration' - cla/google - - OwlBot Post Processor - pattern: 2.2.x isAdminEnforced: true requiredApprovingReviewCount: 1 @@ -77,7 +75,6 @@ branchProtectionRules: - units (11) - 'Kokoro - Test: Integration' - cla/google - - OwlBot Post Processor - pattern: 2.12.x isAdminEnforced: true requiredApprovingReviewCount: 1 @@ -92,7 +89,6 @@ branchProtectionRules: - units (11) - 'Kokoro - Test: Integration' - cla/google - - OwlBot Post Processor - 'Kokoro - Test: Java GraalVM Native Image' - 'Kokoro - Test: Java 17 GraalVM Native Image' - pattern: multi-db @@ -109,7 +105,6 @@ branchProtectionRules: - units (11) - 'Kokoro - Test: Integration' - cla/google - - OwlBot Post Processor - 'Kokoro - Test: Java GraalVM Native Image' - 'Kokoro - Test: Java 17 GraalVM Native Image' - pattern: V3-experimental @@ -125,7 +120,6 @@ branchProtectionRules: - units (11) - 'Kokoro - Test: Integration' - cla/google - - OwlBot Post Processor - 'Kokoro - Test: Java GraalVM Native Image' - 'Kokoro - Test: Java 17 GraalVM Native Image' - javadoc @@ -142,7 +136,6 @@ branchProtectionRules: - units (11) - 'Kokoro - Test: Integration' - cla/google - - OwlBot Post Processor - 'Kokoro - Test: Java GraalVM Native Image' - 'Kokoro - Test: Java 17 GraalVM Native Image' - pattern: 2.17.x @@ -158,7 +151,38 @@ branchProtectionRules: - units (11) - 'Kokoro - Test: Integration' - cla/google - - OwlBot Post Processor + - 'Kokoro - Test: Java GraalVM Native Image' + - 'Kokoro - Test: Java 17 GraalVM Native Image' + - javadoc + - pattern: grpc-experimental + isAdminEnforced: true + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + requiresStrictStatusChecks: false + requiredStatusCheckContexts: + - dependencies (17) + - lint + - clirr + - units (8) + - units (11) + - 'Kokoro - Test: Integration' + - cla/google + - 'Kokoro - Test: Java GraalVM Native Image' + - 'Kokoro - Test: Java 17 GraalVM Native Image' + - javadoc + - pattern: 2.19.x + isAdminEnforced: true + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + requiresStrictStatusChecks: false + requiredStatusCheckContexts: + - dependencies (17) + - lint + - clirr + - units (8) + - units (11) + - 'Kokoro - Test: Integration' + - cla/google - 'Kokoro - Test: Java GraalVM Native Image' - 'Kokoro - Test: Java 17 GraalVM Native Image' - javadoc diff --git a/.github/trusted-contribution.yml b/.github/trusted-contribution.yml index a0ba1f7d9..88d3ac9bf 100644 --- a/.github/trusted-contribution.yml +++ b/.github/trusted-contribution.yml @@ -1,3 +1,9 @@ trustedContributors: - renovate-bot - gcf-owl-bot[bot] + +annotations: +- type: comment + text: "/gcbrun" +- type: label + text: "kokoro:force-run" diff --git a/.github/workflows/approve-readme.yaml b/.github/workflows/approve-readme.yaml index f5fc7d516..59f00b8eb 100644 --- a/.github/workflows/approve-readme.yaml +++ b/.github/workflows/approve-readme.yaml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest if: github.repository_owner == 'googleapis' && github.head_ref == 'autosynth-readme' steps: - - uses: actions/github-script@v6 + - uses: actions/github-script@v7 with: github-token: ${{secrets.YOSHI_APPROVER_TOKEN}} script: | diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ae66b1973..b91fa381f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -27,8 +27,8 @@ jobs: matrix: java: [11, 17, 21] steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: distribution: temurin java-version: ${{matrix.java}} @@ -41,8 +41,8 @@ jobs: name: "units (8)" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: java-version: 8 distribution: temurin @@ -51,7 +51,7 @@ jobs: # https://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#jvm run: echo "SUREFIRE_JVM_OPT=-Djvm=${JAVA_HOME}/bin/java" >> $GITHUB_ENV shell: bash - - uses: actions/setup-java@v3 + - uses: actions/setup-java@v4 with: java-version: 17 distribution: temurin @@ -63,8 +63,8 @@ jobs: steps: - name: Support longpaths run: git config --system core.longpaths true - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: distribution: temurin java-version: 8 @@ -78,8 +78,8 @@ jobs: matrix: java: [17] steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: distribution: temurin java-version: ${{matrix.java}} @@ -88,8 +88,8 @@ jobs: javadoc: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: distribution: temurin java-version: 17 @@ -100,8 +100,8 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: distribution: temurin java-version: 11 @@ -112,8 +112,8 @@ jobs: clirr: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: distribution: temurin java-version: 8 diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml new file mode 100644 index 000000000..0266fbc96 --- /dev/null +++ b/.github/workflows/hermetic_library_generation.yaml @@ -0,0 +1,54 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# GitHub action job to test core java library features on +# downstream client libraries before they are released. +name: Hermetic library generation upon generation config change through pull requests +on: + pull_request: + +env: + REPO_FULL_NAME: ${{ github.event.pull_request.head.repo.full_name }} + GITHUB_REPOSITORY: ${{ github.repository }} + +jobs: + library_generation: + runs-on: ubuntu-latest + steps: + - name: Determine whether the pull request comes from a fork + run: | + if [[ "${GITHUB_REPOSITORY}" != "${REPO_FULL_NAME}" ]]; then + echo "This PR comes from a fork. Skip library generation." + echo "SHOULD_RUN=false" >> $GITHUB_ENV + else + echo "SHOULD_RUN=true" >> $GITHUB_ENV + fi + - uses: actions/checkout@v4 + if: env.SHOULD_RUN == 'true' + with: + fetch-depth: 0 + token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} + - name: Generate changed libraries + if: env.SHOULD_RUN == 'true' + shell: bash + run: | + set -ex + [ -z "$(git config user.email)" ] && git config --global user.email "cloud-java-bot@google.com" + [ -z "$(git config user.name)" ] && git config --global user.name "cloud-java-bot" + bash .github/scripts/hermetic_library_generation.sh \ + --target_branch "${BASE_REF}" \ + --current_branch "${HEAD_REF}" + env: + BASE_REF: ${{ github.base_ref }} + HEAD_REF: ${{ github.head_ref }} + GH_TOKEN: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} diff --git a/.github/workflows/renovate_config_check.yaml b/.github/workflows/renovate_config_check.yaml index 87d8eb2be..7c5ec7865 100644 --- a/.github/workflows/renovate_config_check.yaml +++ b/.github/workflows/renovate_config_check.yaml @@ -14,7 +14,7 @@ jobs: uses: actions/checkout@v4 - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: '20' diff --git a/.github/workflows/samples.yaml b/.github/workflows/samples.yaml index 10d252d77..03b293956 100644 --- a/.github/workflows/samples.yaml +++ b/.github/workflows/samples.yaml @@ -20,8 +20,8 @@ jobs: checkstyle: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: distribution: temurin java-version: 8 diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index 851d94b20..9d1576d94 100644 --- a/.github/workflows/unmanaged_dependency_check.yaml +++ b/.github/workflows/unmanaged_dependency_check.yaml @@ -5,8 +5,8 @@ jobs: unmanaged_dependency_check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: distribution: temurin java-version: 11 @@ -14,6 +14,6 @@ jobs: shell: bash run: .kokoro/build.sh - name: Unmanaged dependency check - uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.29.0 + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.35.0 with: bom-path: google-cloud-datastore-bom/pom.xml diff --git a/.github/workflows/update_generation_config.yaml b/.github/workflows/update_generation_config.yaml new file mode 100644 index 000000000..3cf773992 --- /dev/null +++ b/.github/workflows/update_generation_config.yaml @@ -0,0 +1,42 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# GitHub action job to test core java library features on +# downstream client libraries before they are released. +name: Update generation configuration +on: + schedule: + - cron: '0 2 * * *' + workflow_dispatch: + +jobs: + update-generation-config: + runs-on: ubuntu-22.04 + env: + # the branch into which the pull request is merged + base_branch: main + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} + - name: Update params in generation config to latest + shell: bash + run: | + set -x + [ -z "$(git config user.email)" ] && git config --global user.email "cloud-java-bot@google.com" + [ -z "$(git config user.name)" ] && git config --global user.name "cloud-java-bot" + bash .github/scripts/update_generation_config.sh \ + --base_branch "${base_branch}"\ + --repo ${{ github.repository }} + env: + GH_TOKEN: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} diff --git a/.kokoro/presubmit/graalvm-native-17.cfg b/.kokoro/presubmit/graalvm-native-17.cfg index d7a73c2c6..41590566e 100644 --- a/.kokoro/presubmit/graalvm-native-17.cfg +++ b/.kokoro/presubmit/graalvm-native-17.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.29.0" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.35.0" } env_vars: { diff --git a/.kokoro/presubmit/graalvm-native.cfg b/.kokoro/presubmit/graalvm-native.cfg index b5c7f594b..d6941e80e 100644 --- a/.kokoro/presubmit/graalvm-native.cfg +++ b/.kokoro/presubmit/graalvm-native.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.29.0" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.35.0" } env_vars: { diff --git a/.readme-partials.yaml b/.readme-partials.yaml index 9823b5c70..ced21e49f 100644 --- a/.readme-partials.yaml +++ b/.readme-partials.yaml @@ -105,7 +105,103 @@ custom_content: | running on Compute Engine or from your own desktop. To run the example on App Engine, simply move the code from the main method to your application's servlet class and change the print statements to display on your webpage. - + + gRPC Java Datastore Client User Guide + ------- + In this feature launch, the [Java Datastore client](https://github.com/googleapis/java-datastore) now offers gRPC as a transport layer option with experimental support. Using [gRPC connection pooling](https://grpc.io/docs/guides/performance/) enables distributing RPCs over multiple connections which may improve performance. + + #### Download Instructions + Instructions: + 1. Clone the grpc-experimental branch from GitHub: + ```python + git clone -b grpc-experimental https://github.com/googleapis/java-datastore.git + ``` + 2. Run the following commands to build the library: + ```python + # Go to the directory the code was downloaded to + cd java-datastore/ + + # Build the library + mvn clean install -DskipTests=true + ``` + 3. Add the following dependency to your project: + ```xml + + com.google.cloud + google-cloud-datastore + 2.20.0-grpc-experimental-1-SNAPSHOT + + ``` + + #### How to Use + To opt-in to the gRPC transport behavior, simply add the below line of code (`setTransportOptions`) to your Datastore client instantiation. + + Example: + ```java + DatastoreOptions datastoreOptions = + DatastoreOptions.newBuilder() + .setProjectId("my-project") + .setDatabaseId("my-database") + .setTransportOptions(GrpcTransportOptions.newBuilder().build()) + .build(); + ``` + Setting the transport options explicitly to `GrpcTransportOptions` will signal the client to use gRPC instead of HTTP when making calls to the server. + + To revert back to the existing stable behavior and transport, simply remove the transport options line or replace it with `HttpTransportOptions`. Please note this will require an application rebuild and restart. + Example: + ```java + // will default to existing HTTP transport behavior + DatastoreOptions datastoreOptions = DatastoreOptions.newBuilder() + .setProjectId("my-project") + .setDatabaseId("my-database") + .build(); + + // will also default to existing HTTP transport behavior + DatastoreOptions datastoreOptions = + DatastoreOptions.newBuilder() + .setProjectId("my-project") + .setDatabaseId("my-database") + .setTransportOptions(HttpTransportOptions.newBuilder() + .setConnectTimeout(1000) + .build()).build(); + ``` + + Note: client instantiations that already use `setTransportOptions` with `HttpTransportOptions` will continue to have the same behavior. Only transports that are explicitly set to gRPC will change. + + #### Verify Datastore Transport Options Type + To verify which type of TransportOptions you have successfully configured, you can use the below lines of code to compare transport options type: + ```java + // checks if using gRPC transport options + boolean isGRPC = datastore.getOptions().getTransportOptions() instanceof GrpcTransportOptions; + + // checks if using HTTP transport options + boolean isHTTP = datastore.getOptions().getTransportOptions() instanceof HTTPTransportOptions; + ``` + + #### New Features + There are new gRPC specific features available to use in this update. + + ##### Channel Pooling + To customize the number of channels your client uses, you can update the channel provider in the DatastoreOptions. + See [ChannelPoolSettings](https://cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.grpc.ChannelPoolSettings) and [Performance Best Practices](https://grpc.io/docs/guides/performance/) for more information on channel pools and best practices for performance. + + Example: + ```java + InstantiatingGrpcChannelProvider channelProvider = + DatastoreSettings.defaultGrpcTransportProviderBuilder() + .setChannelPoolSettings( + ChannelPoolSettings.builder() + .setInitialChannelCount(MIN_VAL) + .setMaxChannelCount(MAX_VAL) + .build()) + .build(); + + DatastoreOptions options = DatastoreOptions.newBuilder() + .setProjectId("my-project") + .setChannelProvider(channelProvider) + .setTransportOptions(GrpcTransportOptions.newBuilder().build()) + .build(); + ``` Testing ------- diff --git a/CHANGELOG.md b/CHANGELOG.md index ba6bc10ff..e953fa33f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,78 @@ # Changelog +## [2.21.2](https://github.com/googleapis/java-datastore/compare/v2.21.1...v2.21.2) (2024-08-22) + + +### Dependencies + +* Update dependency com.google.cloud:sdk-platform-java-config to v3.34.0 ([#1547](https://github.com/googleapis/java-datastore/issues/1547)) ([8c5f595](https://github.com/googleapis/java-datastore/commit/8c5f5954d88732ab929b4477a3f15b0052adc2ff)) + +## [2.21.1](https://github.com/googleapis/java-datastore/compare/v2.21.0...v2.21.1) (2024-08-06) + + +### Dependencies + +* Update dependency com.google.cloud:sdk-platform-java-config to v3.33.0 ([#1531](https://github.com/googleapis/java-datastore/issues/1531)) ([9e52395](https://github.com/googleapis/java-datastore/commit/9e52395f7ee71315331790284d35e7aad2f387ed)) + +## [2.21.0](https://github.com/googleapis/java-datastore/compare/v2.20.2...v2.21.0) (2024-07-31) + + +### Features + +* Enable hermetic library generation ([#1462](https://github.com/googleapis/java-datastore/issues/1462)) ([d142d9c](https://github.com/googleapis/java-datastore/commit/d142d9c95d91c8cadaf696efc12d6136814938ff)) + +## [2.20.2](https://github.com/googleapis/java-datastore/compare/v2.20.1...v2.20.2) (2024-06-28) + + +### Dependencies + +* Update dependency com.google.cloud:sdk-platform-java-config to v3.32.0 ([#1492](https://github.com/googleapis/java-datastore/issues/1492)) ([d940c93](https://github.com/googleapis/java-datastore/commit/d940c937959942d753f9215e7ce940ab6742be46)) + +## [2.20.1](https://github.com/googleapis/java-datastore/compare/v2.20.0...v2.20.1) (2024-06-04) + + +### Dependencies + +* Update dependency com.google.cloud:sdk-platform-java-config to v3.31.0 ([#1471](https://github.com/googleapis/java-datastore/issues/1471)) ([42c643d](https://github.com/googleapis/java-datastore/commit/42c643d78562c5cbd6c17c29a0a124be8d05198a)) +* Update dependency com.google.errorprone:error_prone_core to v2.28.0 ([#1469](https://github.com/googleapis/java-datastore/issues/1469)) ([e3fac2b](https://github.com/googleapis/java-datastore/commit/e3fac2bf9992fcb2e91319df0520094865de2d49)) +* Update dependency com.google.guava:guava-testlib to v33.2.1-jre ([#1470](https://github.com/googleapis/java-datastore/issues/1470)) ([614e930](https://github.com/googleapis/java-datastore/commit/614e930f2bdccc517d4733e5fb7f3cefad696a20)) + +## [2.20.0](https://github.com/googleapis/java-datastore/compare/v2.19.3...v2.20.0) (2024-05-27) + + +### Features + +* New PropertyMask field which allows partial commits, lookups, and query results ([#1455](https://github.com/googleapis/java-datastore/issues/1455)) ([ff5e397](https://github.com/googleapis/java-datastore/commit/ff5e39775446216b4806f55f14dacb7fc8e8854b)) + + +### Bug Fixes + +* Migrate off TextPrinter's deprecated methods ([#1452](https://github.com/googleapis/java-datastore/issues/1452)) ([c3c1317](https://github.com/googleapis/java-datastore/commit/c3c131735863d71971110e2ac7ac0244ce16ee92)) +* Set the correct database id on the key parent when calling Key#getParent ([#1457](https://github.com/googleapis/java-datastore/issues/1457)) ([992815d](https://github.com/googleapis/java-datastore/commit/992815d9989d04f7b371dfa320ed17894626a07f)) + +## [2.19.3](https://github.com/googleapis/java-datastore/compare/v2.19.2...v2.19.3) (2024-05-16) + + +### Dependencies + +* Update actions/checkout action to v4 ([#1390](https://github.com/googleapis/java-datastore/issues/1390)) ([80dbca1](https://github.com/googleapis/java-datastore/commit/80dbca1246facf21b08d33e5c6a09b9708b6ce63)) +* Update dependency com.google.cloud:sdk-platform-java-config to v3.30.1 ([#1443](https://github.com/googleapis/java-datastore/issues/1443)) ([79f6c46](https://github.com/googleapis/java-datastore/commit/79f6c46bdbabc66082f23e9562ee9541e0fdeac9)) + +## [2.19.2](https://github.com/googleapis/java-datastore/compare/v2.19.1...v2.19.2) (2024-05-03) + + +### Bug Fixes + +* **deps:** Update the Java code generator (gapic-generator-java) to 2.39.0 ([#1406](https://github.com/googleapis/java-datastore/issues/1406)) ([b265fb3](https://github.com/googleapis/java-datastore/commit/b265fb3c3b8ebc972edbe5a7beae816379846dac)) + + +### Dependencies + +* Update dependency com.google.cloud:sdk-platform-java-config to v3.30.0 ([#1426](https://github.com/googleapis/java-datastore/issues/1426)) ([ac3a1c1](https://github.com/googleapis/java-datastore/commit/ac3a1c10f64c8338346f8fb39f4857f47e8fc639)) +* Update dependency com.google.errorprone:error_prone_core to v2.27.0 ([#1411](https://github.com/googleapis/java-datastore/issues/1411)) ([a3f5a2c](https://github.com/googleapis/java-datastore/commit/a3f5a2c24bff408479541e08278e888cf3166727)) +* Update dependency com.google.errorprone:error_prone_core to v2.27.1 ([#1421](https://github.com/googleapis/java-datastore/issues/1421)) ([48d7daf](https://github.com/googleapis/java-datastore/commit/48d7dafc0c7a49e95bf41d29865ac872b0de0faf)) +* Update dependency com.google.guava:guava-testlib to v33.2.0-jre ([#1422](https://github.com/googleapis/java-datastore/issues/1422)) ([5a5dfdf](https://github.com/googleapis/java-datastore/commit/5a5dfdfb0855cf485b875ab071b79979d24f98dd)) + ## [2.19.1](https://github.com/googleapis/java-datastore/compare/v2.19.0...v2.19.1) (2024-04-19) diff --git a/README.md b/README.md index 3f6f9916c..9089655ec 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file: com.google.cloud libraries-bom - 26.38.0 + 26.41.0 pom import @@ -42,7 +42,7 @@ If you are using Maven without the BOM, add this to your dependencies: com.google.cloud google-cloud-datastore - 2.19.1 + 2.20.0 ``` @@ -50,20 +50,20 @@ If you are using Maven without the BOM, add this to your dependencies: If you are using Gradle 5.x or later, add this to your dependencies: ```Groovy -implementation platform('com.google.cloud:libraries-bom:26.38.0') +implementation platform('com.google.cloud:libraries-bom:26.42.0') implementation 'com.google.cloud:google-cloud-datastore' ``` If you are using Gradle without BOM, add this to your dependencies: ```Groovy -implementation 'com.google.cloud:google-cloud-datastore:2.19.1' +implementation 'com.google.cloud:google-cloud-datastore:2.20.2' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-datastore" % "2.19.1" +libraryDependencies += "com.google.cloud" % "google-cloud-datastore" % "2.20.2" ``` @@ -210,6 +210,102 @@ running on Compute Engine or from your own desktop. To run the example on App En the code from the main method to your application's servlet class and change the print statements to display on your webpage. +gRPC Java Datastore Client User Guide +------- +In this feature launch, the [Java Datastore client](https://github.com/googleapis/java-datastore) now offers gRPC as a transport layer option with experimental support. Using [gRPC connection pooling](https://grpc.io/docs/guides/performance/) enables distributing RPCs over multiple connections which may improve performance. + +#### Download Instructions +Instructions: +1. Clone the grpc-experimental branch from GitHub: +```python +git clone -b grpc-experimental https://github.com/googleapis/java-datastore.git +``` +2. Run the following commands to build the library: +```python +# Go to the directory the code was downloaded to +cd java-datastore/ + +# Build the library +mvn clean install -DskipTests=true +``` +3. Add the following dependency to your project: +```xml + + com.google.cloud + google-cloud-datastore + 2.20.0-grpc-experimental-1-SNAPSHOT + +``` + +#### How to Use +To opt-in to the gRPC transport behavior, simply add the below line of code (`setTransportOptions`) to your Datastore client instantiation. + +Example: +```java +DatastoreOptions datastoreOptions = + DatastoreOptions.newBuilder() + .setProjectId("my-project") + .setDatabaseId("my-database") + .setTransportOptions(GrpcTransportOptions.newBuilder().build()) + .build(); +``` +Setting the transport options explicitly to `GrpcTransportOptions` will signal the client to use gRPC instead of HTTP when making calls to the server. + +To revert back to the existing stable behavior and transport, simply remove the transport options line or replace it with `HttpTransportOptions`. Please note this will require an application rebuild and restart. +Example: +```java +// will default to existing HTTP transport behavior +DatastoreOptions datastoreOptions = DatastoreOptions.newBuilder() + .setProjectId("my-project") + .setDatabaseId("my-database") + .build(); + +// will also default to existing HTTP transport behavior +DatastoreOptions datastoreOptions = + DatastoreOptions.newBuilder() + .setProjectId("my-project") + .setDatabaseId("my-database") + .setTransportOptions(HttpTransportOptions.newBuilder() + .setConnectTimeout(1000) + .build()).build(); +``` + +Note: client instantiations that already use `setTransportOptions` with `HttpTransportOptions` will continue to have the same behavior. Only transports that are explicitly set to gRPC will change. + +#### Verify Datastore Transport Options Type +To verify which type of TransportOptions you have successfully configured, you can use the below lines of code to compare transport options type: +```java +// checks if using gRPC transport options +boolean isGRPC = datastore.getOptions().getTransportOptions() instanceof GrpcTransportOptions; + +// checks if using HTTP transport options +boolean isHTTP = datastore.getOptions().getTransportOptions() instanceof HTTPTransportOptions; +``` + +#### New Features +There are new gRPC specific features available to use in this update. + +##### Channel Pooling +To customize the number of channels your client uses, you can update the channel provider in the DatastoreOptions. +See [ChannelPoolSettings](https://cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.grpc.ChannelPoolSettings) and [Performance Best Practices](https://grpc.io/docs/guides/performance/) for more information on channel pools and best practices for performance. + +Example: +```java +InstantiatingGrpcChannelProvider channelProvider = + DatastoreSettings.defaultGrpcTransportProviderBuilder() + .setChannelPoolSettings( + ChannelPoolSettings.builder() + .setInitialChannelCount(MIN_VAL) + .setMaxChannelCount(MAX_VAL) + .build()) + .build(); + +DatastoreOptions options = DatastoreOptions.newBuilder() + .setProjectId("my-project") + .setChannelProvider(channelProvider) + .setTransportOptions(GrpcTransportOptions.newBuilder().build()) + .build(); +``` Testing ------- @@ -384,7 +480,7 @@ Java is a registered trademark of Oracle and/or its affiliates. [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-datastore/java11.html [stability-image]: https://img.shields.io/badge/stability-stable-green [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-datastore.svg -[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-datastore/2.19.1 +[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-datastore/2.20.2 [authentication]: https://github.com/googleapis/google-cloud-java#authentication [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles diff --git a/datastore-v1-proto-client/pom.xml b/datastore-v1-proto-client/pom.xml index e136a9d8c..52758f476 100644 --- a/datastore-v1-proto-client/pom.xml +++ b/datastore-v1-proto-client/pom.xml @@ -19,12 +19,12 @@ 4.0.0 com.google.cloud.datastore datastore-v1-proto-client - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT com.google.cloud google-cloud-datastore-parent - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT jar @@ -98,7 +98,7 @@ com.google.truth truth - 1.4.2 + 1.4.3 test diff --git a/generation_config.yaml b/generation_config.yaml new file mode 100644 index 000000000..941eaaef0 --- /dev/null +++ b/generation_config.yaml @@ -0,0 +1,25 @@ +gapic_generator_version: 2.45.0 +googleapis_commitish: 02f62c8e241a9f95f0d183785354e90e35388cbd +libraries_bom_version: 26.45.0 +libraries: + - api_shortname: datastore + name_pretty: Cloud Datastore + product_documentation: https://cloud.google.com/datastore + client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-datastore/latest/history + issue_tracker: https://issuetracker.google.com/savedsearches/559768 + release_level: stable + language: java + repo: googleapis/java-datastore + repo_short: java-datastore + distribution_name: com.google.cloud:google-cloud-datastore + codeowner_team: '@googleapis/cloud-native-db-dpes @googleapis/api-datastore-sdk @googleapis/api-firestore-partners' + api_id: datastore.googleapis.com + library_type: GAPIC_COMBO + api_description: is a fully managed, schemaless database for\nstoring non-relational data. Cloud Datastore automatically scales with\nyour users and supports ACID transactions, high availability of reads and\nwrites, strong consistency for reads and ancestor queries, and eventual\nconsistency for all other queries. + excluded_dependencies: grpc-google-cloud-datastore-v1 + extra_versioned_modules: datastore-v1-proto-client + excluded_poms: grpc-google-cloud-datastore-v1 + recommended_package: com.google.cloud.datastore + GAPICs: + - proto_path: google/datastore/v1 + - proto_path: google/datastore/admin/v1 diff --git a/google-cloud-datastore-bom/pom.xml b/google-cloud-datastore-bom/pom.xml index 2651713e3..0fe170fa1 100644 --- a/google-cloud-datastore-bom/pom.xml +++ b/google-cloud-datastore-bom/pom.xml @@ -3,12 +3,12 @@ 4.0.0 com.google.cloud google-cloud-datastore-bom - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT pom com.google.cloud sdk-platform-java-config - 3.29.0 + 3.35.0 Google Cloud datastore BOM @@ -52,22 +52,22 @@ com.google.cloud google-cloud-datastore - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT com.google.api.grpc grpc-google-cloud-datastore-admin-v1 - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT com.google.api.grpc proto-google-cloud-datastore-v1 - 0.110.2-SNAPSHOT + 0.112.3-SNAPSHOT com.google.api.grpc proto-google-cloud-datastore-admin-v1 - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT diff --git a/google-cloud-datastore/pom.xml b/google-cloud-datastore/pom.xml index 8d6b79e8d..c80548fe5 100644 --- a/google-cloud-datastore/pom.xml +++ b/google-cloud-datastore/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-datastore - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT jar Google Cloud Datastore https://github.com/googleapis/java-datastore @@ -12,7 +12,7 @@ com.google.cloud google-cloud-datastore-parent - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT google-cloud-datastore @@ -122,7 +122,7 @@ com.google.guava guava-testlib - 33.1.0-jre + 33.3.0-jre test @@ -157,7 +157,7 @@ com.google.truth truth - 1.4.2 + 1.4.3 test diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/IncompleteKey.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/IncompleteKey.java index db9973cb5..71e31b94d 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/IncompleteKey.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/IncompleteKey.java @@ -91,9 +91,11 @@ public Key getParent() { PathElement parent = ancestors.get(ancestors.size() - 1); Key.Builder keyBuilder; if (parent.hasName()) { - keyBuilder = Key.newBuilder(getProjectId(), parent.getKind(), parent.getName()); + keyBuilder = + Key.newBuilder(getProjectId(), parent.getKind(), parent.getName(), getDatabaseId()); } else { - keyBuilder = Key.newBuilder(getProjectId(), parent.getKind(), parent.getId()); + keyBuilder = + Key.newBuilder(getProjectId(), parent.getKind(), parent.getId(), getDatabaseId()); } String namespace = getNamespace(); if (namespace != null) { diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/Key.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/Key.java index 9e851d0cb..14fe264bb 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/Key.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/Key.java @@ -145,7 +145,7 @@ public Object getNameOrId() { /** Returns the key in an encoded form that can be used as part of a URL. */ public String toUrlSafe() { try { - return URLEncoder.encode(TextFormat.printToString(toPb()), UTF_8.name()); + return URLEncoder.encode(TextFormat.printer().printToString(toPb()), UTF_8.name()); } catch (UnsupportedEncodingException e) { throw new IllegalStateException("Unexpected encoding exception", e); } diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/admin/v1/stub/DatastoreAdminStubSettings.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/admin/v1/stub/DatastoreAdminStubSettings.java index 64ad035d8..fc346d38c 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/admin/v1/stub/DatastoreAdminStubSettings.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/admin/v1/stub/DatastoreAdminStubSettings.java @@ -258,15 +258,6 @@ public DatastoreAdminStub createStub() throws IOException { "Transport not supported: %s", getTransportChannelProvider().getTransportName())); } - /** Returns the endpoint set by the user or the the service's default endpoint. */ - @Override - public String getEndpoint() { - if (super.getEndpoint() != null) { - return super.getEndpoint(); - } - return getDefaultEndpoint(); - } - /** Returns the default service name. */ @Override public String getServiceName() { @@ -716,15 +707,6 @@ public UnaryCallSettings.Builder getIndexSettings() { return listIndexesSettings; } - /** Returns the endpoint set by the user or the the service's default endpoint. */ - @Override - public String getEndpoint() { - if (super.getEndpoint() != null) { - return super.getEndpoint(); - } - return getDefaultEndpoint(); - } - @Override public DatastoreAdminStubSettings build() throws IOException { return new DatastoreAdminStubSettings(this); diff --git a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/IncompleteKeyTest.java b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/IncompleteKeyTest.java index a1f8956b5..75549e5ea 100644 --- a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/IncompleteKeyTest.java +++ b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/IncompleteKeyTest.java @@ -25,15 +25,17 @@ public class IncompleteKeyTest { - private static IncompleteKey pk1, pk2, pk4; - private static Key parent1; + private static IncompleteKey pk1, pk2, pk4, pk5; + private static Key parent1, parent2; @Before public void setUp() { pk1 = IncompleteKey.newBuilder("ds", "kind1").build(); parent1 = Key.newBuilder("ds", "kind2", 10).setNamespace("ns").build(); + parent2 = Key.newBuilder("ds", "kind2", 10, "test-db").setNamespace("ns").build(); pk2 = IncompleteKey.newBuilder(parent1, "kind3").build(); pk4 = IncompleteKey.newBuilderWithDatabaseId("ds", "kind3", "test-db").build(); + pk5 = IncompleteKey.newBuilder(parent2, "kind4").build(); } @Test @@ -59,12 +61,18 @@ public void testBuilders() { assertEquals("test-db", pk4.getDatabaseId()); assertEquals("kind3", pk4.getKind()); assertTrue(pk4.getAncestors().isEmpty()); + + assertEquals("ds", pk5.getProjectId()); + assertEquals("test-db", pk5.getDatabaseId()); + assertEquals("kind4", pk5.getKind()); + assertEquals(parent2.getPath(), pk5.getAncestors()); } @Test public void testParent() { assertNull(pk1.getParent()); assertEquals(parent1, pk2.getParent()); + assertEquals(parent2, pk5.getParent()); Key parent2 = Key.newBuilder("ds", "kind3", "name").setNamespace("ns").build(); IncompleteKey pk3 = IncompleteKey.newBuilder(parent2, "kind3").build(); assertEquals(parent2, pk3.getParent()); diff --git a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITDatastoreTest.java b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITDatastoreTest.java index 09dcd2116..c012d28c9 100644 --- a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITDatastoreTest.java +++ b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITDatastoreTest.java @@ -144,6 +144,7 @@ public class ITDatastoreTest { private static Key KEY3; private static Key KEY4; private static Key KEY5; + private static Key KEY6; private static final String MARKS_KIND = "Marks"; private static FullEntity PARTIAL_ENTITY1; private static FullEntity PARTIAL_ENTITY2; @@ -193,6 +194,10 @@ public ITDatastoreTest( KEY3 = Key.newBuilder(KEY2).setName("bla").setNamespace(NAMESPACE).build(); KEY4 = Key.newBuilder(KEY2).setName("newName1").setNamespace(NAMESPACE).build(); KEY5 = Key.newBuilder(KEY2).setName("newName2").setNamespace(NAMESPACE).build(); + KEY6 = + Key.newBuilder(options.getProjectId(), KIND2, 100, options.getDatabaseId()) + .setNamespace(NAMESPACE) + .build(); LIST_VALUE2 = ListValue.of(Collections.singletonList(KeyValue.of(KEY1))); @@ -1787,6 +1792,21 @@ public void testGet() { assertFalse(entity.contains("bla")); } + @Test + public void testIncompleteKey() { + Key parentKey = null; + try { + IncompleteKey incompleteKey = IncompleteKey.newBuilder(KEY6, KIND1).build(); + parentKey = incompleteKey.getParent(); + Entity entity = Entity.newBuilder(parentKey).set("name", "val").build(); + datastore.put(entity); + Entity retrievedEntity = datastore.get(parentKey); + assertThat(retrievedEntity).isEqualTo(entity); + } finally { + datastore.delete(parentKey); + } + } + @Test public void testGetWithReadTime() throws InterruptedException { Key key = diff --git a/grpc-google-cloud-datastore-admin-v1/pom.xml b/grpc-google-cloud-datastore-admin-v1/pom.xml index 150832cde..0464bed48 100644 --- a/grpc-google-cloud-datastore-admin-v1/pom.xml +++ b/grpc-google-cloud-datastore-admin-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-datastore-admin-v1 - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT grpc-google-cloud-datastore-admin-v1 GRPC library for google-cloud-datastore com.google.cloud google-cloud-datastore-parent - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT diff --git a/pom.xml b/pom.xml index eeb20ad87..6ab0ec448 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-datastore-parent pom - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT Google Cloud Datastore Parent https://github.com/googleapis/java-datastore @@ -14,7 +14,7 @@ com.google.cloud sdk-platform-java-config - 3.29.0 + 3.35.0 @@ -143,7 +143,7 @@ github google-cloud-datastore-parent https://googleapis.dev/java/google-api-grpc/latest - 2.27.0 + 2.31.0 @@ -159,27 +159,27 @@ com.google.api.grpc proto-google-cloud-datastore-admin-v1 - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT com.google.api.grpc grpc-google-cloud-datastore-admin-v1 - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT com.google.cloud google-cloud-datastore - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT com.google.api.grpc proto-google-cloud-datastore-v1 - 0.110.2-SNAPSHOT + 0.112.3-SNAPSHOT com.google.cloud.datastore datastore-v1-proto-client - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT com.google.api.grpc diff --git a/proto-google-cloud-datastore-admin-v1/pom.xml b/proto-google-cloud-datastore-admin-v1/pom.xml index 58e80a474..e9a85dc5e 100644 --- a/proto-google-cloud-datastore-admin-v1/pom.xml +++ b/proto-google-cloud-datastore-admin-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-datastore-admin-v1 - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT proto-google-cloud-datastore-admin-v1 Proto library for google-cloud-datastore com.google.cloud google-cloud-datastore-parent - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT diff --git a/proto-google-cloud-datastore-admin-v1/src/main/proto/google/datastore/admin/v1/datastore_admin.proto b/proto-google-cloud-datastore-admin-v1/src/main/proto/google/datastore/admin/v1/datastore_admin.proto index 79ca3df68..a8b3f9986 100644 --- a/proto-google-cloud-datastore-admin-v1/src/main/proto/google/datastore/admin/v1/datastore_admin.proto +++ b/proto-google-cloud-datastore-admin-v1/src/main/proto/google/datastore/admin/v1/datastore_admin.proto @@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-datastore-admin-v1/src/main/proto/google/datastore/admin/v1/index.proto b/proto-google-cloud-datastore-admin-v1/src/main/proto/google/datastore/admin/v1/index.proto index 60bb5af5f..6a1d12227 100644 --- a/proto-google-cloud-datastore-admin-v1/src/main/proto/google/datastore/admin/v1/index.proto +++ b/proto-google-cloud-datastore-admin-v1/src/main/proto/google/datastore/admin/v1/index.proto @@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-datastore-admin-v1/src/main/proto/google/datastore/admin/v1/migration.proto b/proto-google-cloud-datastore-admin-v1/src/main/proto/google/datastore/admin/v1/migration.proto index e5f7477da..813de87dd 100644 --- a/proto-google-cloud-datastore-admin-v1/src/main/proto/google/datastore/admin/v1/migration.proto +++ b/proto-google-cloud-datastore-admin-v1/src/main/proto/google/datastore/admin/v1/migration.proto @@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-datastore-v1/pom.xml b/proto-google-cloud-datastore-v1/pom.xml index f7533666e..a8d6064ca 100644 --- a/proto-google-cloud-datastore-v1/pom.xml +++ b/proto-google-cloud-datastore-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-datastore-v1 - 0.110.2-SNAPSHOT + 0.112.3-SNAPSHOT proto-google-cloud-datastore-v1 PROTO library for proto-google-cloud-datastore-v1 com.google.cloud google-cloud-datastore-parent - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT diff --git a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/DatastoreProto.java b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/DatastoreProto.java index 1b8753e35..e637dd010 100644 --- a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/DatastoreProto.java +++ b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/DatastoreProto.java @@ -100,6 +100,10 @@ public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry r internal_static_google_datastore_v1_MutationResult_descriptor; static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_google_datastore_v1_MutationResult_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_datastore_v1_PropertyMask_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_datastore_v1_PropertyMask_fieldAccessorTable; static final com.google.protobuf.Descriptors.Descriptor internal_static_google_datastore_v1_ReadOptions_descriptor; static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable @@ -134,151 +138,157 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { + "entity.proto\032\037google/datastore/v1/query." + "proto\032\'google/datastore/v1/query_profile" + ".proto\032\037google/protobuf/timestamp.proto\"" - + "\242\001\n\rLookupRequest\022\027\n\nproject_id\030\010 \001(\tB\003\340" + + "\334\001\n\rLookupRequest\022\027\n\nproject_id\030\010 \001(\tB\003\340" + "A\002\022\023\n\013database_id\030\t \001(\t\0226\n\014read_options\030" + "\001 \001(\0132 .google.datastore.v1.ReadOptions\022" + "+\n\004keys\030\003 \003(\0132\030.google.datastore.v1.KeyB" - + "\003\340A\002\"\346\001\n\016LookupResponse\0220\n\005found\030\001 \003(\0132!" - + ".google.datastore.v1.EntityResult\0222\n\007mis" - + "sing\030\002 \003(\0132!.google.datastore.v1.EntityR" - + "esult\022*\n\010deferred\030\003 \003(\0132\030.google.datasto" - + "re.v1.Key\022\023\n\013transaction\030\005 \001(\014\022-\n\tread_t" - + "ime\030\007 \001(\0132\032.google.protobuf.Timestamp\"\341\002" - + "\n\017RunQueryRequest\022\027\n\nproject_id\030\010 \001(\tB\003\340" - + "A\002\022\023\n\013database_id\030\t \001(\t\0226\n\014partition_id\030" - + "\002 \001(\0132 .google.datastore.v1.PartitionId\022" - + "6\n\014read_options\030\001 \001(\0132 .google.datastore" - + ".v1.ReadOptions\022+\n\005query\030\003 \001(\0132\032.google." - + "datastore.v1.QueryH\000\0222\n\tgql_query\030\007 \001(\0132" - + "\035.google.datastore.v1.GqlQueryH\000\022A\n\017expl" - + "ain_options\030\014 \001(\0132#.google.datastore.v1." - + "ExplainOptionsB\003\340A\001B\014\n\nquery_type\"\306\001\n\020Ru" - + "nQueryResponse\0224\n\005batch\030\001 \001(\0132%.google.d" - + "atastore.v1.QueryResultBatch\022)\n\005query\030\002 " - + "\001(\0132\032.google.datastore.v1.Query\022\023\n\013trans" - + "action\030\005 \001(\014\022<\n\017explain_metrics\030\t \001(\0132#." - + "google.datastore.v1.ExplainMetrics\"\203\003\n\032R" - + "unAggregationQueryRequest\022\027\n\nproject_id\030" - + "\010 \001(\tB\003\340A\002\022\023\n\013database_id\030\t \001(\t\0226\n\014parti" - + "tion_id\030\002 \001(\0132 .google.datastore.v1.Part" - + "itionId\0226\n\014read_options\030\001 \001(\0132 .google.d" - + "atastore.v1.ReadOptions\022B\n\021aggregation_q" - + "uery\030\003 \001(\0132%.google.datastore.v1.Aggrega" - + "tionQueryH\000\0222\n\tgql_query\030\007 \001(\0132\035.google." - + "datastore.v1.GqlQueryH\000\022A\n\017explain_optio" - + "ns\030\013 \001(\0132#.google.datastore.v1.ExplainOp" - + "tionsB\003\340A\001B\014\n\nquery_type\"\342\001\n\033RunAggregat" - + "ionQueryResponse\022:\n\005batch\030\001 \001(\0132+.google" - + ".datastore.v1.AggregationResultBatch\0224\n\005" - + "query\030\002 \001(\0132%.google.datastore.v1.Aggreg" - + "ationQuery\022\023\n\013transaction\030\005 \001(\014\022<\n\017expla" - + "in_metrics\030\t \001(\0132#.google.datastore.v1.E" - + "xplainMetrics\"\215\001\n\027BeginTransactionReques" - + "t\022\027\n\nproject_id\030\010 \001(\tB\003\340A\002\022\023\n\013database_i" - + "d\030\t \001(\t\022D\n\023transaction_options\030\n \001(\0132\'.g" - + "oogle.datastore.v1.TransactionOptions\"/\n" - + "\030BeginTransactionResponse\022\023\n\013transaction" - + "\030\001 \001(\014\"Y\n\017RollbackRequest\022\027\n\nproject_id\030" - + "\010 \001(\tB\003\340A\002\022\023\n\013database_id\030\t \001(\t\022\030\n\013trans" - + "action\030\001 \001(\014B\003\340A\002\"\022\n\020RollbackResponse\"\350\002" - + "\n\rCommitRequest\022\027\n\nproject_id\030\010 \001(\tB\003\340A\002" - + "\022\023\n\013database_id\030\t \001(\t\0225\n\004mode\030\005 \001(\0162\'.go" - + "ogle.datastore.v1.CommitRequest.Mode\022\025\n\013" - + "transaction\030\001 \001(\014H\000\022I\n\026single_use_transa" - + "ction\030\n \001(\0132\'.google.datastore.v1.Transa" - + "ctionOptionsH\000\0220\n\tmutations\030\006 \003(\0132\035.goog" - + "le.datastore.v1.Mutation\"F\n\004Mode\022\024\n\020MODE" - + "_UNSPECIFIED\020\000\022\021\n\rTRANSACTIONAL\020\001\022\025\n\021NON" - + "_TRANSACTIONAL\020\002B\026\n\024transaction_selector" - + "\"\227\001\n\016CommitResponse\022=\n\020mutation_results\030" - + "\003 \003(\0132#.google.datastore.v1.MutationResu" - + "lt\022\025\n\rindex_updates\030\004 \001(\005\022/\n\013commit_time" - + "\030\010 \001(\0132\032.google.protobuf.Timestamp\"o\n\022Al" - + "locateIdsRequest\022\027\n\nproject_id\030\010 \001(\tB\003\340A" - + "\002\022\023\n\013database_id\030\t \001(\t\022+\n\004keys\030\001 \003(\0132\030.g" - + "oogle.datastore.v1.KeyB\003\340A\002\"=\n\023AllocateI" - + "dsResponse\022&\n\004keys\030\001 \003(\0132\030.google.datast" - + "ore.v1.Key\"n\n\021ReserveIdsRequest\022\027\n\nproje" - + "ct_id\030\010 \001(\tB\003\340A\002\022\023\n\013database_id\030\t \001(\t\022+\n" - + "\004keys\030\001 \003(\0132\030.google.datastore.v1.KeyB\003\340" - + "A\002\"\024\n\022ReserveIdsResponse\"\272\002\n\010Mutation\022-\n" - + "\006insert\030\004 \001(\0132\033.google.datastore.v1.Enti" - + "tyH\000\022-\n\006update\030\005 \001(\0132\033.google.datastore." - + "v1.EntityH\000\022-\n\006upsert\030\006 \001(\0132\033.google.dat" - + "astore.v1.EntityH\000\022*\n\006delete\030\007 \001(\0132\030.goo" - + "gle.datastore.v1.KeyH\000\022\026\n\014base_version\030\010" - + " \001(\003H\001\0221\n\013update_time\030\013 \001(\0132\032.google.pro" - + "tobuf.TimestampH\001B\013\n\toperationB\035\n\033confli" - + "ct_detection_strategy\"\305\001\n\016MutationResult" - + "\022%\n\003key\030\003 \001(\0132\030.google.datastore.v1.Key\022" - + "\017\n\007version\030\004 \001(\003\022/\n\013create_time\030\007 \001(\0132\032." - + "google.protobuf.Timestamp\022/\n\013update_time" - + "\030\006 \001(\0132\032.google.protobuf.Timestamp\022\031\n\021co" - + "nflict_detected\030\005 \001(\010\"\312\002\n\013ReadOptions\022L\n" - + "\020read_consistency\030\001 \001(\01620.google.datasto" - + "re.v1.ReadOptions.ReadConsistencyH\000\022\025\n\013t" - + "ransaction\030\002 \001(\014H\000\022B\n\017new_transaction\030\003 " - + "\001(\0132\'.google.datastore.v1.TransactionOpt" - + "ionsH\000\022/\n\tread_time\030\004 \001(\0132\032.google.proto" - + "buf.TimestampH\000\"M\n\017ReadConsistency\022 \n\034RE" - + "AD_CONSISTENCY_UNSPECIFIED\020\000\022\n\n\006STRONG\020\001" - + "\022\014\n\010EVENTUAL\020\002B\022\n\020consistency_type\"\222\002\n\022T" - + "ransactionOptions\022G\n\nread_write\030\001 \001(\01321." - + "google.datastore.v1.TransactionOptions.R" - + "eadWriteH\000\022E\n\tread_only\030\002 \001(\01320.google.d" - + "atastore.v1.TransactionOptions.ReadOnlyH" - + "\000\032)\n\tReadWrite\022\034\n\024previous_transaction\030\001" - + " \001(\014\0329\n\010ReadOnly\022-\n\tread_time\030\001 \001(\0132\032.go" - + "ogle.protobuf.TimestampB\006\n\004mode2\341\r\n\tData" - + "store\022\300\001\n\006Lookup\022\".google.datastore.v1.L" - + "ookupRequest\032#.google.datastore.v1.Looku" - + "pResponse\"m\332A\034project_id,read_options,ke" - + "ys\202\323\344\223\002%\" /v1/projects/{project_id}:look" - + "up:\001*\212\323\344\223\002\035\022\014\n\nproject_id\022\r\n\013database_id" - + "\022\251\001\n\010RunQuery\022$.google.datastore.v1.RunQ" - + "ueryRequest\032%.google.datastore.v1.RunQue" - + "ryResponse\"P\202\323\344\223\002\'\"\"/v1/projects/{projec" - + "t_id}:runQuery:\001*\212\323\344\223\002\035\022\014\n\nproject_id\022\r\n" - + "\013database_id\022\325\001\n\023RunAggregationQuery\022/.g" - + "oogle.datastore.v1.RunAggregationQueryRe" - + "quest\0320.google.datastore.v1.RunAggregati" - + "onQueryResponse\"[\202\323\344\223\0022\"-/v1/projects/{p" - + "roject_id}:runAggregationQuery:\001*\212\323\344\223\002\035\022" - + "\014\n\nproject_id\022\r\n\013database_id\022\326\001\n\020BeginTr" - + "ansaction\022,.google.datastore.v1.BeginTra" - + "nsactionRequest\032-.google.datastore.v1.Be" - + "ginTransactionResponse\"e\332A\nproject_id\202\323\344" - + "\223\002/\"*/v1/projects/{project_id}:beginTran" - + "saction:\001*\212\323\344\223\002\035\022\014\n\nproject_id\022\r\n\013databa" - + "se_id\022\346\001\n\006Commit\022\".google.datastore.v1.C" - + "ommitRequest\032#.google.datastore.v1.Commi" - + "tResponse\"\222\001\332A%project_id,mode,transacti" - + "on,mutations\332A\031project_id,mode,mutations" - + "\202\323\344\223\002%\" /v1/projects/{project_id}:commit" - + ":\001*\212\323\344\223\002\035\022\014\n\nproject_id\022\r\n\013database_id\022\302" - + "\001\n\010Rollback\022$.google.datastore.v1.Rollba" - + "ckRequest\032%.google.datastore.v1.Rollback" - + "Response\"i\332A\026project_id,transaction\202\323\344\223\002" - + "\'\"\"/v1/projects/{project_id}:rollback:\001*" - + "\212\323\344\223\002\035\022\014\n\nproject_id\022\r\n\013database_id\022\307\001\n\013" - + "AllocateIds\022\'.google.datastore.v1.Alloca" - + "teIdsRequest\032(.google.datastore.v1.Alloc" - + "ateIdsResponse\"e\332A\017project_id,keys\202\323\344\223\002*" - + "\"%/v1/projects/{project_id}:allocateIds:" - + "\001*\212\323\344\223\002\035\022\014\n\nproject_id\022\r\n\013database_id\022\303\001" - + "\n\nReserveIds\022&.google.datastore.v1.Reser" - + "veIdsRequest\032\'.google.datastore.v1.Reser" - + "veIdsResponse\"d\332A\017project_id,keys\202\323\344\223\002)\"" - + "$/v1/projects/{project_id}:reserveIds:\001*" - + "\212\323\344\223\002\035\022\014\n\nproject_id\022\r\n\013database_id\032v\312A\030" - + "datastore.googleapis.com\322AXhttps://www.g" - + "oogleapis.com/auth/cloud-platform,https:" - + "//www.googleapis.com/auth/datastoreB\300\001\n\027" - + "com.google.datastore.v1B\016DatastoreProtoP" - + "\001Z + * The properties to return. Defaults to returning all properties. + * + * If this field is set and an entity has a property not referenced in the + * mask, it will be absent from [LookupResponse.found.entity.properties][]. + * + * The entity's key is always returned. + * + * + * .google.datastore.v1.PropertyMask property_mask = 5; + * + * @return Whether the propertyMask field is set. + */ + @java.lang.Override + public boolean hasPropertyMask() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
+   * The properties to return. Defaults to returning all properties.
+   *
+   * If this field is set and an entity has a property not referenced in the
+   * mask, it will be absent from [LookupResponse.found.entity.properties][].
+   *
+   * The entity's key is always returned.
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + * + * @return The propertyMask. + */ + @java.lang.Override + public com.google.datastore.v1.PropertyMask getPropertyMask() { + return propertyMask_ == null + ? com.google.datastore.v1.PropertyMask.getDefaultInstance() + : propertyMask_; + } + /** + * + * + *
+   * The properties to return. Defaults to returning all properties.
+   *
+   * If this field is set and an entity has a property not referenced in the
+   * mask, it will be absent from [LookupResponse.found.entity.properties][].
+   *
+   * The entity's key is always returned.
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + */ + @java.lang.Override + public com.google.datastore.v1.PropertyMaskOrBuilder getPropertyMaskOrBuilder() { + return propertyMask_ == null + ? com.google.datastore.v1.PropertyMask.getDefaultInstance() + : propertyMask_; + } + private byte memoizedIsInitialized = -1; @java.lang.Override @@ -319,6 +384,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io for (int i = 0; i < keys_.size(); i++) { output.writeMessage(3, keys_.get(i)); } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(5, getPropertyMask()); + } if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(projectId_)) { com.google.protobuf.GeneratedMessageV3.writeString(output, 8, projectId_); } @@ -340,6 +408,9 @@ public int getSerializedSize() { for (int i = 0; i < keys_.size(); i++) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, keys_.get(i)); } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getPropertyMask()); + } if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(projectId_)) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, projectId_); } @@ -368,6 +439,10 @@ public boolean equals(final java.lang.Object obj) { if (!getReadOptions().equals(other.getReadOptions())) return false; } if (!getKeysList().equals(other.getKeysList())) return false; + if (hasPropertyMask() != other.hasPropertyMask()) return false; + if (hasPropertyMask()) { + if (!getPropertyMask().equals(other.getPropertyMask())) return false; + } if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; } @@ -391,6 +466,10 @@ public int hashCode() { hash = (37 * hash) + KEYS_FIELD_NUMBER; hash = (53 * hash) + getKeysList().hashCode(); } + if (hasPropertyMask()) { + hash = (37 * hash) + PROPERTY_MASK_FIELD_NUMBER; + hash = (53 * hash) + getPropertyMask().hashCode(); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -532,6 +611,7 @@ private void maybeForceBuilderInitialization() { if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { getReadOptionsFieldBuilder(); getKeysFieldBuilder(); + getPropertyMaskFieldBuilder(); } } @@ -553,6 +633,11 @@ public Builder clear() { keysBuilder_.clear(); } bitField0_ = (bitField0_ & ~0x00000008); + propertyMask_ = null; + if (propertyMaskBuilder_ != null) { + propertyMaskBuilder_.dispose(); + propertyMaskBuilder_ = null; + } return this; } @@ -614,6 +699,11 @@ private void buildPartial0(com.google.datastore.v1.LookupRequest result) { readOptionsBuilder_ == null ? readOptions_ : readOptionsBuilder_.build(); to_bitField0_ |= 0x00000001; } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.propertyMask_ = + propertyMaskBuilder_ == null ? propertyMask_ : propertyMaskBuilder_.build(); + to_bitField0_ |= 0x00000002; + } result.bitField0_ |= to_bitField0_; } @@ -702,6 +792,9 @@ public Builder mergeFrom(com.google.datastore.v1.LookupRequest other) { } } } + if (other.hasPropertyMask()) { + mergePropertyMask(other.getPropertyMask()); + } this.mergeUnknownFields(other.getUnknownFields()); onChanged(); return this; @@ -746,6 +839,12 @@ public Builder mergeFrom( } break; } // case 26 + case 42: + { + input.readMessage(getPropertyMaskFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000010; + break; + } // case 42 case 66: { projectId_ = input.readStringRequireUtf8(); @@ -1549,6 +1648,236 @@ public java.util.List getKeysBuilderList() return keysBuilder_; } + private com.google.datastore.v1.PropertyMask propertyMask_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.datastore.v1.PropertyMask, + com.google.datastore.v1.PropertyMask.Builder, + com.google.datastore.v1.PropertyMaskOrBuilder> + propertyMaskBuilder_; + /** + * + * + *
+     * The properties to return. Defaults to returning all properties.
+     *
+     * If this field is set and an entity has a property not referenced in the
+     * mask, it will be absent from [LookupResponse.found.entity.properties][].
+     *
+     * The entity's key is always returned.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + * + * @return Whether the propertyMask field is set. + */ + public boolean hasPropertyMask() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * + * + *
+     * The properties to return. Defaults to returning all properties.
+     *
+     * If this field is set and an entity has a property not referenced in the
+     * mask, it will be absent from [LookupResponse.found.entity.properties][].
+     *
+     * The entity's key is always returned.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + * + * @return The propertyMask. + */ + public com.google.datastore.v1.PropertyMask getPropertyMask() { + if (propertyMaskBuilder_ == null) { + return propertyMask_ == null + ? com.google.datastore.v1.PropertyMask.getDefaultInstance() + : propertyMask_; + } else { + return propertyMaskBuilder_.getMessage(); + } + } + /** + * + * + *
+     * The properties to return. Defaults to returning all properties.
+     *
+     * If this field is set and an entity has a property not referenced in the
+     * mask, it will be absent from [LookupResponse.found.entity.properties][].
+     *
+     * The entity's key is always returned.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + */ + public Builder setPropertyMask(com.google.datastore.v1.PropertyMask value) { + if (propertyMaskBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + propertyMask_ = value; + } else { + propertyMaskBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + /** + * + * + *
+     * The properties to return. Defaults to returning all properties.
+     *
+     * If this field is set and an entity has a property not referenced in the
+     * mask, it will be absent from [LookupResponse.found.entity.properties][].
+     *
+     * The entity's key is always returned.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + */ + public Builder setPropertyMask(com.google.datastore.v1.PropertyMask.Builder builderForValue) { + if (propertyMaskBuilder_ == null) { + propertyMask_ = builderForValue.build(); + } else { + propertyMaskBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + /** + * + * + *
+     * The properties to return. Defaults to returning all properties.
+     *
+     * If this field is set and an entity has a property not referenced in the
+     * mask, it will be absent from [LookupResponse.found.entity.properties][].
+     *
+     * The entity's key is always returned.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + */ + public Builder mergePropertyMask(com.google.datastore.v1.PropertyMask value) { + if (propertyMaskBuilder_ == null) { + if (((bitField0_ & 0x00000010) != 0) + && propertyMask_ != null + && propertyMask_ != com.google.datastore.v1.PropertyMask.getDefaultInstance()) { + getPropertyMaskBuilder().mergeFrom(value); + } else { + propertyMask_ = value; + } + } else { + propertyMaskBuilder_.mergeFrom(value); + } + if (propertyMask_ != null) { + bitField0_ |= 0x00000010; + onChanged(); + } + return this; + } + /** + * + * + *
+     * The properties to return. Defaults to returning all properties.
+     *
+     * If this field is set and an entity has a property not referenced in the
+     * mask, it will be absent from [LookupResponse.found.entity.properties][].
+     *
+     * The entity's key is always returned.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + */ + public Builder clearPropertyMask() { + bitField0_ = (bitField0_ & ~0x00000010); + propertyMask_ = null; + if (propertyMaskBuilder_ != null) { + propertyMaskBuilder_.dispose(); + propertyMaskBuilder_ = null; + } + onChanged(); + return this; + } + /** + * + * + *
+     * The properties to return. Defaults to returning all properties.
+     *
+     * If this field is set and an entity has a property not referenced in the
+     * mask, it will be absent from [LookupResponse.found.entity.properties][].
+     *
+     * The entity's key is always returned.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + */ + public com.google.datastore.v1.PropertyMask.Builder getPropertyMaskBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getPropertyMaskFieldBuilder().getBuilder(); + } + /** + * + * + *
+     * The properties to return. Defaults to returning all properties.
+     *
+     * If this field is set and an entity has a property not referenced in the
+     * mask, it will be absent from [LookupResponse.found.entity.properties][].
+     *
+     * The entity's key is always returned.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + */ + public com.google.datastore.v1.PropertyMaskOrBuilder getPropertyMaskOrBuilder() { + if (propertyMaskBuilder_ != null) { + return propertyMaskBuilder_.getMessageOrBuilder(); + } else { + return propertyMask_ == null + ? com.google.datastore.v1.PropertyMask.getDefaultInstance() + : propertyMask_; + } + } + /** + * + * + *
+     * The properties to return. Defaults to returning all properties.
+     *
+     * If this field is set and an entity has a property not referenced in the
+     * mask, it will be absent from [LookupResponse.found.entity.properties][].
+     *
+     * The entity's key is always returned.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.datastore.v1.PropertyMask, + com.google.datastore.v1.PropertyMask.Builder, + com.google.datastore.v1.PropertyMaskOrBuilder> + getPropertyMaskFieldBuilder() { + if (propertyMaskBuilder_ == null) { + propertyMaskBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.datastore.v1.PropertyMask, + com.google.datastore.v1.PropertyMask.Builder, + com.google.datastore.v1.PropertyMaskOrBuilder>( + getPropertyMask(), getParentForChildren(), isClean()); + propertyMask_ = null; + } + return propertyMaskBuilder_; + } + @java.lang.Override public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { return super.setUnknownFields(unknownFields); diff --git a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/LookupRequestOrBuilder.java b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/LookupRequestOrBuilder.java index 82fe24661..d343eeca4 100644 --- a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/LookupRequestOrBuilder.java +++ b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/LookupRequestOrBuilder.java @@ -170,4 +170,54 @@ public interface LookupRequestOrBuilder * */ com.google.datastore.v1.KeyOrBuilder getKeysOrBuilder(int index); + + /** + * + * + *
+   * The properties to return. Defaults to returning all properties.
+   *
+   * If this field is set and an entity has a property not referenced in the
+   * mask, it will be absent from [LookupResponse.found.entity.properties][].
+   *
+   * The entity's key is always returned.
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + * + * @return Whether the propertyMask field is set. + */ + boolean hasPropertyMask(); + /** + * + * + *
+   * The properties to return. Defaults to returning all properties.
+   *
+   * If this field is set and an entity has a property not referenced in the
+   * mask, it will be absent from [LookupResponse.found.entity.properties][].
+   *
+   * The entity's key is always returned.
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + * + * @return The propertyMask. + */ + com.google.datastore.v1.PropertyMask getPropertyMask(); + /** + * + * + *
+   * The properties to return. Defaults to returning all properties.
+   *
+   * If this field is set and an entity has a property not referenced in the
+   * mask, it will be absent from [LookupResponse.found.entity.properties][].
+   *
+   * The entity's key is always returned.
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 5; + */ + com.google.datastore.v1.PropertyMaskOrBuilder getPropertyMaskOrBuilder(); } diff --git a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/Mutation.java b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/Mutation.java index 91895d180..6857d48a6 100644 --- a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/Mutation.java +++ b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/Mutation.java @@ -60,6 +60,7 @@ public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { com.google.datastore.v1.Mutation.class, com.google.datastore.v1.Mutation.Builder.class); } + private int bitField0_; private int operationCase_ = 0; @SuppressWarnings("serial") @@ -476,6 +477,77 @@ public com.google.protobuf.TimestampOrBuilder getUpdateTimeOrBuilder() { return com.google.protobuf.Timestamp.getDefaultInstance(); } + public static final int PROPERTY_MASK_FIELD_NUMBER = 9; + private com.google.datastore.v1.PropertyMask propertyMask_; + /** + * + * + *
+   * The properties to write in this mutation.
+   * None of the properties in the mask may have a reserved name, except for
+   * `__key__`.
+   * This field is ignored for `delete`.
+   *
+   * If the entity already exists, only properties referenced in the mask are
+   * updated, others are left untouched.
+   * Properties referenced in the mask but not in the entity are deleted.
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + * + * @return Whether the propertyMask field is set. + */ + @java.lang.Override + public boolean hasPropertyMask() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * + * + *
+   * The properties to write in this mutation.
+   * None of the properties in the mask may have a reserved name, except for
+   * `__key__`.
+   * This field is ignored for `delete`.
+   *
+   * If the entity already exists, only properties referenced in the mask are
+   * updated, others are left untouched.
+   * Properties referenced in the mask but not in the entity are deleted.
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + * + * @return The propertyMask. + */ + @java.lang.Override + public com.google.datastore.v1.PropertyMask getPropertyMask() { + return propertyMask_ == null + ? com.google.datastore.v1.PropertyMask.getDefaultInstance() + : propertyMask_; + } + /** + * + * + *
+   * The properties to write in this mutation.
+   * None of the properties in the mask may have a reserved name, except for
+   * `__key__`.
+   * This field is ignored for `delete`.
+   *
+   * If the entity already exists, only properties referenced in the mask are
+   * updated, others are left untouched.
+   * Properties referenced in the mask but not in the entity are deleted.
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + */ + @java.lang.Override + public com.google.datastore.v1.PropertyMaskOrBuilder getPropertyMaskOrBuilder() { + return propertyMask_ == null + ? com.google.datastore.v1.PropertyMask.getDefaultInstance() + : propertyMask_; + } + private byte memoizedIsInitialized = -1; @java.lang.Override @@ -505,6 +577,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io if (conflictDetectionStrategyCase_ == 8) { output.writeInt64(8, (long) ((java.lang.Long) conflictDetectionStrategy_)); } + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(9, getPropertyMask()); + } if (conflictDetectionStrategyCase_ == 11) { output.writeMessage(11, (com.google.protobuf.Timestamp) conflictDetectionStrategy_); } @@ -542,6 +617,9 @@ public int getSerializedSize() { com.google.protobuf.CodedOutputStream.computeInt64Size( 8, (long) ((java.lang.Long) conflictDetectionStrategy_)); } + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(9, getPropertyMask()); + } if (conflictDetectionStrategyCase_ == 11) { size += com.google.protobuf.CodedOutputStream.computeMessageSize( @@ -562,6 +640,10 @@ public boolean equals(final java.lang.Object obj) { } com.google.datastore.v1.Mutation other = (com.google.datastore.v1.Mutation) obj; + if (hasPropertyMask() != other.hasPropertyMask()) return false; + if (hasPropertyMask()) { + if (!getPropertyMask().equals(other.getPropertyMask())) return false; + } if (!getOperationCase().equals(other.getOperationCase())) return false; switch (operationCase_) { case 4: @@ -602,6 +684,10 @@ public int hashCode() { } int hash = 41; hash = (19 * hash) + getDescriptor().hashCode(); + if (hasPropertyMask()) { + hash = (37 * hash) + PROPERTY_MASK_FIELD_NUMBER; + hash = (53 * hash) + getPropertyMask().hashCode(); + } switch (operationCase_) { case 4: hash = (37 * hash) + INSERT_FIELD_NUMBER; @@ -762,10 +848,19 @@ public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { } // Construct using com.google.datastore.v1.Mutation.newBuilder() - private Builder() {} + private Builder() { + maybeForceBuilderInitialization(); + } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getPropertyMaskFieldBuilder(); + } } @java.lang.Override @@ -787,6 +882,11 @@ public Builder clear() { if (updateTimeBuilder_ != null) { updateTimeBuilder_.clear(); } + propertyMask_ = null; + if (propertyMaskBuilder_ != null) { + propertyMaskBuilder_.dispose(); + propertyMaskBuilder_ = null; + } operationCase_ = 0; operation_ = null; conflictDetectionStrategyCase_ = 0; @@ -827,6 +927,13 @@ public com.google.datastore.v1.Mutation buildPartial() { private void buildPartial0(com.google.datastore.v1.Mutation result) { int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000040) != 0)) { + result.propertyMask_ = + propertyMaskBuilder_ == null ? propertyMask_ : propertyMaskBuilder_.build(); + to_bitField0_ |= 0x00000001; + } + result.bitField0_ |= to_bitField0_; } private void buildPartialOneofs(com.google.datastore.v1.Mutation result) { @@ -896,6 +1003,9 @@ public Builder mergeFrom(com.google.protobuf.Message other) { public Builder mergeFrom(com.google.datastore.v1.Mutation other) { if (other == com.google.datastore.v1.Mutation.getDefaultInstance()) return this; + if (other.hasPropertyMask()) { + mergePropertyMask(other.getPropertyMask()); + } switch (other.getOperationCase()) { case INSERT: { @@ -994,6 +1104,12 @@ public Builder mergeFrom( conflictDetectionStrategyCase_ = 8; break; } // case 64 + case 74: + { + input.readMessage(getPropertyMaskFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000040; + break; + } // case 74 case 90: { input.readMessage(getUpdateTimeFieldBuilder().getBuilder(), extensionRegistry); @@ -2206,6 +2322,254 @@ public com.google.protobuf.TimestampOrBuilder getUpdateTimeOrBuilder() { return updateTimeBuilder_; } + private com.google.datastore.v1.PropertyMask propertyMask_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.datastore.v1.PropertyMask, + com.google.datastore.v1.PropertyMask.Builder, + com.google.datastore.v1.PropertyMaskOrBuilder> + propertyMaskBuilder_; + /** + * + * + *
+     * The properties to write in this mutation.
+     * None of the properties in the mask may have a reserved name, except for
+     * `__key__`.
+     * This field is ignored for `delete`.
+     *
+     * If the entity already exists, only properties referenced in the mask are
+     * updated, others are left untouched.
+     * Properties referenced in the mask but not in the entity are deleted.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + * + * @return Whether the propertyMask field is set. + */ + public boolean hasPropertyMask() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + * + * + *
+     * The properties to write in this mutation.
+     * None of the properties in the mask may have a reserved name, except for
+     * `__key__`.
+     * This field is ignored for `delete`.
+     *
+     * If the entity already exists, only properties referenced in the mask are
+     * updated, others are left untouched.
+     * Properties referenced in the mask but not in the entity are deleted.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + * + * @return The propertyMask. + */ + public com.google.datastore.v1.PropertyMask getPropertyMask() { + if (propertyMaskBuilder_ == null) { + return propertyMask_ == null + ? com.google.datastore.v1.PropertyMask.getDefaultInstance() + : propertyMask_; + } else { + return propertyMaskBuilder_.getMessage(); + } + } + /** + * + * + *
+     * The properties to write in this mutation.
+     * None of the properties in the mask may have a reserved name, except for
+     * `__key__`.
+     * This field is ignored for `delete`.
+     *
+     * If the entity already exists, only properties referenced in the mask are
+     * updated, others are left untouched.
+     * Properties referenced in the mask but not in the entity are deleted.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + */ + public Builder setPropertyMask(com.google.datastore.v1.PropertyMask value) { + if (propertyMaskBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + propertyMask_ = value; + } else { + propertyMaskBuilder_.setMessage(value); + } + bitField0_ |= 0x00000040; + onChanged(); + return this; + } + /** + * + * + *
+     * The properties to write in this mutation.
+     * None of the properties in the mask may have a reserved name, except for
+     * `__key__`.
+     * This field is ignored for `delete`.
+     *
+     * If the entity already exists, only properties referenced in the mask are
+     * updated, others are left untouched.
+     * Properties referenced in the mask but not in the entity are deleted.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + */ + public Builder setPropertyMask(com.google.datastore.v1.PropertyMask.Builder builderForValue) { + if (propertyMaskBuilder_ == null) { + propertyMask_ = builderForValue.build(); + } else { + propertyMaskBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000040; + onChanged(); + return this; + } + /** + * + * + *
+     * The properties to write in this mutation.
+     * None of the properties in the mask may have a reserved name, except for
+     * `__key__`.
+     * This field is ignored for `delete`.
+     *
+     * If the entity already exists, only properties referenced in the mask are
+     * updated, others are left untouched.
+     * Properties referenced in the mask but not in the entity are deleted.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + */ + public Builder mergePropertyMask(com.google.datastore.v1.PropertyMask value) { + if (propertyMaskBuilder_ == null) { + if (((bitField0_ & 0x00000040) != 0) + && propertyMask_ != null + && propertyMask_ != com.google.datastore.v1.PropertyMask.getDefaultInstance()) { + getPropertyMaskBuilder().mergeFrom(value); + } else { + propertyMask_ = value; + } + } else { + propertyMaskBuilder_.mergeFrom(value); + } + if (propertyMask_ != null) { + bitField0_ |= 0x00000040; + onChanged(); + } + return this; + } + /** + * + * + *
+     * The properties to write in this mutation.
+     * None of the properties in the mask may have a reserved name, except for
+     * `__key__`.
+     * This field is ignored for `delete`.
+     *
+     * If the entity already exists, only properties referenced in the mask are
+     * updated, others are left untouched.
+     * Properties referenced in the mask but not in the entity are deleted.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + */ + public Builder clearPropertyMask() { + bitField0_ = (bitField0_ & ~0x00000040); + propertyMask_ = null; + if (propertyMaskBuilder_ != null) { + propertyMaskBuilder_.dispose(); + propertyMaskBuilder_ = null; + } + onChanged(); + return this; + } + /** + * + * + *
+     * The properties to write in this mutation.
+     * None of the properties in the mask may have a reserved name, except for
+     * `__key__`.
+     * This field is ignored for `delete`.
+     *
+     * If the entity already exists, only properties referenced in the mask are
+     * updated, others are left untouched.
+     * Properties referenced in the mask but not in the entity are deleted.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + */ + public com.google.datastore.v1.PropertyMask.Builder getPropertyMaskBuilder() { + bitField0_ |= 0x00000040; + onChanged(); + return getPropertyMaskFieldBuilder().getBuilder(); + } + /** + * + * + *
+     * The properties to write in this mutation.
+     * None of the properties in the mask may have a reserved name, except for
+     * `__key__`.
+     * This field is ignored for `delete`.
+     *
+     * If the entity already exists, only properties referenced in the mask are
+     * updated, others are left untouched.
+     * Properties referenced in the mask but not in the entity are deleted.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + */ + public com.google.datastore.v1.PropertyMaskOrBuilder getPropertyMaskOrBuilder() { + if (propertyMaskBuilder_ != null) { + return propertyMaskBuilder_.getMessageOrBuilder(); + } else { + return propertyMask_ == null + ? com.google.datastore.v1.PropertyMask.getDefaultInstance() + : propertyMask_; + } + } + /** + * + * + *
+     * The properties to write in this mutation.
+     * None of the properties in the mask may have a reserved name, except for
+     * `__key__`.
+     * This field is ignored for `delete`.
+     *
+     * If the entity already exists, only properties referenced in the mask are
+     * updated, others are left untouched.
+     * Properties referenced in the mask but not in the entity are deleted.
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.datastore.v1.PropertyMask, + com.google.datastore.v1.PropertyMask.Builder, + com.google.datastore.v1.PropertyMaskOrBuilder> + getPropertyMaskFieldBuilder() { + if (propertyMaskBuilder_ == null) { + propertyMaskBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.datastore.v1.PropertyMask, + com.google.datastore.v1.PropertyMask.Builder, + com.google.datastore.v1.PropertyMaskOrBuilder>( + getPropertyMask(), getParentForChildren(), isClean()); + propertyMask_ = null; + } + return propertyMaskBuilder_; + } + @java.lang.Override public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { return super.setUnknownFields(unknownFields); diff --git a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/MutationOrBuilder.java b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/MutationOrBuilder.java index e833ed942..e051e6003 100644 --- a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/MutationOrBuilder.java +++ b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/MutationOrBuilder.java @@ -246,6 +246,62 @@ public interface MutationOrBuilder */ com.google.protobuf.TimestampOrBuilder getUpdateTimeOrBuilder(); + /** + * + * + *
+   * The properties to write in this mutation.
+   * None of the properties in the mask may have a reserved name, except for
+   * `__key__`.
+   * This field is ignored for `delete`.
+   *
+   * If the entity already exists, only properties referenced in the mask are
+   * updated, others are left untouched.
+   * Properties referenced in the mask but not in the entity are deleted.
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + * + * @return Whether the propertyMask field is set. + */ + boolean hasPropertyMask(); + /** + * + * + *
+   * The properties to write in this mutation.
+   * None of the properties in the mask may have a reserved name, except for
+   * `__key__`.
+   * This field is ignored for `delete`.
+   *
+   * If the entity already exists, only properties referenced in the mask are
+   * updated, others are left untouched.
+   * Properties referenced in the mask but not in the entity are deleted.
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + * + * @return The propertyMask. + */ + com.google.datastore.v1.PropertyMask getPropertyMask(); + /** + * + * + *
+   * The properties to write in this mutation.
+   * None of the properties in the mask may have a reserved name, except for
+   * `__key__`.
+   * This field is ignored for `delete`.
+   *
+   * If the entity already exists, only properties referenced in the mask are
+   * updated, others are left untouched.
+   * Properties referenced in the mask but not in the entity are deleted.
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 9; + */ + com.google.datastore.v1.PropertyMaskOrBuilder getPropertyMaskOrBuilder(); + com.google.datastore.v1.Mutation.OperationCase getOperationCase(); com.google.datastore.v1.Mutation.ConflictDetectionStrategyCase getConflictDetectionStrategyCase(); diff --git a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/PropertyMask.java b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/PropertyMask.java new file mode 100644 index 000000000..2d9c2caf6 --- /dev/null +++ b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/PropertyMask.java @@ -0,0 +1,848 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/datastore/v1/datastore.proto + +// Protobuf Java Version: 3.25.3 +package com.google.datastore.v1; + +/** + * + * + *
+ * The set of arbitrarily nested property paths used to restrict an operation to
+ * only a subset of properties in an entity.
+ * 
+ * + * Protobuf type {@code google.datastore.v1.PropertyMask} + */ +public final class PropertyMask extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.datastore.v1.PropertyMask) + PropertyMaskOrBuilder { + private static final long serialVersionUID = 0L; + // Use PropertyMask.newBuilder() to construct. + private PropertyMask(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private PropertyMask() { + paths_ = com.google.protobuf.LazyStringArrayList.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new PropertyMask(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.datastore.v1.DatastoreProto + .internal_static_google_datastore_v1_PropertyMask_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.datastore.v1.DatastoreProto + .internal_static_google_datastore_v1_PropertyMask_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.datastore.v1.PropertyMask.class, + com.google.datastore.v1.PropertyMask.Builder.class); + } + + public static final int PATHS_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private com.google.protobuf.LazyStringArrayList paths_ = + com.google.protobuf.LazyStringArrayList.emptyList(); + /** + * + * + *
+   * The paths to the properties covered by this mask.
+   *
+   * A path is a list of property names separated by dots (`.`), for example
+   * `foo.bar` means the property `bar` inside the entity property `foo` inside
+   * the entity associated with this path.
+   *
+   * If a property name contains a dot `.` or a backslash `\`, then that
+   * name must be escaped.
+   *
+   * A path must not be empty, and may not reference a value inside an
+   * [array value][google.datastore.v1.Value.array_value].
+   * 
+ * + * repeated string paths = 1; + * + * @return A list containing the paths. + */ + public com.google.protobuf.ProtocolStringList getPathsList() { + return paths_; + } + /** + * + * + *
+   * The paths to the properties covered by this mask.
+   *
+   * A path is a list of property names separated by dots (`.`), for example
+   * `foo.bar` means the property `bar` inside the entity property `foo` inside
+   * the entity associated with this path.
+   *
+   * If a property name contains a dot `.` or a backslash `\`, then that
+   * name must be escaped.
+   *
+   * A path must not be empty, and may not reference a value inside an
+   * [array value][google.datastore.v1.Value.array_value].
+   * 
+ * + * repeated string paths = 1; + * + * @return The count of paths. + */ + public int getPathsCount() { + return paths_.size(); + } + /** + * + * + *
+   * The paths to the properties covered by this mask.
+   *
+   * A path is a list of property names separated by dots (`.`), for example
+   * `foo.bar` means the property `bar` inside the entity property `foo` inside
+   * the entity associated with this path.
+   *
+   * If a property name contains a dot `.` or a backslash `\`, then that
+   * name must be escaped.
+   *
+   * A path must not be empty, and may not reference a value inside an
+   * [array value][google.datastore.v1.Value.array_value].
+   * 
+ * + * repeated string paths = 1; + * + * @param index The index of the element to return. + * @return The paths at the given index. + */ + public java.lang.String getPaths(int index) { + return paths_.get(index); + } + /** + * + * + *
+   * The paths to the properties covered by this mask.
+   *
+   * A path is a list of property names separated by dots (`.`), for example
+   * `foo.bar` means the property `bar` inside the entity property `foo` inside
+   * the entity associated with this path.
+   *
+   * If a property name contains a dot `.` or a backslash `\`, then that
+   * name must be escaped.
+   *
+   * A path must not be empty, and may not reference a value inside an
+   * [array value][google.datastore.v1.Value.array_value].
+   * 
+ * + * repeated string paths = 1; + * + * @param index The index of the value to return. + * @return The bytes of the paths at the given index. + */ + public com.google.protobuf.ByteString getPathsBytes(int index) { + return paths_.getByteString(index); + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + for (int i = 0; i < paths_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, paths_.getRaw(i)); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + { + int dataSize = 0; + for (int i = 0; i < paths_.size(); i++) { + dataSize += computeStringSizeNoTag(paths_.getRaw(i)); + } + size += dataSize; + size += 1 * getPathsList().size(); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.datastore.v1.PropertyMask)) { + return super.equals(obj); + } + com.google.datastore.v1.PropertyMask other = (com.google.datastore.v1.PropertyMask) obj; + + if (!getPathsList().equals(other.getPathsList())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getPathsCount() > 0) { + hash = (37 * hash) + PATHS_FIELD_NUMBER; + hash = (53 * hash) + getPathsList().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.datastore.v1.PropertyMask parseFrom(java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.datastore.v1.PropertyMask parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.datastore.v1.PropertyMask parseFrom(com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.datastore.v1.PropertyMask parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.datastore.v1.PropertyMask parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.datastore.v1.PropertyMask parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.datastore.v1.PropertyMask parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.datastore.v1.PropertyMask parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.datastore.v1.PropertyMask parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.datastore.v1.PropertyMask parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.datastore.v1.PropertyMask parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.datastore.v1.PropertyMask parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(com.google.datastore.v1.PropertyMask prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
+   * The set of arbitrarily nested property paths used to restrict an operation to
+   * only a subset of properties in an entity.
+   * 
+ * + * Protobuf type {@code google.datastore.v1.PropertyMask} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.datastore.v1.PropertyMask) + com.google.datastore.v1.PropertyMaskOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.datastore.v1.DatastoreProto + .internal_static_google_datastore_v1_PropertyMask_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.datastore.v1.DatastoreProto + .internal_static_google_datastore_v1_PropertyMask_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.datastore.v1.PropertyMask.class, + com.google.datastore.v1.PropertyMask.Builder.class); + } + + // Construct using com.google.datastore.v1.PropertyMask.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + paths_ = com.google.protobuf.LazyStringArrayList.emptyList(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.datastore.v1.DatastoreProto + .internal_static_google_datastore_v1_PropertyMask_descriptor; + } + + @java.lang.Override + public com.google.datastore.v1.PropertyMask getDefaultInstanceForType() { + return com.google.datastore.v1.PropertyMask.getDefaultInstance(); + } + + @java.lang.Override + public com.google.datastore.v1.PropertyMask build() { + com.google.datastore.v1.PropertyMask result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.datastore.v1.PropertyMask buildPartial() { + com.google.datastore.v1.PropertyMask result = new com.google.datastore.v1.PropertyMask(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(com.google.datastore.v1.PropertyMask result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + paths_.makeImmutable(); + result.paths_ = paths_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.datastore.v1.PropertyMask) { + return mergeFrom((com.google.datastore.v1.PropertyMask) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.datastore.v1.PropertyMask other) { + if (other == com.google.datastore.v1.PropertyMask.getDefaultInstance()) return this; + if (!other.paths_.isEmpty()) { + if (paths_.isEmpty()) { + paths_ = other.paths_; + bitField0_ |= 0x00000001; + } else { + ensurePathsIsMutable(); + paths_.addAll(other.paths_); + } + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + java.lang.String s = input.readStringRequireUtf8(); + ensurePathsIsMutable(); + paths_.add(s); + break; + } // case 10 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private com.google.protobuf.LazyStringArrayList paths_ = + com.google.protobuf.LazyStringArrayList.emptyList(); + + private void ensurePathsIsMutable() { + if (!paths_.isModifiable()) { + paths_ = new com.google.protobuf.LazyStringArrayList(paths_); + } + bitField0_ |= 0x00000001; + } + /** + * + * + *
+     * The paths to the properties covered by this mask.
+     *
+     * A path is a list of property names separated by dots (`.`), for example
+     * `foo.bar` means the property `bar` inside the entity property `foo` inside
+     * the entity associated with this path.
+     *
+     * If a property name contains a dot `.` or a backslash `\`, then that
+     * name must be escaped.
+     *
+     * A path must not be empty, and may not reference a value inside an
+     * [array value][google.datastore.v1.Value.array_value].
+     * 
+ * + * repeated string paths = 1; + * + * @return A list containing the paths. + */ + public com.google.protobuf.ProtocolStringList getPathsList() { + paths_.makeImmutable(); + return paths_; + } + /** + * + * + *
+     * The paths to the properties covered by this mask.
+     *
+     * A path is a list of property names separated by dots (`.`), for example
+     * `foo.bar` means the property `bar` inside the entity property `foo` inside
+     * the entity associated with this path.
+     *
+     * If a property name contains a dot `.` or a backslash `\`, then that
+     * name must be escaped.
+     *
+     * A path must not be empty, and may not reference a value inside an
+     * [array value][google.datastore.v1.Value.array_value].
+     * 
+ * + * repeated string paths = 1; + * + * @return The count of paths. + */ + public int getPathsCount() { + return paths_.size(); + } + /** + * + * + *
+     * The paths to the properties covered by this mask.
+     *
+     * A path is a list of property names separated by dots (`.`), for example
+     * `foo.bar` means the property `bar` inside the entity property `foo` inside
+     * the entity associated with this path.
+     *
+     * If a property name contains a dot `.` or a backslash `\`, then that
+     * name must be escaped.
+     *
+     * A path must not be empty, and may not reference a value inside an
+     * [array value][google.datastore.v1.Value.array_value].
+     * 
+ * + * repeated string paths = 1; + * + * @param index The index of the element to return. + * @return The paths at the given index. + */ + public java.lang.String getPaths(int index) { + return paths_.get(index); + } + /** + * + * + *
+     * The paths to the properties covered by this mask.
+     *
+     * A path is a list of property names separated by dots (`.`), for example
+     * `foo.bar` means the property `bar` inside the entity property `foo` inside
+     * the entity associated with this path.
+     *
+     * If a property name contains a dot `.` or a backslash `\`, then that
+     * name must be escaped.
+     *
+     * A path must not be empty, and may not reference a value inside an
+     * [array value][google.datastore.v1.Value.array_value].
+     * 
+ * + * repeated string paths = 1; + * + * @param index The index of the value to return. + * @return The bytes of the paths at the given index. + */ + public com.google.protobuf.ByteString getPathsBytes(int index) { + return paths_.getByteString(index); + } + /** + * + * + *
+     * The paths to the properties covered by this mask.
+     *
+     * A path is a list of property names separated by dots (`.`), for example
+     * `foo.bar` means the property `bar` inside the entity property `foo` inside
+     * the entity associated with this path.
+     *
+     * If a property name contains a dot `.` or a backslash `\`, then that
+     * name must be escaped.
+     *
+     * A path must not be empty, and may not reference a value inside an
+     * [array value][google.datastore.v1.Value.array_value].
+     * 
+ * + * repeated string paths = 1; + * + * @param index The index to set the value at. + * @param value The paths to set. + * @return This builder for chaining. + */ + public Builder setPaths(int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensurePathsIsMutable(); + paths_.set(index, value); + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
+     * The paths to the properties covered by this mask.
+     *
+     * A path is a list of property names separated by dots (`.`), for example
+     * `foo.bar` means the property `bar` inside the entity property `foo` inside
+     * the entity associated with this path.
+     *
+     * If a property name contains a dot `.` or a backslash `\`, then that
+     * name must be escaped.
+     *
+     * A path must not be empty, and may not reference a value inside an
+     * [array value][google.datastore.v1.Value.array_value].
+     * 
+ * + * repeated string paths = 1; + * + * @param value The paths to add. + * @return This builder for chaining. + */ + public Builder addPaths(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensurePathsIsMutable(); + paths_.add(value); + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
+     * The paths to the properties covered by this mask.
+     *
+     * A path is a list of property names separated by dots (`.`), for example
+     * `foo.bar` means the property `bar` inside the entity property `foo` inside
+     * the entity associated with this path.
+     *
+     * If a property name contains a dot `.` or a backslash `\`, then that
+     * name must be escaped.
+     *
+     * A path must not be empty, and may not reference a value inside an
+     * [array value][google.datastore.v1.Value.array_value].
+     * 
+ * + * repeated string paths = 1; + * + * @param values The paths to add. + * @return This builder for chaining. + */ + public Builder addAllPaths(java.lang.Iterable values) { + ensurePathsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, paths_); + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
+     * The paths to the properties covered by this mask.
+     *
+     * A path is a list of property names separated by dots (`.`), for example
+     * `foo.bar` means the property `bar` inside the entity property `foo` inside
+     * the entity associated with this path.
+     *
+     * If a property name contains a dot `.` or a backslash `\`, then that
+     * name must be escaped.
+     *
+     * A path must not be empty, and may not reference a value inside an
+     * [array value][google.datastore.v1.Value.array_value].
+     * 
+ * + * repeated string paths = 1; + * + * @return This builder for chaining. + */ + public Builder clearPaths() { + paths_ = com.google.protobuf.LazyStringArrayList.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + ; + onChanged(); + return this; + } + /** + * + * + *
+     * The paths to the properties covered by this mask.
+     *
+     * A path is a list of property names separated by dots (`.`), for example
+     * `foo.bar` means the property `bar` inside the entity property `foo` inside
+     * the entity associated with this path.
+     *
+     * If a property name contains a dot `.` or a backslash `\`, then that
+     * name must be escaped.
+     *
+     * A path must not be empty, and may not reference a value inside an
+     * [array value][google.datastore.v1.Value.array_value].
+     * 
+ * + * repeated string paths = 1; + * + * @param value The bytes of the paths to add. + * @return This builder for chaining. + */ + public Builder addPathsBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + ensurePathsIsMutable(); + paths_.add(value); + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.datastore.v1.PropertyMask) + } + + // @@protoc_insertion_point(class_scope:google.datastore.v1.PropertyMask) + private static final com.google.datastore.v1.PropertyMask DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.datastore.v1.PropertyMask(); + } + + public static com.google.datastore.v1.PropertyMask getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public PropertyMask parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.datastore.v1.PropertyMask getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/PropertyMaskOrBuilder.java b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/PropertyMaskOrBuilder.java new file mode 100644 index 000000000..8711d5d8a --- /dev/null +++ b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/PropertyMaskOrBuilder.java @@ -0,0 +1,117 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/datastore/v1/datastore.proto + +// Protobuf Java Version: 3.25.3 +package com.google.datastore.v1; + +public interface PropertyMaskOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.datastore.v1.PropertyMask) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
+   * The paths to the properties covered by this mask.
+   *
+   * A path is a list of property names separated by dots (`.`), for example
+   * `foo.bar` means the property `bar` inside the entity property `foo` inside
+   * the entity associated with this path.
+   *
+   * If a property name contains a dot `.` or a backslash `\`, then that
+   * name must be escaped.
+   *
+   * A path must not be empty, and may not reference a value inside an
+   * [array value][google.datastore.v1.Value.array_value].
+   * 
+ * + * repeated string paths = 1; + * + * @return A list containing the paths. + */ + java.util.List getPathsList(); + /** + * + * + *
+   * The paths to the properties covered by this mask.
+   *
+   * A path is a list of property names separated by dots (`.`), for example
+   * `foo.bar` means the property `bar` inside the entity property `foo` inside
+   * the entity associated with this path.
+   *
+   * If a property name contains a dot `.` or a backslash `\`, then that
+   * name must be escaped.
+   *
+   * A path must not be empty, and may not reference a value inside an
+   * [array value][google.datastore.v1.Value.array_value].
+   * 
+ * + * repeated string paths = 1; + * + * @return The count of paths. + */ + int getPathsCount(); + /** + * + * + *
+   * The paths to the properties covered by this mask.
+   *
+   * A path is a list of property names separated by dots (`.`), for example
+   * `foo.bar` means the property `bar` inside the entity property `foo` inside
+   * the entity associated with this path.
+   *
+   * If a property name contains a dot `.` or a backslash `\`, then that
+   * name must be escaped.
+   *
+   * A path must not be empty, and may not reference a value inside an
+   * [array value][google.datastore.v1.Value.array_value].
+   * 
+ * + * repeated string paths = 1; + * + * @param index The index of the element to return. + * @return The paths at the given index. + */ + java.lang.String getPaths(int index); + /** + * + * + *
+   * The paths to the properties covered by this mask.
+   *
+   * A path is a list of property names separated by dots (`.`), for example
+   * `foo.bar` means the property `bar` inside the entity property `foo` inside
+   * the entity associated with this path.
+   *
+   * If a property name contains a dot `.` or a backslash `\`, then that
+   * name must be escaped.
+   *
+   * A path must not be empty, and may not reference a value inside an
+   * [array value][google.datastore.v1.Value.array_value].
+   * 
+ * + * repeated string paths = 1; + * + * @param index The index of the value to return. + * @return The bytes of the paths at the given index. + */ + com.google.protobuf.ByteString getPathsBytes(int index); +} diff --git a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/RunQueryRequest.java b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/RunQueryRequest.java index 4420d5779..55691ceae 100644 --- a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/RunQueryRequest.java +++ b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/RunQueryRequest.java @@ -433,6 +433,68 @@ public com.google.datastore.v1.GqlQueryOrBuilder getGqlQueryOrBuilder() { return com.google.datastore.v1.GqlQuery.getDefaultInstance(); } + public static final int PROPERTY_MASK_FIELD_NUMBER = 10; + private com.google.datastore.v1.PropertyMask propertyMask_; + /** + * + * + *
+   * The properties to return.
+   * This field must not be set for a projection query.
+   *
+   * See
+   * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + * + * @return Whether the propertyMask field is set. + */ + @java.lang.Override + public boolean hasPropertyMask() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * + * + *
+   * The properties to return.
+   * This field must not be set for a projection query.
+   *
+   * See
+   * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + * + * @return The propertyMask. + */ + @java.lang.Override + public com.google.datastore.v1.PropertyMask getPropertyMask() { + return propertyMask_ == null + ? com.google.datastore.v1.PropertyMask.getDefaultInstance() + : propertyMask_; + } + /** + * + * + *
+   * The properties to return.
+   * This field must not be set for a projection query.
+   *
+   * See
+   * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + */ + @java.lang.Override + public com.google.datastore.v1.PropertyMaskOrBuilder getPropertyMaskOrBuilder() { + return propertyMask_ == null + ? com.google.datastore.v1.PropertyMask.getDefaultInstance() + : propertyMask_; + } + public static final int EXPLAIN_OPTIONS_FIELD_NUMBER = 12; private com.google.datastore.v1.ExplainOptions explainOptions_; /** @@ -451,7 +513,7 @@ public com.google.datastore.v1.GqlQueryOrBuilder getGqlQueryOrBuilder() { */ @java.lang.Override public boolean hasExplainOptions() { - return ((bitField0_ & 0x00000004) != 0); + return ((bitField0_ & 0x00000008) != 0); } /** * @@ -525,6 +587,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io com.google.protobuf.GeneratedMessageV3.writeString(output, 9, databaseId_); } if (((bitField0_ & 0x00000004) != 0)) { + output.writeMessage(10, getPropertyMask()); + } + if (((bitField0_ & 0x00000008) != 0)) { output.writeMessage(12, getExplainOptions()); } getUnknownFields().writeTo(output); @@ -559,6 +624,9 @@ public int getSerializedSize() { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, databaseId_); } if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(10, getPropertyMask()); + } + if (((bitField0_ & 0x00000008) != 0)) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(12, getExplainOptions()); } size += getUnknownFields().getSerializedSize(); @@ -586,6 +654,10 @@ public boolean equals(final java.lang.Object obj) { if (hasReadOptions()) { if (!getReadOptions().equals(other.getReadOptions())) return false; } + if (hasPropertyMask() != other.hasPropertyMask()) return false; + if (hasPropertyMask()) { + if (!getPropertyMask().equals(other.getPropertyMask())) return false; + } if (hasExplainOptions() != other.hasExplainOptions()) return false; if (hasExplainOptions()) { if (!getExplainOptions().equals(other.getExplainOptions())) return false; @@ -624,6 +696,10 @@ public int hashCode() { hash = (37 * hash) + READ_OPTIONS_FIELD_NUMBER; hash = (53 * hash) + getReadOptions().hashCode(); } + if (hasPropertyMask()) { + hash = (37 * hash) + PROPERTY_MASK_FIELD_NUMBER; + hash = (53 * hash) + getPropertyMask().hashCode(); + } if (hasExplainOptions()) { hash = (37 * hash) + EXPLAIN_OPTIONS_FIELD_NUMBER; hash = (53 * hash) + getExplainOptions().hashCode(); @@ -782,6 +858,7 @@ private void maybeForceBuilderInitialization() { if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { getPartitionIdFieldBuilder(); getReadOptionsFieldBuilder(); + getPropertyMaskFieldBuilder(); getExplainOptionsFieldBuilder(); } } @@ -808,6 +885,11 @@ public Builder clear() { if (gqlQueryBuilder_ != null) { gqlQueryBuilder_.clear(); } + propertyMask_ = null; + if (propertyMaskBuilder_ != null) { + propertyMaskBuilder_.dispose(); + propertyMaskBuilder_ = null; + } explainOptions_ = null; if (explainOptionsBuilder_ != null) { explainOptionsBuilder_.dispose(); @@ -870,9 +952,14 @@ private void buildPartial0(com.google.datastore.v1.RunQueryRequest result) { to_bitField0_ |= 0x00000002; } if (((from_bitField0_ & 0x00000040) != 0)) { + result.propertyMask_ = + propertyMaskBuilder_ == null ? propertyMask_ : propertyMaskBuilder_.build(); + to_bitField0_ |= 0x00000004; + } + if (((from_bitField0_ & 0x00000080) != 0)) { result.explainOptions_ = explainOptionsBuilder_ == null ? explainOptions_ : explainOptionsBuilder_.build(); - to_bitField0_ |= 0x00000004; + to_bitField0_ |= 0x00000008; } result.bitField0_ |= to_bitField0_; } @@ -949,6 +1036,9 @@ public Builder mergeFrom(com.google.datastore.v1.RunQueryRequest other) { if (other.hasReadOptions()) { mergeReadOptions(other.getReadOptions()); } + if (other.hasPropertyMask()) { + mergePropertyMask(other.getPropertyMask()); + } if (other.hasExplainOptions()) { mergeExplainOptions(other.getExplainOptions()); } @@ -1030,10 +1120,16 @@ public Builder mergeFrom( bitField0_ |= 0x00000002; break; } // case 74 + case 82: + { + input.readMessage(getPropertyMaskFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000040; + break; + } // case 82 case 98: { input.readMessage(getExplainOptionsFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000040; + bitField0_ |= 0x00000080; break; } // case 98 default: @@ -2104,6 +2200,227 @@ public com.google.datastore.v1.GqlQueryOrBuilder getGqlQueryOrBuilder() { return gqlQueryBuilder_; } + private com.google.datastore.v1.PropertyMask propertyMask_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.datastore.v1.PropertyMask, + com.google.datastore.v1.PropertyMask.Builder, + com.google.datastore.v1.PropertyMaskOrBuilder> + propertyMaskBuilder_; + /** + * + * + *
+     * The properties to return.
+     * This field must not be set for a projection query.
+     *
+     * See
+     * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + * + * @return Whether the propertyMask field is set. + */ + public boolean hasPropertyMask() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + * + * + *
+     * The properties to return.
+     * This field must not be set for a projection query.
+     *
+     * See
+     * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + * + * @return The propertyMask. + */ + public com.google.datastore.v1.PropertyMask getPropertyMask() { + if (propertyMaskBuilder_ == null) { + return propertyMask_ == null + ? com.google.datastore.v1.PropertyMask.getDefaultInstance() + : propertyMask_; + } else { + return propertyMaskBuilder_.getMessage(); + } + } + /** + * + * + *
+     * The properties to return.
+     * This field must not be set for a projection query.
+     *
+     * See
+     * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + */ + public Builder setPropertyMask(com.google.datastore.v1.PropertyMask value) { + if (propertyMaskBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + propertyMask_ = value; + } else { + propertyMaskBuilder_.setMessage(value); + } + bitField0_ |= 0x00000040; + onChanged(); + return this; + } + /** + * + * + *
+     * The properties to return.
+     * This field must not be set for a projection query.
+     *
+     * See
+     * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + */ + public Builder setPropertyMask(com.google.datastore.v1.PropertyMask.Builder builderForValue) { + if (propertyMaskBuilder_ == null) { + propertyMask_ = builderForValue.build(); + } else { + propertyMaskBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000040; + onChanged(); + return this; + } + /** + * + * + *
+     * The properties to return.
+     * This field must not be set for a projection query.
+     *
+     * See
+     * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + */ + public Builder mergePropertyMask(com.google.datastore.v1.PropertyMask value) { + if (propertyMaskBuilder_ == null) { + if (((bitField0_ & 0x00000040) != 0) + && propertyMask_ != null + && propertyMask_ != com.google.datastore.v1.PropertyMask.getDefaultInstance()) { + getPropertyMaskBuilder().mergeFrom(value); + } else { + propertyMask_ = value; + } + } else { + propertyMaskBuilder_.mergeFrom(value); + } + if (propertyMask_ != null) { + bitField0_ |= 0x00000040; + onChanged(); + } + return this; + } + /** + * + * + *
+     * The properties to return.
+     * This field must not be set for a projection query.
+     *
+     * See
+     * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + */ + public Builder clearPropertyMask() { + bitField0_ = (bitField0_ & ~0x00000040); + propertyMask_ = null; + if (propertyMaskBuilder_ != null) { + propertyMaskBuilder_.dispose(); + propertyMaskBuilder_ = null; + } + onChanged(); + return this; + } + /** + * + * + *
+     * The properties to return.
+     * This field must not be set for a projection query.
+     *
+     * See
+     * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + */ + public com.google.datastore.v1.PropertyMask.Builder getPropertyMaskBuilder() { + bitField0_ |= 0x00000040; + onChanged(); + return getPropertyMaskFieldBuilder().getBuilder(); + } + /** + * + * + *
+     * The properties to return.
+     * This field must not be set for a projection query.
+     *
+     * See
+     * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + */ + public com.google.datastore.v1.PropertyMaskOrBuilder getPropertyMaskOrBuilder() { + if (propertyMaskBuilder_ != null) { + return propertyMaskBuilder_.getMessageOrBuilder(); + } else { + return propertyMask_ == null + ? com.google.datastore.v1.PropertyMask.getDefaultInstance() + : propertyMask_; + } + } + /** + * + * + *
+     * The properties to return.
+     * This field must not be set for a projection query.
+     *
+     * See
+     * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+     * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.datastore.v1.PropertyMask, + com.google.datastore.v1.PropertyMask.Builder, + com.google.datastore.v1.PropertyMaskOrBuilder> + getPropertyMaskFieldBuilder() { + if (propertyMaskBuilder_ == null) { + propertyMaskBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.datastore.v1.PropertyMask, + com.google.datastore.v1.PropertyMask.Builder, + com.google.datastore.v1.PropertyMaskOrBuilder>( + getPropertyMask(), getParentForChildren(), isClean()); + propertyMask_ = null; + } + return propertyMaskBuilder_; + } + private com.google.datastore.v1.ExplainOptions explainOptions_; private com.google.protobuf.SingleFieldBuilderV3< com.google.datastore.v1.ExplainOptions, @@ -2125,7 +2442,7 @@ public com.google.datastore.v1.GqlQueryOrBuilder getGqlQueryOrBuilder() { * @return Whether the explainOptions field is set. */ public boolean hasExplainOptions() { - return ((bitField0_ & 0x00000040) != 0); + return ((bitField0_ & 0x00000080) != 0); } /** * @@ -2171,7 +2488,7 @@ public Builder setExplainOptions(com.google.datastore.v1.ExplainOptions value) { } else { explainOptionsBuilder_.setMessage(value); } - bitField0_ |= 0x00000040; + bitField0_ |= 0x00000080; onChanged(); return this; } @@ -2194,7 +2511,7 @@ public Builder setExplainOptions( } else { explainOptionsBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000040; + bitField0_ |= 0x00000080; onChanged(); return this; } @@ -2212,7 +2529,7 @@ public Builder setExplainOptions( */ public Builder mergeExplainOptions(com.google.datastore.v1.ExplainOptions value) { if (explainOptionsBuilder_ == null) { - if (((bitField0_ & 0x00000040) != 0) + if (((bitField0_ & 0x00000080) != 0) && explainOptions_ != null && explainOptions_ != com.google.datastore.v1.ExplainOptions.getDefaultInstance()) { getExplainOptionsBuilder().mergeFrom(value); @@ -2223,7 +2540,7 @@ public Builder mergeExplainOptions(com.google.datastore.v1.ExplainOptions value) explainOptionsBuilder_.mergeFrom(value); } if (explainOptions_ != null) { - bitField0_ |= 0x00000040; + bitField0_ |= 0x00000080; onChanged(); } return this; @@ -2241,7 +2558,7 @@ public Builder mergeExplainOptions(com.google.datastore.v1.ExplainOptions value) * */ public Builder clearExplainOptions() { - bitField0_ = (bitField0_ & ~0x00000040); + bitField0_ = (bitField0_ & ~0x00000080); explainOptions_ = null; if (explainOptionsBuilder_ != null) { explainOptionsBuilder_.dispose(); @@ -2263,7 +2580,7 @@ public Builder clearExplainOptions() { * */ public com.google.datastore.v1.ExplainOptions.Builder getExplainOptionsBuilder() { - bitField0_ |= 0x00000040; + bitField0_ |= 0x00000080; onChanged(); return getExplainOptionsFieldBuilder().getBuilder(); } diff --git a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/RunQueryRequestOrBuilder.java b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/RunQueryRequestOrBuilder.java index 9e7a6f0b9..55218e0e9 100644 --- a/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/RunQueryRequestOrBuilder.java +++ b/proto-google-cloud-datastore-v1/src/main/java/com/google/datastore/v1/RunQueryRequestOrBuilder.java @@ -229,6 +229,53 @@ public interface RunQueryRequestOrBuilder */ com.google.datastore.v1.GqlQueryOrBuilder getGqlQueryOrBuilder(); + /** + * + * + *
+   * The properties to return.
+   * This field must not be set for a projection query.
+   *
+   * See
+   * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + * + * @return Whether the propertyMask field is set. + */ + boolean hasPropertyMask(); + /** + * + * + *
+   * The properties to return.
+   * This field must not be set for a projection query.
+   *
+   * See
+   * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + * + * @return The propertyMask. + */ + com.google.datastore.v1.PropertyMask getPropertyMask(); + /** + * + * + *
+   * The properties to return.
+   * This field must not be set for a projection query.
+   *
+   * See
+   * [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask].
+   * 
+ * + * .google.datastore.v1.PropertyMask property_mask = 10; + */ + com.google.datastore.v1.PropertyMaskOrBuilder getPropertyMaskOrBuilder(); + /** * * diff --git a/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/aggregation_result.proto b/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/aggregation_result.proto index 91c521716..262b61fa4 100644 --- a/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/aggregation_result.proto +++ b/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/aggregation_result.proto @@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/datastore.proto b/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/datastore.proto index 1a3fbdd11..92b5038ea 100644 --- a/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/datastore.proto +++ b/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/datastore.proto @@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -173,6 +173,14 @@ message LookupRequest { // Required. Keys of entities to look up. repeated Key keys = 3 [(google.api.field_behavior) = REQUIRED]; + + // The properties to return. Defaults to returning all properties. + // + // If this field is set and an entity has a property not referenced in the + // mask, it will be absent from [LookupResponse.found.entity.properties][]. + // + // The entity's key is always returned. + PropertyMask property_mask = 5; } // The response for [Datastore.Lookup][google.datastore.v1.Datastore.Lookup]. @@ -234,6 +242,13 @@ message RunQueryRequest { GqlQuery gql_query = 7; } + // The properties to return. + // This field must not be set for a projection query. + // + // See + // [LookupRequest.property_mask][google.datastore.v1.LookupRequest.property_mask]. + PropertyMask property_mask = 10; + // Optional. Explain options for the query. If set, additional query // statistics will be returned. If not, only query results will be returned. ExplainOptions explain_options = 12 [(google.api.field_behavior) = OPTIONAL]; @@ -526,6 +541,16 @@ message Mutation { // mutation conflicts. google.protobuf.Timestamp update_time = 11; } + + // The properties to write in this mutation. + // None of the properties in the mask may have a reserved name, except for + // `__key__`. + // This field is ignored for `delete`. + // + // If the entity already exists, only properties referenced in the mask are + // updated, others are left untouched. + // Properties referenced in the mask but not in the entity are deleted. + PropertyMask property_mask = 9; } // The result of applying a mutation. @@ -555,6 +580,23 @@ message MutationResult { bool conflict_detected = 5; } +// The set of arbitrarily nested property paths used to restrict an operation to +// only a subset of properties in an entity. +message PropertyMask { + // The paths to the properties covered by this mask. + // + // A path is a list of property names separated by dots (`.`), for example + // `foo.bar` means the property `bar` inside the entity property `foo` inside + // the entity associated with this path. + // + // If a property name contains a dot `.` or a backslash `\`, then that + // name must be escaped. + // + // A path must not be empty, and may not reference a value inside an + // [array value][google.datastore.v1.Value.array_value]. + repeated string paths = 1; +} + // The options shared by read requests. message ReadOptions { // The possible values for read consistencies. diff --git a/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/entity.proto b/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/entity.proto index d80dd9093..ef4429343 100644 --- a/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/entity.proto +++ b/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/entity.proto @@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/query.proto b/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/query.proto index d1f0f8d07..81386d47b 100644 --- a/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/query.proto +++ b/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/query.proto @@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/query_profile.proto b/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/query_profile.proto index 01c9fc254..f38681c66 100644 --- a/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/query_profile.proto +++ b/proto-google-cloud-datastore-v1/src/main/proto/google/datastore/v1/query_profile.proto @@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index d36722381..715d7154c 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -29,7 +29,7 @@ com.google.cloud google-cloud-datastore - 2.19.1 + 2.20.0 @@ -42,7 +42,7 @@ com.google.truth truth - 1.4.2 + 1.4.3 test
@@ -53,7 +53,7 @@ org.codehaus.mojo build-helper-maven-plugin - 3.5.0 + 3.6.0 add-snippets-source diff --git a/samples/native-image-sample/README.md b/samples/native-image-sample/README.md deleted file mode 100644 index 5f2cfbd27..000000000 --- a/samples/native-image-sample/README.md +++ /dev/null @@ -1,96 +0,0 @@ -# Datastore Sample Application with Native Image - -This application uses the [Google Cloud Datastore client library](https://cloud.google.com/datastore/docs/reference/libraries) and is compatible with Native Image compilation. - -This sample runs through some basic operations of creating/deleting entities, running queries, and running transaction code. - -## Setup Instructions - -You will need to follow these prerequisite steps in order to run the samples: - -1. If you have not already, [create a Google Cloud Platform Project](https://cloud.google.com/resource-manager/docs/creating-managing-projects#creating_a_project). - -2. Install the [Google Cloud SDK](https://cloud.google.com/sdk/) which will allow you to run the sample with your project's credentials. - - Once installed, log in with Application Default Credentials using the following command: - - ``` - gcloud auth application-default login - ``` - - **Note:** Authenticating with Application Default Credentials is convenient to use during development, but we recommend [alternate methods of authentication](https://cloud.google.com/docs/authentication/production) during production use. - -3. Install the native image compiler. - - You can follow the [installation instructions](https://www.graalvm.org/docs/getting-started/#install-graalvm). - After following the instructions, ensure that you install the native image extension installed by running: - - ``` - gu install native-image - ``` - - Once you finish following the instructions, verify that the default version of Java is set to the correct version by running `java -version` in a terminal. - - You will see something similar to the below output: - - ``` - $ java -version - - openjdk version "17.0.3" 2022-04-19 - OpenJDK Runtime Environment GraalVM CE 22.1.0 (build 17.0.3+7-jvmci-22.1-b06) - OpenJDK 64-Bit Server VM GraalVM CE 22.1.0 (build 17.0.3+7-jvmci-22.1-b06, mixed mode, sharing) - ``` -## Sample -1. **(Optional)** If you wish to run the application against the [Datastore emulator](https://cloud.google.com/sdk/gcloud/reference/beta/emulators/datastore), ensure that you have the [Google Cloud SDK](https://cloud.google.com/sdk) installed. - - In a new terminal window, start the emulator via `gcloud`: - - ``` - gcloud beta emulators datastore start --host-port=localhost:9010 - ``` - - Leave the emulator running in this terminal for now. - In the next section, we will run the sample application against the Datastore emulator instance. - -2. Navigate to this directory and compile the application with the native image compiler. - - ``` - mvn package -P native -DskipTests - ``` - -3. **(Optional)** If you're using the emulator, export the `DATASTORE_EMULATOR_HOST` as an environment variable in your terminal. - - ``` - export DATASTORE_EMULATOR_HOST=localhost:9010 - ``` - - The Datastore Client Libraries will detect this environment variable and automatically connect to the emulator instance if this variable is set. - -4. Run the application. - - ``` - ./target/native-image-sample - ``` - -5. The application will run through some basic Datastore operations and log some output statements. - - ``` - Successfully added entity. - Reading entity: 1cf34cc1-2b8a-4945-9fc4-058f03dcd08e - Successfully deleted entity: 1cf34cc1-2b8a-4945-9fc4-058f03dcd08e - Run fake transaction code. - Found entity: - name=de4f36f4-3936-4252-98d3-e0d56d485254 - kind=test-kind - namespace=nativeimage-test-namespace - properties={description=StringValue{valueType=STRING, excludeFromIndexes=false, meaning=0, value=hello world}} - Ran transaction callable. - ``` - -### Sample Integration test with Native Image Support - -In order to run the sample integration test as a native image, call the following command: - - ``` - mvn test -Pnative - ``` diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml index d1d30028d..e69de29bb 100644 --- a/samples/native-image-sample/pom.xml +++ b/samples/native-image-sample/pom.xml @@ -1,141 +0,0 @@ - - - 4.0.0 - com.example.datastore - native-image-sample - Native Image Sample - https://github.com/googleapis/java-datastore - - - - com.google.cloud.samples - shared-configuration - 1.2.0 - - - - - 1.8 - 1.8 - UTF-8 - - - - - - com.google.cloud - libraries-bom - 26.38.0 - pom - import - - - - - - - com.google.cloud - google-cloud-datastore - - - - junit - junit - 4.13.2 - test - - - com.google.truth - truth - 1.4.2 - test - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - com.example.datastore.NativeImageDatastoreSample - - - - - - - - - - - native - - - - org.junit.vintage - junit-vintage-engine - 5.10.2 - test - - - org.graalvm.buildtools - junit-platform-native - 0.10.1 - test - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - 3.2.5 - - - **/IT* - - - - - org.graalvm.buildtools - native-maven-plugin - 0.10.1 - true - - com.example.datastore.NativeImageDatastoreSample - - --no-fallback - --no-server - - - - - build-native - - build - test - - package - - - test-native - - test - - test - - - - - - - - \ No newline at end of file diff --git a/samples/native-image-sample/src/main/java/com/example/datastore/NativeImageDatastoreSample.java b/samples/native-image-sample/src/main/java/com/example/datastore/NativeImageDatastoreSample.java deleted file mode 100644 index 7ce5c900a..000000000 --- a/samples/native-image-sample/src/main/java/com/example/datastore/NativeImageDatastoreSample.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2020-2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.datastore; - -import com.google.cloud.datastore.Datastore; -import com.google.cloud.datastore.DatastoreOptions; -import com.google.cloud.datastore.Entity; -import com.google.cloud.datastore.Key; -import com.google.cloud.datastore.Query; -import com.google.cloud.datastore.QueryResults; -import com.google.cloud.datastore.StructuredQuery; -import com.google.cloud.datastore.Transaction; -import java.time.Duration; -import java.time.Instant; -import java.util.UUID; - -/** Sample Datastore Application. */ -public class NativeImageDatastoreSample { - - /* Datastore namespace where entities will be created. */ - private static final String TEST_NAMESPACE = "nativeimage-test-namespace"; - - /* Datastore kind used. */ - private static final String TEST_KIND = "test-kind"; - - /** Entrypoint to the Datastore sample application. */ - public static void main(String[] args) { - Instant startTime = Instant.now(); - Datastore datastore = DatastoreOptions.getDefaultInstance().getService(); - - String testId = UUID.randomUUID().toString(); - - addEntity(datastore, testId); - getEntity(datastore, testId); - deleteEntity(datastore, testId); - - runTransaction(datastore); - - String id = UUID.randomUUID().toString(); - Key key = createKey(datastore, id); - runTransactionCallable(datastore, key); - Instant endTime = Instant.now(); - Duration duration = Duration.between(startTime, endTime); - System.out.println("Duration: " + duration.toString()); - } - - static void addEntity(Datastore datastore, String id) { - Key key = createKey(datastore, id); - Entity entity = Entity.newBuilder(key).set("description", "hello world").build(); - datastore.add(entity); - System.out.println("Successfully added entity."); - } - - static void getEntity(Datastore datastore, String id) { - Key key = createKey(datastore, id); - Entity entity = datastore.get(key); - System.out.println("Reading entity: " + entity.getKey().getName()); - } - - static void deleteEntity(Datastore datastore, String id) { - Key key = createKey(datastore, id); - datastore.delete(key); - - Entity entity = datastore.get(key); - if (entity == null) { - System.out.println("Successfully deleted entity: " + id); - } else { - throw new RuntimeException("Failed to delete entity: " + id); - } - } - - static void runTransactionCallable(Datastore datastore, Key entityKey) { - datastore.runInTransaction( - client -> { - Entity entity = Entity.newBuilder(entityKey).set("description", "hello world").build(); - datastore.add(entity); - - StructuredQuery query = - Query.newEntityQueryBuilder().setNamespace(TEST_NAMESPACE).setKind(TEST_KIND).build(); - - QueryResults results = datastore.run(query); - while (results.hasNext()) { - Entity result = results.next(); - String name = result.getKey().getName(); - String kind = result.getKey().getKind(); - String namespace = result.getKey().getNamespace(); - System.out.println( - "Found entity:" - + "\n\t\tname=" - + name - + "\n\t\tkind=" - + kind - + "\n\t\tnamespace=" - + namespace - + "\n\t\tproperties=" - + result.getProperties().toString()); - } - - datastore.delete(entityKey); - return null; - }); - - System.out.println("Ran transaction callable."); - } - - private static void runTransaction(Datastore datastore) { - Transaction transaction = datastore.newTransaction(); - transaction.commit(); - transaction = datastore.newTransaction(); - transaction.rollback(); - System.out.println("Run fake transaction code."); - } - - static Key createKey(Datastore datastore, String id) { - return datastore.newKeyFactory().setNamespace(TEST_NAMESPACE).setKind(TEST_KIND).newKey(id); - } -} diff --git a/samples/native-image-sample/src/test/java/com/example/datastore/ITNativeImageDatastoreSample.java b/samples/native-image-sample/src/test/java/com/example/datastore/ITNativeImageDatastoreSample.java deleted file mode 100644 index 710f18367..000000000 --- a/samples/native-image-sample/src/test/java/com/example/datastore/ITNativeImageDatastoreSample.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.datastore; - -import static com.google.common.truth.Truth.assertThat; - -import com.google.cloud.datastore.Datastore; -import com.google.cloud.datastore.DatastoreOptions; -import com.google.cloud.datastore.Key; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; -import java.util.UUID; -import org.junit.Before; -import org.junit.Test; - -/** Tests for {@link com.example.datastore.NativeImageDatastoreSample} */ -public class ITNativeImageDatastoreSample { - - private Datastore datastore; - private ByteArrayOutputStream bout; - private PrintStream out; - - @Before - public void setUp() { - datastore = DatastoreOptions.getDefaultInstance().getService(); - bout = new ByteArrayOutputStream(); - out = new PrintStream(bout); - System.setOut(out); - } - - @Test - public void testAddAndGetEntity() { - bout.reset(); - String testId = "test-id-" + UUID.randomUUID(); - NativeImageDatastoreSample.addEntity(datastore, testId); - NativeImageDatastoreSample.getEntity(datastore, testId); - assertThat(bout.toString()).contains("Reading entity: " + testId); - - NativeImageDatastoreSample.deleteEntity(datastore, testId); - } - - @Test - public void testRunTransactionalCallable() { - bout.reset(); - String testId = "test-id-" + UUID.randomUUID(); - Key key = NativeImageDatastoreSample.createKey(datastore, testId); - NativeImageDatastoreSample.runTransactionCallable(datastore, key); - assertThat(bout.toString()) - .contains( - "Found entity:" - + "\n\t\tname=" - + testId - + "\n\t\tkind=test-kind" - + "\n\t\tnamespace=nativeimage-test-namespace" - + "\n\t\tproperties={description=StringValue{valueType=STRING, excludeFromIndexes=false," - + " meaning=0, value=hello world}}\n" - + "Ran transaction callable."); - - NativeImageDatastoreSample.deleteEntity(datastore, "test-id"); - } -} diff --git a/samples/pom.xml b/samples/pom.xml index a24801164..2e970d081 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -31,7 +31,6 @@ install-without-bom snapshot snippets - native-image-sample @@ -39,7 +38,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.1.1 + 3.1.2 true @@ -47,7 +46,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - 1.6.13 + 1.7.0 true diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 45331e46b..662500308 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -28,7 +28,7 @@ com.google.cloud google-cloud-datastore - 2.19.2-SNAPSHOT + 2.21.3-SNAPSHOT @@ -41,7 +41,7 @@ com.google.truth truth - 1.4.2 + 1.4.3 test
@@ -52,7 +52,7 @@ org.codehaus.mojo build-helper-maven-plugin - 3.5.0 + 3.6.0 add-snippets-source diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 82f0945a7..bd49599d3 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -30,7 +30,7 @@ com.google.cloud libraries-bom - 26.38.0 + 26.45.0 pom import @@ -53,7 +53,7 @@ com.google.truth truth - 1.4.2 + 1.4.3 test diff --git a/versions.txt b/versions.txt index 3d01cfb1c..a22a8396e 100644 --- a/versions.txt +++ b/versions.txt @@ -1,9 +1,9 @@ # Format: # module:released-version:current-version -google-cloud-datastore:2.19.1:2.19.2-SNAPSHOT -google-cloud-datastore-bom:2.19.1:2.19.2-SNAPSHOT -proto-google-cloud-datastore-v1:0.110.1:0.110.2-SNAPSHOT -datastore-v1-proto-client:2.19.1:2.19.2-SNAPSHOT -proto-google-cloud-datastore-admin-v1:2.19.1:2.19.2-SNAPSHOT -grpc-google-cloud-datastore-admin-v1:2.19.1:2.19.2-SNAPSHOT +google-cloud-datastore:2.21.2:2.21.3-SNAPSHOT +google-cloud-datastore-bom:2.21.2:2.21.3-SNAPSHOT +proto-google-cloud-datastore-v1:0.112.2:0.112.3-SNAPSHOT +datastore-v1-proto-client:2.21.2:2.21.3-SNAPSHOT +proto-google-cloud-datastore-admin-v1:2.21.2:2.21.3-SNAPSHOT +grpc-google-cloud-datastore-admin-v1:2.21.2:2.21.3-SNAPSHOT