View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.shardingsphere.infra.route.engine;
19  
20  import lombok.RequiredArgsConstructor;
21  import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
22  import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
23  import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
24  import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
25  import org.apache.shardingsphere.infra.route.context.RouteContext;
26  import org.apache.shardingsphere.infra.route.engine.impl.AllSQLRouteExecutor;
27  import org.apache.shardingsphere.infra.route.engine.impl.PartialSQLRouteExecutor;
28  import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
29  import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
30  import org.apache.shardingsphere.infra.session.query.QueryContext;
31  import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
32  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowTableStatusStatement;
33  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowTablesStatement;
34  
35  import java.util.Collection;
36  
37  /**
38   * SQL route engine.
39   */
40  @HighFrequencyInvocation
41  @RequiredArgsConstructor
42  public final class SQLRouteEngine {
43      
44      private final Collection<ShardingSphereRule> rules;
45      
46      private final ConfigurationProperties props;
47      
48      /**
49       * Route SQL.
50       *
51       * @param connectionContext connection context
52       * @param queryContext query context
53       * @param globalRuleMetaData global rule meta data
54       * @param database database
55       * @return route context
56       */
57      public RouteContext route(final ConnectionContext connectionContext, final QueryContext queryContext, final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database) {
58          SQLRouteExecutor executor = isNeedAllSchemas(queryContext.getSqlStatementContext().getSqlStatement()) ? new AllSQLRouteExecutor() : new PartialSQLRouteExecutor(rules, props);
59          return executor.route(connectionContext, queryContext, globalRuleMetaData, database);
60      }
61      
62      // TODO use dynamic config to judge unconfigured schema
63      private boolean isNeedAllSchemas(final SQLStatement sqlStatement) {
64          return sqlStatement instanceof MySQLShowTablesStatement || sqlStatement instanceof MySQLShowTableStatusStatement;
65      }
66  }