strongduanmu opened a new pull request #15708: URL: https://github.com/apache/shardingsphere/pull/15708
Ref https://github.com/apache/shardingsphere/issues/15686. Changes proposed in this pull request: - optimize EncryptParameterRewriterBuilder and EncryptPredicateColumnTokenGenerator logic Performance test result: ``` Before Benchmark Mode Cnt Score Error Units EncryptParameterRewriterBuilderBenchmark.testGetParameterRewriters thrpt 5 26733.191 ± 203.123 ops/ms EncryptParameterRewriterBuilderBenchmark.testGetSQLTokenGenerators thrpt 5 8842.210 ± 136.072 ops/ms After Benchmark Mode Cnt Score Error Units EncryptParameterRewriterBuilderBenchmark.testGetParameterRewriters thrpt 5 125362.945 ± 227.434 ops/ms EncryptParameterRewriterBuilderBenchmark.testGetSQLTokenGenerators thrpt 5 33337.342 ± 3024.904 ops/ms ``` JMH source code. ```java package com.strongduanmu.performance.encrypt.rewrite.parameter; import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration; import org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration; import org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration; import org.apache.shardingsphere.encrypt.rewrite.condition.EncryptCondition; import org.apache.shardingsphere.encrypt.rewrite.condition.EncryptConditionEngine; import org.apache.shardingsphere.encrypt.rewrite.parameter.EncryptParameterRewriterBuilder; import org.apache.shardingsphere.encrypt.rewrite.token.EncryptTokenGenerateBuilder; import org.apache.shardingsphere.encrypt.rule.EncryptRule; import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory; import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.binder.type.WhereAvailable; import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration; import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource; import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData; import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData; import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine; import org.apache.shardingsphere.parser.config.SQLParserRuleConfiguration; import org.apache.shardingsphere.parser.rule.SQLParserRule; import org.apache.shardingsphere.sql.parser.api.CacheOption; import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment; import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Threads; import org.openjdk.jmh.annotations.Warmup; import java.sql.Types; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.Properties; import java.util.concurrent.TimeUnit; import static java.util.Collections.emptyList; /** * Encrypt parameter rewriter builder benchmark. */ @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) @Fork(1) @Threads(5) @Warmup(iterations = 5, time = 5) @Measurement(iterations = 5, time = 10) @State(Scope.Benchmark) public class EncryptParameterRewriterBuilderBenchmark { private EncryptParameterRewriterBuilder parameterRewriterBuilder; private EncryptTokenGenerateBuilder encryptTokenGenerateBuilder; @Setup(Level.Trial) public void setUp() { Collection<EncryptColumnRuleConfiguration> columns = Collections.singletonList(new EncryptColumnRuleConfiguration("password", "password", null, null, "TEST")); Collection<EncryptTableRuleConfiguration> tables = Collections.singletonList(new EncryptTableRuleConfiguration("t_encrypt", columns, true)); Properties props = new Properties(); props.setProperty("aes-key-value", "test13123"); EncryptRule encryptRule = new EncryptRule(new EncryptRuleConfiguration(tables, Collections.singletonMap("TEST", new ShardingSphereAlgorithmConfiguration("AES", props))), Collections.emptyMap()); ShardingSphereSchema schema = new ShardingSphereSchema(); ColumnMetaData columnMetaData = new ColumnMetaData("encrypt_id", Types.INTEGER, false, false, false); schema.put("t_encrypt", new TableMetaData("t_encrypt", Collections.singletonList(columnMetaData), emptyList())); EncryptConditionEngine encryptConditionEngine = new EncryptConditionEngine(encryptRule, schema); CacheOption cacheOption = new CacheOption(65535, 2000, 4); Optional<SQLParserRule> sqlParserRule = Optional.of(new SQLParserRule(new SQLParserRuleConfiguration(false, cacheOption, cacheOption))); ShardingSphereSQLParserEngine sqlParserEngine = new ShardingSphereSQLParserEngine("MySQL", sqlParserRule.get()); String sql = "SELECT password FROM t_encrypt WHERE encrypt_id = ?"; SQLStatement sqlStatement = sqlParserEngine.parse(sql, true); Map<String, ShardingSphereMetaData> metaDataMap = new HashMap<>(1, 1); ShardingSphereResource resource = new ShardingSphereResource(Collections.emptyMap(), null, null, DatabaseTypeRegistry.getTrunkDatabaseType("MySQL")); ShardingSphereMetaData metaData = new ShardingSphereMetaData("sharding_db", resource, null, schema); metaDataMap.put("sharding_db", metaData); SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(metaDataMap, Collections.emptyList(), sqlStatement, "sharding_db"); Collection<WhereSegment> whereSegments = sqlStatementContext instanceof WhereAvailable ? ((WhereAvailable) sqlStatementContext).getWhereSegments() : Collections.emptyList(); Collection<EncryptCondition> encryptConditions = encryptConditionEngine.createEncryptConditions(whereSegments, sqlStatementContext.getTablesContext()); parameterRewriterBuilder = new EncryptParameterRewriterBuilder(encryptRule, "sharding_db", schema, sqlStatementContext, encryptConditions); encryptTokenGenerateBuilder = new EncryptTokenGenerateBuilder(encryptRule, sqlStatementContext, encryptConditions, "sharding_db"); } @Benchmark public void testGetParameterRewriters() { parameterRewriterBuilder.getParameterRewriters(); } @Benchmark public void testGetSQLTokenGenerators() { encryptTokenGenerateBuilder.getSQLTokenGenerators(); } } ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
