From 0e1bc68c7abd2bda7ee055980afc4d9fd7cdce11 Mon Sep 17 00:00:00 2001 From: elisheva-qlogic <43041115+elisheva-qlogic@users.noreply.github.com> Date: Tue, 23 Oct 2018 17:51:49 -0400 Subject: [PATCH] Exists method added (#3769) --- .../admin/v2/BigtableTableAdminClient.java | 65 +++++++++++++++++++ .../v2/BigtableTableAdminClientTest.java | 41 ++++++++++++ 2 files changed, 106 insertions(+) diff --git a/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClient.java b/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClient.java index 6c886514e25a..ac63ac5acb60 100644 --- a/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClient.java +++ b/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClient.java @@ -20,6 +20,7 @@ import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutures; import com.google.api.gax.rpc.ApiExceptions; +import com.google.api.gax.rpc.NotFoundException; import com.google.bigtable.admin.v2.DeleteTableRequest; import com.google.bigtable.admin.v2.DropRowRangeRequest; import com.google.bigtable.admin.v2.GetTableRequest; @@ -323,6 +324,65 @@ public ApiFuture deleteTableAsync(String tableId) { return transformToVoid(this.stub.deleteTableCallable().futureCall(request)); } + /** + * Checks if the table specified by the tableId exists + * + *

Sample code: + * + *

{@code
+   * if(client.exists("my-table")) {
+   *   System.out.println("Table exists");
+   * }
+   * }
+ */ + public boolean exists(String tableId) { + return ApiExceptions.callAndTranslateApiException(existsAsync(tableId)); + } + + /** + * Asynchronously checks if the table specified by the tableId exists + * + *

Sample code: + * + *

{@code
+   * ApiFuture found = client.existsAsync("my-table");
+   *
+   * ApiFutures.addCallback(
+   *  found,
+   *  new ApiFutureCallback() {
+   *    public void onSuccess(Boolean found) {
+   *      if (found) {
+   *        System.out.println("Table exists");
+   *      } else {
+   *        System.out.println("Table not found");
+   *      }
+   *    }
+   *
+   *    public void onFailure(Throwable t) {
+   *      t.printStackTrace();
+   *    }
+   *  },
+   *  MoreExecutors.directExecutor()
+   * );
+   * }
+ */ + public ApiFuture existsAsync(String tableId) { + + ApiFuture protoFuture = getTableAsync(tableId, com.google.bigtable.admin.v2.Table.View.NAME_ONLY); + + ApiFuture existsFuture = ApiFutures.transform(protoFuture, new ApiFunction() { + @Override public Boolean apply(Table ignored) { + return true; + } + }, MoreExecutors.directExecutor()); + + return ApiFutures.catching(existsFuture, NotFoundException.class, new ApiFunction() { + @Override public Boolean apply(NotFoundException ignored) { + return false; + } + }, MoreExecutors.directExecutor()); + } + /** * Gets the table metadata by tableId. * @@ -373,8 +433,13 @@ public Table getTable(String tableId) { */ @SuppressWarnings("WeakerAccess") public ApiFuture
getTableAsync(String tableId) { + return getTableAsync(tableId, com.google.bigtable.admin.v2.Table.View.SCHEMA_VIEW); + } + + private ApiFuture
getTableAsync(String tableId, com.google.bigtable.admin.v2.Table.View view) { GetTableRequest request = GetTableRequest.newBuilder() .setName(getTableName(tableId)) + .setView(view) .build(); return transformToTableResponse( diff --git a/google-cloud-clients/google-cloud-bigtable-admin/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClientTest.java b/google-cloud-clients/google-cloud-bigtable-admin/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClientTest.java index 33b6a8b410d3..23f6f400bfce 100644 --- a/google-cloud-clients/google-cloud-bigtable-admin/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClientTest.java +++ b/google-cloud-clients/google-cloud-bigtable-admin/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClientTest.java @@ -19,6 +19,8 @@ import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutures; +import com.google.api.gax.grpc.GrpcStatusCode; +import com.google.api.gax.rpc.NotFoundException; import com.google.api.gax.rpc.UnaryCallable; import com.google.bigtable.admin.v2.ColumnFamily; import com.google.bigtable.admin.v2.DeleteTableRequest; @@ -28,6 +30,7 @@ import com.google.bigtable.admin.v2.InstanceName; import com.google.bigtable.admin.v2.ListTablesRequest; import com.google.bigtable.admin.v2.ModifyColumnFamiliesRequest.Modification; +import com.google.bigtable.admin.v2.Table.View; import com.google.bigtable.admin.v2.TableName; import com.google.cloud.bigtable.admin.v2.BaseBigtableTableAdminClient.ListTablesPage; import com.google.cloud.bigtable.admin.v2.BaseBigtableTableAdminClient.ListTablesPagedResponse; @@ -40,9 +43,12 @@ import com.google.protobuf.Empty; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; + +import io.grpc.Status; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; @@ -184,6 +190,7 @@ public void testGetTable() { // Setup GetTableRequest expectedRequest = GetTableRequest.newBuilder() .setName(TABLE_NAME.toString()) + .setView(View.SCHEMA_VIEW) .build(); com.google.bigtable.admin.v2.Table expectedResponse = com.google.bigtable.admin.v2.Table @@ -303,4 +310,38 @@ public ApiFuture answer(InvocationOnMock invocationOnMock) throws Throwabl // Verify assertThat(wasCalled.get()).isTrue(); } + + @Test + public void testExistsTrue() { + // Setup + com.google.bigtable.admin.v2.Table expectedResponse = + com.google.bigtable.admin.v2.Table.newBuilder() + .setName(TABLE_NAME.toString()) + .build(); + + Mockito.when(mockGetTableCallable.futureCall(Matchers.any(GetTableRequest.class))) + .thenReturn(ApiFutures.immediateFuture(expectedResponse)); + + // Execute + boolean found = adminClient.exists(TABLE_NAME.getTable()); + + // Verify + assertThat(found).isTrue(); + } + + @Test + public void testExistsFalse() { + // Setup + NotFoundException exception = + new NotFoundException("fake error", null, GrpcStatusCode.of(Status.Code.NOT_FOUND), false); + + Mockito.when(mockGetTableCallable.futureCall(Matchers.any(GetTableRequest.class))) + .thenReturn(ApiFutures.immediateFailedFuture(exception)); + + // Execute + boolean found = adminClient.exists(TABLE_NAME.getTable()); + + // Verify + assertThat(found).isFalse(); + } }