From dd6583a22504385b7a1f7dc91b3bc3d2500ea0c5 Mon Sep 17 00:00:00 2001
From: ron-gal <125445217+ron-gal@users.noreply.github.com>
Date: Tue, 23 Jul 2024 20:41:39 -0400
Subject: [PATCH] feat: Add support for new functions (#2287)
* feat: Add support for additional types
* fix build
* fix test
* fix build
* improve readability
* fix a whoopsie
* improve readability
* improve readability
* Update clirr-ignored-differences.xml
* Update clirr-ignored-differences.xml
* Update clirr-ignored-differences.xml
* Update clirr-ignored-differences.xml
---
.../clirr-ignored-differences.xml | 39 ++++++
.../cloud/bigtable/admin/v2/models/Type.java | 119 +++++++++++++++---
.../v2/BigtableTableAdminClientTests.java | 25 +++-
.../cloud/bigtable/admin/v2/TypeProtos.java | 29 +++++
.../v2/models/TableAdminRequestsTest.java | 48 +++++++
.../bigtable/admin/v2/models/TypeTest.java | 59 ++++++++-
6 files changed, 298 insertions(+), 21 deletions(-)
diff --git a/google-cloud-bigtable/clirr-ignored-differences.xml b/google-cloud-bigtable/clirr-ignored-differences.xml
index 034168c2a1..ecd4934995 100644
--- a/google-cloud-bigtable/clirr-ignored-differences.xml
+++ b/google-cloud-bigtable/clirr-ignored-differences.xml
@@ -210,4 +210,43 @@
com/google/cloud/bigtable/data/v2/models/ChangeStreamRecordAdapter$ChangeStreamRecordBuilder
*
+
+
+ 2000
+ com/google/cloud/bigtable/admin/v2/models/Type
+
+
+ 2000
+ com/google/cloud/bigtable/admin/v2/models/Type$SumAggregateInput
+
+
+ 5001
+ com/google/cloud/bigtable/admin/v2/models/Type$SumAggregateInput
+ com/google/cloud/bigtable/admin/v2/models/Type
+
+
+ 5001
+ com/google/cloud/bigtable/admin/v2/models/Type$Aggregate
+ com/google/cloud/bigtable/admin/v2/models/Type
+
+
+ 5001
+ com/google/cloud/bigtable/admin/v2/models/Type$Bytes
+ com/google/cloud/bigtable/admin/v2/models/Type
+
+
+ 5001
+ com/google/cloud/bigtable/admin/v2/models/Type$Int64
+ com/google/cloud/bigtable/admin/v2/models/Type
+
+
+ 5001
+ com/google/cloud/bigtable/admin/v2/models/Type$Int64
+ com/google/cloud/bigtable/admin/v2/models/Type$SumAggregateInput
+
+
+ 5001
+ com/google/cloud/bigtable/admin/v2/models/Type$Raw
+ com/google/cloud/bigtable/admin/v2/models/Type
+
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/Type.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/Type.java
index e6a77dc2bf..fca84c706d 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/Type.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/Type.java
@@ -27,16 +27,19 @@
* @see com.google.bigtable.admin.v2.Type
*/
@BetaApi
-public abstract class Type {
- private Type() {}
-
+public interface Type {
/**
- * This type is a marker type that allows types to be used as the input to the SUM aggregate
- * function.
+ * These types are marker types that allow types to be used as the input to aggregate function.
*/
- public abstract static class SumAggregateInput extends Type {}
+ public static interface SumAggregateInput extends Type {}
+
+ public static interface MinAggregateInput extends Type {}
+
+ public static interface MaxAggregateInput extends Type {}
- abstract com.google.bigtable.admin.v2.Type toProto();
+ public static interface HllAggregateInput extends Type {}
+
+ com.google.bigtable.admin.v2.Type toProto();
static Type fromProto(com.google.bigtable.admin.v2.Type source) {
switch (source.getKindCase()) {
@@ -73,7 +76,7 @@ public static Bytes bytes(Bytes.Encoding encoding) {
* Creates an Int64 type with a big-endian encoding. The bytes are then encoded in "raw" format.
*/
public static Int64 bigEndianInt64() {
- return Int64.create(Int64.Encoding.BigEndianBytes.create(Bytes.rawBytes()));
+ return Int64.create(Int64.Encoding.BigEndianBytes.create(Type.rawBytes()));
}
/** Creates an Int64 type with the specified encoding. */
@@ -91,9 +94,39 @@ public static Aggregate sum(SumAggregateInput inputType) {
return Aggregate.create(inputType, Aggregate.Aggregator.Sum.create());
}
+ /** Creates an Aggregate type with a MIN aggregator and Int64 input type. */
+ public static Aggregate int64Min() {
+ return min(bigEndianInt64());
+ }
+
+ /** Creates an Aggregate type with a MIN aggregator and specified input type. */
+ public static Aggregate min(MinAggregateInput inputType) {
+ return Aggregate.create(inputType, Aggregate.Aggregator.Min.create());
+ }
+
+ /** Creates an Aggregate type with a MAX aggregator and Int64 input type. */
+ public static Aggregate int64Max() {
+ return max(bigEndianInt64());
+ }
+
+ /** Creates an Aggregate type with a MAX aggregator and specified input type. */
+ public static Aggregate max(MaxAggregateInput inputType) {
+ return Aggregate.create(inputType, Aggregate.Aggregator.Max.create());
+ }
+
+ /** Creates an Aggregate type with a HLL aggregator and Int64 input type. */
+ public static Aggregate int64Hll() {
+ return hll(bigEndianInt64());
+ }
+
+ /** Creates an Aggregate type with a HLL aggregator and specified input type. */
+ public static Aggregate hll(HllAggregateInput inputType) {
+ return Aggregate.create(inputType, Aggregate.Aggregator.Hll.create());
+ }
+
/** Represents a string of bytes with a specific encoding. */
@AutoValue
- public abstract static class Bytes extends Type {
+ public abstract static class Bytes implements Type {
public static Bytes create(Encoding encoding) {
return new AutoValue_Type_Bytes(encoding);
}
@@ -102,7 +135,7 @@ public static Bytes create(Encoding encoding) {
public abstract Encoding getEncoding();
@Override
- com.google.bigtable.admin.v2.Type toProto() {
+ public com.google.bigtable.admin.v2.Type toProto() {
com.google.bigtable.admin.v2.Type.Builder builder =
com.google.bigtable.admin.v2.Type.newBuilder();
builder.getBytesTypeBuilder().setEncoding(getEncoding().toProto());
@@ -142,7 +175,7 @@ public static Raw create() {
.build();
@Override
- com.google.bigtable.admin.v2.Type.Bytes.Encoding toProto() {
+ public com.google.bigtable.admin.v2.Type.Bytes.Encoding toProto() {
return PROTO_INSTANCE;
}
}
@@ -151,7 +184,8 @@ com.google.bigtable.admin.v2.Type.Bytes.Encoding toProto() {
/** Represents a 64-bit integer with a specific encoding. */
@AutoValue
- public abstract static class Int64 extends SumAggregateInput {
+ public abstract static class Int64
+ implements SumAggregateInput, MinAggregateInput, MaxAggregateInput, HllAggregateInput {
public static Int64 create(Encoding encoding) {
return new AutoValue_Type_Int64(encoding);
}
@@ -169,7 +203,7 @@ static Encoding fromProto(com.google.bigtable.admin.v2.Type.Int64.Encoding sourc
return BigEndianBytes.create(
Bytes.fromProto(source.getBigEndianBytes().getBytesType()));
case ENCODING_NOT_SET:
- return BigEndianBytes.create(Bytes.rawBytes());
+ return BigEndianBytes.create(Type.rawBytes());
}
throw new UnsupportedOperationException();
}
@@ -185,7 +219,7 @@ public static BigEndianBytes create(Bytes bytes) {
public abstract Bytes getBytes();
@Override
- com.google.bigtable.admin.v2.Type.Int64.Encoding toProto() {
+ public com.google.bigtable.admin.v2.Type.Int64.Encoding toProto() {
com.google.bigtable.admin.v2.Type.Int64.Encoding.Builder builder =
com.google.bigtable.admin.v2.Type.Int64.Encoding.newBuilder();
builder.getBigEndianBytesBuilder().setBytesType(getBytes().toProto().getBytesType());
@@ -195,7 +229,7 @@ com.google.bigtable.admin.v2.Type.Int64.Encoding toProto() {
}
@Override
- com.google.bigtable.admin.v2.Type toProto() {
+ public com.google.bigtable.admin.v2.Type toProto() {
com.google.bigtable.admin.v2.Type.Builder builder =
com.google.bigtable.admin.v2.Type.newBuilder();
builder.getInt64TypeBuilder().setEncoding(getEncoding().toProto());
@@ -208,13 +242,13 @@ static Int64 fromProto(com.google.bigtable.admin.v2.Type.Int64 source) {
}
@AutoValue
- public abstract static class Raw extends Type {
+ public abstract static class Raw implements Type {
public static Raw create() {
return new AutoValue_Type_Raw();
}
@Override
- com.google.bigtable.admin.v2.Type toProto() {
+ public com.google.bigtable.admin.v2.Type toProto() {
return com.google.bigtable.admin.v2.Type.getDefaultInstance();
}
}
@@ -226,7 +260,7 @@ com.google.bigtable.admin.v2.Type toProto() {
* the `input_type` or `state_type`, and reads will always return the `state_type` .
*/
@AutoValue
- public abstract static class Aggregate extends Type {
+ public abstract static class Aggregate implements Type {
public static Aggregate create(Type inputType, Aggregator aggregator) {
return new AutoValue_Type_Aggregate(inputType, aggregator);
}
@@ -250,11 +284,49 @@ void buildTo(com.google.bigtable.admin.v2.Type.Aggregate.Builder builder) {
}
}
+ @AutoValue
+ public abstract static class Min extends Aggregator {
+ public static Min create() {
+ return new AutoValue_Type_Aggregate_Aggregator_Min();
+ }
+
+ @Override
+ void buildTo(com.google.bigtable.admin.v2.Type.Aggregate.Builder builder) {
+ builder.setMin(com.google.bigtable.admin.v2.Type.Aggregate.Min.getDefaultInstance());
+ }
+ }
+
+ @AutoValue
+ public abstract static class Max extends Aggregator {
+ public static Max create() {
+ return new AutoValue_Type_Aggregate_Aggregator_Max();
+ }
+
+ @Override
+ void buildTo(com.google.bigtable.admin.v2.Type.Aggregate.Builder builder) {
+ builder.setMax(com.google.bigtable.admin.v2.Type.Aggregate.Max.getDefaultInstance());
+ }
+ }
+
+ @AutoValue
+ public abstract static class Hll extends Aggregator {
+ public static Hll create() {
+ return new AutoValue_Type_Aggregate_Aggregator_Hll();
+ }
+
+ @Override
+ void buildTo(com.google.bigtable.admin.v2.Type.Aggregate.Builder builder) {
+ builder.setHllppUniqueCount(
+ com.google.bigtable.admin.v2.Type.Aggregate.HyperLogLogPlusPlusUniqueCount
+ .getDefaultInstance());
+ }
+ }
+
abstract void buildTo(com.google.bigtable.admin.v2.Type.Aggregate.Builder builder);
}
@Override
- com.google.bigtable.admin.v2.Type toProto() {
+ public com.google.bigtable.admin.v2.Type toProto() {
com.google.bigtable.admin.v2.Type.Builder typeBuilder =
com.google.bigtable.admin.v2.Type.newBuilder();
com.google.bigtable.admin.v2.Type.Aggregate.Builder aggregateBuilder =
@@ -271,6 +343,15 @@ static Aggregate fromProto(com.google.bigtable.admin.v2.Type.Aggregate source) {
case SUM:
aggregator = Aggregator.Sum.create();
break;
+ case MIN:
+ aggregator = Aggregator.Min.create();
+ break;
+ case MAX:
+ aggregator = Aggregator.Max.create();
+ break;
+ case HLLPP_UNIQUE_COUNT:
+ aggregator = Aggregator.Hll.create();
+ break;
case AGGREGATOR_NOT_SET:
throw new UnsupportedOperationException();
}
diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClientTests.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClientTests.java
index e604495c43..a7f2f74a17 100644
--- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClientTests.java
+++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClientTests.java
@@ -256,6 +256,24 @@ public void testCreateTable() {
ColumnFamily.newBuilder()
.setGcRule(GcRule.getDefaultInstance())
.setValueType(TypeProtos.intSumType())
+ .build())
+ .putColumnFamilies(
+ "cf2",
+ ColumnFamily.newBuilder()
+ .setGcRule(GcRule.getDefaultInstance())
+ .setValueType(TypeProtos.intMinType())
+ .build())
+ .putColumnFamilies(
+ "cf3",
+ ColumnFamily.newBuilder()
+ .setGcRule(GcRule.getDefaultInstance())
+ .setValueType(TypeProtos.intMaxType())
+ .build())
+ .putColumnFamilies(
+ "cf4",
+ ColumnFamily.newBuilder()
+ .setGcRule(GcRule.getDefaultInstance())
+ .setValueType(TypeProtos.intHllType())
.build()))
.build();
@@ -267,7 +285,12 @@ public void testCreateTable() {
// Execute
Table result =
- adminClient.createTable(CreateTableRequest.of(TABLE_ID).addFamily("cf1", Type.int64Sum()));
+ adminClient.createTable(
+ CreateTableRequest.of(TABLE_ID)
+ .addFamily("cf1", Type.int64Sum())
+ .addFamily("cf2", Type.int64Min())
+ .addFamily("cf3", Type.int64Max())
+ .addFamily("cf4", Type.int64Hll()));
// Verify
assertThat(result).isEqualTo(Table.fromProto(expectedResponse));
diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/TypeProtos.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/TypeProtos.java
index 0e73f923f6..3a67d9b532 100644
--- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/TypeProtos.java
+++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/TypeProtos.java
@@ -48,4 +48,33 @@ public static com.google.bigtable.admin.v2.Type intSumType() {
.setSum(com.google.bigtable.admin.v2.Type.Aggregate.Sum.getDefaultInstance()))
.build();
}
+
+ public static com.google.bigtable.admin.v2.Type intMinType() {
+ return com.google.bigtable.admin.v2.Type.newBuilder()
+ .setAggregateType(
+ com.google.bigtable.admin.v2.Type.Aggregate.newBuilder()
+ .setInputType(TypeProtos.int64Type())
+ .setMin(com.google.bigtable.admin.v2.Type.Aggregate.Min.getDefaultInstance()))
+ .build();
+ }
+
+ public static com.google.bigtable.admin.v2.Type intMaxType() {
+ return com.google.bigtable.admin.v2.Type.newBuilder()
+ .setAggregateType(
+ com.google.bigtable.admin.v2.Type.Aggregate.newBuilder()
+ .setInputType(TypeProtos.int64Type())
+ .setMax(com.google.bigtable.admin.v2.Type.Aggregate.Max.getDefaultInstance()))
+ .build();
+ }
+
+ public static com.google.bigtable.admin.v2.Type intHllType() {
+ return com.google.bigtable.admin.v2.Type.newBuilder()
+ .setAggregateType(
+ com.google.bigtable.admin.v2.Type.Aggregate.newBuilder()
+ .setInputType(TypeProtos.int64Type())
+ .setHllppUniqueCount(
+ com.google.bigtable.admin.v2.Type.Aggregate.HyperLogLogPlusPlusUniqueCount
+ .getDefaultInstance()))
+ .build();
+ }
}
diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/TableAdminRequestsTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/TableAdminRequestsTest.java
index 05c2abcd85..ff5c40d4b4 100644
--- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/TableAdminRequestsTest.java
+++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/TableAdminRequestsTest.java
@@ -80,6 +80,12 @@ public void modifyFamilies() {
.addFamily("cf3")
.addFamily("cf4", Type.int64Sum())
.addFamily("cf5", GCRules.GCRULES.maxVersions(1), Type.int64Sum())
+ .addFamily("cf6", Type.int64Min())
+ .addFamily("cf7", GCRules.GCRULES.maxVersions(1), Type.int64Min())
+ .addFamily("cf8", Type.int64Max())
+ .addFamily("cf9", GCRules.GCRULES.maxVersions(1), Type.int64Max())
+ .addFamily("cf10", Type.int64Hll())
+ .addFamily("cf11", GCRules.GCRULES.maxVersions(1), Type.int64Hll())
.updateFamily("cf1", GCRules.GCRULES.maxVersions(5))
.dropFamily("cf3")
.toProto(PROJECT_ID, INSTANCE_ID);
@@ -119,6 +125,48 @@ public void modifyFamilies() {
com.google.bigtable.admin.v2.ColumnFamily.newBuilder()
.setGcRule(GCRules.GCRULES.maxVersions(1).toProto())
.setValueType(Type.int64Sum().toProto())))
+ .addModifications(
+ com.google.bigtable.admin.v2.ModifyColumnFamiliesRequest.Modification.newBuilder()
+ .setId("cf6")
+ .setCreate(
+ com.google.bigtable.admin.v2.ColumnFamily.newBuilder()
+ .setGcRule(GcRule.getDefaultInstance())
+ .setValueType(Type.int64Min().toProto())))
+ .addModifications(
+ com.google.bigtable.admin.v2.ModifyColumnFamiliesRequest.Modification.newBuilder()
+ .setId("cf7")
+ .setCreate(
+ com.google.bigtable.admin.v2.ColumnFamily.newBuilder()
+ .setGcRule(GCRules.GCRULES.maxVersions(1).toProto())
+ .setValueType(Type.int64Min().toProto())))
+ .addModifications(
+ com.google.bigtable.admin.v2.ModifyColumnFamiliesRequest.Modification.newBuilder()
+ .setId("cf8")
+ .setCreate(
+ com.google.bigtable.admin.v2.ColumnFamily.newBuilder()
+ .setGcRule(GcRule.getDefaultInstance())
+ .setValueType(Type.int64Max().toProto())))
+ .addModifications(
+ com.google.bigtable.admin.v2.ModifyColumnFamiliesRequest.Modification.newBuilder()
+ .setId("cf9")
+ .setCreate(
+ com.google.bigtable.admin.v2.ColumnFamily.newBuilder()
+ .setGcRule(GCRules.GCRULES.maxVersions(1).toProto())
+ .setValueType(Type.int64Max().toProto())))
+ .addModifications(
+ com.google.bigtable.admin.v2.ModifyColumnFamiliesRequest.Modification.newBuilder()
+ .setId("cf10")
+ .setCreate(
+ com.google.bigtable.admin.v2.ColumnFamily.newBuilder()
+ .setGcRule(GcRule.getDefaultInstance())
+ .setValueType(Type.int64Hll().toProto())))
+ .addModifications(
+ com.google.bigtable.admin.v2.ModifyColumnFamiliesRequest.Modification.newBuilder()
+ .setId("cf11")
+ .setCreate(
+ com.google.bigtable.admin.v2.ColumnFamily.newBuilder()
+ .setGcRule(GCRules.GCRULES.maxVersions(1).toProto())
+ .setValueType(Type.int64Hll().toProto())))
.addModifications(
com.google.bigtable.admin.v2.ModifyColumnFamiliesRequest.Modification.newBuilder()
.setId("cf1")
diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/TypeTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/TypeTest.java
index e724dfe790..047c286838 100644
--- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/TypeTest.java
+++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/TypeTest.java
@@ -55,7 +55,7 @@ public void bigEndianInt64() {
@Test
public void int64WithEncoding() {
- Type type = Type.int64(Int64.Encoding.BigEndianBytes.create(Bytes.rawBytes()));
+ Type type = Type.int64(Int64.Encoding.BigEndianBytes.create(Type.rawBytes()));
assertThat(type.toProto()).isEqualTo(TypeProtos.int64Type());
}
@@ -77,4 +77,61 @@ public void intSumFromProtoToProto() {
assertThat(Type.fromProto(proto)).isEqualTo(Type.int64Sum());
assertThat(Type.fromProto(proto).toProto()).isEqualTo(proto);
}
+
+ @Test
+ public void int64Min() {
+ Type type = Type.int64Min();
+ assertThat(type.toProto()).isEqualTo(TypeProtos.intMinType());
+ }
+
+ @Test
+ public void min() {
+ Type type = Type.min(Type.bigEndianInt64());
+ assertThat(type.toProto()).isEqualTo(TypeProtos.intMinType());
+ }
+
+ @Test
+ public void intMinFromProtoToProto() {
+ com.google.bigtable.admin.v2.Type proto = TypeProtos.intMinType();
+ assertThat(Type.fromProto(proto)).isEqualTo(Type.int64Min());
+ assertThat(Type.fromProto(proto).toProto()).isEqualTo(proto);
+ }
+
+ @Test
+ public void int64Max() {
+ Type type = Type.int64Max();
+ assertThat(type.toProto()).isEqualTo(TypeProtos.intMaxType());
+ }
+
+ @Test
+ public void max() {
+ Type type = Type.max(Type.bigEndianInt64());
+ assertThat(type.toProto()).isEqualTo(TypeProtos.intMaxType());
+ }
+
+ @Test
+ public void intMaxFromProtoToProto() {
+ com.google.bigtable.admin.v2.Type proto = TypeProtos.intMaxType();
+ assertThat(Type.fromProto(proto)).isEqualTo(Type.int64Max());
+ assertThat(Type.fromProto(proto).toProto()).isEqualTo(proto);
+ }
+
+ @Test
+ public void bytesHll() {
+ Type type = Type.int64Hll();
+ assertThat(type.toProto()).isEqualTo(TypeProtos.intHllType());
+ }
+
+ @Test
+ public void hll() {
+ Type type = Type.hll(Type.bigEndianInt64());
+ assertThat(type.toProto()).isEqualTo(TypeProtos.intHllType());
+ }
+
+ @Test
+ public void bytesHllFromProtoToProto() {
+ com.google.bigtable.admin.v2.Type proto = TypeProtos.intHllType();
+ assertThat(Type.fromProto(proto)).isEqualTo(Type.int64Hll());
+ assertThat(Type.fromProto(proto).toProto()).isEqualTo(proto);
+ }
}