diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CursorStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CursorStatementBinder.java index d7441455693c0..80c79ca28f84d 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CursorStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CursorStatementBinder.java @@ -29,11 +29,16 @@ public final class CursorStatementBinder implements SQLStatementBinder { @Override - @SneakyThrows(ReflectiveOperationException.class) public CursorStatement bind(final CursorStatement sqlStatement, final ShardingSphereMetaData metaData, final String currentDatabaseName) { + CursorStatement result = copy(sqlStatement); + result.setSelect(new SelectStatementBinder().bind(sqlStatement.getSelect(), metaData, currentDatabaseName)); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static CursorStatement copy(final CursorStatement sqlStatement) { CursorStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); result.setCursorName(sqlStatement.getCursorName()); - result.setSelect(new SelectStatementBinder().bind(sqlStatement.getSelect(), metaData, currentDatabaseName)); result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); return result; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/DeleteStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/DeleteStatementBinder.java index 7af85829f637a..864268029b443 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/DeleteStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/DeleteStatementBinder.java @@ -24,7 +24,6 @@ import org.apache.shardingsphere.infra.binder.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; -import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DeleteStatement; import java.util.Collections; @@ -32,7 +31,7 @@ import java.util.Map; /** - * Update statement binder. + * Delete statement binder. */ public final class DeleteStatementBinder implements SQLStatementBinder { @@ -41,16 +40,20 @@ public DeleteStatement bind(final DeleteStatement sqlStatement, final ShardingSp return bind(sqlStatement, metaData, currentDatabaseName, Collections.emptyMap()); } - @SneakyThrows(ReflectiveOperationException.class) private DeleteStatement bind(final DeleteStatement sqlStatement, final ShardingSphereMetaData metaData, final String currentDatabaseName, final Map externalTableBinderContexts) { - DeleteStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + DeleteStatement result = copy(sqlStatement); Map tableBinderContexts = new LinkedHashMap<>(); SQLStatementBinderContext statementBinderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, sqlStatement.getDatabaseType(), sqlStatement.getVariableNames()); statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts); - TableSegment boundedTableSegment = TableSegmentBinder.bind(sqlStatement.getTable(), statementBinderContext, tableBinderContexts, Collections.emptyMap()); - result.setTable(boundedTableSegment); + result.setTable(TableSegmentBinder.bind(sqlStatement.getTable(), statementBinderContext, tableBinderContexts, Collections.emptyMap())); sqlStatement.getWhere().ifPresent(optional -> result.setWhere(WhereSegmentBinder.bind(optional, statementBinderContext, tableBinderContexts, Collections.emptyMap()))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private DeleteStatement copy(final DeleteStatement sqlStatement) { + DeleteStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); sqlStatement.getOrderBy().ifPresent(result::setOrderBy); sqlStatement.getLimit().ifPresent(result::setLimit); sqlStatement.getWithSegment().ifPresent(result::setWithSegment); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/InsertStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/InsertStatementBinder.java index fb7e0d8c48712..895d120412bb7 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/InsertStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/InsertStatementBinder.java @@ -33,12 +33,12 @@ import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; /** - * Select statement binder. + * Insert statement binder. */ public final class InsertStatementBinder implements SQLStatementBinder { @@ -47,10 +47,9 @@ public InsertStatement bind(final InsertStatement sqlStatement, final ShardingSp return bind(sqlStatement, metaData, currentDatabaseName, Collections.emptyMap()); } - @SneakyThrows(ReflectiveOperationException.class) private InsertStatement bind(final InsertStatement sqlStatement, final ShardingSphereMetaData metaData, final String currentDatabaseName, final Map externalTableBinderContexts) { - InsertStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + InsertStatement result = copy(sqlStatement); SQLStatementBinderContext statementBinderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, sqlStatement.getDatabaseType(), sqlStatement.getVariableNames()); statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts); Map tableBinderContexts = new LinkedHashMap<>(); @@ -62,9 +61,15 @@ private InsertStatement bind(final InsertStatement sqlStatement, final ShardingS tableBinderContexts.values().forEach(each -> result.getDerivedInsertColumns().addAll(getVisibleColumns(each.getProjectionSegments()))); } sqlStatement.getInsertSelect().ifPresent(optional -> result.setInsertSelect(SubquerySegmentBinder.bind(optional, statementBinderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private InsertStatement copy(final InsertStatement sqlStatement) { + InsertStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); result.getValues().addAll(sqlStatement.getValues()); - sqlStatement.getOnDuplicateKeyColumns().ifPresent(result::setOnDuplicateKeyColumns); sqlStatement.getSetAssignment().ifPresent(result::setSetAssignment); + sqlStatement.getOnDuplicateKeyColumns().ifPresent(result::setOnDuplicateKeyColumns); sqlStatement.getWithSegment().ifPresent(result::setWithSegment); sqlStatement.getOutputSegment().ifPresent(result::setOutputSegment); sqlStatement.getMultiTableInsertType().ifPresent(result::setMultiTableInsertType); @@ -77,12 +82,7 @@ private InsertStatement bind(final InsertStatement sqlStatement, final ShardingS } private Collection getVisibleColumns(final Collection projectionSegments) { - Collection result = new LinkedList<>(); - for (ProjectionSegment each : projectionSegments) { - if (each instanceof ColumnProjectionSegment && each.isVisible()) { - result.add(((ColumnProjectionSegment) each).getColumn()); - } - } - return result; + return projectionSegments.stream() + .filter(each -> each instanceof ColumnProjectionSegment && each.isVisible()).map(each -> ((ColumnProjectionSegment) each).getColumn()).collect(Collectors.toList()); } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java index 2771ed0a39b14..721c6f48d872a 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java @@ -67,10 +67,9 @@ public MergeStatement bind(final MergeStatement sqlStatement, final ShardingSphe return bind(sqlStatement, metaData, currentDatabaseName, Collections.emptyMap()); } - @SneakyThrows(ReflectiveOperationException.class) private MergeStatement bind(final MergeStatement sqlStatement, final ShardingSphereMetaData metaData, final String currentDatabaseName, final Map externalTableBinderContexts) { - MergeStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + MergeStatement result = copy(sqlStatement); SQLStatementBinderContext statementBinderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, sqlStatement.getDatabaseType(), sqlStatement.getVariableNames()); statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts); Map targetTableBinderContexts = new CaseInsensitiveMap<>(); @@ -93,6 +92,12 @@ private MergeStatement bind(final MergeStatement sqlStatement, final ShardingSph sqlStatement.getUpdate().ifPresent( optional -> result.setUpdate(bindMergeUpdate(optional, (SimpleTableSegment) boundedTargetTableSegment, statementBinderContext, targetTableBinderContexts, sourceTableBinderContexts))); addParameterMarkerSegments(result); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private MergeStatement copy(final MergeStatement sqlStatement) { + MergeStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); return result; } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementBinder.java index 95be9609ba5f7..66b8867e762b9 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementBinder.java @@ -46,10 +46,9 @@ public SelectStatement bind(final SelectStatement sqlStatement, final ShardingSp return bind(sqlStatement, metaData, currentDatabaseName, Collections.emptyMap(), Collections.emptyMap()); } - @SneakyThrows(ReflectiveOperationException.class) private SelectStatement bind(final SelectStatement sqlStatement, final ShardingSphereMetaData metaData, final String currentDatabaseName, final Map outerTableBinderContexts, final Map externalTableBinderContexts) { - SelectStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + SelectStatement result = copy(sqlStatement); Map tableBinderContexts = new LinkedHashMap<>(); SQLStatementBinderContext statementBinderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, sqlStatement.getDatabaseType(), sqlStatement.getVariableNames()); statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts); @@ -59,13 +58,19 @@ private SelectStatement bind(final SelectStatement sqlStatement, final ShardingS boundedTableSegment.ifPresent(result::setFrom); result.setProjections(ProjectionsSegmentBinder.bind(sqlStatement.getProjections(), statementBinderContext, boundedTableSegment.orElse(null), tableBinderContexts, outerTableBinderContexts)); sqlStatement.getWhere().ifPresent(optional -> result.setWhere(WhereSegmentBinder.bind(optional, statementBinderContext, tableBinderContexts, outerTableBinderContexts))); + sqlStatement.getCombine().ifPresent(optional -> result.setCombine(CombineSegmentBinder.bind(optional, statementBinderContext))); + sqlStatement.getLock().ifPresent(optional -> result.setLock(LockSegmentBinder.bind(optional, statementBinderContext, tableBinderContexts, outerTableBinderContexts))); // TODO support other segment bind in select statement + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private SelectStatement copy(final SelectStatement sqlStatement) { + SelectStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); sqlStatement.getGroupBy().ifPresent(result::setGroupBy); sqlStatement.getHaving().ifPresent(result::setHaving); sqlStatement.getOrderBy().ifPresent(result::setOrderBy); - sqlStatement.getCombine().ifPresent(optional -> result.setCombine(CombineSegmentBinder.bind(optional, statementBinderContext))); sqlStatement.getLimit().ifPresent(result::setLimit); - sqlStatement.getLock().ifPresent(optional -> result.setLock(LockSegmentBinder.bind(optional, statementBinderContext, tableBinderContexts, outerTableBinderContexts))); sqlStatement.getWindow().ifPresent(result::setWindow); sqlStatement.getModelSegment().ifPresent(result::setModelSegment); result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/UpdateStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/UpdateStatementBinder.java index 49e3614ebbe1e..da11801941fa3 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/UpdateStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/UpdateStatementBinder.java @@ -42,10 +42,9 @@ public UpdateStatement bind(final UpdateStatement sqlStatement, final ShardingSp return bind(sqlStatement, metaData, currentDatabaseName, Collections.emptyMap()); } - @SneakyThrows(ReflectiveOperationException.class) private UpdateStatement bind(final UpdateStatement sqlStatement, final ShardingSphereMetaData metaData, final String currentDatabaseName, final Map externalTableBinderContexts) { - UpdateStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + UpdateStatement result = copy(sqlStatement); Map tableBinderContexts = new LinkedHashMap<>(); SQLStatementBinderContext statementBinderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, sqlStatement.getDatabaseType(), sqlStatement.getVariableNames()); statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts); @@ -53,6 +52,12 @@ private UpdateStatement bind(final UpdateStatement sqlStatement, final ShardingS result.setTable(boundedTableSegment); sqlStatement.getAssignmentSegment().ifPresent(optional -> result.setSetAssignment(AssignmentSegmentBinder.bind(optional, statementBinderContext, tableBinderContexts, Collections.emptyMap()))); sqlStatement.getWhere().ifPresent(optional -> result.setWhere(WhereSegmentBinder.bind(optional, statementBinderContext, tableBinderContexts, Collections.emptyMap()))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private UpdateStatement copy(final UpdateStatement sqlStatement) { + UpdateStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); sqlStatement.getOrderBy().ifPresent(result::setOrderBy); sqlStatement.getLimit().ifPresent(result::setLimit); sqlStatement.getWithSegment().ifPresent(result::setWithSegment);