Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add collation for Case sensitive string column #2490

Merged
merged 5 commits into from
Jan 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,13 @@ implementation 'com.google.cloud:google-cloud-bigquery'
If you are using Gradle without BOM, add this to your dependencies:

```Groovy
implementation 'com.google.cloud:google-cloud-bigquery:2.20.2'
implementation 'com.google.cloud:google-cloud-bigquery:2.21.0'
```

If you are using SBT, add this to your dependencies:

```Scala
libraryDependencies += "com.google.cloud" % "google-cloud-bigquery" % "2.20.2"
libraryDependencies += "com.google.cloud" % "google-cloud-bigquery" % "2.21.0"
```

## Authentication
Expand Down
10 changes: 10 additions & 0 deletions google-cloud-bigquery/clirr-ignored-differences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,14 @@
<className>com/google/cloud/bigquery/Connection</className>
<method>com.google.common.util.concurrent.ListenableFuture executeSelectAsync(java.lang.String, java.util.List, java.util.Map[])</method>
</difference>
<difference>
<differenceType>7013</differenceType>
<className>com/google/cloud/bigquery/DatasetInfo*</className>
<method>*DefaultCollation(*)</method>
</difference>
<difference>
<differenceType>7013</differenceType>
<className>com/google/cloud/bigquery/TableInfo*</className>
<method>*DefaultCollation(*)</method>
</difference>
</differences>
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,12 @@ public Builder setDefaultPartitionExpirationMs(Long defaultPartitionExpirationMs
return this;
}

@Override
public Builder setDefaultCollation(String defaultCollation) {
infoBuilder.setDefaultCollation(defaultCollation);
return this;
}

