From 38e3d7b9bdcfaffbf14f97ee6d036eaaafbe5007 Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Mon, 8 Jul 2024 14:54:25 +0000
Subject: [PATCH 01/12] chore(main): release 2.40.1-SNAPSHOT (#2276)
:robot: I have created a release *beep* *boop*
---
### Updating meta-information for bleeding-edge SNAPSHOT release.
---
This PR was generated with [Release Please](https://togithub.com/googleapis/release-please). See [documentation](https://togithub.com/googleapis/release-please#release-please).
---
google-cloud-bigtable-bom/pom.xml | 16 ++++++++--------
google-cloud-bigtable-deps-bom/pom.xml | 2 +-
google-cloud-bigtable-emulator-core/pom.xml | 4 ++--
google-cloud-bigtable-emulator/pom.xml | 10 +++++-----
google-cloud-bigtable/pom.xml | 10 +++++-----
.../java/com/google/cloud/bigtable/Version.java | 2 +-
grpc-google-cloud-bigtable-admin-v2/pom.xml | 8 ++++----
grpc-google-cloud-bigtable-v2/pom.xml | 8 ++++----
pom.xml | 12 ++++++------
proto-google-cloud-bigtable-admin-v2/pom.xml | 8 ++++----
proto-google-cloud-bigtable-v2/pom.xml | 8 ++++----
samples/snapshot/pom.xml | 2 +-
test-proxy/pom.xml | 4 ++--
versions.txt | 14 +++++++-------
14 files changed, 54 insertions(+), 54 deletions(-)
diff --git a/google-cloud-bigtable-bom/pom.xml b/google-cloud-bigtable-bom/pom.xml
index 016bf5817012..371b2ebe89e8 100644
--- a/google-cloud-bigtable-bom/pom.xml
+++ b/google-cloud-bigtable-bom/pom.xml
@@ -3,7 +3,7 @@
4.0.0com.google.cloudgoogle-cloud-bigtable-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomcom.google.cloud
@@ -63,37 +63,37 @@
com.google.cloudgoogle-cloud-bigtable
- 2.40.0
+ 2.40.1-SNAPSHOTcom.google.cloudgoogle-cloud-bigtable-emulator
- 0.177.0
+ 0.177.1-SNAPSHOTcom.google.cloudgoogle-cloud-bigtable-emulator-core
- 0.177.0
+ 0.177.1-SNAPSHOTcom.google.api.grpcgrpc-google-cloud-bigtable-admin-v2
- 2.40.0
+ 2.40.1-SNAPSHOTcom.google.api.grpcgrpc-google-cloud-bigtable-v2
- 2.40.0
+ 2.40.1-SNAPSHOTcom.google.api.grpcproto-google-cloud-bigtable-admin-v2
- 2.40.0
+ 2.40.1-SNAPSHOTcom.google.api.grpcproto-google-cloud-bigtable-v2
- 2.40.0
+ 2.40.1-SNAPSHOT
diff --git a/google-cloud-bigtable-deps-bom/pom.xml b/google-cloud-bigtable-deps-bom/pom.xml
index 8ef21bdca991..939cb20b414a 100644
--- a/google-cloud-bigtable-deps-bom/pom.xml
+++ b/google-cloud-bigtable-deps-bom/pom.xml
@@ -13,7 +13,7 @@
com.google.cloudgoogle-cloud-bigtable-deps-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpom
diff --git a/google-cloud-bigtable-emulator-core/pom.xml b/google-cloud-bigtable-emulator-core/pom.xml
index cd4a87c6db3b..66f13e1d5f5d 100644
--- a/google-cloud-bigtable-emulator-core/pom.xml
+++ b/google-cloud-bigtable-emulator-core/pom.xml
@@ -7,11 +7,11 @@
google-cloud-bigtable-parentcom.google.cloud
- 2.40.0
+ 2.40.1-SNAPSHOTgoogle-cloud-bigtable-emulator-core
- 0.177.0
+ 0.177.1-SNAPSHOT
A Java wrapper for the Cloud Bigtable emulator.
diff --git a/google-cloud-bigtable-emulator/pom.xml b/google-cloud-bigtable-emulator/pom.xml
index e10790565f1d..289aa754b502 100644
--- a/google-cloud-bigtable-emulator/pom.xml
+++ b/google-cloud-bigtable-emulator/pom.xml
@@ -5,7 +5,7 @@
4.0.0google-cloud-bigtable-emulator
- 0.177.0
+ 0.177.1-SNAPSHOTGoogle Cloud Java - Bigtable Emulatorhttps://github.com/googleapis/java-bigtable
@@ -14,7 +14,7 @@
com.google.cloudgoogle-cloud-bigtable-parent
- 2.40.0
+ 2.40.1-SNAPSHOTscm:git:git@github.com:googleapis/java-bigtable.git
@@ -81,14 +81,14 @@
com.google.cloudgoogle-cloud-bigtable-deps-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomimportcom.google.cloudgoogle-cloud-bigtable-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomimport
@@ -99,7 +99,7 @@
com.google.cloudgoogle-cloud-bigtable-emulator-core
- 0.177.0
+ 0.177.1-SNAPSHOT
diff --git a/google-cloud-bigtable/pom.xml b/google-cloud-bigtable/pom.xml
index d18d33233646..2f418335763f 100644
--- a/google-cloud-bigtable/pom.xml
+++ b/google-cloud-bigtable/pom.xml
@@ -2,7 +2,7 @@
4.0.0google-cloud-bigtable
- 2.40.0
+ 2.40.1-SNAPSHOTjarGoogle Cloud Bigtablehttps://github.com/googleapis/java-bigtable
@@ -12,11 +12,11 @@
com.google.cloudgoogle-cloud-bigtable-parent
- 2.40.0
+ 2.40.1-SNAPSHOT
- 2.40.0
+ 2.40.1-SNAPSHOTgoogle-cloud-bigtable
@@ -47,14 +47,14 @@
com.google.cloudgoogle-cloud-bigtable-deps-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomimportcom.google.cloudgoogle-cloud-bigtable-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomimport
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java
index da6d006f731f..c7f280b3d198 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java
@@ -20,6 +20,6 @@
@InternalApi("For internal use only")
public final class Version {
// {x-version-update-start:google-cloud-bigtable:current}
- public static String VERSION = "2.40.0";
+ public static String VERSION = "2.40.1-SNAPSHOT";
// {x-version-update-end}
}
diff --git a/grpc-google-cloud-bigtable-admin-v2/pom.xml b/grpc-google-cloud-bigtable-admin-v2/pom.xml
index a2e505f17987..4d513e2285e0 100644
--- a/grpc-google-cloud-bigtable-admin-v2/pom.xml
+++ b/grpc-google-cloud-bigtable-admin-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0com.google.api.grpcgrpc-google-cloud-bigtable-admin-v2
- 2.40.0
+ 2.40.1-SNAPSHOTgrpc-google-cloud-bigtable-admin-v2GRPC library for grpc-google-cloud-bigtable-admin-v2com.google.cloudgoogle-cloud-bigtable-parent
- 2.40.0
+ 2.40.1-SNAPSHOT
@@ -18,14 +18,14 @@
com.google.cloudgoogle-cloud-bigtable-deps-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomimportcom.google.cloudgoogle-cloud-bigtable-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomimport
diff --git a/grpc-google-cloud-bigtable-v2/pom.xml b/grpc-google-cloud-bigtable-v2/pom.xml
index 661f988e7c47..64ae507bac94 100644
--- a/grpc-google-cloud-bigtable-v2/pom.xml
+++ b/grpc-google-cloud-bigtable-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0com.google.api.grpcgrpc-google-cloud-bigtable-v2
- 2.40.0
+ 2.40.1-SNAPSHOTgrpc-google-cloud-bigtable-v2GRPC library for grpc-google-cloud-bigtable-v2com.google.cloudgoogle-cloud-bigtable-parent
- 2.40.0
+ 2.40.1-SNAPSHOT
@@ -18,14 +18,14 @@
com.google.cloudgoogle-cloud-bigtable-deps-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomimportcom.google.cloudgoogle-cloud-bigtable-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomimport
diff --git a/pom.xml b/pom.xml
index 12e7ab0a4b2e..4f1c8a8f8363 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
google-cloud-bigtable-parentpom
- 2.40.0
+ 2.40.1-SNAPSHOTGoogle Cloud Bigtable Parenthttps://github.com/googleapis/java-bigtable
@@ -153,27 +153,27 @@
com.google.api.grpcproto-google-cloud-bigtable-v2
- 2.40.0
+ 2.40.1-SNAPSHOTcom.google.api.grpcproto-google-cloud-bigtable-admin-v2
- 2.40.0
+ 2.40.1-SNAPSHOTcom.google.api.grpcgrpc-google-cloud-bigtable-v2
- 2.40.0
+ 2.40.1-SNAPSHOTcom.google.api.grpcgrpc-google-cloud-bigtable-admin-v2
- 2.40.0
+ 2.40.1-SNAPSHOTcom.google.cloudgoogle-cloud-bigtable
- 2.40.0
+ 2.40.1-SNAPSHOT
diff --git a/proto-google-cloud-bigtable-admin-v2/pom.xml b/proto-google-cloud-bigtable-admin-v2/pom.xml
index 4aa17b7fc1a5..5e3ff55843d3 100644
--- a/proto-google-cloud-bigtable-admin-v2/pom.xml
+++ b/proto-google-cloud-bigtable-admin-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0com.google.api.grpcproto-google-cloud-bigtable-admin-v2
- 2.40.0
+ 2.40.1-SNAPSHOTproto-google-cloud-bigtable-admin-v2PROTO library for proto-google-cloud-bigtable-admin-v2com.google.cloudgoogle-cloud-bigtable-parent
- 2.40.0
+ 2.40.1-SNAPSHOT
@@ -18,14 +18,14 @@
com.google.cloudgoogle-cloud-bigtable-deps-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomimportcom.google.cloudgoogle-cloud-bigtable-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomimport
diff --git a/proto-google-cloud-bigtable-v2/pom.xml b/proto-google-cloud-bigtable-v2/pom.xml
index a81ee3dee9d6..b28736fd8e88 100644
--- a/proto-google-cloud-bigtable-v2/pom.xml
+++ b/proto-google-cloud-bigtable-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0com.google.api.grpcproto-google-cloud-bigtable-v2
- 2.40.0
+ 2.40.1-SNAPSHOTproto-google-cloud-bigtable-v2PROTO library for proto-google-cloud-bigtable-v2com.google.cloudgoogle-cloud-bigtable-parent
- 2.40.0
+ 2.40.1-SNAPSHOT
@@ -18,14 +18,14 @@
com.google.cloudgoogle-cloud-bigtable-deps-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomimportcom.google.cloudgoogle-cloud-bigtable-bom
- 2.40.0
+ 2.40.1-SNAPSHOTpomimport
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 80eeefcdef5c..ec644ba8b97f 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -28,7 +28,7 @@
com.google.cloudgoogle-cloud-bigtable
- 2.40.0
+ 2.40.1-SNAPSHOT
diff --git a/test-proxy/pom.xml b/test-proxy/pom.xml
index d9cc054d8ad0..eeed52f89fa3 100644
--- a/test-proxy/pom.xml
+++ b/test-proxy/pom.xml
@@ -12,11 +12,11 @@
google-cloud-bigtable-parentcom.google.cloud
- 2.40.0
+ 2.40.1-SNAPSHOT
- 2.40.0
+ 2.40.1-SNAPSHOT
diff --git a/versions.txt b/versions.txt
index 2a253152cb44..ef58d664c151 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,10 +1,10 @@
# Format:
# module:released-version:current-version
-google-cloud-bigtable:2.40.0:2.40.0
-grpc-google-cloud-bigtable-admin-v2:2.40.0:2.40.0
-grpc-google-cloud-bigtable-v2:2.40.0:2.40.0
-proto-google-cloud-bigtable-admin-v2:2.40.0:2.40.0
-proto-google-cloud-bigtable-v2:2.40.0:2.40.0
-google-cloud-bigtable-emulator:0.177.0:0.177.0
-google-cloud-bigtable-emulator-core:0.177.0:0.177.0
+google-cloud-bigtable:2.40.0:2.40.1-SNAPSHOT
+grpc-google-cloud-bigtable-admin-v2:2.40.0:2.40.1-SNAPSHOT
+grpc-google-cloud-bigtable-v2:2.40.0:2.40.1-SNAPSHOT
+proto-google-cloud-bigtable-admin-v2:2.40.0:2.40.1-SNAPSHOT
+proto-google-cloud-bigtable-v2:2.40.0:2.40.1-SNAPSHOT
+google-cloud-bigtable-emulator:0.177.0:0.177.1-SNAPSHOT
+google-cloud-bigtable-emulator-core:0.177.0:0.177.1-SNAPSHOT
From 9062944610277eb7ae77f395dc79ce94239c5bee Mon Sep 17 00:00:00 2001
From: meeral-k <108340829+meeral-k@users.noreply.github.com>
Date: Mon, 8 Jul 2024 12:00:58 -0400
Subject: [PATCH 02/12] feat: Create new environment variable to toggle
directpath scoped to cloud bigtable. (#2261)
* mend
* mend
* address code comments
* formatting fix
* fixed pom to set environment variable and not a system property
* tagged myself in todo,added environment variable to directpath ipv4 only profile
---
google-cloud-bigtable/pom.xml | 6 ++++++
.../data/v2/stub/EnhancedBigtableStubSettings.java | 12 +++++++++++-
.../cloud/bigtable/test_helpers/env/CloudEnv.java | 7 -------
3 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/google-cloud-bigtable/pom.xml b/google-cloud-bigtable/pom.xml
index 2f418335763f..862eede95426 100644
--- a/google-cloud-bigtable/pom.xml
+++ b/google-cloud-bigtable/pom.xml
@@ -499,6 +499,9 @@
${project.build.directory}/test-grpc-logs/directpath-itREQUIRE_DIRECT_PATH
+
+ true
+ com.google.cloud.bigtable.data.v2.it.*IT
@@ -575,6 +578,9 @@
${project.build.directory}/test-grpc-logs/directpath-ipv4only-itREQUIRE_DIRECT_PATH_IPV4
+
+ true
+ com.google.cloud.bigtable.data.v2.it.*IT
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java
index 9535f1d1aee5..5a9e03cf10bb 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java
@@ -100,6 +100,8 @@ public class EnhancedBigtableStubSettings extends StubSettings IDEMPOTENT_RETRY_CODES =
ImmutableSet.of(Code.DEADLINE_EXCEEDED, Code.UNAVAILABLE);
@@ -345,7 +347,15 @@ public boolean getEnableRetryInfo() {
/** Returns a builder for the default ChannelProvider for this service. */
public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() {
- return BigtableStubSettings.defaultGrpcTransportProviderBuilder()
+ Boolean isDirectpathEnabled = Boolean.parseBoolean(System.getenv(CBT_ENABLE_DIRECTPATH));
+ InstantiatingGrpcChannelProvider.Builder grpcTransportProviderBuilder =
+ BigtableStubSettings.defaultGrpcTransportProviderBuilder();
+ if (isDirectpathEnabled) {
+ // Attempts direct access to CBT service over gRPC to improve throughput,
+ // whether the attempt is allowed is totally controlled by service owner.
+ grpcTransportProviderBuilder.setAttemptDirectPathXds().setAttemptDirectPath(true);
+ }
+ return grpcTransportProviderBuilder
.setChannelPoolSettings(
ChannelPoolSettings.builder()
.setInitialChannelCount(10)
diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/test_helpers/env/CloudEnv.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/test_helpers/env/CloudEnv.java
index d10fd5ea5d89..d7b9523b83b6 100644
--- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/test_helpers/env/CloudEnv.java
+++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/test_helpers/env/CloudEnv.java
@@ -168,21 +168,18 @@ private static void injectTracingCookie(
private void configureConnection(StubSettings.Builder stubSettings) {
// Build an remote address restricting interceptor
final ClientInterceptor interceptor;
- boolean enableDirectPath = false;
switch (getConnectionMode()) {
case DEFAULT:
// nothing special
return;
case REQUIRE_DIRECT_PATH:
- enableDirectPath = true;
interceptor =
buildRemoteAddrInterceptor(
"DirectPath IPv4 or IPv6",
Predicates.or(DIRECT_PATH_IPV4_MATCHER, DIRECT_PATH_IPV6_MATCHER));
break;
case REQUIRE_DIRECT_PATH_IPV4:
- enableDirectPath = true;
interceptor =
buildRemoteAddrInterceptor("DirectPath IPv4", Predicates.or(DIRECT_PATH_IPV4_MATCHER));
break;
@@ -205,10 +202,6 @@ private void configureConnection(StubSettings.Builder stubSettings) {
final ApiFunction oldConfigurator =
channelProvider.getChannelConfigurator();
- if (enableDirectPath) {
- channelProvider.setAttemptDirectPath(true).setAttemptDirectPathXds();
- }
-
@SuppressWarnings("rawtypes")
final ApiFunction newConfigurator =
new ApiFunction() {
From f95a6f25bda34106d725eb0163b51f369b74d3b9 Mon Sep 17 00:00:00 2001
From: Igor Bernstein
Date: Tue, 16 Jul 2024 14:30:48 -0400
Subject: [PATCH 03/12] test: fix samples test that was broken by a test
harness change (#2284)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The test was broken in #2170 which added a new column family. The test was relient on the abolute column family count of the schema. This PR fixes the test by making it focus on the family its trying to delete instead of the entire schema
Change-Id: I0df90e68c0b25c4e66ed7d8ae1c19ae53577443b
Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly:
- [ ] Make sure to open an issue as a [bug/issue](https://togithub.com/googleapis/java-bigtable/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Rollback plan is reviewed and LGTMed
- [ ] All new data plane features have a completed end to end testing plan
Fixes # ☕️
If you write sample code, please follow the [samples format](
https://togithub.com/GoogleCloudPlatform/java-docs-samples/blob/main/SAMPLE_FORMAT.md).
---
README.md | 8 ++++----
.../com/example/bigtable/deletes/DeletesTest.java | 12 ++++++++++--
2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index 4d6e81feb8ab..6258c097c799 100644
--- a/README.md
+++ b/README.md
@@ -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.42.0')
+implementation platform('com.google.cloud:libraries-bom:26.43.0')
implementation 'com.google.cloud:google-cloud-bigtable'
```
If you are using Gradle without BOM, add this to your dependencies:
```Groovy
-implementation 'com.google.cloud:google-cloud-bigtable:2.39.5'
+implementation 'com.google.cloud:google-cloud-bigtable:2.40.0'
```
If you are using SBT, add this to your dependencies:
```Scala
-libraryDependencies += "com.google.cloud" % "google-cloud-bigtable" % "2.39.5"
+libraryDependencies += "com.google.cloud" % "google-cloud-bigtable" % "2.40.0"
```
@@ -542,7 +542,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-bigtable/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-bigtable.svg
-[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-bigtable/2.39.5
+[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-bigtable/2.40.0
[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/samples/snippets/src/test/java/com/example/bigtable/deletes/DeletesTest.java b/samples/snippets/src/test/java/com/example/bigtable/deletes/DeletesTest.java
index a2fa31c0d676..308607c891af 100644
--- a/samples/snippets/src/test/java/com/example/bigtable/deletes/DeletesTest.java
+++ b/samples/snippets/src/test/java/com/example/bigtable/deletes/DeletesTest.java
@@ -19,11 +19,13 @@
import com.example.bigtable.MobileTimeSeriesBaseTest;
import com.google.api.gax.rpc.ServerStream;
import com.google.cloud.bigtable.admin.v2.BigtableTableAdminClient;
+import com.google.cloud.bigtable.admin.v2.models.ColumnFamily;
import com.google.cloud.bigtable.data.v2.BigtableDataClient;
import com.google.cloud.bigtable.data.v2.models.Query;
import com.google.cloud.bigtable.data.v2.models.Row;
import com.google.cloud.bigtable.data.v2.models.RowCell;
import com.google.cloud.bigtable.data.v2.models.TableId;
+import com.google.common.truth.Correspondence;
import com.google.common.truth.Truth;
import java.io.IOException;
import java.util.List;
@@ -39,6 +41,8 @@
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class DeletesTest extends MobileTimeSeriesBaseTest {
+ private static final Correspondence COLUMN_FAMILY_ID_CORRESPONDENCE =
+ Correspondence.transforming(ColumnFamily::getId, "ColumnFamily id");
public static BigtableDataClient bigtableDataClient;
@BeforeClass
@@ -164,13 +168,17 @@ public void test6_testDeleteFromColumnFamily() throws IOException {
public void test7_testDeleteColumnFamily() throws IOException {
try (BigtableTableAdminClient tableAdminClient =
BigtableTableAdminClient.create(projectId, instanceId)) {
- Truth.assertThat(tableAdminClient.getTable(TABLE_ID).getColumnFamilies().size()).isEqualTo(2);
+ Truth.assertThat(tableAdminClient.getTable(TABLE_ID).getColumnFamilies())
+ .comparingElementsUsing(COLUMN_FAMILY_ID_CORRESPONDENCE)
+ .contains(COLUMN_FAMILY_NAME_STATS);
DeleteColumnFamilyExample deleteColumnFamilyExample = new DeleteColumnFamilyExample();
deleteColumnFamilyExample.deleteColumnFamily(
projectId, instanceId, TABLE_ID, COLUMN_FAMILY_NAME_STATS);
- Truth.assertThat(tableAdminClient.getTable(TABLE_ID).getColumnFamilies().size()).isEqualTo(1);
+ Truth.assertThat(tableAdminClient.getTable(TABLE_ID).getColumnFamilies())
+ .comparingElementsUsing(COLUMN_FAMILY_ID_CORRESPONDENCE)
+ .doesNotContain(COLUMN_FAMILY_NAME_STATS);
}
}
From 25218e8cc46f9a51d4b6515afdb8931e574b0bb1 Mon Sep 17 00:00:00 2001
From: Jack Dingilian
Date: Wed, 17 Jul 2024 09:53:14 -0400
Subject: [PATCH 04/12] feat: Implement ExecuteQuery API for SQL support
(#2280)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat: publish the Cloud Bigtable ExecuteQuery API
The ExecuteQuery API will allow users to query Bigtable using SQL
PiperOrigin-RevId: 650660213
Source-Link: https://github.com/googleapis/googleapis/commit/f681f79a93814d8b974da9dd8cdc62228d0f4758
Source-Link: https://github.com/googleapis/googleapis-gen/commit/3180845487136794952b8f365fe6c6868999d9c0
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiMzE4MDg0NTQ4NzEzNjc5NDk1MmI4ZjM2NWZlNmM2ODY4OTk5ZDljMCJ9
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
* feat: publish ProtoRows Message
This is needed to parse ExecuteQuery responses
PiperOrigin-RevId: 651386373
Source-Link: https://github.com/googleapis/googleapis/commit/a5be6fa5ff1603b2cab067408e2640d270f0e300
Source-Link: https://github.com/googleapis/googleapis-gen/commit/d467ce893a04c41e504983346c215d41fd263650
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiZDQ2N2NlODkzYTA0YzQxZTUwNDk4MzM0NmMyMTVkNDFmZDI2MzY1MCJ9
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
* Temporarily allow method level tests to pass for ExecuteQuery
I will re-add these once the client supports the appropriate behavior for readRows
Change-Id: I4b5b0861e93f0a8b97d51556c74bccfe0b1da521
* Copy SqlRowMerger from internal code
This moves things mostly as is. I will move everything to appropriate packages in a follow on (e.g. utils will move to internal). Wanted to keep the changes as minimal as possible
Renames ProtoRowsBatchMergingStateMachine to ProtoRowsMergingStateMachine and removes the obsolete ProtoRowsMergingStateMachine
This simplifies the internal code by removing support for the old api. It should not change any behavior for he ProtoRowsBatch API
Change-Id: I8e8267a9cfeb59e0f8455876d1bccdb7c3778b76
* Implement main interfaces for interacting with ResultSets
This adds the main interfaces for interacting with data:
ResultSet, StructReader, and Struct. StructReader is used
by ResultSet, SqlRow, and Struct to provide a standard set
of accessors for the data.
I'm a little uncertain about the package structure right
now. I've put interfaces that users will interact with
directly in 'models' and everything else in 'internal'.
Internal will include both internal interfaces and the
implementations of the public interfaces. Otherwise I have
kept the package structure pretty flat but happy to group
the sql stuff together more.
This includes thorough documentation for the public interfaces.
Change-Id: I4535daffc596e9355da64b5655c58a68e5e7a95f
* Implement proto to java conversion via AbstractProtoStructReader
This will be re-used for structs in the following commit. The current
design implements this at the Row/Struct level instead of ResultSet &
Struct so that result set can operate on rows of different types when we
support arrow. ResultSet will then be a light wrapper where each getType
call is passed through to the current row.
Change-Id: I21fb4cc0cd830110d5455581491c5b1861efbcb1
* Add implementation for ProtoStruct
Change-Id: Ie9d3892fe92c779a6b81d457c31b534bdce20f38
* Implement ResultSet
This also removes the metadata helpers from the ResultSet interface.
These helpers will live on ResultSetMetadata instead.
Change-Id: Iba60b42b4e62f2d72c5a21206edf716c0ad5ea73
* Implement ResultSetMetadata and use it everwhere we operate on metadata
Also fix AbstractProtoStructReaderTest which was using the wrong runner
and not executing any tests. Fixes a couple test bugs as well.
Change-Id: Ia59459f93dd38046e9ac22995191becaad6ea44e
* Create execute query callables and wire up api to data client
This uses the ExecuteQueryCallContext to pass the metadata back
to the user using a future. Note that we need to be very careful
here that errors always close this future. That is why watchdog
happens higher in the call chain that for other streaming RPCs
Also note i decided to unwrap executeExceptions so that when
possible the future throws the same exceptions as the row stream
Change-Id: Ie9dd523a980efecb2cff010a2ffd7ac52b5f8ac7
* Add statement API for ExecuteQuery requests
Change-Id: Id9113adb24419da18f6e43e47c0c73cddf4b622e
* Implement java representation of Type protobuf
The admin types in admin.v2.models.Type will be migrated to
1) share the same implementation in common, while defining a
narrow interface like SqlType 2) be renamed to SchemaType.
We aren't going to block the Sql launch on this though. It
can happen after.
Change-Id: I9dea84fe9b7b2e0b46e8ece4cb666651183dc639
* Remove unsupported query param types and add doc
Change-Id: I41a28069865df6aa688ac5bc96181aae9f18deb4
* Add clirr exclusion for new proto method. Fix dropped import
Change-Id: I0cf3bd45a5f2bb3e2ad980d4170049d69e701d7e
* Small doc update and remove obsolete TODOs
Change-Id: Ie08217d025df3ec3c97dc96268f1c4e1d20b33bf
* Minor documentation fix for executeQuery
Change-Id: I6073e41b5a5b74b91671002cb93dc42c4023f10f
---------
Co-authored-by: Owl Bot
---
google-cloud-bigtable/pom.xml | 5 +
.../google/cloud/bigtable/common/Type.java | 398 +
.../bigtable/data/v2/BigtableDataClient.java | 32 +
.../bigtable/data/v2/gapic_metadata.json | 3 +
.../internal/AbstractProtoStructReader.java | 337 +
.../data/v2/internal/ColumnMetadataImpl.java | 38 +
.../data/v2/internal/ColumnToIndexMapper.java | 67 +
.../v2/internal/ProtoResultSetMetadata.java | 97 +
.../data/v2/internal/ProtoSqlRow.java | 50 +
.../data/v2/internal/ProtoStruct.java | 58 +
.../data/v2/internal/ResultSetImpl.java | 218 +
.../bigtable/data/v2/internal/SqlRow.java | 24 +
.../data/v2/internal/SqlRowMergerUtil.java | 69 +
.../data/v2/models/sql/ColumnMetadata.java | 28 +
.../data/v2/models/sql/ResultSet.java | 65 +
.../data/v2/models/sql/ResultSetMetadata.java | 49 +
.../bigtable/data/v2/models/sql/SqlType.java | 286 +
.../data/v2/models/sql/Statement.java | 236 +
.../bigtable/data/v2/models/sql/Struct.java | 26 +
.../data/v2/models/sql/StructReader.java | 201 +
.../bigtable/data/v2/stub/BigtableStub.java | 6 +
.../data/v2/stub/BigtableStubSettings.java | 26 +
.../data/v2/stub/EnhancedBigtableStub.java | 86 +
.../v2/stub/EnhancedBigtableStubSettings.java | 43 +
.../data/v2/stub/GrpcBigtableStub.java | 38 +
.../v2/stub/sql/ExecuteQueryCallContext.java | 45 +
.../v2/stub/sql/ExecuteQueryCallable.java | 66 +
.../stub/sql/MetadataResolvingCallable.java | 118 +
.../sql/ProtoRowsMergingStateMachine.java | 213 +
.../data/v2/stub/sql/SqlRowMerger.java | 124 +
.../v2/stub/sql/SqlRowMergingCallable.java | 46 +
.../data/v2/stub/sql/SqlServerStream.java | 37 +
.../data/v2/stub/sql/SqlServerStreamImpl.java | 45 +
.../reflect-config.json | 852 +-
.../cloud/bigtable/common/TypeTest.java | 207 +
.../AbstractProtoStructReaderTest.java | 677 +
.../internal/ProtoResultSetMetadataTest.java | 210 +
.../data/v2/internal/ProtoStructTest.java | 298 +
.../data/v2/internal/ResultSetImplTest.java | 346 +
.../v2/internal/SqlRowMergerUtilTest.java | 228 +
.../data/v2/internal/SqlRowSubject.java | 41 +
.../data/v2/models/sql/SqlTypeTest.java | 191 +
.../data/v2/models/sql/StatementTest.java | 322 +
.../data/v2/stub/CookiesHolderTest.java | 1 +
.../EnhancedBigtableStubSettingsTest.java | 79 +
.../v2/stub/EnhancedBigtableStubTest.java | 86 +
.../bigtable/data/v2/stub/HeadersTest.java | 23 +-
.../bigtable/data/v2/stub/RetryInfoTest.java | 1 +
.../v2/stub/sql/ExecuteQueryCallableTest.java | 60 +
.../sql/MetadataResolvingCallableTest.java | 204 +
.../ProtoRowsMergingStateMachineSubject.java | 70 +
.../sql/ProtoRowsMergingStateMachineTest.java | 434 +
.../data/v2/stub/sql/SqlProtoFactory.java | 200 +
.../data/v2/stub/sql/SqlProtoFactoryTest.java | 47 +
.../data/v2/stub/sql/SqlRowMergerSubject.java | 57 +
.../data/v2/stub/sql/SqlRowMergerTest.java | 260 +
.../stub/sql/SqlRowMergingCallableTest.java | 106 +
.../clirr-ignored-differences.xml | 8 +-
.../com/google/bigtable/v2/BigtableGrpc.java | 98 +
.../com/google/bigtable/v2/ArrayValue.java | 924 +
.../bigtable/v2/ArrayValueOrBuilder.java | 77 +
.../com/google/bigtable/v2/BigtableProto.java | 293 +-
.../google/bigtable/v2/ColumnMetadata.java | 892 +
.../bigtable/v2/ColumnMetadataOrBuilder.java | 86 +
.../com/google/bigtable/v2/DataProto.java | 325 +-
.../bigtable/v2/ExecuteQueryRequest.java | 2172 ++
.../v2/ExecuteQueryRequestOrBuilder.java | 328 +
.../bigtable/v2/ExecuteQueryResponse.java | 1145 +
.../v2/ExecuteQueryResponseOrBuilder.java | 107 +
.../google/bigtable/v2/PartialResultSet.java | 1105 +
.../v2/PartialResultSetOrBuilder.java | 113 +
.../com/google/bigtable/v2/ProtoFormat.java | 430 +
.../bigtable/v2/ProtoFormatOrBuilder.java | 25 +
.../com/google/bigtable/v2/ProtoRows.java | 976 +
.../google/bigtable/v2/ProtoRowsBatch.java | 540 +
.../bigtable/v2/ProtoRowsBatchOrBuilder.java | 40 +
.../bigtable/v2/ProtoRowsOrBuilder.java | 87 +
.../com/google/bigtable/v2/ProtoSchema.java | 930 +
.../bigtable/v2/ProtoSchemaOrBuilder.java | 78 +
.../google/bigtable/v2/ResultSetMetadata.java | 812 +
.../v2/ResultSetMetadataOrBuilder.java | 63 +
.../java/com/google/bigtable/v2/Type.java | 20607 ++++++++++++++++
.../com/google/bigtable/v2/TypeOrBuilder.java | 448 +
.../com/google/bigtable/v2/TypesProto.java | 388 +
.../java/com/google/bigtable/v2/Value.java | 2035 +-
.../google/bigtable/v2/ValueOrBuilder.java | 302 +-
.../proto/google/bigtable/v2/bigtable.proto | 94 +
.../main/proto/google/bigtable/v2/data.proto | 143 +-
.../main/proto/google/bigtable/v2/types.proto | 286 +
89 files changed, 43769 insertions(+), 368 deletions(-)
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/common/Type.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/AbstractProtoStructReader.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/ColumnMetadataImpl.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/ColumnToIndexMapper.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/ProtoResultSetMetadata.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/ProtoSqlRow.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/ProtoStruct.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/ResultSetImpl.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/SqlRow.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/SqlRowMergerUtil.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/sql/ColumnMetadata.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/sql/ResultSet.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/sql/ResultSetMetadata.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/sql/SqlType.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/sql/Statement.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/sql/Struct.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/sql/StructReader.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/sql/ExecuteQueryCallContext.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/sql/ExecuteQueryCallable.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/sql/MetadataResolvingCallable.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/sql/ProtoRowsMergingStateMachine.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/sql/SqlRowMerger.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/sql/SqlRowMergingCallable.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/sql/SqlServerStream.java
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/sql/SqlServerStreamImpl.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/common/TypeTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/AbstractProtoStructReaderTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/ProtoResultSetMetadataTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/ProtoStructTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/ResultSetImplTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/SqlRowMergerUtilTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/SqlRowSubject.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/sql/SqlTypeTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/sql/StatementTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/sql/ExecuteQueryCallableTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/sql/MetadataResolvingCallableTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/sql/ProtoRowsMergingStateMachineSubject.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/sql/ProtoRowsMergingStateMachineTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/sql/SqlProtoFactory.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/sql/SqlProtoFactoryTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/sql/SqlRowMergerSubject.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/sql/SqlRowMergerTest.java
create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/sql/SqlRowMergingCallableTest.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ArrayValue.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ArrayValueOrBuilder.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ColumnMetadata.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ColumnMetadataOrBuilder.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ExecuteQueryRequest.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ExecuteQueryRequestOrBuilder.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ExecuteQueryResponse.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ExecuteQueryResponseOrBuilder.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/PartialResultSet.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/PartialResultSetOrBuilder.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ProtoFormat.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ProtoFormatOrBuilder.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ProtoRows.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ProtoRowsBatch.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ProtoRowsBatchOrBuilder.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ProtoRowsOrBuilder.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ProtoSchema.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ProtoSchemaOrBuilder.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ResultSetMetadata.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/ResultSetMetadataOrBuilder.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/Type.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/TypeOrBuilder.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/java/com/google/bigtable/v2/TypesProto.java
create mode 100644 proto-google-cloud-bigtable-v2/src/main/proto/google/bigtable/v2/types.proto
diff --git a/google-cloud-bigtable/pom.xml b/google-cloud-bigtable/pom.xml
index 862eede95426..fcd7ba5c6fc6 100644
--- a/google-cloud-bigtable/pom.xml
+++ b/google-cloud-bigtable/pom.xml
@@ -326,6 +326,11 @@
mockito-coretest
+
+ com.google.guava
+ guava-testlib
+ test
+
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/common/Type.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/common/Type.java
new file mode 100644
index 000000000000..df5c6dcd95de
--- /dev/null
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/common/Type.java
@@ -0,0 +1,398 @@
+/*
+ * 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.
+ */
+package com.google.cloud.bigtable.common;
+
+import com.google.api.core.BetaApi;
+import com.google.api.core.InternalApi;
+import com.google.auto.value.AutoValue;
+import com.google.cloud.bigtable.data.v2.internal.ColumnToIndexMapper;
+import com.google.cloud.bigtable.data.v2.models.sql.SqlType;
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
+import com.google.protobuf.ByteString;
+import java.util.List;
+import org.threeten.bp.Instant;
+
+/**
+ * Shared type implementations. Right now this is only used by SqlType but this will become a shared
+ * definition with Schema type (called {@link com.google.cloud.bigtable.admin.v2.models.Type} right
+ * now), and any other type interfaces needed in the future.
+ *
+ *
This is considered an internal implementation detail and not meant to be used by applications.
+ * Types should only be used through the relevant interfaces and factories, e.g. {@link SqlType}.
+ */
+@BetaApi
+@InternalApi
+public interface Type {
+
+ @AutoValue
+ abstract class Bytes implements Type, SqlType {
+
+ public static Bytes create() {
+ return DefaultInstances.BYTES;
+ }
+
+ @Override
+ public Code getCode() {
+ return Code.BYTES;
+ }
+
+ @Override
+ public java.lang.String toString() {
+ return getCode().name();
+ }
+ }
+
+ @AutoValue
+ abstract class String implements Type, SqlType {
+ public static String create() {
+ return DefaultInstances.STRING;
+ }
+
+ @Override
+ public Code getCode() {
+ return Code.STRING;
+ }
+
+ @Override
+ public java.lang.String toString() {
+ return getCode().name();
+ }
+ }
+
+ @AutoValue
+ abstract class Int64 implements Type, SqlType {
+ public static Int64 create() {
+ return DefaultInstances.INT64;
+ }
+
+ @Override
+ public Code getCode() {
+ return Code.INT64;
+ }
+
+ @Override
+ public java.lang.String toString() {
+ return getCode().name();
+ }
+ }
+
+ @AutoValue
+ abstract class Float64 implements Type, SqlType {
+ public static Float64 create() {
+ return DefaultInstances.FLOAT64;
+ }
+
+ @Override
+ public Code getCode() {
+ return Code.FLOAT64;
+ }
+
+ @Override
+ public java.lang.String toString() {
+ return getCode().name();
+ }
+ }
+
+ @AutoValue
+ abstract class Float32 implements Type, SqlType {
+ public static Float32 create() {
+ return DefaultInstances.FLOAT32;
+ }
+
+ @Override
+ public Code getCode() {
+ return Code.FLOAT32;
+ }
+
+ @Override
+ public java.lang.String toString() {
+ return getCode().name();
+ }
+ }
+
+ @AutoValue
+ abstract class Bool implements Type, SqlType {
+ public static Bool create() {
+ return DefaultInstances.BOOL;
+ }
+
+ @Override
+ public Code getCode() {
+ return Code.BOOL;
+ }
+
+ @Override
+ public java.lang.String toString() {
+ return getCode().name();
+ }
+ }
+
+ @AutoValue
+ abstract class Timestamp implements Type, SqlType {
+ public static Timestamp create() {
+ return DefaultInstances.TIMESTAMP;
+ }
+
+ @Override
+ public Code getCode() {
+ return Code.TIMESTAMP;
+ }
+
+ @Override
+ public java.lang.String toString() {
+ return getCode().name();
+ }
+ }
+
+ @AutoValue
+ abstract class Date implements Type, SqlType {
+ public static Date create() {
+ return DefaultInstances.DATE;
+ }
+
+ @Override
+ public Code getCode() {
+ return Code.DATE;
+ }
+
+ @Override
+ public java.lang.String toString() {
+ return getCode().name();
+ }
+ }
+
+ /**
+ * This is a special version of struct that is intended to only be used in the {@link
+ * com.google.cloud.bigtable.data.v2.models.sql.StructReader} getters that require types. We don't
+ * want users to need to specify the struct schema when the schema will be validated on calls to
+ * {@link com.google.cloud.bigtable.data.v2.models.sql.StructReader} methods on the struct.
+ *
+ *
Any attempts to interact with the schema will throw an exception.
+ *
+ *
For example the historical map data type uses this as follows:
+ *
+ *
{@code
+ * Map> historicalMap =
+ * resultSet.getMap(
+ * "cf",
+ * SqlType.mapOf(SqlType.bytes(), SqlType.arrayOf(SqlType.struct())));
+ * Struct struct = historicalMap.get("column").get(0);
+ * // Struct schema will be validated here so there's no need for users to pass the schema to getMap above
+ * ByteString value = struct.getBytes("value");
+ * }
+ */
+ @AutoValue
+ abstract class SchemalessStruct implements Type, SqlType.Struct {
+ public static SchemalessStruct create() {
+ return DefaultInstances.SCHEMALESS_STRUCT;
+ }
+
+ @Override
+ public Code getCode() {
+ return Code.STRUCT;
+ }
+
+ @Override
+ public List getFields() {
+ throw new UnsupportedOperationException(
+ "Attempting to access schema of Schemaless Struct. These structs should only be used for typing of StructReader data access calls.");
+ }
+
+ @Override
+ public SqlType> getType(int fieldIndex) {
+ throw new UnsupportedOperationException(
+ "Attempting to access schema of Schemaless Struct. These structs should only be used for typing of StructReader data access calls.");
+ }
+
+ @Override
+ public SqlType> getType(java.lang.String fieldName) {
+ throw new UnsupportedOperationException(
+ "Attempting to access schema of Schemaless Struct. These structs should only be used for typing of StructReader data access calls.");
+ }
+
+ @Override
+ public int getColumnIndex(java.lang.String fieldName) {
+ throw new UnsupportedOperationException(
+ "Attempting to access schema of Schemaless Struct. These structs should only be used for typing of StructReader data access calls.");
+ }
+
+ @Override
+ public java.lang.String toString() {
+ return getCode().name();
+ }
+ }
+
+ /**
+ * Struct implementation that contains a schema that users can access. This should never be
+ * constructed by users. It is only intended to be created directly from Type protobufs.
+ */
+ class StructWithSchema extends ColumnToIndexMapper implements Type, SqlType.Struct {
+
+ private final List fields;
+
+ @InternalApi("Visible for testing")
+ public StructWithSchema(List fields) {
+ super(fields);
+ this.fields = fields;
+ }
+
+ @InternalApi("Visible for testing")
+ @AutoValue
+ public abstract static class Field implements SqlType.Struct.Field {
+ public static Field fromProto(com.google.bigtable.v2.Type.Struct.Field proto) {
+ return new AutoValue_Type_StructWithSchema_Field(
+ proto.getFieldName(), SqlType.fromProto(proto.getType()));
+ }
+
+ @Override
+ public abstract java.lang.String name();
+
+ @Override
+ public abstract SqlType> type();
+ }
+
+ public static StructWithSchema fromProto(com.google.bigtable.v2.Type.Struct proto) {
+ ImmutableList.Builder fields = ImmutableList.builder();
+ for (com.google.bigtable.v2.Type.Struct.Field protoField : proto.getFieldsList()) {
+ fields.add(Field.fromProto(protoField));
+ }
+ return new StructWithSchema(fields.build());
+ }
+
+ @Override
+ public Code getCode() {
+ return Code.STRUCT;
+ }
+
+ @Override
+ public List getFields() {
+ return fields;
+ }
+
+ @Override
+ public SqlType> getType(int fieldIndex) {
+ return fields.get(fieldIndex).type();
+ }
+
+ @Override
+ public SqlType> getType(java.lang.String fieldName) {
+ int index = getColumnIndex(fieldName);
+ return getType(index);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ StructWithSchema struct = (StructWithSchema) obj;
+ // Everything is derived from fields so that's all we need to compare;
+ return Objects.equal(getFields(), struct.getFields());
+ }
+
+ @Override
+ public int hashCode() {
+ // Everything is derived from fields so that's all we need;
+ return Objects.hashCode(fields);
+ }
+
+ @Override
+ public java.lang.String toString() {
+ return getCode().name() + "{fields=" + fields.toString() + "}";
+ }
+ }
+
+ @AutoValue
+ abstract class Array implements Type, SqlType.Array {
+ // Do we need non-sql type array elements? Might get messy
+ public static Type.Array create(SqlType elemType) {
+ return new AutoValue_Type_Array<>(elemType);
+ }
+
+ protected abstract SqlType elementType();
+
+ @Override
+ public Code getCode() {
+ return Code.ARRAY;
+ }
+
+ @Override
+ public SqlType getElementType() {
+ return elementType();
+ }
+
+ @Override
+ public java.lang.String toString() {
+ return getCode().name() + "{elementType=" + getElementType().getCode() + "}";
+ }
+ }
+
+ @AutoValue
+ abstract class Map implements Type, SqlType.Map {
+ // Same question as for array
+ public static Type.Map create(SqlType keyType, SqlType valueType) {
+ return new AutoValue_Type_Map<>(keyType, valueType);
+ }
+
+ protected abstract SqlType keyType();
+
+ protected abstract SqlType valueType();
+
+ @Override
+ public Code getCode() {
+ return Code.MAP;
+ }
+
+ @Override
+ public SqlType getKeyType() {
+ return keyType();
+ }
+
+ @Override
+ public SqlType getValueType() {
+ return valueType();
+ }
+
+ @Override
+ public java.lang.String toString() {
+ return getCode().name()
+ + "{keyType="
+ + getKeyType().toString()
+ + ", valueType="
+ + getValueType().toString()
+ + "}";
+ }
+ }
+
+ // Implementation detail to make singleton instances private without referencing the concrete
+ // autovalue generated class from the abstract base classes.
+ @InternalApi
+ class DefaultInstances {
+ private static final Bytes BYTES = new AutoValue_Type_Bytes();
+ private static final String STRING = new AutoValue_Type_String();
+ private static final Int64 INT64 = new AutoValue_Type_Int64();
+ private static final Float64 FLOAT64 = new AutoValue_Type_Float64();
+ private static final Float32 FLOAT32 = new AutoValue_Type_Float32();
+ private static final Bool BOOL = new AutoValue_Type_Bool();
+ private static final Timestamp TIMESTAMP = new AutoValue_Type_Timestamp();
+ private static final Date DATE = new AutoValue_Type_Date();
+ private static final SchemalessStruct SCHEMALESS_STRUCT = new AutoValue_Type_SchemalessStruct();
+ }
+}
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClient.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClient.java
index 8f08f82d8ae5..61f51924f1cb 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClient.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClient.java
@@ -30,6 +30,7 @@
import com.google.api.gax.rpc.ServerStream;
import com.google.api.gax.rpc.ServerStreamingCallable;
import com.google.api.gax.rpc.UnaryCallable;
+import com.google.cloud.bigtable.data.v2.internal.ResultSetImpl;
import com.google.cloud.bigtable.data.v2.models.BulkMutation;
import com.google.cloud.bigtable.data.v2.models.ChangeStreamRecord;
import com.google.cloud.bigtable.data.v2.models.ConditionalRowMutation;
@@ -47,7 +48,10 @@
import com.google.cloud.bigtable.data.v2.models.SampleRowKeysRequest;
import com.google.cloud.bigtable.data.v2.models.TableId;
import com.google.cloud.bigtable.data.v2.models.TargetId;
+import com.google.cloud.bigtable.data.v2.models.sql.ResultSet;
+import com.google.cloud.bigtable.data.v2.models.sql.Statement;
import com.google.cloud.bigtable.data.v2.stub.EnhancedBigtableStub;
+import com.google.cloud.bigtable.data.v2.stub.sql.SqlServerStream;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.protobuf.ByteString;
import java.io.IOException;
@@ -2610,6 +2614,34 @@ public void readChangeStreamAsync(
return stub.readChangeStreamCallable();
}
+ /**
+ * Executes a SQL Query and returns a ResultSet to iterate over the results. The returned
+ * ResultSet instance is not threadsafe, it can only be used from single thread.
+ *
+ *
Sample code:
+ *
+ *
{@code
+ * try (BigtableDataClient bigtableDataClient = BigtableDataClient.create("[PROJECT]", "[INSTANCE]")) {
+ * String query = "SELECT CAST(cf['stringCol'] AS STRING) FROM [TABLE]";
+ *
+ * try (ResultSet resultSet = bigtableDataClient.executeQuery(Statement.of(query))) {
+ * while (resultSet.next()) {
+ * String s = resultSet.getString("stringCol");
+ * // do something with data
+ * }
+ * } catch (RuntimeException e) {
+ * e.printStackTrace();
+ * }
+ * }
+ *
+ * @see Statement For query options.
+ */
+ @BetaApi
+ public ResultSet executeQuery(Statement statement) {
+ SqlServerStream stream = stub.createExecuteQueryCallable().call(statement);
+ return ResultSetImpl.create(stream);
+ }
+
/** Close the clients and releases all associated resources. */
@Override
public void close() {
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/gapic_metadata.json b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/gapic_metadata.json
index 495762d21930..1134631db20a 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/gapic_metadata.json
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/gapic_metadata.json
@@ -13,6 +13,9 @@
"CheckAndMutateRow": {
"methods": ["checkAndMutateRow", "checkAndMutateRow", "checkAndMutateRow", "checkAndMutateRow", "checkAndMutateRow", "checkAndMutateRowCallable"]
},
+ "ExecuteQuery": {
+ "methods": ["executeQueryCallable"]
+ },
"GenerateInitialChangeStreamPartitions": {
"methods": ["generateInitialChangeStreamPartitionsCallable"]
},
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/AbstractProtoStructReader.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/AbstractProtoStructReader.java
new file mode 100644
index 000000000000..7035a8285d49
--- /dev/null
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/AbstractProtoStructReader.java
@@ -0,0 +1,337 @@
+/*
+ * 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.
+ */
+package com.google.cloud.bigtable.data.v2.internal;
+
+import com.google.api.core.InternalApi;
+import com.google.bigtable.v2.Value;
+import com.google.bigtable.v2.Value.KindCase;
+import com.google.cloud.Date;
+import com.google.cloud.bigtable.data.v2.models.sql.SqlType;
+import com.google.cloud.bigtable.data.v2.models.sql.Struct;
+import com.google.cloud.bigtable.data.v2.models.sql.StructReader;
+import com.google.common.base.Preconditions;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.Timestamp;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.threeten.bp.Instant;
+
+@InternalApi
+public abstract class AbstractProtoStructReader implements StructReader {
+
+ abstract List values();
+
+ // Force subclasses to override equals and hashcode. We need this for tests.
+ public abstract boolean equals(Object other);
+
+ public abstract int hashCode();
+
+ /**
+ * @param columnName name of the column
+ * @return the index of the column named {@code columnName}
+ * @throws IllegalArgumentException if there is not exactly one column with the given name
+ */
+ public abstract int getColumnIndex(String columnName);
+
+ /**
+ * @param columnIndex index of the column
+ * @return the type of the column at the given index
+ */
+ public abstract SqlType> getColumnType(int columnIndex);
+
+ /**
+ * @param columnName name of the column
+ * @return the type of the column with the given name
+ * @throws IllegalArgumentException if there is not exactly one column with the given name
+ */
+ public SqlType> getColumnType(String columnName) {
+ return getColumnType(getColumnIndex(columnName));
+ }
+
+ @Override
+ public boolean isNull(int columnIndex) {
+ Value value = values().get(columnIndex);
+ return value.getKindCase().equals(KindCase.KIND_NOT_SET);
+ }
+
+ @Override
+ public boolean isNull(String columnName) {
+ return isNull(getColumnIndex(columnName));
+ }
+
+ @Override
+ public ByteString getBytes(int columnIndex) {
+ checkNonNullOfType(columnIndex, SqlType.bytes(), columnIndex);
+ Value value = values().get(columnIndex);
+ return value.getBytesValue();
+ }
+
+ @Override
+ public ByteString getBytes(String columnName) {
+ int columnIndex = getColumnIndex(columnName);
+ checkNonNullOfType(columnIndex, SqlType.bytes(), columnName);
+ Value value = values().get(columnIndex);
+ return value.getBytesValue();
+ }
+
+ @Override
+ public String getString(int columnIndex) {
+ checkNonNullOfType(columnIndex, SqlType.string(), columnIndex);
+ Value value = values().get(columnIndex);
+ return value.getStringValue();
+ }
+
+ @Override
+ public String getString(String columnName) {
+ int columnIndex = getColumnIndex(columnName);
+ checkNonNullOfType(columnIndex, SqlType.string(), columnName);
+ Value value = values().get(columnIndex);
+ return value.getStringValue();
+ }
+
+ @Override
+ public long getLong(int columnIndex) {
+ checkNonNullOfType(columnIndex, SqlType.int64(), columnIndex);
+ Value value = values().get(columnIndex);
+ return value.getIntValue();
+ }
+
+ @Override
+ public long getLong(String columnName) {
+ int columnIndex = getColumnIndex(columnName);
+ checkNonNullOfType(columnIndex, SqlType.int64(), columnName);
+ Value value = values().get(columnIndex);
+ return value.getIntValue();
+ }
+
+ @Override
+ public double getDouble(int columnIndex) {
+ checkNonNullOfType(columnIndex, SqlType.float64(), columnIndex);
+ Value value = values().get(columnIndex);
+ return value.getFloatValue();
+ }
+
+ @Override
+ public double getDouble(String columnName) {
+ int columnIndex = getColumnIndex(columnName);
+ checkNonNullOfType(columnIndex, SqlType.float64(), columnName);
+ Value value = values().get(columnIndex);
+ return value.getFloatValue();
+ }
+
+ @Override
+ public float getFloat(int columnIndex) {
+ checkNonNullOfType(columnIndex, SqlType.float32(), columnIndex);
+ Value value = values().get(columnIndex);
+ return (float) value.getFloatValue();
+ }
+
+ @Override
+ public float getFloat(String columnName) {
+ int columnIndex = getColumnIndex(columnName);
+ checkNonNullOfType(columnIndex, SqlType.float32(), columnName);
+ Value value = values().get(columnIndex);
+ return (float) value.getFloatValue();
+ }
+
+ @Override
+ public boolean getBoolean(int columnIndex) {
+ checkNonNullOfType(columnIndex, SqlType.bool(), columnIndex);
+ Value value = values().get(columnIndex);
+ return value.getBoolValue();
+ }
+
+ @Override
+ public boolean getBoolean(String columnName) {
+ int columnIndex = getColumnIndex(columnName);
+ checkNonNullOfType(columnIndex, SqlType.bool(), columnName);
+ Value value = values().get(columnIndex);
+ return value.getBoolValue();
+ }
+
+ @Override
+ public Instant getTimestamp(int columnIndex) {
+ checkNonNullOfType(columnIndex, SqlType.timestamp(), columnIndex);
+ Value value = values().get(columnIndex);
+ return toInstant(value.getTimestampValue());
+ }
+
+ @Override
+ public Instant getTimestamp(String columnName) {
+ int columnIndex = getColumnIndex(columnName);
+ checkNonNullOfType(columnIndex, SqlType.timestamp(), columnName);
+ Value value = values().get(columnIndex);
+ return toInstant(value.getTimestampValue());
+ }
+
+ @Override
+ public Date getDate(int columnIndex) {
+ checkNonNullOfType(columnIndex, SqlType.date(), columnIndex);
+ Value value = values().get(columnIndex);
+ return fromProto(value.getDateValue());
+ }
+
+ @Override
+ public Date getDate(String columnName) {
+ int columnIndex = getColumnIndex(columnName);
+ checkNonNullOfType(columnIndex, SqlType.date(), columnName);
+ Value value = values().get(columnIndex);
+ return fromProto(value.getDateValue());
+ }
+
+ @Override
+ public Struct getStruct(int columnIndex) {
+ checkNonNullOfType(columnIndex, SqlType.struct(), columnIndex);
+ Value value = values().get(columnIndex);
+ SqlType.Struct schema = (SqlType.Struct) getColumnType(columnIndex);
+ // A struct value is represented as an array
+ return ProtoStruct.create(schema, value.getArrayValue());
+ }
+
+ @Override
+ public Struct getStruct(String columnName) {
+ int columnIndex = getColumnIndex(columnName);
+ checkNonNullOfType(columnIndex, SqlType.struct(), columnName);
+ Value value = values().get(columnIndex);
+ SqlType.Struct schema = (SqlType.Struct) getColumnType(columnIndex);
+ // A struct value is represented as an array
+ return ProtoStruct.create(schema, value.getArrayValue());
+ }
+
+ @Override
+ public List getList(int columnIndex, SqlType.Array arrayType) {
+ // Note it is important that we use the actualType to decode bc user passed struct types
+ // won't have schemas
+ SqlType> actualType = getColumnType(columnIndex);
+ checkNonNullOfType(columnIndex, arrayType, actualType, columnIndex);
+ Value value = values().get(columnIndex);
+ return (List) decodeValue(value, actualType);
+ }
+
+ @Override
+ public List getList(String columnName, SqlType.Array arrayType) {
+ int columnIndex = getColumnIndex(columnName);
+ // Note it is important that we use the actualType to decode bc user passed struct types
+ // won't have schemas
+ SqlType> actualType = getColumnType(columnIndex);
+ checkNonNullOfType(columnIndex, arrayType, actualType, columnName);
+ Value value = values().get(columnIndex);
+ return (List) decodeValue(value, actualType);
+ }
+
+ @Override
+ public Map getMap(int columnIndex, SqlType.Map mapType) {
+ // Note it is important that we use the actualType to decode bc user passed struct types
+ // won't have schemas
+ SqlType> actualType = getColumnType(columnIndex);
+ checkNonNullOfType(columnIndex, mapType, actualType, columnIndex);
+ Value value = values().get(columnIndex);
+ return (Map) decodeValue(value, actualType);
+ }
+
+ @Override
+ public Map getMap(String columnName, SqlType.Map mapType) {
+ int columnIndex = getColumnIndex(columnName);
+ // Note it is important that we use the actualType to decode bc user passed struct types
+ // won't have schemas
+ SqlType> actualType = getColumnType(columnIndex);
+ checkNonNullOfType(columnIndex, mapType, actualType, columnName);
+ Value value = values().get(columnIndex);
+ return (Map) decodeValue(value, actualType);
+ }
+
+ Object decodeValue(Value value, SqlType> type) {
+ if (value.getKindCase().equals(KindCase.KIND_NOT_SET)) {
+ return null;
+ }
+ switch (type.getCode()) {
+ case BYTES:
+ return value.getBytesValue();
+ case STRING:
+ return value.getStringValue();
+ case INT64:
+ return value.getIntValue();
+ case FLOAT64:
+ case FLOAT32:
+ return value.getFloatValue();
+ case BOOL:
+ return value.getBoolValue();
+ case TIMESTAMP:
+ return toInstant(value.getTimestampValue());
+ case DATE:
+ return fromProto(value.getDateValue());
+ case STRUCT:
+ SqlType.Struct schema = (SqlType.Struct) type;
+ // A struct value is represented as an array
+ return ProtoStruct.create(schema, value.getArrayValue());
+ case ARRAY:
+ ArrayList