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

menghaoran 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 11a7e6c  Polish package structure of optimizer.convert (#12704)
11a7e6c is described below

commit 11a7e6cb87185465bd5b2131ab2f4684091d9c12
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Sep 25 07:01:39 2021 +0800

    Polish package structure of optimizer.convert (#12704)
    
    * Rename SQLNodeConverterUtil
    
    * Refactor SQLNodeConverterUtil
    
    * Add limit and projection package
    
    * Add groupby package
    
    * Add orderby package
    
    * Add orderby package
    
    * Move projection package
    
    * Add from package
    
    * Move orderby package
    
    * Add where package
    
    * Add subquery package
    
    * Add expression package
    
    * Add SQLStatementToSQLNodeConverter
    
    * Refactor SelectStatementConverterTest
    
    * Rename SQLSegmentToSQLNodeConverter
    
    * Refactor SQLSegmentToSQLNodeConverter
    
    * Polish package of optimizer.convert
    
    * Refactor SelectStatementConverter
    
    * Refactor SimpleTableConverter
    
    * Refactor TableConverter
    
    * Refactor TableConverter
    
    * Refactor TableConverter
    
    * Refactor ProjectionsConverter
    
    * Refactor ExpressionConverter
    
    * refactor BinaryOperationExpressionConverter
    
    * Refactor SelectStatementConverter
---
 .../infra/optimize/ShardingSphereOptimizer.java    |  2 +-
 .../converter/impl/GroupBySQLNodeConverter.java    | 45 --------------
 .../impl/SelectStatementSQLNodeConverter.java      | 61 ------------------
 .../SQLNodeConvertEngine.java                      | 15 ++---
 .../segment/SQLSegmentConverter.java}              | 19 +++---
 .../segment/expression/ExpressionConverter.java}   | 36 ++++++-----
 .../impl/BinaryOperationExpressionConverter.java}  | 30 +++++----
 .../segment/expression/impl/ColumnConverter.java}  | 12 ++--
 .../expression/impl/ListExpressionConverter.java}  | 17 +++--
 .../impl/LiteralExpressionConverter.java}          | 21 ++++---
 .../segment/from/TableConverter.java}              | 27 ++++----
 .../segment/from/impl/JoinTableConverter.java}     | 53 +++++++++-------
 .../segment/from/impl/SimpleTableConverter.java}   | 23 +++----
 .../segment/from/impl/SubqueryTableConverter.java} |  8 +--
 .../segment/groupby/GroupByConverter.java}         | 20 +++---
 .../segment/groupby/HavingConverter.java}          | 14 ++---
 .../segment/limit/AbstractLimitConverter.java}     | 20 +++---
 .../segment/limit/OffsetConverter.java}            |  8 +--
 .../limit}/PaginationValueSQLConverter.java        | 25 ++++----
 .../segment/limit/RowCountConverter.java}          |  8 +--
 .../segment/orderby/OrderByConverter.java}         | 18 ++----
 .../orderby/item/ColumnOrderByItemConverter.java}  | 19 +++---
 .../item/ExpressionOrderByItemConverter.java}      | 11 ++--
 .../orderby/item/OrderByItemConverterUtil.java}    | 19 +++---
 .../segment/projection/DistinctConverter.java}     | 15 ++---
 .../segment/projection/ProjectionsConverter.java}  | 39 ++++++------
 .../impl/ColumnProjectionConverter.java}           | 13 ++--
 .../impl/ExpressionProjectionConverter.java}       | 13 ++--
 .../segment/where/WhereConverter.java}             | 16 ++---
 .../statement/SQLStatementConverter.java}          | 20 +++---
 .../statement/SelectStatementConverter.java        | 71 +++++++++++++++++++++
 ...narySqlOperator.java => BinarySQLOperator.java} | 56 ++++++++---------
 .../statement/SelectStatementConverterTest.java}   | 40 +++++++-----
 .../core/convert/BaseSqlNodeConverterTest.java     | 72 ----------------------
 .../loader/CommonFixtureTableMetaDataBuilder.java  |  4 +-
 .../AlterTableFederationMetaDataRefresherTest.java |  5 +-
 ...CreateTableFederationMetaDataRefresherTest.java |  3 +-
 .../DropTableFederationMetaDataRefresherTest.java  |  3 +-
 .../metadata/rule/CommonFixtureRule.java           |  2 +-
 ...chema.builder.spi.RuleBasedTableMetaDataBuilder |  2 +-
 .../src/test/resources/logback-test.xml            | 33 ++++++++++
 41 files changed, 435 insertions(+), 503 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/ShardingSphereOptimizer.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/ShardingSphereOptimizer.java
index 7144345..3928ec7 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/ShardingSphereOptimizer.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/ShardingSphereOptimizer.java
@@ -39,7 +39,7 @@ import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.infra.exception.ShardingSphereException;
 import 
org.apache.shardingsphere.infra.optimize.context.translatable.TranslatableOptimizerContext;
-import org.apache.shardingsphere.infra.optimize.convert.SQLNodeConvertEngine;
+import org.apache.shardingsphere.infra.optimize.converter.SQLNodeConvertEngine;
 import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.sql.parser.exception.SQLParsingException;
 
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/GroupBySQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/GroupBySQLNodeConverter.java
deleted file mode 100644
index c485ced..0000000
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/GroupBySQLNodeConverter.java
+++ /dev/null
@@ -1,45 +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.infra.optimize.convert.converter.impl;
-
-import org.apache.calcite.sql.SqlNode;
-import org.apache.calcite.sql.SqlNodeList;
-import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SqlNodeConverterUtil;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.GroupBySegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.OrderByItemSegment;
-
-import java.util.Collection;
-import java.util.Optional;
-
-/**
- * Group by converter.
- */
-public final class GroupBySQLNodeConverter implements 
SQLNodeConverter<GroupBySegment, SqlNodeList> {
-    
-    @Override
-    public Optional<SqlNodeList> convert(final GroupBySegment groupBy) {
-        if (groupBy == null || groupBy.getGroupByItems() == null || 
groupBy.getGroupByItems().isEmpty()) {
-            return Optional.empty();
-        }
-        Collection<OrderByItemSegment> groupByItems = 
groupBy.getGroupByItems();
-        Collection<SqlNode> groupBySqlNodes = 
SqlNodeConverterUtil.convertOrderByItems(groupByItems);
-        return Optional.of(new SqlNodeList(groupBySqlNodes, 
SqlParserPos.ZERO));
-    }
-}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/SelectStatementSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/SelectStatementSQLNodeConverter.java
deleted file mode 100644
index 8386264..0000000
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/SelectStatementSQLNodeConverter.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.shardingsphere.infra.optimize.convert.converter.impl;
-
-import org.apache.calcite.sql.SqlNode;
-import org.apache.calcite.sql.SqlNodeList;
-import org.apache.calcite.sql.SqlSelect;
-import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.SelectStatementHandler;
-
-import java.util.Optional;
-
-/**
- * Converter of select statement to SQL node.
- */
-public final class SelectStatementSQLNodeConverter implements 
SQLNodeConverter<SelectStatement, SqlNode> {
-    
-    @Override
-    public Optional<SqlNode> convert(final SelectStatement selectStatement) {
-        Optional<SqlNodeList> distinct = new 
DistinctSQLNodeConverter().convert(selectStatement.getProjections());
-        Optional<SqlNodeList> projections = new 
ProjectionsSQLNodeConverter().convert(selectStatement.getProjections());
-        Optional<SqlNode> from = new 
TableSQLNodeConverter().convert(selectStatement.getFrom());
-        Optional<SqlNode> where = new 
WhereSQLNodeConverter().convert(selectStatement.getWhere().orElse(null));
-        Optional<SqlNodeList> groupBy = new 
GroupBySQLNodeConverter().convert(selectStatement.getGroupBy().orElse(null));
-        Optional<SqlNode> having = new 
HavingSQLNodeConverter().convert(selectStatement.getHaving().orElse(null));
-        Optional<SqlNodeList> orderBy = new 
OrderBySQLNodeConverter().convert(selectStatement.getOrderBy().orElse(null));
-        Optional<LimitSegment> limit = 
SelectStatementHandler.getLimitSegment(selectStatement);
-        Optional<SqlNode> offset = new 
OffsetSQLNodeConverter().convert(limit.orElse(null));
-        Optional<SqlNode> rowCount = new 
RowCountSQLNodeConverter().convert(limit.orElse(null));
-        return Optional.of(new SqlSelect(SqlParserPos.ZERO, 
-                distinct.orElse(null), 
-                projections.orElse(null), 
-                from.orElse(null), 
-                where.orElse(null), 
-                groupBy.orElse(null), 
-                having.orElse(null),
-                null, 
-                orderBy.orElse(null),
-                offset.orElse(null),
-                rowCount.orElse(null), 
-                null));
-    }
-}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/SQLNodeConvertEngine.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/SQLNodeConvertEngine.java
similarity index 76%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/SQLNodeConvertEngine.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/SQLNodeConvertEngine.java
index df22e1e..7003206 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/SQLNodeConvertEngine.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/SQLNodeConvertEngine.java
@@ -15,17 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert;
+package org.apache.shardingsphere.infra.optimize.converter;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.calcite.sql.SqlNode;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.impl.SelectStatementSQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.statement.SelectStatementConverter;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 
-import java.util.Optional;
-
 /**
  * SQL node convert engine.
  */
