Skip to content

Commit

Permalink
Refactor StatementBinder (#32047)
Browse files Browse the repository at this point in the history
* Refactor DeleteStatementBinder

* Refactor CursorStatementBinder

* Refactor InsertStatementBinder

* Refactor UpdateStatementBinder

* Refactor SelectStatementBinder

* Refactor MergeStatementBinder

* Refactor MergeStatementBinder
  • Loading branch information
terrymanu authored Jul 9, 2024
1 parent 9e223a3 commit beb0443
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,16 @@
public final class CursorStatementBinder implements SQLStatementBinder<CursorStatement> {

@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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,14 @@
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;
import java.util.LinkedHashMap;
import java.util.Map;

/**
* Update statement binder.
* Delete statement binder.
*/
public final class DeleteStatementBinder implements SQLStatementBinder<DeleteStatement> {

Expand All @@ -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<String, TableSegmentBinderContext> externalTableBinderContexts) {
DeleteStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance();
DeleteStatement result = copy(sqlStatement);
Map<String, TableSegmentBinderContext> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<InsertStatement> {

Expand All @@ -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<String, TableSegmentBinderContext> 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<String, TableSegmentBinderContext> tableBinderContexts = new LinkedHashMap<>();
Expand All @@ -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);
Expand All @@ -77,12 +82,7 @@ private InsertStatement bind(final InsertStatement sqlStatement, final ShardingS
}

private Collection<ColumnSegment> getVisibleColumns(final Collection<ProjectionSegment> projectionSegments) {
Collection<ColumnSegment> 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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, TableSegmentBinderContext> 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<String, TableSegmentBinderContext> targetTableBinderContexts = new CaseInsensitiveMap<>();
Expand All @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, TableSegmentBinderContext> outerTableBinderContexts, final Map<String, TableSegmentBinderContext> externalTableBinderContexts) {
SelectStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance();
SelectStatement result = copy(sqlStatement);
Map<String, TableSegmentBinderContext> tableBinderContexts = new LinkedHashMap<>();
SQLStatementBinderContext statementBinderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, sqlStatement.getDatabaseType(), sqlStatement.getVariableNames());
statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts);
Expand All @@ -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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,17 +42,22 @@ 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<String, TableSegmentBinderContext> externalTableBinderContexts) {
UpdateStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance();
UpdateStatement result = copy(sqlStatement);
Map<String, TableSegmentBinderContext> 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);
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);
Expand Down

0 comments on commit beb0443

Please sign in to comment.