@Override
public Dataset build() {
return new Dataset(bigquery, infoBuilder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ public Dataset apply(DatasetInfo datasetInfo) {
private final Labels labels;
private final EncryptionConfiguration defaultEncryptionConfiguration;
private final Long defaultPartitionExpirationMs;
private final String defaultCollation;

/** A builder for {@code DatasetInfo} objects. */
public abstract static class Builder {
Expand Down Expand Up @@ -148,6 +149,19 @@ public abstract Builder setDefaultEncryptionConfiguration(
*/
public abstract Builder setDefaultPartitionExpirationMs(Long defaultPartitionExpirationMs);

/**
* Optional. Defines the default collation specification of future tables created in the
* dataset. If a table is created in this dataset without table-level default collation, then
* the table inherits the dataset default collation, which is applied to the string fields that
* do not have explicit collation specified. A change to this field affects only tables created
* afterwards, and does not alter the existing tables. The following values are supported:
*
* <p>* 'und:ci': undetermined locale, case insensitive. * '': empty string. Default to
* case-sensitive behavior. (-- A wrapper is used here because it is possible to set the value
* to the empty string. --) (-- api-linter: standard-fields=disabled --)
*/
public abstract Builder setDefaultCollation(String defaultCollation);

/** Creates a {@code DatasetInfo} object. */
public abstract DatasetInfo build();
}
Expand All @@ -168,6 +182,7 @@ static final class BuilderImpl extends Builder {
private Labels labels = Labels.ZERO;
private EncryptionConfiguration defaultEncryptionConfiguration;
private Long defaultPartitionExpirationMs;
private String defaultCollation;

BuilderImpl() {}

Expand All @@ -186,6 +201,7 @@ static final class BuilderImpl extends Builder {
this.labels = datasetInfo.labels;
this.defaultEncryptionConfiguration = datasetInfo.defaultEncryptionConfiguration;
this.defaultPartitionExpirationMs = datasetInfo.defaultPartitionExpirationMs;
this.defaultCollation = datasetInfo.defaultCollation;
}

BuilderImpl(com.google.api.services.bigquery.model.Dataset datasetPb) {
Expand Down Expand Up @@ -219,6 +235,7 @@ public Acl apply(Dataset.Access accessPb) {
.build();
}
this.defaultPartitionExpirationMs = datasetPb.getDefaultPartitionExpirationMs();
this.defaultCollation = datasetPb.getDefaultCollation();
}

@Override
Expand Down Expand Up @@ -313,6 +330,12 @@ public Builder setDefaultPartitionExpirationMs(Long defaultPartitionExpirationMs
return this;
}

@Override
public Builder setDefaultCollation(String defaultCollation) {
this.defaultCollation = defaultCollation;
return this;
}

@Override
public DatasetInfo build() {
return new DatasetInfo(this);
Expand All @@ -334,6 +357,7 @@ public DatasetInfo build() {
labels = builder.labels;
defaultEncryptionConfiguration = builder.defaultEncryptionConfiguration;
defaultPartitionExpirationMs = builder.defaultPartitionExpirationMs;
defaultCollation = builder.defaultCollation;
}

/** Returns the dataset identity. */
Expand Down Expand Up @@ -459,6 +483,10 @@ public Long getDefaultPartitionExpirationMs() {
return defaultPartitionExpirationMs;
}

public String getDefaultCollation() {
return defaultCollation;
}

/** Returns a builder for the dataset object. */
public Builder toBuilder() {
return new BuilderImpl(this);
Expand All @@ -481,6 +509,7 @@ public String toString() {
.add("labels", labels)
.add("defaultEncryptionConfiguration", defaultEncryptionConfiguration)
.add("defaultPartitionExpirationMs", defaultPartitionExpirationMs)
.add("defaultCollation", defaultCollation)
.toString();
}

Expand Down Expand Up @@ -556,6 +585,9 @@ public Dataset.Access apply(Acl acl) {
if (defaultPartitionExpirationMs != null) {
datasetPb.setDefaultPartitionExpirationMs(defaultPartitionExpirationMs);
}
if (defaultCollation != null) {
datasetPb.setDefaultCollation(defaultCollation);
}
return datasetPb;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ public TableFieldSchema apply(Field field) {
private final Long scale;
private final Long precision;
private final String defaultValueExpression;
private final String collation;

/**
* Mode for a BigQuery Table field. {@link Mode#NULLABLE} fields can be set to {@code null},
Expand All @@ -87,6 +88,7 @@ public static final class Builder {
private Long scale;
private Long precision;
private String defaultValueExpression;
private String collation;

private Builder() {}

Expand All @@ -101,6 +103,7 @@ private Builder(Field field) {
this.scale = field.scale;
this.precision = field.precision;
this.defaultValueExpression = field.defaultValueExpression;
this.collation = field.collation;
}

/**
Expand Down Expand Up @@ -285,6 +288,19 @@ public Builder setDefaultValueExpression(String defaultValueExpression) {
return this;
}

/**
* Optional. Field collation can be set only when the type of field is STRING. The following
* values are supported:
*
* <p>* 'und:ci': undetermined locale, case insensitive. * '': empty string. Default to
* case-sensitive behavior. (-- A wrapper is used here because it is possible to set the value
* to the empty string. --)
*/
public Builder setCollation(String collation) {
this.collation = collation;
return this;
}

/** Creates a {@code Field} object. */
public Field build() {
return new Field(this);
Expand All @@ -302,6 +318,7 @@ private Field(Builder builder) {
this.scale = builder.scale;
this.precision = builder.precision;
this.defaultValueExpression = builder.defaultValueExpression;
this.collation = builder.collation;
}

/** Returns the field name. */
Expand Down Expand Up @@ -357,6 +374,10 @@ public String getDefaultValueExpression() {
return defaultValueExpression;
}

public String getCollation() {
return collation;
}

/**
* Returns the list of sub-fields if {@link #getType()} is a {@link LegacySQLTypeName#RECORD}.
* Returns {@code null} otherwise.
Expand All @@ -382,6 +403,7 @@ public String toString() {
.add("scale", scale)
.add("precision", precision)
.add("defaultValueExpression", defaultValueExpression)
.add("collation", collation)
.toString();
}

Expand Down Expand Up @@ -468,6 +490,9 @@ TableFieldSchema toPb() {
List<TableFieldSchema> fieldsPb = Lists.transform(getSubFields(), TO_PB_FUNCTION);
fieldSchemaPb.setFields(fieldsPb);
}
if (collation != null) {
fieldSchemaPb.setCollation(collation);
}
return fieldSchemaPb;
}

Expand Down Expand Up @@ -500,6 +525,9 @@ static Field fromPb(TableFieldSchema fieldSchemaPb) {
? FieldList.of(Lists.transform(fieldSchemaPb.getFields(), FROM_PB_FUNCTION))
: null;
fieldBuilder.setType(LegacySQLTypeName.valueOf(fieldSchemaPb.getType()), subFields);
if (fieldSchemaPb.getCollation() != null) {
fieldBuilder.setCollation(fieldSchemaPb.getCollation());
}
return fieldBuilder.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,12 @@ public Builder setRequirePartitionFilter(Boolean requirePartitionFilter) {
return this;
}

@Override
public Builder setDefaultCollation(String defaultCollation) {
infoBuilder.setDefaultCollation(defaultCollation);
return this;
}

@Override
public Table build() {
return new Table(bigquery, infoBuilder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ public Table apply(TableInfo tableInfo) {
private final EncryptionConfiguration encryptionConfiguration;
private final Labels labels;
private final Boolean requirePartitionFilter;
private final String defaultCollation;

/** A builder for {@code TableInfo} objects. */
public abstract static class Builder {
Expand Down Expand Up @@ -135,6 +136,8 @@ public abstract static class Builder {
public Builder setRequirePartitionFilter(Boolean requirePartitionFilter) {
return this;
}

public abstract Builder setDefaultCollation(String defaultCollation);
}

static class BuilderImpl extends Builder {
Expand All @@ -155,6 +158,7 @@ static class BuilderImpl extends Builder {
private EncryptionConfiguration encryptionConfiguration;
private Labels labels = Labels.ZERO;
private Boolean requirePartitionFilter;
private String defaultCollation;

BuilderImpl() {}

Expand All @@ -175,6 +179,7 @@ static class BuilderImpl extends Builder {
this.encryptionConfiguration = tableInfo.encryptionConfiguration;
this.labels = tableInfo.labels;
this.requirePartitionFilter = tableInfo.requirePartitionFilter;
this.defaultCollation = tableInfo.defaultCollation;
}

BuilderImpl(Table tablePb) {
Expand All @@ -199,6 +204,7 @@ static class BuilderImpl extends Builder {
}
this.labels = Labels.fromPb(tablePb.getLabels());
this.requirePartitionFilter = tablePb.getRequirePartitionFilter();
this.defaultCollation = tablePb.getDefaultCollation();
}

@Override
Expand Down Expand Up @@ -297,6 +303,12 @@ public Builder setRequirePartitionFilter(Boolean requirePartitionFilter) {
return this;
}

@Override
public Builder setDefaultCollation(String defaultCollation) {
this.defaultCollation = defaultCollation;
return this;
}

@Override
public TableInfo build() {
return new TableInfo(this);
Expand All @@ -318,8 +330,9 @@ public TableInfo build() {
this.numRows = builder.numRows;
this.definition = builder.definition;
this.encryptionConfiguration = builder.encryptionConfiguration;
labels = builder.labels;
this.labels = builder.labels;
this.requirePartitionFilter = builder.requirePartitionFilter;
this.defaultCollation = builder.defaultCollation;
}

/** Returns the hash of the table resource. */
Expand Down Expand Up @@ -422,6 +435,10 @@ public Boolean getRequirePartitionFilter() {
return requirePartitionFilter;
}

public String getDefaultCollation() {
return defaultCollation;
}

/** Returns a builder for the table object. */
public Builder toBuilder() {
return new BuilderImpl(this);
Expand All @@ -446,6 +463,7 @@ public String toString() {
.add("encryptionConfiguration", encryptionConfiguration)
.add("labels", labels)
.add("requirePartitionFilter", requirePartitionFilter)
.add("defaultCollation", defaultCollation)
.toString();
}

Expand Down Expand Up @@ -507,6 +525,9 @@ Table toPb() {
}
tablePb.setLabels(labels.toPb());
tablePb.setRequirePartitionFilter(requirePartitionFilter);
if (defaultCollation != null) {
tablePb.setDefaultCollation(defaultCollation);
}
return tablePb;
}

Expand Down
Loading