From 151d11848af5d20ff44a19b38395dac99e98fd15 Mon Sep 17 00:00:00 2001 From: chenpingzeng Date: Tue, 12 Oct 2021 15:39:13 +0800 Subject: [PATCH] [fix] delete and update with filter condition does not pushdown to datasource Signed-off-by: chenpingzeng --- .../DataCenterQueryGenerator.java | 14 +++++ .../optimization/KylinSqlStatementWriter.java | 2 +- .../optimization/BaseJdbcQueryGenerator.java | 14 +++++ .../BaseJdbcSqlStatementWriter.java | 2 +- .../jdbc/optimization/JdbcPlanOptimizer.java | 6 +- .../JdbcQueryGeneratorContext.java | 61 ++++++++++++++++++- .../TestBaseBaseJdbcQueryGenerator.java | 4 +- .../spi/sql/expression/Selection.java | 4 +- 8 files changed, 97 insertions(+), 10 deletions(-) diff --git a/hetu-datacenter/src/main/java/io/hetu/core/plugin/datacenter/optimization/DataCenterQueryGenerator.java b/hetu-datacenter/src/main/java/io/hetu/core/plugin/datacenter/optimization/DataCenterQueryGenerator.java index 5e5c1a13c..34d6a1ea1 100644 --- a/hetu-datacenter/src/main/java/io/hetu/core/plugin/datacenter/optimization/DataCenterQueryGenerator.java +++ b/hetu-datacenter/src/main/java/io/hetu/core/plugin/datacenter/optimization/DataCenterQueryGenerator.java @@ -116,6 +116,20 @@ public class DataCenterQueryGenerator .setSchemaTableName(Optional.of(new SchemaTableName(dcTableHandle.getSchemaName(), dcTableHandle.getTableName()))) .setSelections(selections) .setFrom(Optional.of(table.toString())); + + String catalogName = dcTableHandle.getCatalogName(); + if (catalogName != null) { + contextBuilder.setRemoteCatalogName(catalogName); + } + String schemaName = dcTableHandle.getSchemaName(); + if (schemaName != null) { + contextBuilder.setRemoteSchemaName(schemaName); + } + String tableName = dcTableHandle.getTableName(); + if (tableName != null) { + contextBuilder.setRemoteTablename(tableName); + } + // If LIMIT has been push down, add it to context if (dcTableHandle.getLimit().isPresent()) { contextBuilder.setLimit(dcTableHandle.getLimit()); diff --git a/hetu-kylin/src/main/java/io/hetu/core/plugin/kylin/optimization/KylinSqlStatementWriter.java b/hetu-kylin/src/main/java/io/hetu/core/plugin/kylin/optimization/KylinSqlStatementWriter.java index a84c22721..a6a959b5c 100644 --- a/hetu-kylin/src/main/java/io/hetu/core/plugin/kylin/optimization/KylinSqlStatementWriter.java +++ b/hetu-kylin/src/main/java/io/hetu/core/plugin/kylin/optimization/KylinSqlStatementWriter.java @@ -50,7 +50,7 @@ public class KylinSqlStatementWriter else { StringJoiner joiner = new StringJoiner(", "); for (Selection selection : selections) { - if (selection.isAliased(pushDownParameter.getCaseInsensitiveParameter())) { + if (selection.isAliased(!pushDownParameter.getCaseInsensitiveParameter())) { joiner.add(selection.getExpression() + " AS " + KylinKeywords.getAlias(selection.getAlias())); } else { diff --git a/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/BaseJdbcQueryGenerator.java b/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/BaseJdbcQueryGenerator.java index 7bd64935d..cf347a58a 100644 --- a/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/BaseJdbcQueryGenerator.java +++ b/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/BaseJdbcQueryGenerator.java @@ -419,6 +419,20 @@ public class BaseJdbcQueryGenerator .setSchemaTableName(Optional.of(jdbcTableHandle.getSchemaTableName())) .setSelections(selections) .setFrom(Optional.of(table.toString())); + + String catalogName = jdbcTableHandle.getCatalogName(); + if (catalogName != null) { + contextBuilder.setRemoteCatalogName(catalogName); + } + String schemaName = jdbcTableHandle.getSchemaName(); + if (schemaName != null) { + contextBuilder.setRemoteSchemaName(schemaName); + } + String tableName = jdbcTableHandle.getTableName(); + if (tableName != null) { + contextBuilder.setRemoteTablename(tableName); + } + // If LIMIT has been push down, add it to context if (jdbcTableHandle.getLimit().isPresent()) { contextBuilder.setLimit(jdbcTableHandle.getLimit()); diff --git a/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/BaseJdbcSqlStatementWriter.java b/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/BaseJdbcSqlStatementWriter.java index c457b9fcf..3fff21cac 100644 --- a/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/BaseJdbcSqlStatementWriter.java +++ b/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/BaseJdbcSqlStatementWriter.java @@ -61,7 +61,7 @@ public class BaseJdbcSqlStatementWriter else { StringJoiner joiner = new StringJoiner(", "); for (Selection selection : selections) { - if (selection.isAliased(nameCaseInsensitive)) { + if (selection.isAliased(!nameCaseInsensitive)) { joiner.add(selection.getExpression() + " AS " + selection.getAlias()); } else { diff --git a/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/JdbcPlanOptimizer.java b/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/JdbcPlanOptimizer.java index 326b42a6f..38929ea12 100644 --- a/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/JdbcPlanOptimizer.java +++ b/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/JdbcPlanOptimizer.java @@ -281,9 +281,9 @@ public class JdbcPlanOptimizer context.getCatalogName().get(), new JdbcTableHandle( context.getSchemaTableName().get(), - context.getCatalogName().get().getCatalogName(), - context.getSchemaTableName().get().getSchemaName(), - context.getSchemaTableName().get().getTableName(), + context.getRemoteCatalogName(), + context.getRemoteSchemaName(), + context.getRemoteTableName(), TupleDomain.all(), OptionalLong.empty(), Optional.of(new GeneratedSql(sql, true)), diff --git a/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/JdbcQueryGeneratorContext.java b/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/JdbcQueryGeneratorContext.java index ef37bfb75..f13932f7b 100644 --- a/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/JdbcQueryGeneratorContext.java +++ b/presto-base-jdbc/src/main/java/io/prestosql/plugin/jdbc/optimization/JdbcQueryGeneratorContext.java @@ -37,6 +37,10 @@ public final class JdbcQueryGeneratorContext { private final Optional catalogName; private final Optional schemaTableName; + // cresponding to catalogName/schemaName/tableName to JdbcTableHandle + private final String remoteCatalogName; + private final String remoteSchemaName; + private final String remoteTableName; private final Optional transaction; private final LinkedHashMap selections; private final Set groupByColumns; @@ -50,6 +54,9 @@ public final class JdbcQueryGeneratorContext private JdbcQueryGeneratorContext( Optional catalogName, Optional schemaTableName, + String remoteCatalogName, + String remoteSchemaName, + String remoteTableName, Optional transaction, Map selections, Optional from, @@ -62,6 +69,9 @@ public final class JdbcQueryGeneratorContext { this.catalogName = catalogName; this.schemaTableName = schemaTableName; + this.remoteCatalogName = remoteCatalogName; + this.remoteSchemaName = remoteSchemaName; + this.remoteTableName = requireNonNull(remoteTableName, "table name is null"); this.transaction = transaction; this.selections = new LinkedHashMap<>(requireNonNull(selections, "selections can't be null")); this.from = requireNonNull(from, "from can't be null"); @@ -83,6 +93,21 @@ public final class JdbcQueryGeneratorContext return schemaTableName; } + public String getRemoteCatalogName() + { + return remoteCatalogName; + } + + public String getRemoteSchemaName() + { + return remoteSchemaName; + } + + public String getRemoteTableName() + { + return remoteTableName; + } + public Optional getTransaction() { return transaction; @@ -184,13 +209,17 @@ public final class JdbcQueryGeneratorContext public static Builder buildAsNewTable(JdbcQueryGeneratorContext context) { - return new Builder(context.getCatalogName(), context.getSchemaTableName(), context.getTransaction(), context.getGroupIdNodeInfo()); + return new Builder(context.getCatalogName(), context.getSchemaTableName(), context.getRemoteCatalogName(), + context.getRemoteSchemaName(), context.getRemoteTableName(), context.getTransaction(), context.getGroupIdNodeInfo()); } public static final class Builder { private Optional catalogName; private Optional schemaTableName; + private String remoteCatalogName; + private String remoteSchemaName; + private String remoteTableName; private Optional transaction; private LinkedHashMap selections = new LinkedHashMap<>(); private Set groupByColumns = new HashSet<>(); @@ -207,6 +236,9 @@ public final class JdbcQueryGeneratorContext { this.catalogName = context.getCatalogName(); this.schemaTableName = context.getSchemaTableName(); + this.remoteCatalogName = context.getRemoteCatalogName(); + this.remoteSchemaName = context.getRemoteSchemaName(); + this.remoteTableName = context.getRemoteTableName(); this.transaction = context.getTransaction(); this.selections = context.getSelections(); this.groupByColumns = context.getGroupByColumns(); @@ -221,11 +253,17 @@ public final class JdbcQueryGeneratorContext private Builder( Optional catalogName, Optional schemaTableName, + String remoteCatalogName, + String remoteSchemaName, + String remoteTableName, Optional transaction, GroupIdNodeInfo groupIdNodeInfo) { this.catalogName = catalogName; this.schemaTableName = schemaTableName; + this.remoteCatalogName = remoteCatalogName; + this.remoteSchemaName = remoteSchemaName; + this.remoteTableName = remoteTableName; this.transaction = transaction; this.groupIdNodeInfo = groupIdNodeInfo; } @@ -242,6 +280,24 @@ public final class JdbcQueryGeneratorContext return this; } + public Builder setRemoteCatalogName(String catalogname) + { + this.remoteCatalogName = catalogname; + return this; + } + + public Builder setRemoteSchemaName(String schemaName) + { + this.remoteSchemaName = schemaName; + return this; + } + + public Builder setRemoteTablename(String tableName) + { + this.remoteTableName = tableName; + return this; + } + public Builder setTransaction(Optional transaction) { this.transaction = transaction; @@ -316,6 +372,9 @@ public final class JdbcQueryGeneratorContext return new JdbcQueryGeneratorContext( catalogName, schemaTableName, + remoteCatalogName, + remoteSchemaName, + remoteTableName, transaction, selections, from, diff --git a/presto-base-jdbc/src/test/java/io/prestosql/plugin/jdbc/optimization/TestBaseBaseJdbcQueryGenerator.java b/presto-base-jdbc/src/test/java/io/prestosql/plugin/jdbc/optimization/TestBaseBaseJdbcQueryGenerator.java index 53f2337b3..fcd11f2a3 100644 --- a/presto-base-jdbc/src/test/java/io/prestosql/plugin/jdbc/optimization/TestBaseBaseJdbcQueryGenerator.java +++ b/presto-base-jdbc/src/test/java/io/prestosql/plugin/jdbc/optimization/TestBaseBaseJdbcQueryGenerator.java @@ -317,7 +317,7 @@ public class TestBaseBaseJdbcQueryGenerator Optional.of(endValue.getName())))), symbol("city"), scanNode)), - "SELECT regionid, city, amount_out FROM (SELECT regionid, city, fare, amount, startvalue, endvalue, min(amount) OVER (RANGE BETWEEN startValue PRECEDING AND endValue FOLLOWING) AS amount_out FROM (SELECT regionid, city, fare, amount, startValue, endValue FROM 'table') hetu_table_1) hetu_table_2"); + "SELECT regionid, city, amount_out FROM (SELECT regionid, city, fare, amount, startvalue, endvalue, min(amount) OVER (RANGE BETWEEN startValue PRECEDING AND endValue FOLLOWING) AS amount_out FROM (SELECT regionid, city, fare, amount, startValue AS startvalue, endValue AS endvalue FROM 'table') hetu_table_1) hetu_table_2"); testJQL(planBuilder -> planBuilder.project( Assignments.builder() .put(symbol("regionid"), variable("regionid")) @@ -348,6 +348,6 @@ public class TestBaseBaseJdbcQueryGenerator Optional.empty()))), symbol("city"), scanNode)), - "SELECT regionid, city, amount_out FROM (SELECT regionid, city, fare, amount, startvalue, endvalue, min(amount) OVER ( ORDER BY fare ASC NULLS FIRST ROWS BETWEEN startValue PRECEDING AND UNBOUNDED FOLLOWING) AS amount_out FROM (SELECT regionid, city, fare, amount, startValue, endValue FROM 'table') hetu_table_1) hetu_table_2"); + "SELECT regionid, city, amount_out FROM (SELECT regionid, city, fare, amount, startvalue, endvalue, min(amount) OVER ( ORDER BY fare ASC NULLS FIRST ROWS BETWEEN startValue PRECEDING AND UNBOUNDED FOLLOWING) AS amount_out FROM (SELECT regionid, city, fare, amount, startValue AS startvalue, endValue AS endvalue FROM 'table') hetu_table_1) hetu_table_2"); } } diff --git a/presto-spi/src/main/java/io/prestosql/spi/sql/expression/Selection.java b/presto-spi/src/main/java/io/prestosql/spi/sql/expression/Selection.java index 3bbd86af3..a0833cd62 100644 --- a/presto-spi/src/main/java/io/prestosql/spi/sql/expression/Selection.java +++ b/presto-spi/src/main/java/io/prestosql/spi/sql/expression/Selection.java @@ -44,9 +44,9 @@ public class Selection return alias; } - public boolean isAliased(boolean caseInsensitive) + public boolean isAliased(boolean caseSensitive) { - return caseInsensitive ? !this.alias.equals(expression) : !this.alias.toLowerCase(Locale.ENGLISH).equals(expression.toLowerCase(Locale.ENGLISH)); + return caseSensitive ? !this.alias.equals(expression) : !this.alias.toLowerCase(Locale.ENGLISH).equals(expression.toLowerCase(Locale.ENGLISH)); } @Override