@@ -33,17 +31,14 @@ import java.util.Optional;
 public final class SQLNodeConvertEngine {
     
     /**
-     * Convert.
+     * Convert SQL statement to SQL node.
      * 
-     * @param statement SQL statement
+     * @param statement SQL statement to be converted
      * @return sqlNode converted SQL node
      */
     public static SqlNode convert(final SQLStatement statement) {
         if (statement instanceof SelectStatement) {
-            Optional<SqlNode> selectSQLNode = new 
SelectStatementSQLNodeConverter().convert((SelectStatement) statement);
-            if (selectSQLNode.isPresent()) {
-                return selectSQLNode.get();
-            }
+            return new SelectStatementConverter().convert((SelectStatement) 
statement);
         }
         throw new UnsupportedOperationException("Unsupported SQL node 
conversion.");
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/SQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/SQLSegmentConverter.java
similarity index 65%
copy from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/SQLNodeConverter.java
copy to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/SQLSegmentConverter.java
index f8e07e0..d8c7ff7 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/SQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/SQLSegmentConverter.java
@@ -15,23 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter;
+package org.apache.shardingsphere.infra.optimize.converter.segment;
 
 import org.apache.calcite.sql.SqlNode;
-import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
 
 import java.util.Optional;
 
 /**
- * SQL node converter.
+ * SQL segment converter.
+ * 
+ * @param <T> type of SQL segment
+ * @param <S> type of SQL node
  */
-public interface SQLNodeConverter<T extends ASTNode, R extends SqlNode> {
+public interface SQLSegmentConverter<T extends SQLSegment, S extends SqlNode> {
     
     /**
-     * Convert.
+     * Convert SQL segment to SQL node.
      * 
-     * @param astNode AST node
-     * @return sqlNode converted SQL node
+     * @param segment SQL segment be to converted
+     * @return converted SQL node
      */
-    Optional<R> convert(T astNode);
+    Optional<S> convert(T segment);
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ExpressionSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/ExpressionConverter.java
similarity index 52%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ExpressionSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/ExpressionConverter.java
index 8443cd1..3e1fc92 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ExpressionSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/ExpressionConverter.java
@@ -15,10 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.expression;
 
 import org.apache.calcite.sql.SqlNode;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.impl.BinaryOperationExpressionConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.impl.ColumnConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.impl.ListExpressionConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.impl.LiteralExpressionConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
@@ -29,27 +33,27 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.L
 import java.util.Optional;
 
 /**
- * Expression converter entry.
+ * Expression converter.
  */
-public final class ExpressionSQLNodeConverter implements 
SQLNodeConverter<ExpressionSegment, SqlNode> {
+public final class ExpressionConverter implements 
SQLSegmentConverter<ExpressionSegment, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final ExpressionSegment expression) {
-        if (null == expression) {
+    public Optional<SqlNode> convert(final ExpressionSegment segment) {
+        if (null == segment) {
             return Optional.empty();
         }
-        if (expression instanceof LiteralExpressionSegment) {
-            return new 
LiteralExpressionSQLNodeConverter().convert((LiteralExpressionSegment) 
expression);
-        } else if (expression instanceof CommonExpressionSegment) {
+        if (segment instanceof LiteralExpressionSegment) {
+            return new 
LiteralExpressionConverter().convert((LiteralExpressionSegment) segment);
+        } else if (segment instanceof CommonExpressionSegment) {
             // TODO 
             throw new UnsupportedOperationException("unsupported 
CommonExpressionSegment");
-        } else if (expression instanceof ListExpression) {
-            return new 
ListExpressionSQLNodeConverter().convert((ListExpression) expression);
-        } else if (expression instanceof BinaryOperationExpression) {
-            return new 
BinaryOperationExpressionSQLNodeConverter().convert((BinaryOperationExpression) 
expression);
-        } else if (expression instanceof ColumnSegment) {
-            return new ColumnSQLNodeConverter().convert((ColumnSegment) 
expression);
+        } else if (segment instanceof ListExpression) {
+            return new ListExpressionConverter().convert((ListExpression) 
segment);
+        } else if (segment instanceof BinaryOperationExpression) {
+            return new 
BinaryOperationExpressionConverter().convert((BinaryOperationExpression) 
segment);
+        } else if (segment instanceof ColumnSegment) {
+            return new ColumnConverter().convert((ColumnSegment) segment);
         }
-        throw new UnsupportedOperationException("unsupported TableSegment 
type: " + expression.getClass());
+        throw new UnsupportedOperationException("unsupported TableSegment 
type: " + segment.getClass());
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/BinaryOperationExpressionSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
similarity index 52%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/BinaryOperationExpressionSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
index a36027a..f68de30 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/BinaryOperationExpressionSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
@@ -15,30 +15,36 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.impl;
 
+import com.google.common.base.Preconditions;
 import org.apache.calcite.sql.SqlBasicCall;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
-import org.apache.shardingsphere.infra.optimize.operator.BinarySqlOperator;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.ExpressionConverter;
+import org.apache.shardingsphere.infra.optimize.operator.BinarySQLOperator;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 
 import java.util.Optional;
 
 /**
  * Binary operation expression converter.
  */
-public final class BinaryOperationExpressionSQLNodeConverter implements 
SQLNodeConverter<BinaryOperationExpression, SqlNode> {
+public final class BinaryOperationExpressionConverter implements 
SQLSegmentConverter<BinaryOperationExpression, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final BinaryOperationExpression 
binaryOperationExpression) {
-        SqlNode left = new 
ExpressionSQLNodeConverter().convert(binaryOperationExpression.getLeft()).get();
-        SqlNode right = new 
ExpressionSQLNodeConverter().convert(binaryOperationExpression.getRight()).get();
-        String operator = binaryOperationExpression.getOperator();
-        BinarySqlOperator binarySqlOperator = 
BinarySqlOperator.value(operator);
-        SqlNode sqlNode = new 
SqlBasicCall(binarySqlOperator.getSqlBinaryOperator(), new SqlNode[] {left, 
right},
-                SqlParserPos.ZERO);
-        return Optional.of(sqlNode);
+    public Optional<SqlNode> convert(final BinaryOperationExpression segment) {
+        BinarySQLOperator operator = 
BinarySQLOperator.value(segment.getOperator());
+        SqlNode left = convertExpression(segment.getLeft());
+        SqlNode right = convertExpression(segment.getRight());
+        return Optional.of(new SqlBasicCall(operator.getSqlBinaryOperator(), 
new SqlNode[] {left, right}, SqlParserPos.ZERO));
+    }
+    
+    private SqlNode convertExpression(final ExpressionSegment segment) {
+        Optional<SqlNode> result = new ExpressionConverter().convert(segment);
+        Preconditions.checkState(result.isPresent());
+        return result.get();
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ColumnSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/ColumnConverter.java
similarity index 76%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ColumnSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/ColumnConverter.java
index f36c6b7..2065885 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ColumnSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/ColumnConverter.java
@@ -15,13 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.impl;
 
 import com.google.common.collect.ImmutableList;
 import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
 
@@ -30,12 +30,12 @@ import java.util.Optional;
 /**
  * Column converter.
  */
-public final class ColumnSQLNodeConverter implements 
SQLNodeConverter<ColumnSegment, SqlNode> {
+public final class ColumnConverter implements 
SQLSegmentConverter<ColumnSegment, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final ColumnSegment columnSegment) {
-        Optional<OwnerSegment> owner = columnSegment.getOwner();
-        String columnName = columnSegment.getIdentifier().getValue();
+    public Optional<SqlNode> convert(final ColumnSegment segment) {
+        Optional<OwnerSegment> owner = segment.getOwner();
+        String columnName = segment.getIdentifier().getValue();
         if (owner.isPresent()) {
             return Optional.of(new 
SqlIdentifier(ImmutableList.of(owner.get().getIdentifier().getValue(), 
columnName), SqlParserPos.ZERO));
         }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ListExpressionSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/ListExpressionConverter.java
similarity index 72%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ListExpressionSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/ListExpressionConverter.java
index 326ca75..13e5586 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ListExpressionSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/ListExpressionConverter.java
@@ -15,30 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.impl;
 
 import org.apache.calcite.sql.SqlBasicCall;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.ExpressionConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
 
-import java.util.List;
 import java.util.Optional;
 
 /**
  * List expression converter.
  */
-public final class ListExpressionSQLNodeConverter implements 
SQLNodeConverter<ListExpression, SqlNode> {
+public final class ListExpressionConverter implements 
SQLSegmentConverter<ListExpression, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final ListExpression expression) {
-        List<ExpressionSegment> items = expression.getItems();
+    public Optional<SqlNode> convert(final ListExpression segment) {
         SqlNode left = null;
-        for (ExpressionSegment item : items) {
-            Optional<SqlNode> optional = new 
ExpressionSQLNodeConverter().convert(item);
+        for (ExpressionSegment item : segment.getItems()) {
+            Optional<SqlNode> optional = new 
ExpressionConverter().convert(item);
             if (!optional.isPresent()) {
                 continue;
             }
@@ -48,6 +47,6 @@ public final class ListExpressionSQLNodeConverter implements 
SQLNodeConverter<Li
             }
             left = new SqlBasicCall(SqlStdOperatorTable.OR, new SqlNode[] 
{left, optional.get()}, SqlParserPos.ZERO);
         }
-        return Optional.of(left);
+        return Optional.ofNullable(left);
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/LiteralExpressionSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/LiteralExpressionConverter.java
similarity index 69%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/LiteralExpressionSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/LiteralExpressionConverter.java
index f82fa63..01a87c3 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/LiteralExpressionSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/LiteralExpressionConverter.java
@@ -15,25 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.impl;
 
 import org.apache.calcite.sql.SqlLiteral;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
 
 import java.util.Optional;
 
-public final class LiteralExpressionSQLNodeConverter implements 
SQLNodeConverter<LiteralExpressionSegment, SqlNode> {
+/**
+ * Literal expression converter.
+ */
+public final class LiteralExpressionConverter implements 
SQLSegmentConverter<LiteralExpressionSegment, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final LiteralExpressionSegment 
literalExpression) {
-        Object literals = literalExpression.getLiterals();
-        if (literals.getClass() == Integer.class) {
-            return 
Optional.of(SqlLiteral.createExactNumeric(String.valueOf(literalExpression.getLiterals()),
 SqlParserPos.ZERO));
-        } else if (literals.getClass() == String.class) {
-            return Optional.of(SqlLiteral.createCharString((String) 
literalExpression.getLiterals(), SqlParserPos.ZERO));
+    public Optional<SqlNode> convert(final LiteralExpressionSegment segment) {
+        if (Integer.class == segment.getLiterals().getClass()) {
+            return 
Optional.of(SqlLiteral.createExactNumeric(String.valueOf(segment.getLiterals()),
 SqlParserPos.ZERO));
+        }
+        if (String.class == segment.getLiterals().getClass()) {
+            return Optional.of(SqlLiteral.createCharString((String) 
segment.getLiterals(), SqlParserPos.ZERO));
         }
         return Optional.empty();
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/TableSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/from/TableConverter.java
similarity index 52%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/TableSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/from/TableConverter.java
index d9548b5..c74ed50 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/TableSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/from/TableConverter.java
@@ -15,10 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.from;
 
 import org.apache.calcite.sql.SqlNode;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.from.impl.JoinTableConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.from.impl.SimpleTableConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.from.impl.SubqueryTableConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
@@ -27,19 +30,19 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.Tab
 import java.util.Optional;
 
 /**
- * convert from clause.
+ * Table converter.
  */
-public final class TableSQLNodeConverter implements 
SQLNodeConverter<TableSegment, SqlNode> {
+public final class TableConverter implements SQLSegmentConverter<TableSegment, 
SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final TableSegment table) {
-        if (table instanceof SimpleTableSegment) {
-            return new 
SimpleTableSQLNodeConverter().convert((SimpleTableSegment) table);
-        } else if (table instanceof JoinTableSegment) {
-            return new JoinTableSQLNodeConverter().convert((JoinTableSegment) 
table);
-        } else if (table instanceof SubqueryTableSegment) {
-            return new 
SubqueryTableSQLNodeConverter().convert((SubqueryTableSegment) table);
+    public Optional<SqlNode> convert(final TableSegment segment) {
+        if (segment instanceof SimpleTableSegment) {
+            return new SimpleTableConverter().convert((SimpleTableSegment) 
segment);
+        } else if (segment instanceof JoinTableSegment) {
+            return new JoinTableConverter().convert((JoinTableSegment) 
segment);
+        } else if (segment instanceof SubqueryTableSegment) {
+            return new SubqueryTableConverter().convert((SubqueryTableSegment) 
segment);
         }
-        throw new UnsupportedOperationException("Unsupported table segment 
type: " + table.getClass());
+        throw new UnsupportedOperationException("Unsupported segment segment 
type: " + segment.getClass());
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/JoinTableSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/from/impl/JoinTableConverter.java
similarity index 52%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/JoinTableSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/from/impl/JoinTableConverter.java
index ccf2125..cca2316 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/JoinTableSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/from/impl/JoinTableConverter.java
@@ -15,24 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.from.impl;
 
+import com.google.common.base.Preconditions;
 import org.apache.calcite.sql.JoinConditionType;
 import org.apache.calcite.sql.JoinType;
 import org.apache.calcite.sql.SqlJoin;
 import org.apache.calcite.sql.SqlLiteral;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.ExpressionConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.from.TableConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
 
 import java.util.Optional;
 
 /**
  * Join converter.
  */
-public final class JoinTableSQLNodeConverter implements 
SQLNodeConverter<JoinTableSegment, SqlNode> {
+public final class JoinTableConverter implements 
SQLSegmentConverter<JoinTableSegment, SqlNode> {
     
     private static final String JOIN_TYPE_INNER = "INNER";
     
@@ -43,33 +46,37 @@ public final class JoinTableSQLNodeConverter implements 
SQLNodeConverter<JoinTab
     private static final String JOIN_TYPE_FULL = "FULL";
     
     @Override
-    public Optional<SqlNode> convert(final JoinTableSegment join) {
-        SqlNode left = new 
TableSQLNodeConverter().convert(join.getLeft()).get();
-        SqlNode right = new 
TableSQLNodeConverter().convert(join.getRight()).get();
-        ExpressionSegment expressionSegment = join.getCondition();
-        Optional<SqlNode> condition = new 
ExpressionSQLNodeConverter().convert(expressionSegment);
-        SqlLiteral conditionType = condition.isPresent() ? 
JoinConditionType.ON.symbol(SqlParserPos.ZERO)
-                : JoinConditionType.NONE.symbol(SqlParserPos.ZERO);
-        SqlLiteral joinTypeSqlNode = convertJoinType(join.getJoinType());
-        SqlNode sqlNode = new SqlJoin(SqlParserPos.ZERO, left,
-                SqlLiteral.createBoolean(false, SqlParserPos.ZERO),
-                joinTypeSqlNode, right, conditionType, condition.orElse(null));
-        return Optional.of(sqlNode);
+    public Optional<SqlNode> convert(final JoinTableSegment segment) {
+        SqlNode left = convertJoinedTable(segment.getLeft());
+        SqlNode right = convertJoinedTable(segment.getRight());
+        Optional<SqlNode> condition = new 
ExpressionConverter().convert(segment.getCondition());
+        SqlLiteral conditionType = condition.isPresent() ? 
JoinConditionType.ON.symbol(SqlParserPos.ZERO) : 
JoinConditionType.NONE.symbol(SqlParserPos.ZERO);
+        return Optional.of(
+                new SqlJoin(SqlParserPos.ZERO, left, 
SqlLiteral.createBoolean(false, SqlParserPos.ZERO), 
convertJoinType(segment.getJoinType()), right, conditionType, 
condition.orElse(null)));
+    }
+    
+    private SqlNode convertJoinedTable(final TableSegment segment) {
+        Optional<SqlNode> result = new TableConverter().convert(segment);
+        Preconditions.checkState(result.isPresent());
+        return result.get();
     }
     
     private SqlLiteral convertJoinType(final String joinType) {
-        if (joinType == null) {
+        if (null == joinType) {
             return JoinType.COMMA.symbol(SqlParserPos.ZERO);
-        } else if (JOIN_TYPE_INNER.equals(joinType)) {
+        }
+        if (JOIN_TYPE_INNER.equals(joinType)) {
             return JoinType.INNER.symbol(SqlParserPos.ZERO);
-        } else if (JOIN_TYPE_LEFT.equals(joinType)) {
+        }
+        if (JOIN_TYPE_LEFT.equals(joinType)) {
             return JoinType.LEFT.symbol(SqlParserPos.ZERO);
-        } else if (JOIN_TYPE_RIGHT.equals(joinType)) {
+        }
+        if (JOIN_TYPE_RIGHT.equals(joinType)) {
             return JoinType.RIGHT.symbol(SqlParserPos.ZERO);
-        } else if (JOIN_TYPE_FULL.equals(joinType)) {
+        }
+        if (JOIN_TYPE_FULL.equals(joinType)) {
             return JoinType.FULL.symbol(SqlParserPos.ZERO);
-        } else {
-            throw new UnsupportedOperationException("unsupported join type " + 
joinType);
         }
+        throw new UnsupportedOperationException("unsupported join type " + 
joinType);
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/SimpleTableSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/from/impl/SimpleTableConverter.java
similarity index 61%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/SimpleTableSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/from/impl/SimpleTableConverter.java
index 61ef9c0..82adee5 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/SimpleTableSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/from/impl/SimpleTableConverter.java
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.from.impl;
 
 import org.apache.calcite.sql.SqlBasicCall;
 import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
 
@@ -31,19 +31,16 @@ import java.util.Optional;
 /**
  * Simple table converter.
  */
-public final class SimpleTableSQLNodeConverter implements 
SQLNodeConverter<SimpleTableSegment, SqlNode> {
+public final class SimpleTableConverter implements 
SQLSegmentConverter<SimpleTableSegment, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final SimpleTableSegment simpleTable) {
-        TableNameSegment tableName = simpleTable.getTableName();
-        SqlNode tableNameSqlNode = new 
SqlIdentifier(tableName.getIdentifier().getValue(), SqlParserPos.ZERO);
-        SqlNode sqlNode;
-        if (simpleTable.getAlias().isPresent()) {
-            SqlNode aliasIdentifier = new 
SqlIdentifier(simpleTable.getAlias().get(), SqlParserPos.ZERO);
-            sqlNode = new SqlBasicCall(SqlStdOperatorTable.AS, new SqlNode[] 
{tableNameSqlNode, aliasIdentifier}, SqlParserPos.ZERO);
-        } else {
-            sqlNode = tableNameSqlNode;
+    public Optional<SqlNode> convert(final SimpleTableSegment segment) {
+        TableNameSegment tableName = segment.getTableName();
+        SqlNode tableNameSQLNode = new 
SqlIdentifier(tableName.getIdentifier().getValue(), SqlParserPos.ZERO);
+        if (segment.getAlias().isPresent()) {
+            SqlNode aliasSQLNode = new SqlIdentifier(segment.getAlias().get(), 
SqlParserPos.ZERO);
+            return Optional.of(new SqlBasicCall(SqlStdOperatorTable.AS, new 
SqlNode[] {tableNameSQLNode, aliasSQLNode}, SqlParserPos.ZERO));
         }
-        return Optional.of(sqlNode);
+        return Optional.of(tableNameSQLNode);
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/SubqueryTableSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/from/impl/SubqueryTableConverter.java
similarity index 80%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/SubqueryTableSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/from/impl/SubqueryTableConverter.java
index b0fcb55..2439145 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/SubqueryTableSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/from/impl/SubqueryTableConverter.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.from.impl;
 
 import org.apache.calcite.sql.SqlNode;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
 
 import java.util.Optional;
@@ -26,10 +26,10 @@ import java.util.Optional;
 /**
  * Subquery converter.
  */
-public final class SubqueryTableSQLNodeConverter implements 
SQLNodeConverter<SubqueryTableSegment, SqlNode> {
+public final class SubqueryTableConverter implements 
SQLSegmentConverter<SubqueryTableSegment, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final SubqueryTableSegment astNode) {
+    public Optional<SqlNode> convert(final SubqueryTableSegment segment) {
         // TODO 
         return Optional.empty();
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/DistinctSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/groupby/GroupByConverter.java
similarity index 58%
copy from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/DistinctSQLNodeConverter.java
copy to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/groupby/GroupByConverter.java
index 8fd861d..730f588 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/DistinctSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/groupby/GroupByConverter.java
@@ -15,27 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.groupby;
 
 import org.apache.calcite.sql.SqlNodeList;
-import org.apache.calcite.sql.SqlSelectKeyword;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionsSegment;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.orderby.item.OrderByItemConverterUtil;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.GroupBySegment;
 
-import java.util.Collections;
 import java.util.Optional;
 
 /**
- * Distinct sql node converter.
+ * Group by converter.
  */
-public final class DistinctSQLNodeConverter implements 
SQLNodeConverter<ProjectionsSegment, SqlNodeList> {
+public final class GroupByConverter implements 
SQLSegmentConverter<GroupBySegment, SqlNodeList> {
     
     @Override
-    public Optional<SqlNodeList> convert(final ProjectionsSegment 
projectionsSegment) {
-        if (projectionsSegment.isDistinctRow()) {
-            return Optional.of(new 
SqlNodeList(Collections.singletonList(SqlSelectKeyword.DISTINCT.symbol(SqlParserPos.ZERO)),
 SqlParserPos.ZERO));
-        }
-        return Optional.empty();
+    public Optional<SqlNodeList> convert(final GroupBySegment segment) {
+        return null == segment || segment.getGroupByItems().isEmpty() ? 
Optional.empty() : Optional.of(new 
SqlNodeList(OrderByItemConverterUtil.convert(segment.getGroupByItems()), 
SqlParserPos.ZERO));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/HavingSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/groupby/HavingConverter.java
similarity index 65%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/HavingSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/groupby/HavingConverter.java
index cdf4245..329dafd 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/HavingSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/groupby/HavingConverter.java
@@ -15,10 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.groupby;
 
 import org.apache.calcite.sql.SqlNode;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.ExpressionConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.HavingSegment;
 
 import java.util.Optional;
@@ -26,13 +27,10 @@ import java.util.Optional;
 /**
  * Having converter.
  */
-public final class HavingSQLNodeConverter implements 
SQLNodeConverter<HavingSegment, SqlNode> {
+public final class HavingConverter implements 
SQLSegmentConverter<HavingSegment, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final HavingSegment having) {
-        if (having == null) {
-            return Optional.empty();
-        }
-        return new ExpressionSQLNodeConverter().convert(having.getExpr());
+    public Optional<SqlNode> convert(final HavingSegment segment) {
+        return null == segment ? Optional.empty() : new 
ExpressionConverter().convert(segment.getExpr());
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/AbstractLimitSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/limit/AbstractLimitConverter.java
similarity index 65%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/AbstractLimitSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/limit/AbstractLimitConverter.java
index 4b86b22..abfc5d3 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/AbstractLimitSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/limit/AbstractLimitConverter.java
@@ -15,10 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.limit;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.calcite.sql.SqlNode;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.PaginationValueSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
 
@@ -26,21 +27,18 @@ import java.util.Optional;
 import java.util.function.Function;
 
 /**
- * Abstract limit sql node converter.
+ * Abstract limit converter.
  */
-public abstract class AbstractLimitSQLNodeConverter implements 
SQLNodeConverter<LimitSegment, SqlNode> {
+@RequiredArgsConstructor
+public abstract class AbstractLimitConverter implements 
SQLSegmentConverter<LimitSegment, SqlNode> {
     
     private final Function<LimitSegment, Optional<PaginationValueSegment>> 
function;
     
-    protected AbstractLimitSQLNodeConverter(final Function<LimitSegment, 
Optional<PaginationValueSegment>> function) {
-        this.function = function;
-    }
-    
     @Override
-    public final Optional<SqlNode> convert(final LimitSegment limit) {
-        if (null == limit) {
+    public final Optional<SqlNode> convert(final LimitSegment segment) {
+        if (null == segment) {
             return Optional.empty();
         }
-        return function.apply(limit).flatMap(optional -> new 
PaginationValueSQLConverter().convert(optional));
+        return function.apply(segment).flatMap(optional -> new 
PaginationValueSQLConverter().convert(optional));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/OffsetSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/limit/OffsetConverter.java
similarity index 81%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/OffsetSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/limit/OffsetConverter.java
index e53c3a2..8eb77ab 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/OffsetSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/limit/OffsetConverter.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.limit;
 
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
 
 /**
- * Offset sql node converter.
+ * Offset converter.
  */
-public final class OffsetSQLNodeConverter extends 
AbstractLimitSQLNodeConverter {
+public final class OffsetConverter extends AbstractLimitConverter {
     
-    public OffsetSQLNodeConverter() {
+    public OffsetConverter() {
         super(LimitSegment::getOffset);
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/PaginationValueSQLConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/limit/PaginationValueSQLConverter.java
similarity index 61%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/PaginationValueSQLConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/limit/PaginationValueSQLConverter.java
index 8f5e59e..f6c843e 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/PaginationValueSQLConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/limit/PaginationValueSQLConverter.java
@@ -15,13 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.limit;
 
 import org.apache.calcite.sql.SqlDynamicParam;
 import org.apache.calcite.sql.SqlLiteral;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.NumberLiteralPaginationValueSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.PaginationValueSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.ParameterMarkerLimitValueSegment;
@@ -31,16 +31,19 @@ import java.util.Optional;
 /**
  * Pagination value converter.
  */
-public final class PaginationValueSQLConverter implements 
SQLNodeConverter<PaginationValueSegment, SqlNode> {
+public final class PaginationValueSQLConverter implements 
SQLSegmentConverter<PaginationValueSegment, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final PaginationValueSegment 
paginationValue) {
-        if (paginationValue instanceof NumberLiteralPaginationValueSegment) {
-            NumberLiteralPaginationValueSegment offsetValue = 
(NumberLiteralPaginationValueSegment) paginationValue;
-            return 
Optional.of(SqlLiteral.createExactNumeric(String.valueOf(offsetValue.getValue()),
 SqlParserPos.ZERO));
-        } else {
-            ParameterMarkerLimitValueSegment offsetParam = 
(ParameterMarkerLimitValueSegment) paginationValue;
-            return Optional.of(new 
SqlDynamicParam(offsetParam.getParameterIndex(), SqlParserPos.ZERO));
-        }
+    public Optional<SqlNode> convert(final PaginationValueSegment segment) {
+        return Optional.of(segment instanceof 
NumberLiteralPaginationValueSegment
+                ? getLiteralSQLNode((NumberLiteralPaginationValueSegment) 
segment) : getParameterMarkerSQLNode((ParameterMarkerLimitValueSegment) 
segment));
+    }
+    
+    private SqlNode getLiteralSQLNode(final 
NumberLiteralPaginationValueSegment segment) {
+        return 
SqlLiteral.createExactNumeric(String.valueOf(segment.getValue()), 
SqlParserPos.ZERO);
+    }
+    
+    private SqlNode getParameterMarkerSQLNode(final 
ParameterMarkerLimitValueSegment segment) {
+        return new SqlDynamicParam(segment.getParameterIndex(), 
SqlParserPos.ZERO);
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/RowCountSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/limit/RowCountConverter.java
similarity index 80%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/RowCountSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/limit/RowCountConverter.java
index e83b5f2..98f677a 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/RowCountSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/limit/RowCountConverter.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.limit;
 
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
 
 /**
- * Row count sql node converter.
+ * Row count converter.
  */
-public final class RowCountSQLNodeConverter extends 
AbstractLimitSQLNodeConverter {
+public final class RowCountConverter extends AbstractLimitConverter {
     
-    public RowCountSQLNodeConverter() {
+    public RowCountConverter() {
         super(LimitSegment::getRowCount);
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/OrderBySQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/orderby/OrderByConverter.java
similarity index 58%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/OrderBySQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/orderby/OrderByConverter.java
index 3891727..7ca9552 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/OrderBySQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/orderby/OrderByConverter.java
@@ -15,29 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.orderby;
 
-import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.SqlNodeList;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SqlNodeConverterUtil;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.orderby.item.OrderByItemConverterUtil;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.OrderBySegment;
 
-import java.util.Collection;
 import java.util.Optional;
 
 /**
  * Order by converter. 
  */
-public final class OrderBySQLNodeConverter implements 
SQLNodeConverter<OrderBySegment, SqlNodeList> {
+public final class OrderByConverter implements 
SQLSegmentConverter<OrderBySegment, SqlNodeList> {
     
     @Override
-    public Optional<SqlNodeList> convert(final OrderBySegment orderBy) {
-        if (orderBy == null) {
-            return Optional.empty();
-        }
-        Collection<SqlNode> orderBySqlNodes = 
SqlNodeConverterUtil.convertOrderByItems(orderBy.getOrderByItems());
-        return Optional.of(new SqlNodeList(orderBySqlNodes, 
SqlParserPos.ZERO));
+    public Optional<SqlNodeList> convert(final OrderBySegment segment) {
+        return null == segment ? Optional.empty() : Optional.of(new 
SqlNodeList(OrderByItemConverterUtil.convert(segment.getOrderByItems()), 
SqlParserPos.ZERO));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ColumnOrderByItemSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/orderby/item/ColumnOrderByItemConverter.java
similarity index 63%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ColumnOrderByItemSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/orderby/item/ColumnOrderByItemConverter.java
index 620fadf..f707b02 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ColumnOrderByItemSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/orderby/item/ColumnOrderByItemConverter.java
@@ -15,13 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package 
org.apache.shardingsphere.infra.optimize.converter.segment.orderby.item;
 
 import org.apache.calcite.sql.SqlBasicCall;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.impl.ColumnConverter;
 import org.apache.shardingsphere.sql.parser.sql.common.constant.OrderDirection;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ColumnOrderByItemSegment;
 
@@ -29,16 +30,16 @@ import java.util.Objects;
 import java.util.Optional;
 
 /**
- *  Column of order by converter. 
+ *  Column of order by item converter. 
  */
-public final class ColumnOrderByItemSQLNodeConverter implements 
SQLNodeConverter<ColumnOrderByItemSegment, SqlNode> {
+public final class ColumnOrderByItemConverter implements 
SQLSegmentConverter<ColumnOrderByItemSegment, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final ColumnOrderByItemSegment 
columnOrderBy) {
-        Optional<SqlNode> optional = new 
ColumnSQLNodeConverter().convert(columnOrderBy.getColumn());
-        if (optional.isPresent() && Objects.equals(OrderDirection.DESC, 
columnOrderBy.getOrderDirection())) {
-            optional = Optional.of(new SqlBasicCall(SqlStdOperatorTable.DESC, 
new SqlNode[] {optional.get()}, SqlParserPos.ZERO));
+    public Optional<SqlNode> convert(final ColumnOrderByItemSegment segment) {
+        Optional<SqlNode> result = new 
ColumnConverter().convert(segment.getColumn());
+        if (result.isPresent() && Objects.equals(OrderDirection.DESC, 
segment.getOrderDirection())) {
+            result = Optional.of(new SqlBasicCall(SqlStdOperatorTable.DESC, 
new SqlNode[] {result.get()}, SqlParserPos.ZERO));
         }
-        return optional;
+        return result;
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ExpressionOrderByItemSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/orderby/item/ExpressionOrderByItemConverter.java
similarity index 75%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ExpressionOrderByItemSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/orderby/item/ExpressionOrderByItemConverter.java
index 90fbed9..1d756e6 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ExpressionOrderByItemSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/orderby/item/ExpressionOrderByItemConverter.java
@@ -15,18 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package 
org.apache.shardingsphere.infra.optimize.converter.segment.orderby.item;
 
 import org.apache.calcite.sql.SqlNode;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ExpressionOrderByItemSegment;
 
 import java.util.Optional;
 
-public final class ExpressionOrderByItemSQLNodeConverter implements 
SQLNodeConverter<ExpressionOrderByItemSegment, SqlNode> {
+/**
+ * Expression of order by item converter.
+ */
+public final class ExpressionOrderByItemConverter implements 
SQLSegmentConverter<ExpressionOrderByItemSegment, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final ExpressionOrderByItemSegment 
astNode) {
+    public Optional<SqlNode> convert(final ExpressionOrderByItemSegment 
segment) {
         // TODO 
         return Optional.empty();
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/SqlNodeConverterUtil.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/orderby/item/OrderByItemConverterUtil.java
similarity index 78%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/SqlNodeConverterUtil.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/orderby/item/OrderByItemConverterUtil.java
index dc900fcb..bced900 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/SqlNodeConverterUtil.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/orderby/item/OrderByItemConverterUtil.java
@@ -15,10 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter;
+package 
org.apache.shardingsphere.infra.optimize.converter.segment.orderby.item;
 
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 import org.apache.calcite.sql.SqlNode;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.impl.ColumnOrderByItemSQLNodeConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ColumnOrderByItemSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ExpressionOrderByItemSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.IndexOrderByItemSegment;
@@ -29,20 +30,22 @@ import java.util.ArrayList;
 import java.util.Collection;
 
 /**
- * Utility for sql node converter.
+ * Order by item converter utility.
  */
-public final class SqlNodeConverterUtil {
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class OrderByItemConverterUtil {
     
     /**
      * Convert order by items.
-     * @param orderByItems order by item list.
-     * @return a collection of order by item <code>SqlNode</code>
+     * 
+     * @param orderByItems order by item list
+     * @return SQL nodes converted by order by item
      */
-    public static Collection<SqlNode> convertOrderByItems(final 
Collection<OrderByItemSegment> orderByItems) {
+    public static Collection<SqlNode> convert(final 
Collection<OrderByItemSegment> orderByItems) {
         Collection<SqlNode> result = new ArrayList<>(orderByItems.size());
         for (OrderByItemSegment each : orderByItems) {
             if (each instanceof ColumnOrderByItemSegment) {
-                new 
ColumnOrderByItemSQLNodeConverter().convert((ColumnOrderByItemSegment) 
each).ifPresent(result::add);
+                new 
ColumnOrderByItemConverter().convert((ColumnOrderByItemSegment) 
each).ifPresent(result::add);
             } else if (each instanceof ExpressionOrderByItemSegment) {
                 throw new UnsupportedOperationException("unsupported 
ExpressionOrderByItemSegment");
             } else if (each instanceof IndexOrderByItemSegment) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/DistinctSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/DistinctConverter.java
similarity index 68%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/DistinctSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/DistinctConverter.java
index 8fd861d..0a600d7 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/DistinctSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/DistinctConverter.java
@@ -15,27 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.projection;
 
 import org.apache.calcite.sql.SqlNodeList;
 import org.apache.calcite.sql.SqlSelectKeyword;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionsSegment;
 
 import java.util.Collections;
 import java.util.Optional;
 
 /**
- * Distinct sql node converter.
+ * Distinct converter.
  */
-public final class DistinctSQLNodeConverter implements 
SQLNodeConverter<ProjectionsSegment, SqlNodeList> {
+public final class DistinctConverter implements 
SQLSegmentConverter<ProjectionsSegment, SqlNodeList> {
     
     @Override
-    public Optional<SqlNodeList> convert(final ProjectionsSegment 
projectionsSegment) {
-        if (projectionsSegment.isDistinctRow()) {
-            return Optional.of(new 
SqlNodeList(Collections.singletonList(SqlSelectKeyword.DISTINCT.symbol(SqlParserPos.ZERO)),
 SqlParserPos.ZERO));
-        }
-        return Optional.empty();
+    public Optional<SqlNodeList> convert(final ProjectionsSegment segment) {
+        return segment.isDistinctRow() ? Optional.of(new 
SqlNodeList(Collections.singletonList(SqlSelectKeyword.DISTINCT.symbol(SqlParserPos.ZERO)),
 SqlParserPos.ZERO)) : Optional.empty();
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ProjectionsSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/ProjectionsConverter.java
similarity index 53%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ProjectionsSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/ProjectionsConverter.java
index 5c677f6..cbe17d1 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ProjectionsSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/ProjectionsConverter.java
@@ -15,12 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.projection;
 
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.SqlNodeList;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.projection.impl.ColumnProjectionConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.projection.impl.ExpressionProjectionConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
@@ -28,30 +30,29 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Projecti
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 import java.util.Optional;
 
 /**
  * Projection converter.
  */
-public final class ProjectionsSQLNodeConverter implements 
SQLNodeConverter<ProjectionsSegment, SqlNodeList> {
+public final class ProjectionsConverter implements 
SQLSegmentConverter<ProjectionsSegment, SqlNodeList> {
     
     @Override
-    public Optional<SqlNodeList> convert(final ProjectionsSegment 
projectionsSegment) {
-        Collection<ProjectionSegment> projections = 
projectionsSegment.getProjections();
-        List<SqlNode> columnNodes = new ArrayList<>(projections.size());
-        for (ProjectionSegment projection : projections) {
-            Optional<SqlNode> optional = Optional.empty();
-            if (projection instanceof ColumnProjectionSegment) {
-                optional = new 
ColumnProjectionSQLNodeConverter().convert((ColumnProjectionSegment) 
projection);
-            } else if (projection instanceof ExpressionProjectionSegment) {
-                optional = new 
ExpressionProjectionSQLNodeConverter().convert((ExpressionProjectionSegment) 
projection);
-            }
-            // TODO other Projection
-            if (optional.isPresent()) {
-                columnNodes.add(optional.get());
-            }
+    public Optional<SqlNodeList> convert(final ProjectionsSegment segment) {
+        Collection<SqlNode> projectionSQLNodes = new 
ArrayList<>(segment.getProjections().size());
+        for (ProjectionSegment each : segment.getProjections()) {
+            getProjectionSQLNode(each).ifPresent(projectionSQLNodes::add);
         }
-        return Optional.of(new SqlNodeList(columnNodes, SqlParserPos.ZERO));
+        return Optional.of(new SqlNodeList(projectionSQLNodes, 
SqlParserPos.ZERO));
+    }
+    
+    private Optional<SqlNode> getProjectionSQLNode(final ProjectionSegment 
segment) {
+        if (segment instanceof ColumnProjectionSegment) {
+            return new 
ColumnProjectionConverter().convert((ColumnProjectionSegment) segment);
+        } else if (segment instanceof ExpressionProjectionSegment) {
+            return new 
ExpressionProjectionConverter().convert((ExpressionProjectionSegment) segment);
+        }
+        // TODO process other projection
+        return Optional.empty();
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ColumnProjectionSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/impl/ColumnProjectionConverter.java
similarity index 68%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ColumnProjectionSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/impl/ColumnProjectionConverter.java
index 1628126..b07a657 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ColumnProjectionSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/impl/ColumnProjectionConverter.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package 
org.apache.shardingsphere.infra.optimize.converter.segment.projection.impl;
 
 import org.apache.calcite.sql.SqlNode;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.impl.ColumnConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
 
 import java.util.Optional;
@@ -27,11 +27,10 @@ import java.util.Optional;
 /**
  * Column projection converter. 
  */
-public final class ColumnProjectionSQLNodeConverter implements 
SQLNodeConverter<ColumnProjectionSegment, SqlNode> {
+public final class ColumnProjectionConverter implements 
SQLSegmentConverter<ColumnProjectionSegment, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final ColumnProjectionSegment 
columnProjection) {
-        ColumnSegment column = columnProjection.getColumn();
-        return new ColumnSQLNodeConverter().convert(column);
+    public Optional<SqlNode> convert(final ColumnProjectionSegment segment) {
+        return new ColumnConverter().convert(segment.getColumn());
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ExpressionProjectionSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/impl/ExpressionProjectionConverter.java
similarity index 76%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ExpressionProjectionSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/impl/ExpressionProjectionConverter.java
index 2f2943b..3c986ab 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/ExpressionProjectionSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/impl/ExpressionProjectionConverter.java
@@ -15,22 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package 
org.apache.shardingsphere.infra.optimize.converter.segment.projection.impl;
 
 import org.apache.calcite.sql.SqlCharStringLiteral;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
 
 import java.util.Optional;
 
-public final class ExpressionProjectionSQLNodeConverter implements 
SQLNodeConverter<ExpressionProjectionSegment, SqlNode> {
+/**
+ * Expression projection converter.
+ */
+public final class ExpressionProjectionConverter implements 
SQLSegmentConverter<ExpressionProjectionSegment, SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final ExpressionProjectionSegment 
expressionProjection) {
+    public Optional<SqlNode> convert(final ExpressionProjectionSegment 
segment) {
         // TODO expression has not been parsed now.
-        String expression = expressionProjection.getText();
+        String expression = segment.getText();
         return Optional.of(SqlCharStringLiteral.createCharString(expression, 
SqlParserPos.ZERO));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/WhereSQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/where/WhereConverter.java
similarity index 62%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/WhereSQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/where/WhereConverter.java
index 4ba54e4..e4f9dde 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/impl/WhereSQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/where/WhereConverter.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter.impl;
+package org.apache.shardingsphere.infra.optimize.converter.segment.where;
 
 import org.apache.calcite.sql.SqlNode;
-import 
org.apache.shardingsphere.infra.optimize.convert.converter.SQLNodeConverter;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.expression.ExpressionConverter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
 
 import java.util.Optional;
@@ -27,14 +27,10 @@ import java.util.Optional;
 /**
  * Where converter.
  */
-public final class WhereSQLNodeConverter implements 
SQLNodeConverter<WhereSegment, SqlNode> {
+public final class WhereConverter implements SQLSegmentConverter<WhereSegment, 
SqlNode> {
     
     @Override
-    public Optional<SqlNode> convert(final WhereSegment where) {
-        if (where == null) {
-            return Optional.empty();
-        }
-        ExpressionSegment whereExpr = where.getExpr();
-        return new ExpressionSQLNodeConverter().convert(whereExpr);
+    public Optional<SqlNode> convert(final WhereSegment segment) {
+        return null == segment ? Optional.empty() : new 
ExpressionConverter().convert(segment.getExpr());
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/SQLNodeConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/statement/SQLStatementConverter.java
similarity index 66%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/SQLNodeConverter.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/statement/SQLStatementConverter.java
index f8e07e0..58aba22 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/convert/converter/SQLNodeConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/statement/SQLStatementConverter.java
@@ -15,23 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.convert.converter;
+package org.apache.shardingsphere.infra.optimize.converter.statement;
 
 import org.apache.calcite.sql.SqlNode;
-import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
-
-import java.util.Optional;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 /**
- * SQL node converter.
+ * SQL Statement converter.
+ * 
+ * @param <T> type of SQL statement
  */
-public interface SQLNodeConverter<T extends ASTNode, R extends SqlNode> {
+public interface SQLStatementConverter<T extends SQLStatement> {
     
     /**
-     * Convert.
+     * Convert SQL statement to SQL node.
      * 
-     * @param astNode AST node
-     * @return sqlNode converted SQL node
+     * @param sqlStatement SQL statement be to converted
+     * @return converted SQL node
      */
-    Optional<R> convert(T astNode);
+    SqlNode convert(T sqlStatement);
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverter.java
new file mode 100644
index 0000000..dff2707
--- /dev/null
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverter.java
@@ -0,0 +1,71 @@
+/*
+ * 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.infra.optimize.converter.statement;
+
+import com.google.common.base.Preconditions;
+import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.SqlNodeList;
+import org.apache.calcite.sql.SqlSelect;
+import org.apache.calcite.sql.parser.SqlParserPos;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.from.TableConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.groupby.GroupByConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.groupby.HavingConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.limit.OffsetConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.limit.RowCountConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.orderby.OrderByConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.projection.DistinctConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.projection.ProjectionsConverter;
+import 
org.apache.shardingsphere.infra.optimize.converter.segment.where.WhereConverter;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.SelectStatementHandler;
+
+import java.util.Optional;
+
+/**
+ * Converter of select statement to SQL node.
+ */
+public final class SelectStatementConverter implements 
SQLStatementConverter<SelectStatement> {
+    
+    @Override
+    public SqlNode convert(final SelectStatement selectStatement) {
+        Optional<SqlNodeList> distinct = new 
DistinctConverter().convert(selectStatement.getProjections());
+        Optional<SqlNodeList> projections = new 
ProjectionsConverter().convert(selectStatement.getProjections());
+        Preconditions.checkState(projections.isPresent());
+        Optional<SqlNode> from = new 
TableConverter().convert(selectStatement.getFrom());
+        Optional<SqlNode> where = new 
WhereConverter().convert(selectStatement.getWhere().orElse(null));
+        Optional<SqlNodeList> groupBy = new 
GroupByConverter().convert(selectStatement.getGroupBy().orElse(null));
+        Optional<SqlNode> having = new 
HavingConverter().convert(selectStatement.getHaving().orElse(null));
+        Optional<SqlNodeList> orderBy = new 
OrderByConverter().convert(selectStatement.getOrderBy().orElse(null));
+        Optional<LimitSegment> limit = 
SelectStatementHandler.getLimitSegment(selectStatement);
+        Optional<SqlNode> offset = new 
OffsetConverter().convert(limit.orElse(null));
+        Optional<SqlNode> rowCount = new 
RowCountConverter().convert(limit.orElse(null));
+        return new SqlSelect(SqlParserPos.ZERO,
+                distinct.orElse(null),
+                projections.get(),
+                from.orElse(null),
+                where.orElse(null),
+                groupBy.orElse(null),
+                having.orElse(null),
+                null,
+                orderBy.orElse(null),
+                offset.orElse(null),
+                rowCount.orElse(null),
+                null);
+    }
+}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/operator/BinarySqlOperator.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/operator/BinarySQLOperator.java
similarity index 67%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/operator/BinarySqlOperator.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/operator/BinarySQLOperator.java
index 4acb56c..04bf0bf 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/operator/BinarySqlOperator.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/operator/BinarySQLOperator.java
@@ -17,54 +17,46 @@
 
 package org.apache.shardingsphere.infra.optimize.operator;
 
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import org.apache.calcite.sql.SqlBinaryOperator;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 
 /**
- * binary sql operator.
+ * Binary SQL operator.
  */
-public enum BinarySqlOperator {
-
+@RequiredArgsConstructor
+public enum BinarySQLOperator {
+    
     EQUALS("=", SqlStdOperatorTable.EQUALS),
-
+    
     GREATER_THAN(">", SqlStdOperatorTable.GREATER_THAN),
-
+    
     GREATER_EQUALS_THAN(">=", SqlStdOperatorTable.GREATER_THAN_OR_EQUAL),
-
+    
     LESS_THAN("<", SqlStdOperatorTable.LESS_THAN),
-
+    
     LESS_EQUALS_THAN("<=", SqlStdOperatorTable.LESS_THAN_OR_EQUAL),
-
+    
     AND("AND", SqlStdOperatorTable.AND),
-
+    
     NONE("", null);
-
+    
     private final String operator;
-
+    
+    @Getter
     private final SqlBinaryOperator sqlBinaryOperator;
-
-    BinarySqlOperator(final String operator, final SqlBinaryOperator 
sqlBinaryOperator) {
-        this.operator = operator;
-        this.sqlBinaryOperator = sqlBinaryOperator;
-    }
-
-    /**
-     * Get binary operator. 
-     * @return sql binary operator
-     */
-    public SqlBinaryOperator getSqlBinaryOperator() {
-        return sqlBinaryOperator;
-    }
-
+    
     /**
-     * convert string to BinarySqlOperator.
-     * @param sqlOperator string type of sqlOperator
-     * @return <code>BinarySqlOperator</code>
+     * Convert string to binary SQL operator.
+     * 
+     * @param sqlOperator SQL operator type
+     * @return converted binary SQL operator
      */
-    public static BinarySqlOperator value(final String sqlOperator) {
-        for (BinarySqlOperator val : values()) {
-            if (val.operator.equalsIgnoreCase(sqlOperator)) {
-                return val;
+    public static BinarySQLOperator value(final String sqlOperator) {
+        for (BinarySQLOperator each : values()) {
+            if (each.operator.equalsIgnoreCase(sqlOperator)) {
+                return each;
             }
         }
         throw new UnsupportedOperationException("unsupported sql operator: " + 
sqlOperator);
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/convert/SelectStatementSQLNodeConverterTest.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverterTest.java
similarity index 86%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/convert/SelectStatementSQLNodeConverterTest.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverterTest.java
index e6ad081..ab0b1bf 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/convert/SelectStatementSQLNodeConverterTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverterTest.java
@@ -15,15 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.core.convert;
+package org.apache.shardingsphere.infra.optimize.converter.statement;
 
+import lombok.SneakyThrows;
 import org.apache.calcite.sql.SqlJoin;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.SqlSelect;
+import org.apache.calcite.sql.parser.SqlParseException;
+import org.apache.calcite.sql.parser.SqlParser;
+import org.apache.calcite.sql.parser.SqlParser.Config;
+import org.apache.calcite.sql.validate.SqlConformanceEnum;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
-import org.apache.shardingsphere.infra.optimize.convert.SQLNodeConvertEngine;
+import org.apache.shardingsphere.infra.optimize.converter.SQLNodeConvertEngine;
 import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -39,14 +45,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
 
-/**
- * testcase of converting shardingshphere ast to calcite ast.
- *
- * <p>after converting phrase finished, the next phrase is comparing  the 
converted result with the
- * result of calcite parser.
- * </p>
- */
-public final class SelectStatementSQLNodeConverterTest extends 
BaseSqlNodeConverterTest {
+public final class SelectStatementConverterTest {
     
     private ShardingSphereSQLParserEngine sqlStatementParserEngine;
     
@@ -66,13 +65,13 @@ public final class SelectStatementSQLNodeConverterTest 
extends BaseSqlNodeConver
         assertNull(sqlSelect.getWhere());
         assertNull(sqlSelect.getOffset());
         assertNull(sqlSelect.getFetch());
-        SqlNode calciteSqlNode = parseByCalciteParser(sql);
+        SqlNode calciteSqlNode = parseByCalciteParser(sql, new 
MySQLDatabaseType());
         assertNotNull(calciteSqlNode);
         assertThat(sqlNode.toString(), is(calciteSqlNode.toString()));
     }
     
     @Test
-    public void assertConvertSimpleSelectLimit() {
+    public void assertConvertLimit() {
         String sql = "select order_id, user_id from t_order limit 1, 2";
         SQLStatement sqlStatement = 
sqlStatementParserEngine.parse(sql.toUpperCase(), false);
         SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
@@ -88,7 +87,7 @@ public final class SelectStatementSQLNodeConverterTest 
extends BaseSqlNodeConver
     }
     
     @Test
-    public void assertConvertSimpleSelectRowCount() {
+    public void assertConvertLimitWithRowCountOnly() {
         String sql = "select order_id, user_id from t_order limit 2";
         SQLStatement sqlStatement = 
sqlStatementParserEngine.parse(sql.toUpperCase(), false);
         SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
@@ -104,7 +103,7 @@ public final class SelectStatementSQLNodeConverterTest 
extends BaseSqlNodeConver
     }
     
     @Test
-    public void assertConvertSimpleSelectFilter() {
+    public void assertConvertWhere() {
         String sql = "select order_id, user_id from t_order where order_id = 
10";
         SQLStatement sqlStatement = 
sqlStatementParserEngine.parse(sql.toUpperCase(), false);
         SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
@@ -118,7 +117,7 @@ public final class SelectStatementSQLNodeConverterTest 
extends BaseSqlNodeConver
     }
     
     @Test
-    public void assertConvertSimpleSelectFilterGroupBy() {
+    public void assertConvertWhereAndGroupBy() {
         String sql = "select order_id, user_id from t_order where order_id = 
10 group by order_id";
         SQLStatement sqlStatement = 
sqlStatementParserEngine.parse(sql.toUpperCase(), false);
         SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
@@ -133,7 +132,7 @@ public final class SelectStatementSQLNodeConverterTest 
extends BaseSqlNodeConver
     }
     
     @Test
-    public void assertConvertSimpleSelectFilterOrderBy() {
+    public void assertConvertWhereAndOrderBy() {
         String sql = "select order_id, user_id from t_order where user_id = 10 
order by order_id desc";
         SQLStatement sqlStatement = 
sqlStatementParserEngine.parse(sql.toUpperCase(), false);
         SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
@@ -171,4 +170,13 @@ public final class SelectStatementSQLNodeConverterTest 
extends BaseSqlNodeConver
         assertThat(sqlNode, instanceOf(SqlSelect.class));
         // TODO outer join is not supported by parser of ShardingSphere 
     }
+    
+    @SneakyThrows(SqlParseException.class)
+    protected SqlNode parseByCalciteParser(final String sql, final 
DatabaseType databaseType) {
+        return SqlParser.create(sql, 
Config.DEFAULT.withConformance(getSQLConformance(databaseType))).parseQuery();
+    }
+    
+    private SqlConformanceEnum getSQLConformance(final DatabaseType 
databaseType) {
+        return databaseType instanceof MySQLDatabaseType ? 
SqlConformanceEnum.MYSQL_5 : SqlConformanceEnum.DEFAULT;
+    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/convert/BaseSqlNodeConverterTest.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/convert/BaseSqlNodeConverterTest.java
deleted file mode 100644
index aff17f6..0000000
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/convert/BaseSqlNodeConverterTest.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.infra.optimize.core.convert;
-
-import org.apache.calcite.sql.SqlNode;
-import org.apache.calcite.sql.parser.SqlParseException;
-import org.apache.calcite.sql.parser.SqlParser;
-import org.apache.calcite.sql.validate.SqlConformanceEnum;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
-
-/**
- * Base sql node converter test.
- */
-public abstract class BaseSqlNodeConverterTest {
-
-    /**
-     * parse by Calcite sql parser with default database dialect.
-     * @param sql sql
-     * @return Calcite SqlNode.
-     */
-    protected SqlNode parseByCalciteParser(final String sql) {
-        SqlParser parser = SqlParser.create(sql);
-        return realParse(parser);
-    }
-
-    /**
-     * parse by Calcite sql parser with arbitrary database dialect.
-     * @param sql sql
-     * @param databaseType database type.
-     * @return Calcite SqlNode.
-     */
-    protected SqlNode parseByCalciteParser(final String sql, final 
DatabaseType databaseType) {
-        if (databaseType == null) {
-            return parseByCalciteParser(sql);
-        }
-        SqlConformanceEnum sqlConformance = getConformance(databaseType);
-        SqlParser.Config parserConfig = 
SqlParser.Config.DEFAULT.withConformance(sqlConformance);
-        SqlParser parser = SqlParser.create(sql, parserConfig);
-        return realParse(parser);
-    }
-
-    private SqlNode realParse(final SqlParser parser) {
-        try {
-            return parser.parseQuery();
-        } catch (SqlParseException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private SqlConformanceEnum getConformance(final DatabaseType databaseType) 
{
-        if (databaseType instanceof MySQLDatabaseType) {
-            return SqlConformanceEnum.MYSQL_5;
-        }
-        return SqlConformanceEnum.DEFAULT;
-    }
-}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/loader/CommonFixtureTableMetaDataBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/loader/CommonFixtureTableMetaDataBuilder.java
similarity index 92%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/loader/CommonFixtureTableMetaDataBuilder.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/loader/CommonFixtureTableMetaDataBuilder.java
index 3166ce8..105da68 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/loader/CommonFixtureTableMetaDataBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/loader/CommonFixtureTableMetaDataBuilder.java
@@ -15,12 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.core.metadata.loader;
+package org.apache.shardingsphere.infra.optimize.metadata.loader;
 
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.spi.RuleBasedTableMetaDataBuilder;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
-import 
org.apache.shardingsphere.infra.optimize.core.metadata.rule.CommonFixtureRule;
+import 
org.apache.shardingsphere.infra.optimize.metadata.rule.CommonFixtureRule;
 
 import java.sql.SQLException;
 import java.util.Collection;
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/AlterTableFederationMetaDataRefresherTest.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/AlterTableFederationMetaDataRefresherTest.java
similarity index 95%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/AlterTableFederationMetaDataRefresherTest.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/AlterTableFederationMetaDataRefresherTest.java
index ec2c302..7b70a85 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/AlterTableFederationMetaDataRefresherTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/AlterTableFederationMetaDataRefresherTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.core.metadata.refresher;
+package org.apache.shardingsphere.infra.optimize.metadata.refresher;
 
 import com.google.common.collect.ImmutableMap;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
@@ -23,9 +23,8 @@ import 
org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.model.IndexMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 import 
org.apache.shardingsphere.infra.optimize.metadata.FederationSchemaMetaData;
-import 
org.apache.shardingsphere.infra.optimize.metadata.refresher.FederationMetaDataRefresher;
 import 
org.apache.shardingsphere.infra.optimize.metadata.refresher.type.AlterTableFederationMetaDataRefresher;
-import 
org.apache.shardingsphere.infra.optimize.core.metadata.rule.CommonFixtureRule;
+import 
org.apache.shardingsphere.infra.optimize.metadata.rule.CommonFixtureRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/CreateTableFederationMetaDataRefresherTest.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/CreateTableFederationMetaDataRefresherTest.java
similarity index 96%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/CreateTableFederationMetaDataRefresherTest.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/CreateTableFederationMetaDataRefresherTest.java
index 537f5b4..a3cbfe6 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/CreateTableFederationMetaDataRefresherTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/CreateTableFederationMetaDataRefresherTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.core.metadata.refresher;
+package org.apache.shardingsphere.infra.optimize.metadata.refresher;
 
 import com.google.common.collect.ImmutableMap;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
@@ -23,7 +23,6 @@ import 
org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.model.IndexMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 import 
org.apache.shardingsphere.infra.optimize.metadata.FederationSchemaMetaData;
-import 
org.apache.shardingsphere.infra.optimize.metadata.refresher.FederationMetaDataRefresher;
 import 
org.apache.shardingsphere.infra.optimize.metadata.refresher.type.CreateTableFederationMetaDataRefresher;
 import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/DropTableFederationMetaDataRefresherTest.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/DropTableFederationMetaDataRefresherTest.java
similarity index 97%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/DropTableFederationMetaDataRefresherTest.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/DropTableFederationMetaDataRefresherTest.java
index aa0b8bb..e83f498 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/DropTableFederationMetaDataRefresherTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/DropTableFederationMetaDataRefresherTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.core.metadata.refresher;
+package org.apache.shardingsphere.infra.optimize.metadata.refresher;
 
 import com.google.common.collect.ImmutableMap;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
@@ -23,7 +23,6 @@ import 
org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.model.IndexMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 import 
org.apache.shardingsphere.infra.optimize.metadata.FederationSchemaMetaData;
-import 
org.apache.shardingsphere.infra.optimize.metadata.refresher.FederationMetaDataRefresher;
 import 
org.apache.shardingsphere.infra.optimize.metadata.refresher.type.DropTableFederationMetaDataRefresher;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/rule/CommonFixtureRule.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/rule/CommonFixtureRule.java
similarity index 94%
rename from 
shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/rule/CommonFixtureRule.java
rename to 
shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/rule/CommonFixtureRule.java
index 51af791..f6cf756 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/metadata/rule/CommonFixtureRule.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/metadata/rule/CommonFixtureRule.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.optimize.core.metadata.rule;
+package org.apache.shardingsphere.infra.optimize.metadata.rule;
 
 import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
 
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.schema.builder.spi.RuleBasedTableMetaDataBuilder
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.schema.builder.spi.RuleBasedTableMetaDataBuilder
index 03a304e..127ab8e 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.schema.builder.spi.RuleBasedTableMetaDataBuilder
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.schema.builder.spi.RuleBasedTableMetaDataBuilder
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.infra.optimize.core.metadata.loader.CommonFixtureTableMetaDataBuilder
+org.apache.shardingsphere.infra.optimize.metadata.loader.CommonFixtureTableMetaDataBuilder
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/resources/logback-test.xml
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..d90fc4a
--- /dev/null
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/resources/logback-test.xml
@@ -0,0 +1,33 @@
+<?xml version="1.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.
+  -->
+
+<configuration>
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] 
%logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+    <logger name="org.apache.shardingsphere" level="warn" additivity="false">
+        <appender-ref ref="console" />
+    </logger>
+    
+    <root>
+        <level value="error" />
+        <appender-ref ref="console" />
+    </root>
+</configuration> 

Reply via email to