1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.infra.connection.kernel;
19
20 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
21 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
22 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
23 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContextBuilder;
24 import org.apache.shardingsphere.infra.executor.sql.log.SQLLogger;
25 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
26 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
27 import org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry;
28 import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteResult;
29 import org.apache.shardingsphere.infra.route.context.RouteContext;
30 import org.apache.shardingsphere.infra.route.engine.SQLRouteEngine;
31 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
32 import org.apache.shardingsphere.infra.session.query.QueryContext;
33
34
35
36
37 public final class KernelProcessor {
38
39
40
41
42
43
44
45
46
47
48
49 public ExecutionContext generateExecutionContext(final QueryContext queryContext, final ShardingSphereDatabase database, final RuleMetaData globalRuleMetaData,
50 final ConfigurationProperties props, final ConnectionContext connectionContext) {
51 RouteContext routeContext = route(queryContext, database, globalRuleMetaData, props, connectionContext);
52 SQLRewriteResult rewriteResult = rewrite(queryContext, database, globalRuleMetaData, props, routeContext, connectionContext);
53 ExecutionContext result = createExecutionContext(queryContext, database, routeContext, rewriteResult);
54 logSQL(queryContext, props, result);
55 return result;
56 }
57
58 private RouteContext route(final QueryContext queryContext, final ShardingSphereDatabase database,
59 final RuleMetaData globalRuleMetaData, final ConfigurationProperties props, final ConnectionContext connectionContext) {
60 return new SQLRouteEngine(database.getRuleMetaData().getRules(), props).route(connectionContext, queryContext, globalRuleMetaData, database);
61 }
62
63 private SQLRewriteResult rewrite(final QueryContext queryContext, final ShardingSphereDatabase database, final RuleMetaData globalRuleMetaData,
64 final ConfigurationProperties props, final RouteContext routeContext, final ConnectionContext connectionContext) {
65 SQLRewriteEntry sqlRewriteEntry = new SQLRewriteEntry(database, globalRuleMetaData, props);
66 return sqlRewriteEntry.rewrite(queryContext, routeContext, connectionContext);
67 }
68
69 private ExecutionContext createExecutionContext(final QueryContext queryContext, final ShardingSphereDatabase database, final RouteContext routeContext, final SQLRewriteResult rewriteResult) {
70 return new ExecutionContext(queryContext, ExecutionContextBuilder.build(database, rewriteResult, queryContext.getSqlStatementContext()), routeContext);
71 }
72
73 private void logSQL(final QueryContext queryContext, final ConfigurationProperties props, final ExecutionContext executionContext) {
74 if (props.<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW)) {
75 SQLLogger.logSQL(queryContext, props.<Boolean>getValue(ConfigurationPropertyKey.SQL_SIMPLE), executionContext);
76 }
77 }
78 }