Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor SchemaMetaDataAware #32380

Merged
merged 2 commits into from
Aug 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.apache.shardingsphere.encrypt.rewrite.parameter.rewriter.EncryptPredicateParameterRewriter;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.rewrite.parameter.rewriter.ParameterRewriter;
import org.apache.shardingsphere.infra.rewrite.parameter.rewriter.ParameterRewriterBuilder;
Expand Down Expand Up @@ -74,6 +75,7 @@ private void addParameterRewriter(final Collection<ParameterRewriter> paramRewri
private void setUpParameterRewriter(final ParameterRewriter toBeAddedParamRewriter) {
if (toBeAddedParamRewriter instanceof SchemaMetaDataAware) {
((SchemaMetaDataAware) toBeAddedParamRewriter).setSchemas(schemas);
((SchemaMetaDataAware) toBeAddedParamRewriter).setDefaultSchema(schemas.get(new DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(databaseName)));
}
if (toBeAddedParamRewriter instanceof EncryptRuleAware) {
((EncryptRuleAware) toBeAddedParamRewriter).setEncryptRule(encryptRule);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@
import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseTypeAware;
import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
import org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
import org.apache.shardingsphere.infra.binder.context.segment.select.orderby.OrderByItem;
import org.apache.shardingsphere.infra.binder.context.segment.select.projection.Projection;
Expand All @@ -32,7 +32,6 @@
import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
import org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.SchemaMetaDataAware;
Expand All @@ -54,13 +53,13 @@
*/
@HighFrequencyInvocation
@Setter
public final class EncryptGroupByItemTokenGenerator implements CollectionSQLTokenGenerator<SQLStatementContext>, SchemaMetaDataAware, EncryptRuleAware, DatabaseTypeAware {
public final class EncryptGroupByItemTokenGenerator implements CollectionSQLTokenGenerator<SQLStatementContext>, EncryptRuleAware, SchemaMetaDataAware, DatabaseTypeAware {

private String databaseName;
private EncryptRule encryptRule;

private Map<String, ShardingSphereSchema> schemas;

private EncryptRule encryptRule;
private ShardingSphereSchema defaultSchema;

private DatabaseType databaseType;

Expand All @@ -72,8 +71,7 @@ public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext)
@Override
public Collection<SQLToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
Collection<SQLToken> result = new LinkedHashSet<>();
String defaultSchema = new DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(databaseName);
ShardingSphereSchema schema = ((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName().map(schemas::get).orElseGet(() -> schemas.get(defaultSchema));
ShardingSphereSchema schema = ((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName().map(schemas::get).orElseGet(() -> defaultSchema);
for (OrderByItem each : getGroupByItems(sqlStatementContext)) {
if (each.getSegment() instanceof ColumnOrderByItemSegment) {
ColumnSegment columnSegment = ((ColumnOrderByItemSegment) each.getSegment()).getColumn();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
Expand All @@ -49,13 +48,13 @@
*/
@HighFrequencyInvocation
@Setter
public final class EncryptOrderByItemTokenGenerator implements CollectionSQLTokenGenerator<SQLStatementContext>, SchemaMetaDataAware, EncryptRuleAware {
public final class EncryptOrderByItemTokenGenerator implements CollectionSQLTokenGenerator<SQLStatementContext>, EncryptRuleAware, SchemaMetaDataAware {

private String databaseName;
private EncryptRule encryptRule;

private Map<String, ShardingSphereSchema> schemas;

private EncryptRule encryptRule;
private ShardingSphereSchema defaultSchema;

@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
Expand All @@ -65,8 +64,7 @@ public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext)
@Override
public Collection<SQLToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
Collection<SQLToken> result = new LinkedHashSet<>();
String defaultSchema = new DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(databaseName);
ShardingSphereSchema schema = ((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName().map(schemas::get).orElseGet(() -> schemas.get(defaultSchema));
ShardingSphereSchema schema = ((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName().map(schemas::get).orElseGet(() -> defaultSchema);
for (OrderByItem each : getOrderByItems(sqlStatementContext)) {
if (each.getSegment() instanceof ColumnOrderByItemSegment) {
ColumnSegment columnSegment = ((ColumnOrderByItemSegment) each.getSegment()).getColumn();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
import org.apache.shardingsphere.infra.binder.context.type.WhereAvailable;
import org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
Expand All @@ -60,13 +59,13 @@
*/
@HighFrequencyInvocation
@Setter
public final class EncryptPredicateColumnTokenGenerator implements CollectionSQLTokenGenerator<SQLStatementContext>, SchemaMetaDataAware, EncryptRuleAware {
public final class EncryptPredicateColumnTokenGenerator implements CollectionSQLTokenGenerator<SQLStatementContext>, EncryptRuleAware, SchemaMetaDataAware {

private String databaseName;
private EncryptRule encryptRule;

private Map<String, ShardingSphereSchema> schemas;

private EncryptRule encryptRule;
private ShardingSphereSchema defaultSchema;

@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
Expand All @@ -79,8 +78,7 @@ public Collection<SQLToken> generateSQLTokens(final SQLStatementContext sqlState
() -> new UnsupportedSQLOperationException("Can not use different encryptor in join condition"));
Collection<ColumnSegment> columnSegments = ((WhereAvailable) sqlStatementContext).getColumnSegments();
Collection<WhereSegment> whereSegments = ((WhereAvailable) sqlStatementContext).getWhereSegments();
String defaultSchema = new DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(databaseName);
ShardingSphereSchema schema = ((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName().map(schemas::get).orElseGet(() -> schemas.get(defaultSchema));
ShardingSphereSchema schema = ((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName().map(schemas::get).orElseGet(() -> defaultSchema);
Map<String, String> columnExpressionTableNames = ((TableAvailable) sqlStatementContext).getTablesContext().findTableNames(columnSegments, schema);
return generateSQLTokens(columnSegments, columnExpressionTableNames, whereSegments, sqlStatementContext.getDatabaseType());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ class EncryptGroupByItemTokenGeneratorTest {
@BeforeEach
void setup() {
generator.setEncryptRule(mockEncryptRule());
generator.setDatabaseName("db_schema");
generator.setSchemas(Collections.singletonMap("test", mock(ShardingSphereSchema.class)));
generator.setDatabaseType(databaseType);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ class EncryptOrderByItemTokenGeneratorTest {
@BeforeEach
void setup() {
generator.setEncryptRule(mockEncryptRule());
generator.setDatabaseName("db_schema");
generator.setSchemas(Collections.singletonMap("test", mock(ShardingSphereSchema.class)));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
package org.apache.shardingsphere.encrypt.rewrite.token.generator.predicate;

import org.apache.shardingsphere.encrypt.rewrite.token.generator.fixture.EncryptGeneratorFixtureBuilder;
import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
import org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.generic.SubstitutableColumnNameToken;
Expand All @@ -44,14 +43,12 @@ void setup() {

@Test
void assertIsGenerateSQLToken() {
generator.setDatabaseName(DefaultDatabase.LOGIC_NAME);
generator.setSchemas(Collections.emptyMap());
assertTrue(generator.isGenerateSQLToken(EncryptGeneratorFixtureBuilder.createUpdateStatementContext()));
}

@Test
void assertGenerateSQLTokenFromGenerateNewSQLToken() {
generator.setDatabaseName(DefaultDatabase.LOGIC_NAME);
generator.setSchemas(Collections.emptyMap());
Collection<SQLToken> substitutableColumnNameTokens = generator.generateSQLTokens(EncryptGeneratorFixtureBuilder.createUpdateStatementContext());
assertThat(substitutableColumnNameTokens.size(), is(1));
Expand All @@ -60,7 +57,6 @@ void assertGenerateSQLTokenFromGenerateNewSQLToken() {

@Test
void assertGenerateSQLTokensWhenJoinConditionUseDifferentEncryptor() {
generator.setDatabaseName(DefaultDatabase.LOGIC_NAME);
generator.setSchemas(Collections.emptyMap());
assertThrows(UnsupportedSQLOperationException.class, () -> generator.generateSQLTokens(EncryptGeneratorFixtureBuilder.createSelectStatementContext()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import org.apache.shardingsphere.infra.database.core.metadata.database.object.DialectObjectUniquenessLevelProvider;
import org.apache.shardingsphere.infra.database.core.metadata.database.object.DialectObjectUniquenessLevelProvider.UniquenessLevel;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.SchemaMetaDataAware;
Expand All @@ -46,10 +45,10 @@ public final class IndexTokenGenerator implements CollectionSQLTokenGenerator<SQ

private ShardingRule shardingRule;

private String databaseName;

private Map<String, ShardingSphereSchema> schemas;

private ShardingSphereSchema defaultSchema;

@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
return sqlStatementContext instanceof IndexAvailable && !((IndexAvailable) sqlStatementContext).getIndexes().isEmpty() && isSchemaUniquenessLevelIndex(sqlStatementContext.getDatabaseType());
Expand All @@ -62,10 +61,9 @@ private boolean isSchemaUniquenessLevelIndex(final DatabaseType databaseType) {
@Override
public Collection<SQLToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
Collection<SQLToken> result = new LinkedList<>();
String defaultSchemaName = new DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(databaseName);
if (sqlStatementContext instanceof IndexAvailable) {
for (IndexSegment each : ((IndexAvailable) sqlStatementContext).getIndexes()) {
ShardingSphereSchema schema = each.getOwner().isPresent() ? schemas.get(each.getOwner().get().getIdentifier().getValue()) : schemas.get(defaultSchemaName);
ShardingSphereSchema schema = each.getOwner().isPresent() ? schemas.get(each.getOwner().get().getIdentifier().getValue()) : defaultSchema;
result.add(new IndexToken(each.getIndexName().getStartIndex(), each.getStopIndex(), each.getIndexName().getIdentifier(), sqlStatementContext, shardingRule, schema));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ void assertGenerateSQLTokens() {
IndexTokenGenerator generator = new IndexTokenGenerator();
generator.setShardingRule(mock(ShardingRule.class));
generator.setSchemas(Collections.singletonMap("test", mock(ShardingSphereSchema.class)));
generator.setDatabaseName("test");
Collection<SQLToken> actual = generator.generateSQLTokens(alterIndexStatementContext);
assertThat(actual.size(), is(1));
assertThat((new LinkedList<>(actual)).get(0).getStartIndex(), is(1));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package org.apache.shardingsphere.infra.rewrite.sql.token.generator;

import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.ConnectionContextAware;
import org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.ParametersAware;
Expand Down Expand Up @@ -62,7 +63,7 @@ public List<SQLToken> generateSQLTokens(final String databaseName, final Map<Str
final SQLStatementContext sqlStatementContext, final List<Object> params, final ConnectionContext connectionContext) {
List<SQLToken> result = new LinkedList<>();
for (SQLTokenGenerator each : generators) {
setUpSQLTokenGenerator(each, params, databaseName, schemas, result, connectionContext);
setUpSQLTokenGenerator(each, params, databaseName, schemas, sqlStatementContext, result, connectionContext);
if (each instanceof OptionalSQLTokenGenerator) {
SQLToken sqlToken = ((OptionalSQLTokenGenerator) each).generateSQLToken(sqlStatementContext);
if (!result.contains(sqlToken)) {
Expand All @@ -76,13 +77,14 @@ public List<SQLToken> generateSQLTokens(final String databaseName, final Map<Str
}

private void setUpSQLTokenGenerator(final SQLTokenGenerator sqlTokenGenerator, final List<Object> params,
final String databaseName, final Map<String, ShardingSphereSchema> schemas, final List<SQLToken> previousSQLTokens, final ConnectionContext connectionContext) {
final String databaseName, final Map<String, ShardingSphereSchema> schemas,
final SQLStatementContext sqlStatementContext, final List<SQLToken> previousSQLTokens, final ConnectionContext connectionContext) {
if (sqlTokenGenerator instanceof ParametersAware) {
((ParametersAware) sqlTokenGenerator).setParameters(params);
}
if (sqlTokenGenerator instanceof SchemaMetaDataAware) {
((SchemaMetaDataAware) sqlTokenGenerator).setSchemas(schemas);
((SchemaMetaDataAware) sqlTokenGenerator).setDatabaseName(databaseName);
((SchemaMetaDataAware) sqlTokenGenerator).setDefaultSchema(schemas.get(new DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(databaseName)));
}
if (sqlTokenGenerator instanceof PreviousSQLTokensAware) {
((PreviousSQLTokensAware) sqlTokenGenerator).setPreviousSQLTokens(previousSQLTokens);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,16 @@
public interface SchemaMetaDataAware {

/**
* Set database name.
* Set schema meta data.
*
* @param databaseName database name
* @param schemas schema meta data map
*/
void setDatabaseName(String databaseName);
void setSchemas(Map<String, ShardingSphereSchema> schemas);

/**
* Set schema meta data.
* Set default schema.
*
* @param schemas schema meta data map
* @param defaultSchema default schema
*/
void setSchemas(Map<String, ShardingSphereSchema> schemas);
void setDefaultSchema(ShardingSphereSchema defaultSchema);
}