diff --git a/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/BaseJdbcClient.java b/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/BaseJdbcClient.java index 101a7fbd4807..f5cf1bf736a7 100644 --- a/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/BaseJdbcClient.java +++ b/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/BaseJdbcClient.java @@ -228,7 +228,8 @@ public ConnectorSplitSource getSplits(JdbcTableLayoutHandle layoutHandle) tableHandle.getCatalogName(), tableHandle.getSchemaName(), tableHandle.getTableName(), - layoutHandle.getTupleDomain()); + layoutHandle.getTupleDomain(), + Optional.empty()); return new FixedSplitSource(ImmutableList.of(jdbcSplit)); } @@ -258,7 +259,8 @@ public PreparedStatement buildSql(Connection connection, JdbcSplit split, List tupleDomain; + private final Optional additionalPredicate; @JsonCreator public JdbcSplit( @@ -42,13 +44,15 @@ public JdbcSplit( @JsonProperty("catalogName") @Nullable String catalogName, @JsonProperty("schemaName") @Nullable String schemaName, @JsonProperty("tableName") String tableName, - @JsonProperty("tupleDomain") TupleDomain tupleDomain) + @JsonProperty("tupleDomain") TupleDomain tupleDomain, + @JsonProperty("additionalProperty") Optional additionalPredicate) { this.connectorId = requireNonNull(connectorId, "connector id is null"); this.catalogName = catalogName; this.schemaName = schemaName; this.tableName = requireNonNull(tableName, "table name is null"); this.tupleDomain = requireNonNull(tupleDomain, "tupleDomain is null"); + this.additionalPredicate = requireNonNull(additionalPredicate, "additionalPredicate is null"); } @JsonProperty @@ -83,6 +87,12 @@ public TupleDomain getTupleDomain() return tupleDomain; } + @JsonProperty + public Optional getAdditionalPredicate() + { + return additionalPredicate; + } + @Override public boolean isRemotelyAccessible() { diff --git a/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/QueryBuilder.java b/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/QueryBuilder.java index 9427e6e9c4f6..884c94868ce5 100644 --- a/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/QueryBuilder.java +++ b/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/QueryBuilder.java @@ -43,6 +43,7 @@ import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; @@ -90,7 +91,15 @@ public QueryBuilder(String quote) this.quote = requireNonNull(quote, "quote is null"); } - public PreparedStatement buildSql(JdbcClient client, Connection connection, String catalog, String schema, String table, List columns, TupleDomain tupleDomain) + public PreparedStatement buildSql( + JdbcClient client, + Connection connection, + String catalog, + String schema, + String table, + List columns, + TupleDomain tupleDomain, + Optional additionalPredicate) throws SQLException { StringBuilder sql = new StringBuilder(); @@ -118,6 +127,12 @@ public PreparedStatement buildSql(JdbcClient client, Connection connection, Stri List accumulator = new ArrayList<>(); List clauses = toConjuncts(columns, tupleDomain, accumulator); + if (additionalPredicate.isPresent()) { + clauses = ImmutableList.builder() + .addAll(clauses) + .add(additionalPredicate.get()) + .build(); + } if (!clauses.isEmpty()) { sql.append(" WHERE ") .append(Joiner.on(" AND ").join(clauses)); diff --git a/presto-base-jdbc/src/test/java/io/prestosql/plugin/jdbc/TestJdbcQueryBuilder.java b/presto-base-jdbc/src/test/java/io/prestosql/plugin/jdbc/TestJdbcQueryBuilder.java index 3daab8207840..bfc5358a5c19 100644 --- a/presto-base-jdbc/src/test/java/io/prestosql/plugin/jdbc/TestJdbcQueryBuilder.java +++ b/presto-base-jdbc/src/test/java/io/prestosql/plugin/jdbc/TestJdbcQueryBuilder.java @@ -37,6 +37,7 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Locale; +import java.util.Optional; import static io.airlift.slice.Slices.utf8Slice; import static io.airlift.testing.Assertions.assertContains; @@ -196,7 +197,7 @@ public void testNormalBuildSql() .build()); Connection connection = database.getConnection(); - try (PreparedStatement preparedStatement = new QueryBuilder("\"").buildSql(jdbcClient, connection, "", "", "test_table", columns, tupleDomain); + try (PreparedStatement preparedStatement = new QueryBuilder("\"").buildSql(jdbcClient, connection, "", "", "test_table", columns, tupleDomain, Optional.empty()); ResultSet resultSet = preparedStatement.executeQuery()) { ImmutableSet.Builder builder = ImmutableSet.builder(); while (resultSet.next()) { @@ -219,7 +220,7 @@ public void testBuildSqlWithFloat() false))); Connection connection = database.getConnection(); - try (PreparedStatement preparedStatement = new QueryBuilder("\"").buildSql(jdbcClient, connection, "", "", "test_table", columns, tupleDomain); + try (PreparedStatement preparedStatement = new QueryBuilder("\"").buildSql(jdbcClient, connection, "", "", "test_table", columns, tupleDomain, Optional.empty()); ResultSet resultSet = preparedStatement.executeQuery()) { ImmutableSet.Builder longBuilder = ImmutableSet.builder(); ImmutableSet.Builder floatBuilder = ImmutableSet.builder(); @@ -245,7 +246,7 @@ public void testBuildSqlWithVarchar() false))); Connection connection = database.getConnection(); - try (PreparedStatement preparedStatement = new QueryBuilder("\"").buildSql(jdbcClient, connection, "", "", "test_table", columns, tupleDomain); + try (PreparedStatement preparedStatement = new QueryBuilder("\"").buildSql(jdbcClient, connection, "", "", "test_table", columns, tupleDomain, Optional.empty()); ResultSet resultSet = preparedStatement.executeQuery()) { ImmutableSet.Builder builder = ImmutableSet.builder(); while (resultSet.next()) { @@ -273,7 +274,7 @@ public void testBuildSqlWithChar() false))); Connection connection = database.getConnection(); - try (PreparedStatement preparedStatement = new QueryBuilder("\"").buildSql(jdbcClient, connection, "", "", "test_table", columns, tupleDomain); + try (PreparedStatement preparedStatement = new QueryBuilder("\"").buildSql(jdbcClient, connection, "", "", "test_table", columns, tupleDomain, Optional.empty()); ResultSet resultSet = preparedStatement.executeQuery()) { ImmutableSet.Builder builder = ImmutableSet.builder(); while (resultSet.next()) { @@ -306,7 +307,7 @@ public void testBuildSqlWithDateTime() false))); Connection connection = database.getConnection(); - try (PreparedStatement preparedStatement = new QueryBuilder("\"").buildSql(jdbcClient, connection, "", "", "test_table", columns, tupleDomain); + try (PreparedStatement preparedStatement = new QueryBuilder("\"").buildSql(jdbcClient, connection, "", "", "test_table", columns, tupleDomain, Optional.empty()); ResultSet resultSet = preparedStatement.executeQuery()) { ImmutableSet.Builder dateBuilder = ImmutableSet.builder(); ImmutableSet.Builder