This is an automated email from the ASF dual-hosted git repository.
Abacn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git
The following commit(s) were added to refs/heads/master by this push:
new 0c370589685 Remove Beam SQL Data Catalog provider (#40663)
0c370589685 is described below
commit 0c370589685d55c637e57fe854d9b0135358eebd
Author: Abdelrahman Ibrahim <[email protected]>
AuthorDate: Tue Oct 20 02:36:14 2026 +0300
Remove Beam SQL Data Catalog provider (#40663)
---
CHANGES.md | 1 +
build.gradle.kts | 2 -
.../org/apache/beam/gradle/BeamModulePlugin.groovy | 2 -
.../assets/symbols/java.g.yaml | 19 --
.../resources/beam/checkstyle/suppressions.xml | 1 -
sdks/java/extensions/sql/datacatalog/build.gradle | 107 ----------
.../sql/example/BeamSqlDataCatalogExample.java | 107 ----------
.../sdk/extensions/sql/example/package-info.java | 20 --
.../provider/datacatalog/BigQueryTableFactory.java | 72 -------
.../provider/datacatalog/ChainedTableFactory.java | 50 -----
.../datacatalog/DataCatalogPipelineOptions.java | 43 ----
.../DataCatalogPipelineOptionsRegistrar.java | 31 ---
.../datacatalog/DataCatalogTableProvider.java | 235 ---------------------
.../meta/provider/datacatalog/GcsTableFactory.java | 61 ------
.../provider/datacatalog/PubsubTableFactory.java | 62 ------
.../sql/meta/provider/datacatalog/SchemaUtils.java | 190 -----------------
.../meta/provider/datacatalog/TableFactory.java | 37 ----
.../meta/provider/datacatalog/ZetaSqlIdUtils.java | 83 --------
.../meta/provider/datacatalog/package-info.java | 20 --
.../datacatalog/DataCatalogBigQueryIT.java | 115 ----------
.../provider/datacatalog/DataCatalogGCSIT.java | 83 --------
.../meta/provider/datacatalog/SchemaUtilsTest.java | 157 --------------
.../provider/datacatalog/ZetaSqlIdUtilsTest.java | 64 ------
settings.gradle.kts | 1 -
24 files changed, 1 insertion(+), 1562 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index 00fb9aa825b..d06940d12cf 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -85,6 +85,7 @@
## Breaking Changes
+* (Java) Removed Beam SQL Google Cloud Data Catalog table provider
(`beam-sdks-java-extensions-sql-datacatalog`) because GCP Data Catalog has been
decommissioned ([#40663](https://github.com/apache/beam/issues/40663)).
* (Go) The row coder now encodes `int16` and `uint16` struct fields as 2 byte
big endian INT16 values, matching the Java and Python SDKs. This is an update
incompatible change for streaming pipelines that use rows with `int16` or
`uint16` fields ([#40151](https://github.com/apache/beam/issues/40151)).
* (Java) JmsIO migrated to `jakarta.jms` (JMS 3.1) and ActiveMQ 6.2.5. User
code implementing `JmsIO.MessageMapper`,
`valueMapper`, `topicNameMapper`, or providing a `ConnectionFactory` must
update imports from `javax.jms.*` to
diff --git a/build.gradle.kts b/build.gradle.kts
index 8b68b273796..1cefe1ac5b9 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -393,7 +393,6 @@ tasks.register("flinkPreCommit") {
tasks.register("sqlPreCommit") {
dependsOn(":sdks:java:extensions:sql:preCommit")
dependsOn(":sdks:java:extensions:sql:buildDependents")
- dependsOn(":sdks:java:extensions:sql:datacatalog:build")
dependsOn(":sdks:java:extensions:sql:expansion-service:build")
dependsOn(":sdks:java:extensions:sql:hcatalog:build")
dependsOn(":sdks:java:extensions:sql:iceberg:build")
@@ -442,7 +441,6 @@ tasks.register("javaAvroVersionsTest") {
tasks.register("sqlPostCommit") {
dependsOn(":sdks:java:extensions:sql:postCommit")
dependsOn(":sdks:java:extensions:sql:jdbc:postCommit")
- dependsOn(":sdks:java:extensions:sql:datacatalog:postCommit")
dependsOn(":sdks:java:extensions:sql:iceberg:integrationTest")
dependsOn(":sdks:java:extensions:sql:hadoopVersionsTest")
}
diff --git
a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
index cf5979dd176..17fc16e9967 100644
--- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
+++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
@@ -770,7 +770,6 @@ class BeamModulePlugin implements Plugin<Project> {
google_cloud_core :
"com.google.cloud:google-cloud-core", // google_cloud_platform_libraries_bom
sets version
google_cloud_core_grpc :
"com.google.cloud:google-cloud-core-grpc", //
google_cloud_platform_libraries_bom sets version
google_cloud_core_http :
"com.google.cloud:google-cloud-core-http", //
google_cloud_platform_libraries_bom sets version
- google_cloud_datacatalog_v1beta1 :
"com.google.cloud:google-cloud-datacatalog", //
google_cloud_platform_libraries_bom sets version
google_cloud_dataflow_java_proto_library_all:
"com.google.cloud.dataflow:google-cloud-dataflow-java-proto-library-all:0.5.160304",
google_cloud_datastore_v1_proto_client :
"com.google.cloud.datastore:datastore-v1-proto-client:3.4.0", //
[bomupgrader] sets version
google_cloud_firestore :
"com.google.cloud:google-cloud-firestore", //
google_cloud_platform_libraries_bom sets version
@@ -893,7 +892,6 @@ class BeamModulePlugin implements Plugin<Project> {
proto_google_cloud_bigquery_storage_v1 :
"com.google.api.grpc:proto-google-cloud-bigquerystorage-v1", //
google_cloud_platform_libraries_bom sets version
proto_google_cloud_bigtable_admin_v2 :
"com.google.api.grpc:proto-google-cloud-bigtable-admin-v2", //
google_cloud_platform_libraries_bom sets version
proto_google_cloud_bigtable_v2 :
"com.google.api.grpc:proto-google-cloud-bigtable-v2", //
google_cloud_platform_libraries_bom sets version
- proto_google_cloud_datacatalog_v1beta1 :
"com.google.api.grpc:proto-google-cloud-datacatalog-v1beta1", //
google_cloud_platform_libraries_bom sets version
proto_google_cloud_datastore_v1 :
"com.google.api.grpc:proto-google-cloud-datastore-v1", //
google_cloud_platform_libraries_bom sets version
proto_google_cloud_firestore_v1 :
"com.google.api.grpc:proto-google-cloud-firestore-v1", //
google_cloud_platform_libraries_bom sets version
proto_google_cloud_kms_v1 :
"com.google.api.grpc:proto-google-cloud-kms-v1", //
google_cloud_platform_libraries_bom sets version
diff --git
a/playground/frontend/playground_components/assets/symbols/java.g.yaml
b/playground/frontend/playground_components/assets/symbols/java.g.yaml
index e0f2b1d15d1..2619d8702f1 100644
--- a/playground/frontend/playground_components/assets/symbols/java.g.yaml
+++ b/playground/frontend/playground_components/assets/symbols/java.g.yaml
@@ -1292,9 +1292,6 @@ BeamSqlCli:
- explainQuery
- getMetaStore
- metaStore
-BeamSqlDataCatalogExample:
- methods:
- - main
BeamSqlEnv:
methods:
- addSchema
@@ -3424,22 +3421,6 @@ DaoFactory:
- getChangeStreamDao
- getPartitionMetadataAdminDao
- getPartitionMetadataDao
-DataCatalogPipelineOptionsRegistrar:
- methods:
- - getPipelineOptions
-DataCatalogTableProvider:
- methods:
- - buildBeamSqlTable
- - close
- - create
- - createDataCatalogClient
- - createTable
- - dropTable
- - getTable
- - getTableByFullName
- - getTableType
- - getTables
- - setSchemaIfNotPresent
DataChangeRecord:
methods:
- equals
diff --git
a/sdks/java/build-tools/src/main/resources/beam/checkstyle/suppressions.xml
b/sdks/java/build-tools/src/main/resources/beam/checkstyle/suppressions.xml
index 833fd30cf21..d3ec39dc6ac 100644
--- a/sdks/java/build-tools/src/main/resources/beam/checkstyle/suppressions.xml
+++ b/sdks/java/build-tools/src/main/resources/beam/checkstyle/suppressions.xml
@@ -70,7 +70,6 @@
<suppress id="ForbidNonVendoredGrpcProtobuf"
files=".*google.*cloud.*spanner.*FakePartitionFactory\.java" />
<suppress id="ForbidNonVendoredGrpcProtobuf"
files=".*extensions.*sql.*datastore.*" />
<suppress id="ForbidNonVendoredGrpcProtobuf"
files=".*extensions.*sql.*ProtoPayloadSerializerProvider.*" />
- <suppress id="ForbidNonVendoredGrpcProtobuf"
files=".*datacatalog.*DataCatalogTableProvider\.java" />
<suppress id="ForbidNonVendoredGrpcProtobuf"
files=".*examples.*datatokenization.*BigTableIO\.java" />
<suppress id="ForbidNonVendoredGrpcProtobuf"
files=".*aws2.*kinesis.*RecordsAggregator\.java" />
<suppress id="ForbidNonVendoredGrpcProtobuf"
files=".*testinfra.*pipelines.*" />
diff --git a/sdks/java/extensions/sql/datacatalog/build.gradle
b/sdks/java/extensions/sql/datacatalog/build.gradle
deleted file mode 100644
index db4a9200150..00000000000
--- a/sdks/java/extensions/sql/datacatalog/build.gradle
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * License); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import groovy.json.JsonOutput
-
-plugins { id 'org.apache.beam.module' }
-
-applyJavaNature(
- automaticModuleName: 'org.apache.beam.sdk.extensions.sql.datacatalog')
-
-dependencies {
- implementation
enforcedPlatform(library.java.google_cloud_platform_libraries_bom)
- implementation(library.java.google_cloud_datacatalog_v1beta1) {
- exclude group: 'io.grpc', module: 'grpc-core' // Use Beam's version
- }
- implementation library.java.gax
- implementation library.java.google_auth_library_credentials
- implementation library.java.proto_google_cloud_datacatalog_v1beta1
- implementation library.java.protobuf_java
- implementation library.java.slf4j_api
- implementation library.java.vendored_guava_32_1_2_jre
- implementation library.java.jackson_databind
- implementation project(path: ":sdks:java:core", configuration: "shadow")
- implementation "org.threeten:threetenbp:1.4.5"
- provided project(":sdks:java:extensions:sql")
-
- // Dependencies for the example
- implementation project(":sdks:java:extensions:google-cloud-platform-core")
- provided project(":sdks:java:io:google-cloud-platform")
- permitUnusedDeclared project(":sdks:java:io:google-cloud-platform")
- implementation library.java.slf4j_api
-
- testImplementation project(":sdks:java:extensions:sql")
- testImplementation project(":runners:direct-java")
- testImplementation project(":sdks:java:io:google-cloud-platform")
- testImplementation library.java.google_api_services_bigquery
- testImplementation library.java.junit
- testRuntimeOnly library.java.slf4j_simple
-}
-
-task runDataCatalogExample(type: JavaExec) {
- description = "Run SQL example of how to use Data Catalog table provider"
- mainClass =
"org.apache.beam.sdk.extensions.sql.example.BeamSqlDataCatalogExample"
- classpath = sourceSets.main.runtimeClasspath
-
- def runner = project.findProperty('runner') ?: 'DirectRunner'
- def queryString = project.findProperty('queryString') ?: ''
- def outputFilePrefix = project.findProperty('outputFilePrefix') ?: ''
- def gcpProject = project.findProperty('gcpProject') ?: 'apache-beam-testing'
- def gcpRegion = project.findProperty('gcpRegion') ?: 'us-central1'
- def gcsTempRoot = project.findProperty('gcsTempRoot') ?:
'gs://temp-storage-for-end-to-end-tests/'
-
- args = [
- "--runner=${runner}",
- "--queryString=${queryString}",
- "--outputFilePrefix=${outputFilePrefix}",
- "--project=${gcpProject}",
- "--region=${gcpRegion}",
- "--tempLocation=${gcsTempRoot}",
- ]
-}
-
-task integrationTest(type: Test) {
- group = "Verification"
- def gcpProject = project.findProperty('gcpProject') ?: 'apache-beam-testing'
- def gcsTempRoot = project.findProperty('gcsTempRoot') ?:
'gs://temp-storage-for-end-to-end-tests/'
-
- // Disable Gradle cache (it should not be used because the IT's won't run).
- outputs.upToDateWhen { false }
-
- def pipelineOptions = [
- "--project=${gcpProject}",
- "--tempLocation=${gcsTempRoot}",
- "--blockOnRun=false"]
-
- systemProperty "beamTestPipelineOptions", JsonOutput.toJson(pipelineOptions)
-
- include '**/*IT.class'
- maxParallelForks 4
- classpath = project(":sdks:java:extensions:sql:datacatalog")
- .sourceSets
- .test
- .runtimeClasspath
- testClassesDirs =
files(project(":sdks:java:extensions:sql:datacatalog").sourceSets.test.output.classesDirs)
- useJUnit {}
-}
-
-task postCommit {
- group = "Verification"
- description = "Various integration tests"
- dependsOn integrationTest
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/example/BeamSqlDataCatalogExample.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/example/BeamSqlDataCatalogExample.java
deleted file mode 100644
index 0b2f1b04cbb..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/example/BeamSqlDataCatalogExample.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.example;
-
-import java.util.Arrays;
-import java.util.stream.Collectors;
-import org.apache.beam.sdk.Pipeline;
-import org.apache.beam.sdk.extensions.sql.SqlTransform;
-import
org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog.DataCatalogPipelineOptions;
-import
org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog.DataCatalogTableProvider;
-import org.apache.beam.sdk.io.TextIO;
-import org.apache.beam.sdk.options.Description;
-import org.apache.beam.sdk.options.PipelineOptions;
-import org.apache.beam.sdk.options.PipelineOptionsFactory;
-import org.apache.beam.sdk.options.Validation;
-import org.apache.beam.sdk.transforms.MapElements;
-import org.apache.beam.sdk.values.Row;
-import org.apache.beam.sdk.values.TypeDescriptor;
-import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Example pipeline that uses Google Cloud Data Catalog to retrieve the table
metadata. */
-public class BeamSqlDataCatalogExample {
-
- private static final Logger LOG =
LoggerFactory.getLogger(BeamSqlDataCatalogExample.class);
-
- /** Pipeline options to specify the query and the output for the example. */
- public interface DCExamplePipelineOptions extends PipelineOptions {
-
- /** SQL Query. */
- @Description("Required. SQL Query containing the pipeline logic.")
- @Validation.Required
- String getQueryString();
-
- void setQueryString(String queryString);
-
- /** Output file prefix. */
- @Description("Required. Output file prefix.")
- @Validation.Required
- String getOutputFilePrefix();
-
- void setOutputFilePrefix(String outputPathPrefix);
- }
-
- public static void main(String[] args) throws Exception {
- LOG.info("Args: {}", Arrays.asList(args));
- DCExamplePipelineOptions options =
-
PipelineOptionsFactory.fromArgs(args).as(DCExamplePipelineOptions.class);
- LOG.info("Query: {}\nOutput: {}", options.getQueryString(),
options.getOutputFilePrefix());
-
- Pipeline pipeline = Pipeline.create(options);
-
- validateArgs(options);
-
- try (DataCatalogTableProvider tableProvider =
-
DataCatalogTableProvider.create(options.as(DataCatalogPipelineOptions.class))) {
- pipeline
- .apply(
- "SQL Query",
- SqlTransform.query(options.getQueryString())
- .withDefaultTableProvider("datacatalog", tableProvider))
- .apply("Convert to Strings", rowsToStrings())
- .apply("Write output",
TextIO.write().to(options.getOutputFilePrefix()));
-
- pipeline.run().waitUntilFinish();
- }
- }
-
- private static MapElements<Row, String> rowsToStrings() {
- return MapElements.into(TypeDescriptor.of(String.class))
- .via(
- row ->
row.getValues().stream().map(String::valueOf).collect(Collectors.joining(",
")));
- }
-
- private static void validateArgs(DCExamplePipelineOptions options) {
- if (Strings.isNullOrEmpty(options.getQueryString())
- || Strings.isNullOrEmpty(options.getOutputFilePrefix())) {
- String usage =
- "ERROR: SQL query or output file is not specified."
- + "To run this example:\n"
- + "./gradlew "
- + ":sdks:java:extensions:sql:datacatalog:runDataCatalogExample "
- + "-PgcpProject=<project> "
- + "-PgcsTempRoot=<GCS temp location> "
- + "-PqueryString=<query> "
- + "-PoutputFilePrefix=<output location> "
- + "-PtempLocation=<temp GCS location for BQ export>\n\n";
- throw new IllegalArgumentException(usage);
- }
- }
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/example/package-info.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/example/package-info.java
deleted file mode 100644
index 7d6ff31c68a..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/example/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/** Example how to use Data Catalog table provider. */
-package org.apache.beam.sdk.extensions.sql.example;
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/BigQueryTableFactory.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/BigQueryTableFactory.java
deleted file mode 100644
index 172dad752d9..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/BigQueryTableFactory.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import com.google.cloud.datacatalog.v1beta1.Entry;
-import java.net.URI;
-import java.util.Optional;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.apache.beam.sdk.extensions.sql.TableUtils;
-import org.apache.beam.sdk.extensions.sql.meta.Table;
-
-/** {@link TableFactory} that understands Data Catalog BigQuery entries. */
-class BigQueryTableFactory implements TableFactory {
- private static final String BIGQUERY_API = "bigquery.googleapis.com";
-
- private static final Pattern BQ_PATH_PATTERN =
- Pattern.compile(
-
"/projects/(?<PROJECT>[^/]+)/datasets/(?<DATASET>[^/]+)/tables/(?<TABLE>[^/]+)");
-
- private final boolean truncateTimestamps;
-
- public BigQueryTableFactory(boolean truncateTimestamps) {
- this.truncateTimestamps = truncateTimestamps;
- }
-
- @Override
- public Optional<Table.Builder> tableBuilder(Entry entry) {
- if
(!URI.create(entry.getLinkedResource()).getAuthority().equalsIgnoreCase(BIGQUERY_API))
{
- return Optional.empty();
- }
-
- return Optional.of(
- Table.builder()
- .location(getLocation(entry))
- .properties(TableUtils.emptyProperties().put("truncateTimestamps",
truncateTimestamps))
- .type("bigquery")
- .comment(""));
- }
-
- private static String getLocation(Entry entry) {
- URI entryName = URI.create(entry.getLinkedResource());
- String bqPath = entryName.getPath();
-
- Matcher bqPathMatcher = BQ_PATH_PATTERN.matcher(bqPath);
- if (!bqPathMatcher.matches()) {
- throw new IllegalArgumentException(
- "Unsupported format for BigQuery table path: '" +
entry.getLinkedResource() + "'");
- }
-
- String project = bqPathMatcher.group("PROJECT");
- String dataset = bqPathMatcher.group("DATASET");
- String table = bqPathMatcher.group("TABLE");
-
- return String.format("%s:%s.%s", project, dataset, table);
- }
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/ChainedTableFactory.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/ChainedTableFactory.java
deleted file mode 100644
index a68dafe63f4..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/ChainedTableFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import com.google.cloud.datacatalog.v1beta1.Entry;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
-import org.apache.beam.sdk.extensions.sql.meta.Table;
-
-/** {@link TableFactory} that uses the first applicable sub-{@link
TableFactory}. */
-class ChainedTableFactory implements TableFactory {
-
- private final List<TableFactory> subTableFactories;
-
- public static ChainedTableFactory of(TableFactory... subTableFactories) {
- return new ChainedTableFactory(Arrays.asList(subTableFactories));
- }
-
- private ChainedTableFactory(List<TableFactory> subTableFactories) {
- this.subTableFactories = subTableFactories;
- }
-
- /** Creates a Beam SQL table description from a GCS fileset entry. */
- @Override
- public Optional<Table.Builder> tableBuilder(Entry entry) {
- for (TableFactory tableFactory : subTableFactories) {
- Optional<Table.Builder> tableBuilder = tableFactory.tableBuilder(entry);
- if (tableBuilder.isPresent()) {
- return tableBuilder;
- }
- }
- return Optional.empty();
- }
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogPipelineOptions.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogPipelineOptions.java
deleted file mode 100644
index bb4afee3a21..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogPipelineOptions.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import org.apache.beam.sdk.options.Default;
-import org.apache.beam.sdk.options.Description;
-import org.apache.beam.sdk.options.PipelineOptions;
-import org.apache.beam.sdk.options.Validation;
-
-/** Pipeline options for Data Catalog table provider. */
-public interface DataCatalogPipelineOptions extends PipelineOptions {
-
- /** DataCatalog endpoint. */
- @Description("Data catalog endpoint.")
- @Validation.Required
- @Default.String("datacatalog.googleapis.com:443")
- String getDataCatalogEndpoint();
-
- void setDataCatalogEndpoint(String dataCatalogEndpoint);
-
- /** Whether to truncate timestamps in tables described by Data Catalog. */
- @Description("Truncate sub-millisecond precision timestamps in tables
described by Data Catalog")
- @Validation.Required
- @Default.Boolean(false)
- boolean getTruncateTimestamps();
-
- void setTruncateTimestamps(boolean newValue);
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogPipelineOptionsRegistrar.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogPipelineOptionsRegistrar.java
deleted file mode 100644
index 7f055dd245a..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogPipelineOptionsRegistrar.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import com.google.auto.service.AutoService;
-import org.apache.beam.sdk.options.PipelineOptions;
-import org.apache.beam.sdk.options.PipelineOptionsRegistrar;
-import
org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableList;
-
-@AutoService(PipelineOptionsRegistrar.class)
-public class DataCatalogPipelineOptionsRegistrar implements
PipelineOptionsRegistrar {
- @Override
- public Iterable<Class<? extends PipelineOptions>> getPipelineOptions() {
- return ImmutableList.of(DataCatalogPipelineOptions.class);
- }
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogTableProvider.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogTableProvider.java
deleted file mode 100644
index 19cc37b3f0d..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogTableProvider.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import static java.util.stream.Collectors.toMap;
-
-import com.google.api.gax.rpc.InvalidArgumentException;
-import com.google.api.gax.rpc.NotFoundException;
-import com.google.api.gax.rpc.PermissionDeniedException;
-import com.google.api.gax.rpc.StatusCode.Code;
-import com.google.cloud.datacatalog.v1beta1.DataCatalogClient;
-import com.google.cloud.datacatalog.v1beta1.DataCatalogSettings;
-import com.google.cloud.datacatalog.v1beta1.Entry;
-import com.google.cloud.datacatalog.v1beta1.LookupEntryRequest;
-import com.google.cloud.datacatalog.v1beta1.UpdateEntryRequest;
-import com.google.protobuf.FieldMask;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Stream;
-import org.apache.beam.sdk.annotations.Internal;
-import org.apache.beam.sdk.extensions.gcp.options.GcpOptions;
-import org.apache.beam.sdk.extensions.sql.impl.TableName;
-import org.apache.beam.sdk.extensions.sql.meta.BeamSqlTable;
-import org.apache.beam.sdk.extensions.sql.meta.Table;
-import org.apache.beam.sdk.extensions.sql.meta.provider.FullNameTableProvider;
-import org.apache.beam.sdk.extensions.sql.meta.provider.InvalidTableException;
-import org.apache.beam.sdk.extensions.sql.meta.provider.TableProvider;
-import
org.apache.beam.sdk.extensions.sql.meta.provider.bigquery.BigQueryTableProvider;
-import
org.apache.beam.sdk.extensions.sql.meta.provider.pubsub.PubsubTableProvider;
-import org.apache.beam.sdk.extensions.sql.meta.provider.text.TextTableProvider;
-import org.apache.beam.sdk.schemas.Schema;
-import
org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.MoreObjects;
-import
org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableList;
-import
org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.threeten.bp.Duration;
-
-/** Uses DataCatalog to get the source type and schema for a table. */
-public class DataCatalogTableProvider extends FullNameTableProvider implements
AutoCloseable {
-
- private static final Logger LOG =
LoggerFactory.getLogger(DataCatalogTableProvider.class);
-
- private static final TableFactory PUBSUB_TABLE_FACTORY = new
PubsubTableFactory();
- private static final TableFactory GCS_TABLE_FACTORY = new GcsTableFactory();
-
- private static final Map<String, TableProvider> DELEGATE_PROVIDERS =
- Stream.of(new PubsubTableProvider(), new BigQueryTableProvider(), new
TextTableProvider())
- .collect(toMap(TableProvider::getTableType, p -> p));
-
- private final DataCatalogClient dataCatalog;
- private final Map<String, Table> tableCache;
- private final TableFactory tableFactory;
-
- private DataCatalogTableProvider(DataCatalogClient dataCatalog, boolean
truncateTimestamps) {
- this.tableCache = new HashMap<>();
- this.dataCatalog = dataCatalog;
- this.tableFactory =
- ChainedTableFactory.of(
- PUBSUB_TABLE_FACTORY, GCS_TABLE_FACTORY, new
BigQueryTableFactory(truncateTimestamps));
- }
-
- public static DataCatalogTableProvider create(DataCatalogPipelineOptions
options) {
- return new DataCatalogTableProvider(
- createDataCatalogClient(options), options.getTruncateTimestamps());
- }
-
- @Override
- public String getTableType() {
- return "google.cloud.datacatalog";
- }
-
- @Override
- public void createTable(Table table) {
- throw new UnsupportedOperationException(
- "Creating tables is not supported with DataCatalog table provider.");
- }
-
- @Override
- public void dropTable(String tableName) {
- throw new UnsupportedOperationException(
- "Dropping tables is not supported with DataCatalog table provider");
- }
-
- @Override
- public Map<String, Table> getTables() {
- throw new UnsupportedOperationException("Loading all tables from
DataCatalog is not supported");
- }
-
- @Override
- public @Nullable Table getTable(String tableName) {
- return loadTable(tableName);
- }
-
- @Override
- public Table getTableByFullName(TableName fullTableName) {
-
- ImmutableList<String> allNameParts =
- ImmutableList.<String>builder()
- .addAll(fullTableName.getPath())
- .add(fullTableName.getTableName())
- .build();
-
- String fullEscapedTableName = ZetaSqlIdUtils.escapeAndJoin(allNameParts);
-
- return loadTable(fullEscapedTableName);
- }
-
- @Override
- public BeamSqlTable buildBeamSqlTable(Table table) {
- TableProvider tableProvider = DELEGATE_PROVIDERS.get(table.getType());
- if (tableProvider == null) {
- throw new RuntimeException("TableProvider is null");
- }
- return tableProvider.buildBeamSqlTable(table);
- }
-
- private Table loadTable(String tableName) {
- if (!tableCache.containsKey(tableName)) {
- tableCache.put(tableName, loadTableFromDC(tableName));
- }
-
- return tableCache.get(tableName);
- }
-
- private Table loadTableFromDC(String tableName) {
- try {
- return toCalciteTable(
- tableName,
- dataCatalog.lookupEntry(
-
LookupEntryRequest.newBuilder().setSqlResource(tableName).build()));
- } catch (InvalidArgumentException | PermissionDeniedException |
NotFoundException e) {
- throw new InvalidTableException("Could not resolve table in Data
Catalog: " + tableName, e);
- }
- }
-
- @Internal
- public static DataCatalogClient
createDataCatalogClient(DataCatalogPipelineOptions options) {
- try {
- DataCatalogSettings.Builder builder =
- DataCatalogSettings.newBuilder()
- .setCredentialsProvider(() ->
options.as(GcpOptions.class).getGcpCredential())
- .setEndpoint(options.getDataCatalogEndpoint());
-
- // Retry permission denied errors, they are likely due to sync delay.
- // Limit max retry delay to 1 minute, at that point its probably a
legitimate permission error
- // and we should get back to the user.
- builder
- .lookupEntrySettings()
- .setRetryableCodes(
- ImmutableSet.of(Code.PERMISSION_DENIED, Code.DEADLINE_EXCEEDED,
Code.UNAVAILABLE))
- .setRetrySettings(
- builder.lookupEntrySettings().getRetrySettings().toBuilder()
- .setMaxRetryDelay(Duration.ofMinutes(1L))
- .build());
- builder
- .updateEntrySettings()
- .setRetryableCodes(
- ImmutableSet.of(Code.PERMISSION_DENIED, Code.DEADLINE_EXCEEDED,
Code.UNAVAILABLE))
- .setRetrySettings(
- builder.updateEntrySettings().getRetrySettings().toBuilder()
- .setMaxRetryDelay(Duration.ofMinutes(1L))
- .build());
-
- return DataCatalogClient.create(builder.build());
- } catch (IOException e) {
- throw new RuntimeException("Error creating Data Catalog client", e);
- }
- }
-
- private Table toCalciteTable(String tableName, Entry entry) {
- if (entry.getSchema().getColumnsCount() == 0) {
- throw new UnsupportedOperationException(
- "Entry doesn't have a schema. Please attach a schema to '"
- + tableName
- + "' in Data Catalog: "
- + entry.toString());
- }
- Schema schema = SchemaUtils.fromDataCatalog(entry.getSchema());
-
- Optional<Table.Builder> tableBuilder = tableFactory.tableBuilder(entry);
- if (!tableBuilder.isPresent()) {
- throw new UnsupportedOperationException(
- String.format(
- "Unsupported Data Catalog entry: %s",
- MoreObjects.toStringHelper(entry)
- .add("linkedResource", entry.getLinkedResource())
- .add("hasGcsFilesetSpec", entry.hasGcsFilesetSpec())
- .toString()));
- }
-
- return tableBuilder.get().schema(schema).name(tableName).build();
- }
-
- @Internal
- public boolean setSchemaIfNotPresent(String resource, Schema schema) {
- com.google.cloud.datacatalog.v1beta1.Schema dcSchema =
SchemaUtils.toDataCatalog(schema);
- Entry entry =
-
dataCatalog.lookupEntry(LookupEntryRequest.newBuilder().setSqlResource(resource).build());
- if (entry.getSchema().getColumnsCount() == 0) {
- dataCatalog.updateEntry(
- UpdateEntryRequest.newBuilder()
- .setEntry(entry.toBuilder().setSchema(dcSchema).build())
- .setUpdateMask(FieldMask.newBuilder().addPaths("schema").build())
- .build());
- return true;
- } else {
- LOG.info("Not updating schema for '{}' since it already has one.",
resource);
- return false;
- }
- }
-
- @Override
- public void close() {
- dataCatalog.close();
- }
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/GcsTableFactory.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/GcsTableFactory.java
deleted file mode 100644
index 3a85362bbea..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/GcsTableFactory.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import com.google.cloud.datacatalog.v1beta1.Entry;
-import com.google.cloud.datacatalog.v1beta1.GcsFilesetSpec;
-import java.util.List;
-import java.util.Optional;
-import org.apache.beam.sdk.extensions.sql.TableUtils;
-import org.apache.beam.sdk.extensions.sql.meta.Table;
-
-/** {@link TableFactory} that understands Data Catalog GCS entries. */
-class GcsTableFactory implements TableFactory {
-
- /** Creates a Beam SQL table description from a GCS fileset entry. */
- @Override
- public Optional<Table.Builder> tableBuilder(Entry entry) {
- if (!entry.hasGcsFilesetSpec()) {
- return Optional.empty();
- }
-
- GcsFilesetSpec gcsFilesetSpec = entry.getGcsFilesetSpec();
- List<String> filePatterns = gcsFilesetSpec.getFilePatternsList();
-
- // We support exactly one 'file_patterns' field and nothing else at the
moment
- if (filePatterns.size() != 1) {
- throw new UnsupportedOperationException(
- "Unable to parse GCS entry '" + entry.getName() + "'");
- }
-
- String filePattern = filePatterns.get(0);
-
- if (!filePattern.startsWith("gs://")) {
- throw new UnsupportedOperationException(
- "Unsupported file pattern. "
- + "Only file patterns with 'gs://' schema are supported at the
moment.");
- }
-
- return Optional.of(
- Table.builder()
- .type("text")
- .location(filePattern)
- .properties(TableUtils.emptyProperties())
- .comment(""));
- }
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/PubsubTableFactory.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/PubsubTableFactory.java
deleted file mode 100644
index 5688713f7ee..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/PubsubTableFactory.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import com.google.cloud.datacatalog.v1beta1.Entry;
-import java.net.URI;
-import java.util.Optional;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.apache.beam.sdk.extensions.sql.TableUtils;
-import org.apache.beam.sdk.extensions.sql.meta.Table;
-
-/** {@link TableFactory} that understands Data Catalog Pubsub entries. */
-class PubsubTableFactory implements TableFactory {
-
- private static final String PUBSUB_API = "pubsub.googleapis.com";
-
- private static final Pattern PS_PATH_PATTERN =
- Pattern.compile("/projects/(?<PROJECT>[^/]+)/topics/(?<TOPIC>[^/]+)");
-
- @Override
- public Optional<Table.Builder> tableBuilder(Entry entry) {
- if
(!URI.create(entry.getLinkedResource()).getAuthority().equalsIgnoreCase(PUBSUB_API))
{
- return Optional.empty();
- }
-
- return Optional.of(
- Table.builder()
- .location(getLocation(entry))
- .properties(TableUtils.emptyProperties())
- .type("pubsub")
- .comment(""));
- }
-
- private static String getLocation(Entry entry) {
- URI entryName = URI.create(entry.getLinkedResource());
- String psPath = entryName.getPath();
-
- Matcher bqPathMatcher = PS_PATH_PATTERN.matcher(psPath);
- if (!bqPathMatcher.matches()) {
- throw new IllegalArgumentException(
- "Unsupported format for Pubsub topic: '" + entry.getLinkedResource()
+ "'");
- }
-
- return psPath.substring(1);
- }
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtils.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtils.java
deleted file mode 100644
index ef66d0e656c..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtils.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import static org.apache.beam.sdk.schemas.Schema.toSchema;
-
-import com.google.cloud.datacatalog.v1beta1.ColumnSchema;
-import java.util.List;
-import java.util.Map;
-import org.apache.beam.sdk.schemas.Schema;
-import org.apache.beam.sdk.schemas.Schema.Field;
-import org.apache.beam.sdk.schemas.Schema.FieldType;
-import org.apache.beam.sdk.schemas.logicaltypes.SqlTypes;
-import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Strings;
-import
org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableMap;
-
-@SuppressWarnings({
- "nullness" // TODO(https://github.com/apache/beam/issues/20497)
-})
-class SchemaUtils {
-
- private static final Map<String, FieldType> FIELD_TYPES =
- ImmutableMap.<String, FieldType>builder()
- .put("BOOL", FieldType.BOOLEAN)
- .put("BYTES", FieldType.BYTES)
- .put("DATE", FieldType.logicalType(SqlTypes.DATE))
- .put("DATETIME", FieldType.logicalType(SqlTypes.DATETIME))
- .put("DOUBLE", FieldType.DOUBLE)
- .put("FLOAT", FieldType.DOUBLE)
- .put("FLOAT64", FieldType.DOUBLE)
- .put("INT32", FieldType.INT32)
- .put("INT64", FieldType.INT64)
- .put("STRING", FieldType.STRING)
- .put("TIME", FieldType.logicalType(SqlTypes.TIME))
- .put("TIMESTAMP", FieldType.DATETIME)
- .put("NUMERIC", FieldType.DECIMAL)
- .put("MAP<STRING,STRING>", FieldType.map(FieldType.STRING,
FieldType.STRING))
- .build();
-
- /** Convert DataCatalog schema to Beam schema. */
- static Schema fromDataCatalog(com.google.cloud.datacatalog.v1beta1.Schema
dcSchema) {
- return fromColumnsList(dcSchema.getColumnsList());
- }
-
- private static Schema fromColumnsList(List<ColumnSchema> columnsMap) {
- return
columnsMap.stream().map(SchemaUtils::toBeamField).collect(toSchema());
- }
-
- private static Field toBeamField(ColumnSchema column) {
- String name = column.getColumn();
-
- // basic field type
- FieldType fieldType = getBeamFieldType(column);
- Field field = Field.of(name, fieldType);
-
- // set the nullable flag, or convert to a list if repeated
- if (Strings.isNullOrEmpty(column.getMode()) ||
"NULLABLE".equals(column.getMode())) {
- field = field.withNullable(true);
- } else if ("REQUIRED".equals(column.getMode())) {
- field = field.withNullable(false);
- } else if ("REPEATED".equals(column.getMode())) {
- field = Field.of(name, FieldType.array(fieldType));
- } else {
- throw new UnsupportedOperationException(
- "Field mode '" + column.getMode() + "' is not supported (field '" +
name + "')");
- }
-
- return field;
- }
-
- private static FieldType getBeamFieldType(ColumnSchema column) {
- String dcFieldType = column.getType();
-
- if (FIELD_TYPES.containsKey(dcFieldType)) {
- return FIELD_TYPES.get(dcFieldType);
- }
-
- if ("STRUCT".equals(dcFieldType)) {
- Schema structSchema = fromColumnsList(column.getSubcolumnsList());
- return FieldType.row(structSchema);
- }
-
- throw new UnsupportedOperationException(
- "Field type '" + dcFieldType + "' is not supported (field '" +
column.getColumn() + "')");
- }
-
- /** Convert Beam schema to DataCatalog schema. */
- static com.google.cloud.datacatalog.v1beta1.Schema toDataCatalog(Schema
schema) {
- com.google.cloud.datacatalog.v1beta1.Schema.Builder schemaBuilder =
- com.google.cloud.datacatalog.v1beta1.Schema.newBuilder();
- for (Schema.Field field : schema.getFields()) {
- schemaBuilder.addColumns(fromBeamField(field));
- }
- return schemaBuilder.build();
- }
-
- private static ColumnSchema fromBeamField(Schema.Field field) {
- Schema.FieldType fieldType = field.getType();
- if (fieldType.getTypeName().equals(Schema.TypeName.ARRAY)) {
- if (fieldType.getNullable()) {
- throw new UnsupportedOperationException(
- "Nullable array type is not supported in DataCatalog schemas: " +
fieldType);
- } else if (fieldType.getCollectionElementType().getNullable()) {
- throw new UnsupportedOperationException(
- "Nullable array element type is not supported in DataCatalog
schemas: " + fieldType);
- } else if
(fieldType.getCollectionElementType().getTypeName().equals(Schema.TypeName.ARRAY))
{
- throw new UnsupportedOperationException(
- "Array of arrays not supported in DataCatalog schemas: " +
fieldType);
- }
- ColumnSchema column =
- fromBeamField(Field.of(field.getName(),
fieldType.getCollectionElementType()));
- if (!column.getMode().equals("REQUIRED")) {
- // We should have bailed out earlier for any cases that would result
in mode being set.
- throw new AssertionError(
- "ColumnSchema for collection element type has non-empty mode: " +
fieldType);
- }
- return column.toBuilder().setMode("REPEATED").build();
- } else { // struct or primitive type
- ColumnSchema.Builder colBuilder =
- ColumnSchema.newBuilder().setType(getDataCatalogType(fieldType));
-
- if (fieldType.getNullable()) {
- colBuilder.setMode("NULLABLE");
- } else {
- colBuilder.setMode("REQUIRED");
- }
-
- // if this is a struct, add the child columns
- if (fieldType.getTypeName().equals(Schema.TypeName.ROW)) {
- for (Schema.Field subField : fieldType.getRowSchema().getFields()) {
- colBuilder.addSubcolumns(fromBeamField(subField));
- }
- }
-
- return colBuilder.setColumn(field.getName()).build();
- }
- }
-
- private static String getDataCatalogType(FieldType fieldType) {
- switch (fieldType.getTypeName()) {
- case INT32:
- case INT64:
- case BYTES:
- case DOUBLE:
- case STRING:
- return fieldType.getTypeName().name();
- case BOOLEAN:
- return "BOOL";
- case DATETIME:
- return "TIMESTAMP";
- case DECIMAL:
- return "NUMERIC";
- case LOGICAL_TYPE:
- Schema.LogicalType<?, ?> logical = fieldType.getLogicalType();
- if (SqlTypes.TIME.getIdentifier().equals(logical.getIdentifier())) {
- return "TIME";
- } else if
(SqlTypes.DATE.getIdentifier().equals(logical.getIdentifier())) {
- return "DATE";
- } else if
(SqlTypes.DATETIME.getIdentifier().equals(logical.getIdentifier())) {
- return "DATETIME";
- } else {
- throw new UnsupportedOperationException("Unsupported logical type: "
+ logical);
- }
- case ROW:
- return "STRUCT";
- case MAP:
- return String.format(
- "MAP<%s,%s>",
- getDataCatalogType(fieldType.getMapKeyType()),
- getDataCatalogType(fieldType.getMapValueType()));
- default:
- throw new UnsupportedOperationException("Unsupported type: " +
fieldType);
- }
- }
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/TableFactory.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/TableFactory.java
deleted file mode 100644
index 5a1f7182f78..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/TableFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import com.google.cloud.datacatalog.v1beta1.Entry;
-import java.util.Optional;
-import org.apache.beam.sdk.extensions.sql.meta.Table;
-
-/**
- * A {@link TableFactory} <i>may</i> be able to interpret a given Data Catalog
{@link Entry} into
- * Beam SQL {@link Table}.
- */
-interface TableFactory {
-
- /**
- * If this {@link TableFactory} instance can interpret the given {@link
Entry}, then a Beam SQL
- * {@link Table} is constructed, else returns {@link Optional#empty}.
- *
- * <p>The {@link Table} is returned as a builder for further customization
by the caller.
- */
- Optional<Table.Builder> tableBuilder(Entry entry);
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/ZetaSqlIdUtils.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/ZetaSqlIdUtils.java
deleted file mode 100644
index e00fbb3148a..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/ZetaSqlIdUtils.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import static java.util.stream.Collectors.joining;
-import static
org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-import java.util.regex.Pattern;
-import
org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableMap;
-
-/** Utils to work with ZetaSQL-compatible IDs. */
-class ZetaSqlIdUtils {
-
- /**
- * Some special characters we explicitly handle.
- *
- * <p>Everything else is ignored, e.g. tabs, newlines, etc.
- */
- private static final Pattern SPECIAL_CHARS_ESCAPE =
- Pattern.compile(
- "(?<SpecialChar>["
- + "\\\\" // slash
- + "`" // backtick
- + "'" // single quote
- + "\"" // double quote
- + "?" // question mark
- + "])");
-
- private static final ImmutableMap<String, String> WHITESPACES =
- ImmutableMap.of(
- "\n", "\\\\n",
- "\t", "\\\\t",
- "\r", "\\\\r",
- "\f", "\\\\f");
-
- private static final Pattern SIMPLE_ID =
Pattern.compile("[A-Za-z_][A-Za-z_0-9]*");
-
- /**
- * Joins parts into a single compound ZetaSQL identifier.
- *
- * <p>Escapes backticks, slashes, double and single quotes, doesn't handle
other special
- * characters for now.
- */
- static String escapeAndJoin(List<String> parts) {
- return parts.stream()
- .map(ZetaSqlIdUtils::escapeSpecialChars)
- .map(ZetaSqlIdUtils::replaceWhitespaces)
- .map(ZetaSqlIdUtils::backtickIfNeeded)
- .collect(joining("."));
- }
-
- private static String escapeSpecialChars(String str) {
- return SPECIAL_CHARS_ESCAPE.matcher(str).replaceAll("\\\\${SpecialChar}");
- }
-
- private static String replaceWhitespaces(String s) {
- return WHITESPACES.keySet().stream()
- .reduce(
- s,
- (str, whitespace) ->
- str.replaceAll(whitespace,
checkNotNull(WHITESPACES.get(whitespace))));
- }
-
- private static String backtickIfNeeded(String s) {
- return SIMPLE_ID.matcher(s).matches() ? s : ("`" + s + "`");
- }
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/package-info.java
b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/package-info.java
deleted file mode 100644
index 029f3f80010..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/** Table schema for Google Cloud Data Catalog. */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
diff --git
a/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogBigQueryIT.java
b/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogBigQueryIT.java
deleted file mode 100644
index cdfc8ce1631..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogBigQueryIT.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import static org.apache.beam.sdk.schemas.Schema.FieldType.INT64;
-import static org.apache.beam.sdk.schemas.Schema.FieldType.STRING;
-
-import com.google.api.services.bigquery.model.TableReference;
-import java.util.Arrays;
-import org.apache.beam.sdk.extensions.sql.SqlTransform;
-import org.apache.beam.sdk.extensions.sql.impl.BeamSqlPipelineOptions;
-import org.apache.beam.sdk.extensions.sql.impl.CalciteQueryPlanner;
-import org.apache.beam.sdk.extensions.sql.impl.QueryPlanner;
-import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO;
-import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.Write.Method;
-import org.apache.beam.sdk.io.gcp.bigquery.BigQueryUtils;
-import org.apache.beam.sdk.io.gcp.bigquery.TestBigQuery;
-import org.apache.beam.sdk.schemas.Schema;
-import org.apache.beam.sdk.testing.PAssert;
-import org.apache.beam.sdk.testing.TestPipeline;
-import org.apache.beam.sdk.transforms.Create;
-import org.apache.beam.sdk.values.PCollection;
-import org.apache.beam.sdk.values.Row;
-import org.joda.time.Duration;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.runners.Enclosed;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-/** Integration tests for DataCatalog+BigQuery. */
-@RunWith(Enclosed.class)
-public class DataCatalogBigQueryIT {
-
- @RunWith(Parameterized.class)
- public static class DialectSensitiveTests {
- private static final Schema ID_NAME_SCHEMA =
- Schema.builder().addNullableField("id",
INT64).addNullableField("name", STRING).build();
- @Rule public transient TestPipeline writePipeline = TestPipeline.create();
- @Rule public transient TestPipeline readPipeline = TestPipeline.create();
- @Rule public transient TestBigQuery bigQuery =
TestBigQuery.create(ID_NAME_SCHEMA);
-
- /** Parameterized by which SQL dialect, since the syntax here is the same.
*/
- @Parameterized.Parameters(name = "{0}")
- public static Iterable<Object[]> dialects() {
- return Arrays.asList(new Object[][] {{"CalciteSQL",
CalciteQueryPlanner.class}});
- }
-
- @SuppressWarnings("initialization.fields.uninitialized")
- @Parameterized.Parameter(0)
- public String dialectName;
-
- @SuppressWarnings("initialization.fields.uninitialized")
- @Parameterized.Parameter(1)
- public Class<? extends QueryPlanner> queryPlanner;
-
- @Test
- public void testRead() throws Exception {
- TableReference bqTable = bigQuery.tableReference();
-
- // Streaming inserts do not work with DIRECT_READ mode, there is a
several hour lag.
- PCollection<Row> data =
- writePipeline.apply(Create.of(row(1, "name1"), row(2, "name2"),
row(3, "name3")));
- data.apply(
- BigQueryIO.<Row>write()
- .withSchema(BigQueryUtils.toTableSchema(ID_NAME_SCHEMA))
- .withFormatFunction(BigQueryUtils.toTableRow())
- .withMethod(Method.FILE_LOADS)
- .to(bqTable));
- writePipeline.run().waitUntilFinish(Duration.standardMinutes(2));
-
- String tableId =
- String.format(
- "bigquery.`table`.`%s`.`%s`.`%s`",
- bqTable.getProjectId(), bqTable.getDatasetId(),
bqTable.getTableId());
-
- readPipeline
- .getOptions()
- .as(BeamSqlPipelineOptions.class)
- .setPlannerName(queryPlanner.getName());
-
- try (DataCatalogTableProvider tableProvider =
- DataCatalogTableProvider.create(
- readPipeline.getOptions().as(DataCatalogPipelineOptions.class)))
{
- PCollection<Row> result =
- readPipeline.apply(
- "query",
- SqlTransform.query("SELECT id, name FROM " + tableId)
- .withDefaultTableProvider("datacatalog", tableProvider));
-
- PAssert.that(result).containsInAnyOrder(row(1, "name1"), row(2,
"name2"), row(3, "name3"));
- readPipeline.run().waitUntilFinish(Duration.standardMinutes(2));
- }
- }
-
- private static Row row(long id, String name) {
- return Row.withSchema(ID_NAME_SCHEMA).addValues(id, name).build();
- }
- }
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogGCSIT.java
b/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogGCSIT.java
deleted file mode 100644
index b780f5b8708..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogGCSIT.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import static org.apache.beam.sdk.schemas.Schema.FieldType.INT32;
-import static org.apache.beam.sdk.schemas.Schema.FieldType.STRING;
-
-import java.io.Serializable;
-import org.apache.beam.runners.direct.DirectOptions;
-import org.apache.beam.sdk.extensions.sql.SqlTransform;
-import org.apache.beam.sdk.schemas.Schema;
-import org.apache.beam.sdk.testing.PAssert;
-import org.apache.beam.sdk.testing.TestPipeline;
-import org.apache.beam.sdk.values.PCollection;
-import org.apache.beam.sdk.values.Row;
-import org.joda.time.Duration;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Integration tests for DataCatalog+GCS. */
-@RunWith(JUnit4.class)
-public class DataCatalogGCSIT implements Serializable {
-
- private static final Schema ID_NAME_TYPE_SCHEMA =
- Schema.builder()
- .addNullableField("id", INT32)
- .addNullableField("name", STRING)
- .addNullableField("type", STRING)
- .build();
-
- @Rule public transient TestPipeline pipeline = TestPipeline.create();
-
- @Test
- public void testReadFromGCS() throws Exception {
- String gcsEntryId =
- "`datacatalog`" // this is part of the resource name in DataCatalog,
so it has to be
- + ".`entry`" // different from the table provider name ("dc" in
this test)
- + ".`apache-beam-testing`"
- + ".`us-central1`"
- + ".`samples`"
- + ".`integ_test_small_csv_test_1`";
-
- try (DataCatalogTableProvider tableProvider =
- DataCatalogTableProvider.create(
- pipeline.getOptions().as(DataCatalogPipelineOptions.class))) {
- PCollection<Row> result =
- pipeline.apply(
- "query",
- SqlTransform.query("SELECT id, name, type FROM " + gcsEntryId)
- .withDefaultTableProvider("dc", tableProvider));
-
- pipeline.getOptions().as(DirectOptions.class).setBlockOnRun(true);
- PAssert.that(result)
- .containsInAnyOrder(
- row(1, "customer1", "test"),
- row(2, "customer2", "test"),
- row(3, "customer1", "test"),
- row(4, "customer2", "test"));
- pipeline.run().waitUntilFinish(Duration.standardMinutes(2));
- }
- }
-
- private Row row(int id, String name, String type) {
- return Row.withSchema(ID_NAME_TYPE_SCHEMA).addValues(id, name,
type).build();
- }
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtilsTest.java
b/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtilsTest.java
deleted file mode 100644
index 6afc9466f60..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtilsTest.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import static org.junit.Assert.assertEquals;
-
-import com.google.cloud.datacatalog.v1beta1.ColumnSchema;
-import org.apache.beam.sdk.schemas.Schema;
-import org.apache.beam.sdk.schemas.Schema.FieldType;
-import org.apache.beam.sdk.schemas.logicaltypes.SqlTypes;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Unit tests for {@link SchemaUtils}. */
-@RunWith(JUnit4.class)
-public class SchemaUtilsTest {
-
- private static final Schema TEST_INNER_SCHEMA =
- Schema.builder().addField("i1", FieldType.INT64).addField("i2",
FieldType.STRING).build();
-
- private static final Schema TEST_SCHEMA =
- Schema.builder()
- .addNullableField("f_int32", FieldType.INT32)
- .addNullableField("f_int64", FieldType.INT64)
- .addNullableField("f_bytes", FieldType.BYTES)
- .addNullableField("f_double", FieldType.DOUBLE)
- .addNullableField("f_string", FieldType.STRING)
- .addNullableField("f_bool", FieldType.BOOLEAN)
- .addNullableField("f_ts", FieldType.DATETIME)
- .addNullableField("f_numeric", FieldType.DECIMAL)
- .addLogicalTypeField("f_time", SqlTypes.TIME)
- .addLogicalTypeField("f_date", SqlTypes.DATE)
- .addLogicalTypeField("f_datetime", SqlTypes.DATETIME)
- .addArrayField("f_array", FieldType.INT64)
- .addRowField("f_struct", TEST_INNER_SCHEMA)
- .build();
-
- private static final com.google.cloud.datacatalog.v1beta1.Schema
TEST_DC_SCHEMA =
- com.google.cloud.datacatalog.v1beta1.Schema.newBuilder()
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_int32")
- .setType("INT32")
- .setMode("NULLABLE")
- .build())
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_int64")
- .setType("INT64")
- .setMode("NULLABLE")
- .build())
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_bytes")
- .setType("BYTES")
- .setMode("NULLABLE")
- .build())
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_double")
- .setType("DOUBLE")
- .setMode("NULLABLE")
- .build())
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_string")
- .setType("STRING")
- .setMode("NULLABLE")
- .build())
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_bool")
- .setType("BOOL")
- .setMode("NULLABLE")
- .build())
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_ts")
- .setType("TIMESTAMP")
- .setMode("NULLABLE")
- .build())
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_numeric")
- .setType("NUMERIC")
- .setMode("NULLABLE")
- .build())
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_time")
- .setType("TIME")
- .setMode("REQUIRED")
- .build())
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_date")
- .setType("DATE")
- .setMode("REQUIRED")
- .build())
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_datetime")
- .setType("DATETIME")
- .setMode("REQUIRED")
- .build())
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_array")
- .setType("INT64")
- .setMode("REPEATED")
- .build())
- .addColumns(
- ColumnSchema.newBuilder()
- .setColumn("f_struct")
- .setType("STRUCT")
- .addSubcolumns(
- ColumnSchema.newBuilder()
- .setColumn("i1")
- .setType("INT64")
- .setMode("REQUIRED")
- .build())
- .addSubcolumns(
- ColumnSchema.newBuilder()
- .setColumn("i2")
- .setType("STRING")
- .setMode("REQUIRED")
- .build())
- .setMode("REQUIRED")
- .build())
- .build();
-
- @Test
- public void testFromDataCatalog() {
- assertEquals(TEST_SCHEMA, SchemaUtils.fromDataCatalog(TEST_DC_SCHEMA));
- }
-
- @Test
- public void testToDataCatalog() {
- assertEquals(TEST_DC_SCHEMA, SchemaUtils.toDataCatalog(TEST_SCHEMA));
- }
-}
diff --git
a/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/ZetaSqlIdUtilsTest.java
b/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/ZetaSqlIdUtilsTest.java
deleted file mode 100644
index ff34ef83666..00000000000
---
a/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/ZetaSqlIdUtilsTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.Arrays;
-import java.util.List;
-import org.junit.Test;
-
-/** Unit tests for {@link ZetaSqlIdUtils}. */
-public class ZetaSqlIdUtilsTest {
-
- @Test
- public void testHandlesSimpleIds() {
- List<String> id = Arrays.asList("aaa", "BbB", "zAzzz00");
- assertEquals("aaa.BbB.zAzzz00", ZetaSqlIdUtils.escapeAndJoin(id));
- }
-
- @Test
- public void testHandlesMixedIds() {
- List<String> id = Arrays.asList("aaa", "Bb---B", "zAzzz00");
- assertEquals("aaa.`Bb---B`.zAzzz00", ZetaSqlIdUtils.escapeAndJoin(id));
- }
-
- @Test
- public void testHandlesSpecialChars() {
- List<String> id = Arrays.asList("a\\a", "b`b", "c'c", "d\"d", "e?e");
- assertEquals("`a\\\\a`.`b\\`b`.`c\\'c`.`d\\\"d`.`e\\?e`",
ZetaSqlIdUtils.escapeAndJoin(id));
- }
-
- @Test
- public void testHandlesSpecialCharsInOnePart() {
- List<String> id = Arrays.asList("a\\ab`bc'cd\"de?e");
- assertEquals("`a\\\\ab\\`bc\\'cd\\\"de\\?e`",
ZetaSqlIdUtils.escapeAndJoin(id));
- }
-
- @Test
- public void testHandlesWhiteSpaces() {
- List<String> id = Arrays.asList("a\na", "b\tb", "c\rc", "d\fd");
- assertEquals("`a\\na`.`b\\tb`.`c\\rc`.`d\\fd`",
ZetaSqlIdUtils.escapeAndJoin(id));
- }
-
- @Test
- public void testHandlesWhiteSpacesInOnePart() {
- List<String> id = Arrays.asList("a\nab\tbc\rcd\fd");
- assertEquals("`a\\nab\\tbc\\rcd\\fd`", ZetaSqlIdUtils.escapeAndJoin(id));
- }
-}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index e1ed639b0d2..b8e7b855b99 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -219,7 +219,6 @@ include(":sdks:java:extensions:sql:payloads")
include(":sdks:java:extensions:sql:perf-tests")
include(":sdks:java:extensions:sql:jdbc")
include(":sdks:java:extensions:sql:hcatalog")
-include(":sdks:java:extensions:sql:datacatalog")
include(":sdks:java:extensions:sql:expansion-service")
include(":sdks:java:extensions:sql:udf")
include(":sdks:java:extensions:sql:udf-test-provider")