diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 6189f7ea75be..7124cc4c4ff7 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -240,6 +240,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { boolean enableGcpLogExporter; OpenTelemetry customOpenTelemetry; boolean useGlobalOpenTelemetry; + boolean enableGraphMetadata; private OpenTelemetry openTelemetry; private Context otelContext; Tracer tracer = @@ -314,7 +315,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { } this.reqGoogleDriveScope = - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( String.valueOf(ds.getRequestGoogleDriveScope()), BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME); @@ -397,6 +398,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { this.connectionPoolSize = ds.getConnectionPoolSize(); this.listenerPoolSize = ds.getListenerPoolSize(); this.partnerToken = ds.getPartnerToken(); + this.enableGraphMetadata = ds.getEnableGraphMetadata(); this.headerProvider = createHeaderProvider(); this.enableGcpTraceExporter = ds.getEnableGcpTraceExporter(); @@ -867,6 +869,10 @@ Long getListenerPoolSize() { return listenerPoolSize; } + boolean isEnableGraphMetadata() { + return this.enableGraphMetadata; + } + @Override public boolean isValid(int timeout) throws SQLException { if (timeout < 0) { @@ -1644,7 +1650,7 @@ private boolean checkIsReadOnlyTokenUsed(Map authProps) { String readonlyValue = authProps.get(BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME); if (readonlyValue != null) { - return BigQueryJdbcUrlUtility.convertIntToBoolean( + return BigQueryJdbcUrlUtility.convertToBoolean( readonlyValue, BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME); } return false; diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java index 140636632316..204d3fc4e2ee 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java @@ -174,7 +174,7 @@ public Connection connect(String url, Properties info) throws SQLException { boolean enableGcpLogExporter = false; if (enableGcpLogExporterStr != null) { enableGcpLogExporter = - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( enableGcpLogExporterStr, BigQueryJdbcUrlUtility.ENABLE_GCP_LOG_EXPORTER_PROPERTY_NAME); } diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java index ef7c9363c68d..d22846470081 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java @@ -193,6 +193,8 @@ protected boolean removeEldestEntry(Map.Entry> eldes static final String MAX_BYTES_BILLED_PROPERTY_NAME = "MaximumBytesBilled"; static final Long DEFAULT_MAX_BYTES_BILLED_VALUE = 0L; static final String LABELS_PROPERTY_NAME = "Labels"; + static final String ENABLE_GRAPH_METADATA_PROPERTY_NAME = "EnableGraphMetadata"; + static final boolean DEFAULT_ENABLE_GRAPH_METADATA_VALUE = false; static final List OVERRIDE_PROPERTIES = Arrays.asList( BIGQUERY_ENDPOINT_OVERRIDE_PROPERTY_NAME, @@ -691,6 +693,11 @@ protected boolean removeEldestEntry(Map.Entry> eldes .setDefaultValue( String.valueOf( TelemetryPropertyUtility.DEFAULT_ENABLE_DIAGNOSTIC_TELEMETRY_VALUE)) + .build(), + BigQueryConnectionProperty.newBuilder() + .setName(ENABLE_GRAPH_METADATA_PROPERTY_NAME) + .setDescription( + "Enables or disables discovery of Property Graphs and related metadata in DatabaseMetaData methods.") .build()))); private static final List NETWORK_PROPERTIES = @@ -861,7 +868,7 @@ static String appendPropertiesToURL(String url, String callerClassName, Properti return urlBuilder.toString(); } - static boolean convertIntToBoolean(String value, String propertyName) { + static boolean convertToBoolean(String value, String propertyName) { int integerValue; try { diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index 66034dc1a35d..7d91c128d9a7 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -131,6 +131,7 @@ public class DataSource implements javax.sql.DataSource { private OpenTelemetry customOpenTelemetry; private boolean useGlobalOpenTelemetry = BigQueryJdbcUrlUtility.DEFAULT_USE_GLOBAL_OTEL_VALUE; private Boolean enableDiagnosticTelemetry; + private Boolean enableGraphMetadata; // Make sure the JDBC driver class is loaded. static { @@ -157,13 +158,13 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME, (ds, val) -> ds.setEnableHighThroughputAPI( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME, (ds, val) -> ds.setUnsupportedHTAPIFallback( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.HTAPI_MIN_TABLE_SIZE_PROPERTY_NAME, @@ -182,13 +183,13 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME, (ds, val) -> ds.setEnableSession( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ENABLE_TIMESTAMP_PICOS_PROPERTY_NAME, (ds, val) -> ds.setEnableTimestampPicos( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_TIMESTAMP_PICOS_PROPERTY_NAME))) .put(BigQueryJdbcUrlUtility.LOG_LEVEL_PROPERTY_NAME, DataSource::setLogLevel) .put(BigQueryJdbcUrlUtility.LOG_PATH_PROPERTY_NAME, DataSource::setLogPath) @@ -209,7 +210,7 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME, (ds, val) -> ds.setOAuthAccessTokenReadonly( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.OAUTH_REFRESH_TOKEN_PROPERTY_NAME, @@ -218,14 +219,14 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME, (ds, val) -> ds.setUseQueryCache( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME))) .put(BigQueryJdbcUrlUtility.QUERY_DIALECT_PROPERTY_NAME, DataSource::setQueryDialect) .put( BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME, (ds, val) -> ds.setAllowLargeResults( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.LARGE_RESULTS_TABLE_PROPERTY_NAME, @@ -258,7 +259,7 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME, (ds, val) -> ds.setEnableWriteAPI( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ADDITIONAL_PROJECTS_PROPERTY_NAME, @@ -267,14 +268,14 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME, (ds, val) -> ds.setFilterTablesOnDefaultDataset( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ENABLE_PROJECT_DISCOVERY_PROPERTY_NAME, (ds, val) -> ds.setEnableProjectDiscovery( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_PROJECT_DISCOVERY_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME, @@ -376,26 +377,32 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.ENABLE_GCP_TRACE_EXPORTER_PROPERTY_NAME, (ds, val) -> ds.setEnableGcpTraceExporter( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_GCP_TRACE_EXPORTER_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ENABLE_GCP_LOG_EXPORTER_PROPERTY_NAME, (ds, val) -> ds.setEnableGcpLogExporter( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_GCP_LOG_EXPORTER_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.USE_GLOBAL_OTEL_PROPERTY_NAME, (ds, val) -> ds.setUseGlobalOpenTelemetry( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.USE_GLOBAL_OTEL_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ENABLE_DIAGNOSTIC_TELEMETRY_PROPERTY_NAME, (ds, val) -> ds.setEnableDiagnosticTelemetry( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_DIAGNOSTIC_TELEMETRY_PROPERTY_NAME))) + .put( + BigQueryJdbcUrlUtility.ENABLE_GRAPH_METADATA_PROPERTY_NAME, + (ds, val) -> + ds.setEnableGraphMetadata( + BigQueryJdbcUrlUtility.convertToBoolean( + val, BigQueryJdbcUrlUtility.ENABLE_GRAPH_METADATA_PROPERTY_NAME))) .build(); public static DataSource fromUrl(String url) { @@ -738,6 +745,11 @@ Properties createProperties() { BigQueryJdbcUrlUtility.USE_GLOBAL_OTEL_PROPERTY_NAME, String.valueOf(this.useGlobalOpenTelemetry)); } + if (this.enableGraphMetadata != null) { + connectionProperties.setProperty( + BigQueryJdbcUrlUtility.ENABLE_GRAPH_METADATA_PROPERTY_NAME, + String.valueOf(this.enableGraphMetadata)); + } connectionProperties.setProperty( BigQueryJdbcUrlUtility.ENABLE_DIAGNOSTIC_TELEMETRY_PROPERTY_NAME, String.valueOf(getEnableDiagnosticTelemetry())); @@ -1537,6 +1549,16 @@ public void setPrivateServiceConnect(String privateServiceConnect) { this.privateServiceConnect = privateServiceConnect; } + public boolean getEnableGraphMetadata() { + return enableGraphMetadata != null + ? enableGraphMetadata + : BigQueryJdbcUrlUtility.DEFAULT_ENABLE_GRAPH_METADATA_VALUE; + } + + public void setEnableGraphMetadata(Boolean enableGraphMetadata) { + this.enableGraphMetadata = enableGraphMetadata; + } + @Override public PrintWriter getLogWriter() { return null; diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java index 55d9d4bde62b..daf938657196 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java @@ -391,4 +391,26 @@ public void testParseDiagnosticTelemetryProperties() { assertThat(defaultDs.getEnableDiagnosticTelemetry()) .isEqualTo(TelemetryPropertyUtility.DEFAULT_ENABLE_DIAGNOSTIC_TELEMETRY_VALUE); } + + @Test + public void testEnableGraphMetadataProperties() { + String url = + "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + + "ProjectId=MyBigQueryProject;" + + "EnableGraphMetadata=1"; + + assertThat(BigQueryJdbcUrlUtility.parseUriProperty(url, "EnableGraphMetadata")).isEqualTo("1"); + + DataSource ds = DataSource.fromUrl(url); + assertThat(ds.getEnableGraphMetadata()).isTrue(); + + Properties props = ds.createProperties(); + assertThat(props.getProperty("EnableGraphMetadata")).isEqualTo("true"); + + String urlWithoutGraph = + "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=MyBigQueryProject"; + DataSource defaultDs = DataSource.fromUrl(urlWithoutGraph); + assertThat(defaultDs.getEnableGraphMetadata()) + .isEqualTo(BigQueryJdbcUrlUtility.DEFAULT_ENABLE_GRAPH_METADATA_VALUE); + } }