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]


Reply via email to