This is an automated email from the ASF dual-hosted git repository.

panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new c442a7fa894 Remove useless FilterableTable and 
FilterableTableScanExecutor in sql federation (#26177)
c442a7fa894 is described below

commit c442a7fa89451dd1728851ed71575e01efe805a4
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Jun 8 16:49:17 2023 +0800

    Remove useless FilterableTable and FilterableTableScanExecutor in sql 
federation (#26177)
---
 .../AdvancedSQLFederationExecutor.java             |   6 +-
 .../executor/FilterableTableScanExecutor.java      | 308 ---------------------
 .../executor/TranslatableTableScanExecutor.java    |   4 +-
 .../FilterableScanNodeExecutorContext.java         |  39 ---
 .../metadata/filter/FilterableDatabase.java        |  54 ----
 .../metadata/filter/FilterableSchema.java          |  72 -----
 .../optimizer/metadata/filter/FilterableTable.java |  66 -----
 ...gsphere.sqlfederation.spi.SQLFederationExecutor |   2 +-
 .../executor/FilterableTableScanExecutorTest.java  |  11 +-
 .../result/SQLFederationResultSetTest.java         |   5 +-
 10 files changed, 13 insertions(+), 554 deletions(-)

diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/resultset/AdvancedSQLFederationExecutor.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/AdvancedSQLFederationExecutor.java
similarity index 96%
rename from 
kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/resultset/AdvancedSQLFederationExecutor.java
rename to 
kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/AdvancedSQLFederationExecutor.java
index ed88b35e144..e943941dbba 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/resultset/AdvancedSQLFederationExecutor.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/AdvancedSQLFederationExecutor.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sqlfederation.executor.resultset;
+package org.apache.shardingsphere.sqlfederation.executor;
 
 import com.google.common.base.Preconditions;
 import org.apache.calcite.adapter.enumerable.EnumerableInterpretable;
@@ -45,9 +45,7 @@ import 
org.apache.shardingsphere.infra.metadata.data.ShardingSphereData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import 
org.apache.shardingsphere.sqlfederation.executor.SQLFederationDataContext;
-import 
org.apache.shardingsphere.sqlfederation.executor.TableScanExecutorContext;
-import 
org.apache.shardingsphere.sqlfederation.executor.TranslatableTableScanExecutor;
+import 
org.apache.shardingsphere.sqlfederation.executor.resultset.SQLFederationResultSet;
 import org.apache.shardingsphere.sqlfederation.optimizer.SQLOptimizeContext;
 import org.apache.shardingsphere.sqlfederation.optimizer.SQLOptimizeEngine;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.context.OptimizerContext;
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutor.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutor.java
deleted file mode 100644
index 017538a6509..00000000000
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutor.java
+++ /dev/null
@@ -1,308 +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.shardingsphere.sqlfederation.executor;
-
-import lombok.RequiredArgsConstructor;
-import lombok.SneakyThrows;
-import org.apache.calcite.adapter.java.JavaTypeFactory;
-import org.apache.calcite.config.CalciteConnectionConfig;
-import org.apache.calcite.config.CalciteConnectionConfigImpl;
-import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
-import org.apache.calcite.linq4j.AbstractEnumerable;
-import org.apache.calcite.linq4j.Enumerable;
-import org.apache.calcite.linq4j.Enumerator;
-import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.prepare.CalciteCatalogReader;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.RelFactories;
-import org.apache.calcite.rel.rel2sql.RelToSqlConverter;
-import org.apache.calcite.rex.RexBuilder;
-import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.sql.SqlDialect;
-import org.apache.calcite.sql.util.SqlString;
-import org.apache.calcite.tools.RelBuilder;
-import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
-import org.apache.shardingsphere.infra.connection.kernel.KernelProcessor;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
-import org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroup;
-import 
org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroupContext;
-import 
org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroupReportContext;
-import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.result.ExecuteResult;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.JDBCMemoryQueryResult;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.stream.JDBCStreamQueryResult;
-import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecutionPrepareEngine;
-import org.apache.shardingsphere.infra.executor.sql.process.ProcessEngine;
-import org.apache.shardingsphere.infra.hint.HintValueContext;
-import org.apache.shardingsphere.infra.merge.MergeEngine;
-import org.apache.shardingsphere.infra.merge.result.MergedResult;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
-import org.apache.shardingsphere.infra.metadata.data.ShardingSphereData;
-import org.apache.shardingsphere.infra.metadata.data.ShardingSphereSchemaData;
-import org.apache.shardingsphere.infra.metadata.data.ShardingSphereTableData;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
-import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngine;
-import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
-import org.apache.shardingsphere.infra.session.query.QueryContext;
-import 
org.apache.shardingsphere.infra.util.exception.external.sql.type.wrapper.SQLWrapperException;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-import org.apache.shardingsphere.sqlfederation.executor.row.EmptyRowEnumerator;
-import org.apache.shardingsphere.sqlfederation.executor.row.MemoryEnumerator;
-import 
org.apache.shardingsphere.sqlfederation.executor.row.SQLFederationRowEnumerator;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.context.OptimizerContext;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.FilterableScanNodeExecutorContext;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.ScanNodeExecutorContext;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.TableScanExecutor;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.filter.FilterableSchema;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.util.SQLFederationPlannerUtils;
-import 
org.apache.shardingsphere.sqlfederation.spi.SQLFederationExecutorContext;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-/**
- * Filterable table scan executor.
- */
-@RequiredArgsConstructor
-public final class FilterableTableScanExecutor implements TableScanExecutor {
-    
-    private static final JavaTypeFactory JAVA_TYPE_FACTORY = new 
JavaTypeFactoryImpl();
-    
-    private final DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine;
-    
-    private final JDBCExecutor jdbcExecutor;
-    
-    private final JDBCExecutorCallback<? extends ExecuteResult> callback;
-    
-    private final OptimizerContext optimizerContext;
-    
-    private final ShardingSphereRuleMetaData globalRuleMetaData;
-    
-    private final TableScanExecutorContext executorContext;
-    
-    private final ShardingSphereData data;
-    
-    private final ProcessEngine processEngine = new ProcessEngine();
-    
-    @Override
-    public Enumerable<Object> executeScalar(final ShardingSphereTable table, 
final ScanNodeExecutorContext scanContext) {
-        return new AbstractEnumerable<Object>() {
-            
-            @Override
-            public Enumerator<Object> enumerator() {
-                return new EmptyRowEnumerator<>();
-            }
-        };
-    }
-    
-    @Override
-    public Enumerable<Object[]> execute(final ShardingSphereTable table, final 
ScanNodeExecutorContext scanContext) {
-        String databaseName = executorContext.getDatabaseName().toLowerCase();
-        String schemaName = executorContext.getSchemaName().toLowerCase();
-        DatabaseType databaseType = 
DatabaseTypeEngine.getTrunkDatabaseType(optimizerContext.getParserContext(databaseName).getDatabaseType().getType());
-        if (databaseType.getSystemSchemas().contains(schemaName)) {
-            return executeByShardingSphereData(databaseName, schemaName, 
table);
-        }
-        SqlString sqlString = createSQLString(table, 
(FilterableScanNodeExecutorContext) scanContext, 
SQLDialectFactory.getSQLDialect(databaseType.getType()));
-        SQLFederationExecutorContext federationContext = 
executorContext.getFederationContext();
-        QueryContext queryContext = 
createQueryContext(federationContext.getMetaData(), sqlString, databaseType, 
federationContext.getQueryContext().isUseCache());
-        ShardingSphereDatabase database = 
federationContext.getMetaData().getDatabase(databaseName);
-        // TODO need to get session context
-        ExecutionContext context = new 
KernelProcessor().generateExecutionContext(queryContext, database, 
globalRuleMetaData, executorContext.getProps(), new ConnectionContext());
-        if (federationContext.isPreview()) {
-            
federationContext.getExecutionUnits().addAll(context.getExecutionUnits());
-            return createEmptyEnumerable();
-        }
-        return execute(databaseType, queryContext, database, context);
-    }
-    
-    private AbstractEnumerable<Object[]> execute(final DatabaseType 
databaseType, final QueryContext queryContext, final ShardingSphereDatabase 
database, final ExecutionContext context) {
-        try {
-            ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext =
-                    prepareEngine.prepare(context.getRouteContext(), 
context.getExecutionUnits(), new 
ExecutionGroupReportContext(database.getName()));
-            setParameters(executionGroupContext.getInputGroups());
-            processEngine.executeSQL(executionGroupContext, 
context.getQueryContext());
-            List<QueryResult> queryResults = execute(executionGroupContext, 
databaseType);
-            // TODO need to get session context
-            MergeEngine mergeEngine = new MergeEngine(database, 
executorContext.getProps(), new ConnectionContext());
-            MergedResult mergedResult = mergeEngine.merge(queryResults, 
queryContext.getSqlStatementContext());
-            Collection<Statement> statements = 
getStatements(executionGroupContext.getInputGroups());
-            return createEnumerable(mergedResult, 
queryResults.get(0).getMetaData(), statements);
-        } catch (final SQLException ex) {
-            throw new SQLWrapperException(ex);
-        } finally {
-            processEngine.completeSQLExecution();
-        }
-    }
-    
-    private List<QueryResult> execute(final 
ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext, final 
DatabaseType databaseType) throws SQLException {
-        Collection<QueryResult> queryResults = 
jdbcExecutor.execute(executionGroupContext, 
callback).stream().map(QueryResult.class::cast).collect(Collectors.toList());
-        List<QueryResult> result = new LinkedList<>();
-        for (QueryResult each : queryResults) {
-            QueryResult queryResult = each instanceof JDBCStreamQueryResult
-                    ? new JDBCMemoryQueryResult(((JDBCStreamQueryResult) 
each).getResultSet(), databaseType)
-                    : each;
-            result.add(queryResult);
-        }
-        return result;
-    }
-    
-    private Enumerable<Object[]> executeByShardingSphereData(final String 
databaseName, final String schemaName, final ShardingSphereTable table) {
-        Optional<ShardingSphereTableData> tableData = 
Optional.ofNullable(data.getDatabaseData().get(databaseName)).map(optional -> 
optional.getSchemaData().get(schemaName))
-                
.map(ShardingSphereSchemaData::getTableData).map(shardingSphereData -> 
shardingSphereData.get(table.getName()));
-        return 
tableData.map(this::createMemoryEnumerator).orElseGet(this::createEmptyEnumerable);
-    }
-    
-    private Enumerable<Object[]> createMemoryEnumerator(final 
ShardingSphereTableData tableData) {
-        return new AbstractEnumerable<Object[]>() {
-            
-            @Override
-            public Enumerator<Object[]> enumerator() {
-                return new MemoryEnumerator<>(tableData.getRows());
-            }
-        };
-    }
-    
-    private Collection<Statement> getStatements(final 
Collection<ExecutionGroup<JDBCExecutionUnit>> inputGroups) {
-        Collection<Statement> result = new LinkedList<>();
-        for (ExecutionGroup<JDBCExecutionUnit> each : inputGroups) {
-            for (JDBCExecutionUnit executionUnit : each.getInputs()) {
-                result.add(executionUnit.getStorageResource());
-            }
-        }
-        return result;
-    }
-    
-    private SqlString createSQLString(final ShardingSphereTable table, final 
FilterableScanNodeExecutorContext scanContext, final SqlDialect sqlDialect) {
-        return new 
RelToSqlConverter(sqlDialect).visitRoot(createRelNode(table, 
scanContext)).asStatement().toSqlString(sqlDialect);
-    }
-    
-    private void setParameters(final 
Collection<ExecutionGroup<JDBCExecutionUnit>> inputGroups) {
-        for (ExecutionGroup<JDBCExecutionUnit> each : inputGroups) {
-            for (JDBCExecutionUnit executionUnit : each.getInputs()) {
-                if (!(executionUnit.getStorageResource() instanceof 
PreparedStatement)) {
-                    continue;
-                }
-                setParameters((PreparedStatement) 
executionUnit.getStorageResource(), 
executionUnit.getExecutionUnit().getSqlUnit().getParameters());
-            }
-        }
-    }
-    
-    @SneakyThrows(SQLException.class)
-    private void setParameters(final PreparedStatement preparedStatement, 
final List<Object> params) {
-        for (int i = 0; i < params.size(); i++) {
-            preparedStatement.setObject(i + 1, params.get(i));
-        }
-    }
-    
-    private RelNode createRelNode(final ShardingSphereTable table, final 
FilterableScanNodeExecutorContext scanContext) {
-        String databaseName = executorContext.getDatabaseName();
-        String schemaName = executorContext.getSchemaName();
-        CalciteConnectionConfig connectionConfig = new 
CalciteConnectionConfigImpl(optimizerContext.getParserContext(databaseName).getDialectProps());
-        ShardingSphereDatabase database = 
executorContext.getFederationContext().getMetaData().getDatabase(databaseName);
-        CalciteCatalogReader catalogReader = 
SQLFederationPlannerUtils.createCatalogReader(schemaName,
-                new FilterableSchema(schemaName, 
database.getSchema(schemaName), database.getProtocolType(), JAVA_TYPE_FACTORY, 
null), JAVA_TYPE_FACTORY, connectionConfig);
-        RelOptCluster relOptCluster = 
RelOptCluster.create(SQLFederationPlannerUtils.createVolcanoPlanner(), new 
RexBuilder(JAVA_TYPE_FACTORY));
-        RelBuilder builder = 
RelFactories.LOGICAL_BUILDER.create(relOptCluster, 
catalogReader).scan(table.getName()).filter(scanContext.getFilterValues());
-        if (null != scanContext.getProjects()) {
-            builder.project(createProjections(scanContext.getProjects(), 
builder, table.getColumnNames()));
-        }
-        return builder.build();
-    }
-    
-    private Collection<RexNode> createProjections(final int[] projects, final 
RelBuilder relBuilder, final List<String> columnNames) {
-        Collection<RexNode> result = new LinkedList<>();
-        for (int each : projects) {
-            result.add(relBuilder.field(columnNames.get(each)));
-        }
-        return result;
-    }
-    
-    private AbstractEnumerable<Object[]> createEnumerable(final MergedResult 
mergedResult, final QueryResultMetaData metaData, final Collection<Statement> 
statements) throws SQLException {
-        // TODO remove getRows when mergedResult support JDBC first method
-        Collection<Object[]> rows = getRows(mergedResult, metaData);
-        return new AbstractEnumerable<Object[]>() {
-            
-            @Override
-            public Enumerator<Object[]> enumerator() {
-                return new SQLFederationRowEnumerator<>(rows, statements);
-            }
-        };
-    }
-    
-    private Collection<Object[]> getRows(final MergedResult mergedResult, 
final QueryResultMetaData metaData) throws SQLException {
-        Collection<Object[]> result = new LinkedList<>();
-        while (mergedResult.next()) {
-            Object[] currentRow = new Object[metaData.getColumnCount()];
-            for (int i = 0; i < metaData.getColumnCount(); i++) {
-                currentRow[i] = mergedResult.getValue(i + 1, Object.class);
-            }
-            result.add(currentRow);
-        }
-        return result;
-    }
-    
-    private QueryContext createQueryContext(final ShardingSphereMetaData 
metaData, final SqlString sqlString, final DatabaseType databaseType, final 
boolean useCache) {
-        String sql = sqlString.getSql().replace("\n", " ");
-        SQLStatement sqlStatement = new 
SQLStatementParserEngine(databaseType.getType(),
-                optimizerContext.getSqlParserRule().getSqlStatementCache(), 
optimizerContext.getSqlParserRule().getParseTreeCache(),
-                
optimizerContext.getSqlParserRule().isSqlCommentParseEnabled()).parse(sql, 
useCache);
-        List<Object> params = getParameters(sqlString.getDynamicParameters());
-        SQLStatementContext sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaData, params, sqlStatement, 
executorContext.getDatabaseName());
-        return new QueryContext(sqlStatementContext, sql, params, new 
HintValueContext(), useCache);
-    }
-    
-    private List<Object> getParameters(final List<Integer> paramIndexes) {
-        if (null == paramIndexes) {
-            return Collections.emptyList();
-        }
-        List<Object> result = new ArrayList<>();
-        for (Integer each : paramIndexes) {
-            
result.add(executorContext.getFederationContext().getQueryContext().getParameters().get(each));
-        }
-        return result;
-    }
-    
-    private AbstractEnumerable<Object[]> createEmptyEnumerable() {
-        return new AbstractEnumerable<Object[]>() {
-            
-            @Override
-            public Enumerator<Object[]> enumerator() {
-                return new EmptyRowEnumerator<>();
-            }
-        };
-    }
-}
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
index 9d63426c5b3..6ff143b2868 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
@@ -81,7 +81,7 @@ import 
org.apache.shardingsphere.sqlfederation.optimizer.context.OptimizerContex
 import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.ScanNodeExecutorContext;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.TableScanExecutor;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.TranslatableScanNodeExecutorContext;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.filter.FilterableSchema;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.translatable.TranslatableSchema;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.rexnode.StringToRexNodeUtils;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.util.SQLFederationPlannerUtils;
 import 
org.apache.shardingsphere.sqlfederation.spi.SQLFederationExecutorContext;
@@ -319,7 +319,7 @@ public final class TranslatableTableScanExecutor implements 
TableScanExecutor {
         CalciteConnectionConfig connectionConfig = new 
CalciteConnectionConfigImpl(optimizerContext.getParserContext(databaseName).getDialectProps());
         ShardingSphereDatabase database = 
executorContext.getFederationContext().getMetaData().getDatabase(databaseName);
         CalciteCatalogReader catalogReader = 
SQLFederationPlannerUtils.createCatalogReader(schemaName,
-                new FilterableSchema(schemaName, 
database.getSchema(schemaName), database.getProtocolType(), JAVA_TYPE_FACTORY, 
null), JAVA_TYPE_FACTORY, connectionConfig);
+                new TranslatableSchema(schemaName, 
database.getSchema(schemaName), database.getProtocolType(), JAVA_TYPE_FACTORY, 
null), JAVA_TYPE_FACTORY, connectionConfig);
         RelOptCluster relOptCluster = 
RelOptCluster.create(SQLFederationPlannerUtils.createVolcanoPlanner(), new 
RexBuilder(JAVA_TYPE_FACTORY));
         RelBuilder builder = 
RelFactories.LOGICAL_BUILDER.create(relOptCluster, 
catalogReader).scan(table.getName());
         if (null != scanContext.getFilterValues()) {
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/executor/FilterableScanNodeExecutorContext.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/executor/FilterableScanNodeExecutorContext.java
deleted file mode 100644
index 5762eeed792..00000000000
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/executor/FilterableScanNodeExecutorContext.java
+++ /dev/null
@@ -1,39 +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.shardingsphere.sqlfederation.optimizer.executor;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import org.apache.calcite.DataContext;
-import org.apache.calcite.rex.RexNode;
-
-import java.util.List;
-
-/**
- * Table scan executor context.
- */
-@RequiredArgsConstructor
-@Getter
-public final class FilterableScanNodeExecutorContext implements 
ScanNodeExecutorContext {
-    
-    private final DataContext root;
-    
-    private final List<RexNode> filterValues;
-    
-    private final int[] projects;
-}
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/filter/FilterableDatabase.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/filter/FilterableDatabase.java
deleted file mode 100644
index 79cf9ae515d..00000000000
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/filter/FilterableDatabase.java
+++ /dev/null
@@ -1,54 +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.shardingsphere.sqlfederation.optimizer.metadata.filter;
-
-import lombok.Getter;
-import org.apache.calcite.adapter.java.JavaTypeFactory;
-import org.apache.calcite.schema.Schema;
-import org.apache.calcite.schema.impl.AbstractSchema;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.TableScanExecutor;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * Filterable database.
- */
-@Getter
-public final class FilterableDatabase extends AbstractSchema {
-    
-    private final String name;
-    
-    private final Map<String, Schema> subSchemaMap;
-    
-    public FilterableDatabase(final ShardingSphereDatabase database, final 
JavaTypeFactory javaTypeFactory, final TableScanExecutor executor) {
-        name = database.getName();
-        subSchemaMap = createSubSchemaMap(database, javaTypeFactory, executor);
-    }
-    
-    private Map<String, Schema> createSubSchemaMap(final 
ShardingSphereDatabase database, final JavaTypeFactory javaTypeFactory, final 
TableScanExecutor executor) {
-        Map<String, Schema> result = new 
LinkedHashMap<>(database.getSchemas().size(), 1F);
-        for (Entry<String, ShardingSphereSchema> entry : 
database.getSchemas().entrySet()) {
-            result.put(entry.getKey(), new FilterableSchema(entry.getKey(), 
entry.getValue(), database.getProtocolType(), javaTypeFactory, executor));
-        }
-        return result;
-    }
-}
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/filter/FilterableSchema.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/filter/FilterableSchema.java
deleted file mode 100644
index 0f9a1918b2f..00000000000
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/filter/FilterableSchema.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.shardingsphere.sqlfederation.optimizer.metadata.filter;
-
-import lombok.Getter;
-import org.apache.calcite.adapter.java.JavaTypeFactory;
-import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.rel.type.RelDataTypeImpl;
-import org.apache.calcite.schema.Table;
-import org.apache.calcite.schema.impl.AbstractSchema;
-import org.apache.calcite.schema.impl.ViewTable;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.TableScanExecutor;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.statistic.FederationStatistic;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.util.SQLFederationDataTypeUtils;
-
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * Filterable schema.
- */
-@Getter
-public final class FilterableSchema extends AbstractSchema {
-    
-    private final String name;
-    
-    private final Map<String, Table> tableMap;
-    
-    public FilterableSchema(final String schemaName, final 
ShardingSphereSchema schema, final DatabaseType protocolType, final 
JavaTypeFactory javaTypeFactory, final TableScanExecutor executor) {
-        name = schemaName;
-        tableMap = createTableMap(schema, protocolType, javaTypeFactory, 
executor);
-    }
-    
-    private Map<String, Table> createTableMap(final ShardingSphereSchema 
schema, final DatabaseType protocolType, final JavaTypeFactory javaTypeFactory, 
final TableScanExecutor executor) {
-        Map<String, Table> result = new 
LinkedHashMap<>(schema.getTables().size(), 1F);
-        for (ShardingSphereTable each : schema.getTables().values()) {
-            if (schema.containsView(each.getName())) {
-                result.put(each.getName(), getViewTable(schema, protocolType, 
each, javaTypeFactory));
-            } else {
-                // TODO implement table statistic logic after using custom 
operators
-                result.put(each.getName(), new FilterableTable(each, executor, 
new FederationStatistic(), protocolType));
-            }
-        }
-        return result;
-    }
-    
-    private ViewTable getViewTable(final ShardingSphereSchema schema, final 
DatabaseType protocolType, final ShardingSphereTable table, final 
JavaTypeFactory javaTypeFactory) {
-        RelDataType relDataType = 
SQLFederationDataTypeUtils.createRelDataType(table, protocolType, 
javaTypeFactory);
-        ShardingSphereView view = schema.getView(table.getName());
-        return new ViewTable(javaTypeFactory.getJavaClass(relDataType), 
RelDataTypeImpl.proto(relDataType), view.getViewDefinition(), 
Collections.emptyList(), Collections.emptyList());
-    }
-}
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/filter/FilterableTable.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/filter/FilterableTable.java
deleted file mode 100644
index 2aead5dbeca..00000000000
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/filter/FilterableTable.java
+++ /dev/null
@@ -1,66 +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.shardingsphere.sqlfederation.optimizer.metadata.filter;
-
-import lombok.RequiredArgsConstructor;
-import org.apache.calcite.DataContext;
-import org.apache.calcite.linq4j.Enumerable;
-import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.rel.type.RelDataTypeFactory;
-import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.schema.ProjectableFilterableTable;
-import org.apache.calcite.schema.Statistic;
-import org.apache.calcite.schema.impl.AbstractTable;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.FilterableScanNodeExecutorContext;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.TableScanExecutor;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.statistic.FederationStatistic;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.util.SQLFederationDataTypeUtils;
-
-import java.util.List;
-
-/**
- * Filterable table.
- */
-@RequiredArgsConstructor
-public final class FilterableTable extends AbstractTable implements 
ProjectableFilterableTable {
-    
-    private final ShardingSphereTable table;
-    
-    private final TableScanExecutor executor;
-    
-    private final FederationStatistic statistic;
-    
-    private final DatabaseType protocolType;
-    
-    @Override
-    public RelDataType getRowType(final RelDataTypeFactory typeFactory) {
-        return SQLFederationDataTypeUtils.createRelDataType(table, 
protocolType, typeFactory);
-    }
-    
-    @Override
-    public Enumerable<Object[]> scan(final DataContext root, final 
List<RexNode> filters, final int[] projects) {
-        return executor.execute(table, new 
FilterableScanNodeExecutorContext(root, filters, projects));
-    }
-    
-    @Override
-    public Statistic getStatistic() {
-        return statistic;
-    }
-}
diff --git 
a/kernel/sql-federation/core/src/main/resources/META-INF/services/org.apache.shardingsphere.sqlfederation.spi.SQLFederationExecutor
 
b/kernel/sql-federation/core/src/main/resources/META-INF/services/org.apache.shardingsphere.sqlfederation.spi.SQLFederationExecutor
index 2f2bf7d5b24..3de4c495b37 100644
--- 
a/kernel/sql-federation/core/src/main/resources/META-INF/services/org.apache.shardingsphere.sqlfederation.spi.SQLFederationExecutor
+++ 
b/kernel/sql-federation/core/src/main/resources/META-INF/services/org.apache.shardingsphere.sqlfederation.spi.SQLFederationExecutor
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.sqlfederation.executor.resultset.AdvancedSQLFederationExecutor
+org.apache.shardingsphere.sqlfederation.executor.AdvancedSQLFederationExecutor
diff --git 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutorTest.java
 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutorTest.java
index 84f4837dafb..d6c6b70c0ca 100644
--- 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutorTest.java
+++ 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutorTest.java
@@ -58,11 +58,12 @@ class FilterableTableScanExecutorTest {
         when(schemaData.getTableData().get("test")).thenReturn(tableData);
         ShardingSphereTable shardingSphereTable = 
mock(ShardingSphereTable.class);
         when(shardingSphereTable.getName()).thenReturn("test");
-        Enumerable<Object[]> enumerable = new 
FilterableTableScanExecutor(null, null, null, optimizerContext, null, 
executorContext, shardingSphereData)
+        Enumerable<Object[]> enumerable = new 
TranslatableTableScanExecutor(null, null, null, optimizerContext, null, 
executorContext, shardingSphereData)
                 .execute(shardingSphereTable, 
Mockito.mock(ScanNodeExecutorContext.class));
-        Enumerator<Object[]> actual = enumerable.enumerator();
-        actual.moveNext();
-        Object[] row = actual.current();
-        assertThat(row[0], is(1));
+        try (Enumerator<Object[]> actual = enumerable.enumerator()) {
+            actual.moveNext();
+            Object[] row = actual.current();
+            assertThat(row[0], is(1));
+        }
     }
 }
diff --git 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/executor/result/SQLFederationResultSetTest.java
 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/executor/result/SQLFederationResultSetTest.java
index 67f137f469f..a5a50c60c1a 100644
--- 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/executor/result/SQLFederationResultSetTest.java
+++ 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/executor/result/SQLFederationResultSetTest.java
@@ -25,7 +25,7 @@ import 
org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.sqlfederation.executor.resultset.SQLFederationResultSet;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.filter.FilterableSchema;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.translatable.TranslatableSchema;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -69,8 +69,7 @@ class SQLFederationResultSetTest {
     @BeforeEach
     void setUp() {
         enumerator = createEnumerator();
-        federationResultSet =
-                new SQLFederationResultSet(enumerator, 
mock(ShardingSphereSchema.class), Mockito.mock(FilterableSchema.class), 
createSelectStatementContext(), Mockito.mock(RelDataType.class));
+        federationResultSet = new SQLFederationResultSet(enumerator, 
mock(ShardingSphereSchema.class), mock(TranslatableSchema.class), 
createSelectStatementContext(), mock(RelDataType.class));
     }
     
     private SelectStatementContext createSelectStatementContext() {


Reply via email to