未验证 提交 a9123686 编写于 作者: L Liang Zhang 提交者: GitHub

Add impl of DataNodeRouter (#4869)

* fix jav a doc

* Add DefaultDateNodeRouter

* Add ShardingRouteDecorator

* merge DateNodeRouter and DefaultDateNodeRouter

* refactor package of route module

* rename DataNodeRouteDecorator to RouteDecorator
上级 8e84b168
......@@ -18,26 +18,34 @@
package org.apache.shardingsphere.masterslave.route.engine;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.rule.MasterSlaveRule;
import org.apache.shardingsphere.masterslave.route.engine.impl.MasterSlaveDataSourceRouter;
import org.apache.shardingsphere.underlying.route.decorator.RouteDecorator;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.apache.shardingsphere.underlying.route.DateNodeRouteDecorator;
import org.apache.shardingsphere.underlying.route.context.RouteMapper;
import org.apache.shardingsphere.underlying.route.context.RouteResult;
import org.apache.shardingsphere.underlying.route.context.RouteUnit;
import org.apache.shardingsphere.core.rule.MasterSlaveRule;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
/**
* Route decorator for master-slave.
*/
@RequiredArgsConstructor
public final class MasterSlaveRouteDecorator implements DateNodeRouteDecorator {
public final class MasterSlaveRouteDecorator implements RouteDecorator {
private final MasterSlaveRule masterSlaveRule;
@Override
public RouteContext decorate(final RouteContext routeContext) {
if (routeContext.getRouteResult().getRouteUnits().isEmpty()) {
String dataSourceName = new MasterSlaveDataSourceRouter(masterSlaveRule).route(routeContext.getSqlStatementContext().getSqlStatement());
RouteResult routeResult = new RouteResult();
routeResult.getRouteUnits().add(new RouteUnit(new RouteMapper(dataSourceName, dataSourceName), Collections.emptyList()));
return new RouteContext(routeContext.getSqlStatementContext(), Collections.emptyList(), routeResult);
}
Collection<RouteUnit> toBeRemoved = new LinkedList<>();
Collection<RouteUnit> toBeAdded = new LinkedList<>();
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
......
......@@ -94,6 +94,14 @@ public final class MasterSlaveRouteDecoratorTest {
assertThat(routedDataSourceNames.next(), is(MASTER_DATASOURCE));
}
@Test
public void assertDecorateToMasterWithoutRouteUnits() {
RouteContext routeContext = mockSQLRouteContextWithoutRouteUnits(insertStatement);
RouteContext actual = routeDecorator.decorate(routeContext);
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(MASTER_DATASOURCE));
}
@Test
public void assertDecorateToSlave() {
RouteContext routeContext = mockSQLRouteContext(selectStatement);
......@@ -103,7 +111,16 @@ public final class MasterSlaveRouteDecoratorTest {
assertThat(routedDataSourceNames.next(), is(NON_MASTER_SLAVE_DATASOURCE_NAME));
assertThat(routedDataSourceNames.next(), is(SLAVE_DATASOURCE));
}
@Test
public void assertDecorateToSlaveWithoutRouteUnits() {
RouteContext routeContext = mockSQLRouteContextWithoutRouteUnits(selectStatement);
when(selectStatement.getLock()).thenReturn(Optional.empty());
RouteContext actual = routeDecorator.decorate(routeContext);
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(SLAVE_DATASOURCE));
}
@Test
public void assertLockDecorateToMaster() {
RouteContext routeContext = mockSQLRouteContext(selectStatement);
......@@ -114,9 +131,18 @@ public final class MasterSlaveRouteDecoratorTest {
assertThat(routedDataSourceNames.next(), is(MASTER_DATASOURCE));
}
@Test
public void assertLockDecorateToMasterWithoutRouteUnits() {
RouteContext routeContext = mockSQLRouteContextWithoutRouteUnits(selectStatement);
when(selectStatement.getLock()).thenReturn(Optional.of(mock(LockSegment.class)));
RouteContext actual = routeDecorator.decorate(routeContext);
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(MASTER_DATASOURCE));
}
private RouteContext mockSQLRouteContext(final SQLStatement sqlStatement) {
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
return new RouteContext(sqlStatementContext, mockRouteResult());
return new RouteContext(sqlStatementContext, Collections.emptyList(), mockRouteResult());
}
private RouteResult mockRouteResult() {
......@@ -126,4 +152,9 @@ public final class MasterSlaveRouteDecoratorTest {
result.getRouteUnits().add(new RouteUnit(new RouteMapper(NON_MASTER_SLAVE_DATASOURCE_NAME, NON_MASTER_SLAVE_DATASOURCE_NAME), Collections.emptyList()));
return result;
}
private RouteContext mockSQLRouteContextWithoutRouteUnits(final SQLStatement sqlStatement) {
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
return new RouteContext(sqlStatementContext, Collections.emptyList(), new RouteResult());
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.shardingsphere.masterslave.route.engine;
import com.google.common.collect.Lists;
import org.apache.shardingsphere.core.rule.MasterSlaveRule;
import org.apache.shardingsphere.core.strategy.masterslave.RandomMasterSlaveLoadBalanceAlgorithm;
import org.apache.shardingsphere.masterslave.route.engine.impl.MasterVisitedManager;
import org.apache.shardingsphere.sql.parser.SQLParserEngine;
import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Collections;
import java.util.Optional;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public final class MasterSlaveRouterTest {
private static final String INSERT_SQL = "INSERT INTO table (id) VALUES (1)";
private static final String QUERY_SQL = "SELECT * FROM table";
private static final String QUERY_SQL_LOCK = "SELECT * FROM table FOR UPDATE";
private static final String MASTER_DATASOURCE = "master";
private static final String SLAVE_DATASOURCE = "query";
@Mock
private SQLParserEngine sqlParserEngine;
@Mock
private InsertStatement insertStatement;
@Mock
private MasterSlaveRule masterSlaveRule;
@Mock
private SelectStatement selectStatement;
private MasterSlaveRouter masterSlaveRouter;
@Before
public void setUp() {
masterSlaveRouter = new MasterSlaveRouter(masterSlaveRule, sqlParserEngine, true);
when(sqlParserEngine.parse(QUERY_SQL, false)).thenReturn(selectStatement);
when(sqlParserEngine.parse(INSERT_SQL, false)).thenReturn(insertStatement);
when(selectStatement.getLock()).thenReturn(Optional.empty());
when(masterSlaveRule.getMasterDataSourceName()).thenReturn(MASTER_DATASOURCE);
when(masterSlaveRule.getLoadBalanceAlgorithm()).thenReturn(new RandomMasterSlaveLoadBalanceAlgorithm());
when(masterSlaveRule.getSlaveDataSourceNames()).thenReturn(Lists.newArrayList(SLAVE_DATASOURCE));
}
@After
public void tearDown() {
MasterVisitedManager.clear();
}
@Test
public void assertRouteToMaster() {
RouteContext actual = masterSlaveRouter.route(INSERT_SQL, Collections.emptyList(), false);
assertThat(actual.getRouteResult().getRouteUnits().size(), is(1));
assertThat(actual.getRouteResult().getRouteUnits().iterator().next().getDataSourceMapper().getActualName(), is(MASTER_DATASOURCE));
}
@Test
public void assertRouteToSlave() {
RouteContext actual = masterSlaveRouter.route(QUERY_SQL, Collections.emptyList(), false);
assertThat(actual.getRouteResult().getRouteUnits().size(), is(1));
assertThat(actual.getRouteResult().getRouteUnits().iterator().next().getDataSourceMapper().getActualName(), is(SLAVE_DATASOURCE));
}
@Test
public void assertLockRouteToMaster() {
RouteContext actual = masterSlaveRouter.route(QUERY_SQL_LOCK, Collections.emptyList(), false);
assertThat(actual.getRouteResult().getRouteUnits().size(), is(1));
assertThat(actual.getRouteResult().getRouteUnits().iterator().next().getDataSourceMapper().getActualName(), is(MASTER_DATASOURCE));
}
}
......@@ -27,12 +27,12 @@ import org.apache.shardingsphere.masterslave.route.engine.MasterSlaveRouteDecora
import org.apache.shardingsphere.sharding.execute.context.ShardingExecutionContext;
import org.apache.shardingsphere.sharding.rewrite.context.ShardingSQLRewriteContextDecorator;
import org.apache.shardingsphere.sharding.rewrite.engine.ShardingSQLRewriteEngine;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouter;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouteDecorator;
import org.apache.shardingsphere.sharding.route.engine.context.ShardingRouteContext;
import org.apache.shardingsphere.sharding.route.hook.SPIRoutingHook;
import org.apache.shardingsphere.sql.parser.SQLParserEngine;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.underlying.common.rule.BaseRule;
import org.apache.shardingsphere.underlying.executor.context.ExecutionContext;
......@@ -42,6 +42,8 @@ import org.apache.shardingsphere.underlying.rewrite.SQLRewriteEntry;
import org.apache.shardingsphere.underlying.rewrite.context.SQLRewriteContext;
import org.apache.shardingsphere.underlying.rewrite.context.SQLRewriteContextDecorator;
import org.apache.shardingsphere.underlying.rewrite.engine.SQLRewriteResult;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.apache.shardingsphere.underlying.route.context.RouteUnit;
import java.util.Collection;
......@@ -62,7 +64,9 @@ public abstract class BaseShardingEngine {
private final ShardingSphereMetaData metaData;
private final ShardingRouter shardingRouter;
private final DateNodeRouter dateNodeRouter;
private final ShardingRouteDecorator shardingRouteDecorator;
private final SPIRoutingHook routingHook;
......@@ -70,7 +74,8 @@ public abstract class BaseShardingEngine {
this.shardingRule = shardingRule;
this.properties = properties;
this.metaData = metaData;
shardingRouter = new ShardingRouter(shardingRule, properties, metaData, sqlParserEngine);
dateNodeRouter = new DateNodeRouter(metaData, sqlParserEngine);
shardingRouteDecorator = new ShardingRouteDecorator(shardingRule, properties, metaData);
routingHook = new SPIRoutingHook();
}
......@@ -94,12 +99,12 @@ public abstract class BaseShardingEngine {
protected abstract List<Object> cloneParameters(List<Object> parameters);
protected abstract ShardingRouteContext route(ShardingRouter shardingRouter, String sql, List<Object> parameters);
protected abstract RouteContext route(DateNodeRouter dateNodeRouter, String sql, List<Object> parameters);
private ShardingRouteContext executeRoute(final String sql, final List<Object> clonedParameters) {
routingHook.start(sql);
try {
ShardingRouteContext result = decorate(route(shardingRouter, sql, clonedParameters));
ShardingRouteContext result = decorate(route(dateNodeRouter, sql, clonedParameters));
routingHook.finishSuccess(result, metaData.getSchema());
return result;
// CHECKSTYLE:OFF
......@@ -110,8 +115,8 @@ public abstract class BaseShardingEngine {
}
}
private ShardingRouteContext decorate(final ShardingRouteContext shardingRouteContext) {
ShardingRouteContext result = shardingRouteContext;
private ShardingRouteContext decorate(final RouteContext routeContext) {
ShardingRouteContext result = (ShardingRouteContext) shardingRouteDecorator.decorate(routeContext);
for (MasterSlaveRule each : shardingRule.getMasterSlaveRules()) {
result = (ShardingRouteContext) new MasterSlaveRouteDecorator(each).decorate(result);
}
......
......@@ -18,11 +18,11 @@
package org.apache.shardingsphere.core.shard;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouter;
import org.apache.shardingsphere.sharding.route.engine.context.ShardingRouteContext;
import org.apache.shardingsphere.sql.parser.SQLParserEngine;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import java.util.ArrayList;
import java.util.List;
......@@ -49,7 +49,7 @@ public final class PreparedQueryShardingEngine extends BaseShardingEngine {
}
@Override
protected ShardingRouteContext route(final ShardingRouter shardingRouter, final String sql, final List<Object> parameters) {
return shardingRouter.route(sql, parameters, true);
protected RouteContext route(final DateNodeRouter dateNodeRouter, final String sql, final List<Object> parameters) {
return dateNodeRouter.route(sql, parameters, true);
}
}
......@@ -18,11 +18,11 @@
package org.apache.shardingsphere.core.shard;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouter;
import org.apache.shardingsphere.sharding.route.engine.context.ShardingRouteContext;
import org.apache.shardingsphere.sql.parser.SQLParserEngine;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import java.util.Collections;
import java.util.List;
......@@ -49,7 +49,7 @@ public final class SimpleQueryShardingEngine extends BaseShardingEngine {
}
@Override
protected ShardingRouteContext route(final ShardingRouter shardingRouter, final String sql, final List<Object> parameters) {
return shardingRouter.route(sql, Collections.emptyList(), false);
protected RouteContext route(final DateNodeRouter dateNodeRouter, final String sql, final List<Object> parameters) {
return dateNodeRouter.route(sql, Collections.emptyList(), false);
}
}
......@@ -58,7 +58,7 @@ public abstract class BaseShardingEngineTest {
protected final ShardingRouteContext createSQLRouteContext() {
RouteResult routeResult = new RouteResult();
routeResult.getRouteUnits().add(new RouteUnit(new RouteMapper("ds", "ds"), Collections.emptyList()));
return new ShardingRouteContext(new CommonSQLStatementContext(new ShowStatement()), routeResult, new ShardingConditions(Collections.emptyList()));
return new ShardingRouteContext(new CommonSQLStatementContext(new ShowStatement()), Collections.emptyList(), routeResult, new ShardingConditions(Collections.emptyList()));
}
protected final void assertExecutionContext(final ExecutionContext actual) {
......
......@@ -18,12 +18,14 @@
package org.apache.shardingsphere.core.shard;
import lombok.SneakyThrows;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouter;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouteDecorator;
import org.apache.shardingsphere.sql.parser.SQLParserEngine;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
......@@ -41,7 +43,10 @@ import static org.mockito.Mockito.when;
public final class PreparedQueryShardingEngineTest extends BaseShardingEngineTest {
@Mock
private ShardingRouter shardingRouter;
private DateNodeRouter dateNodeRouter;
@Mock
private ShardingRouteDecorator shardingRouteDecorator;
private PreparedQueryShardingEngine shardingEngine;
......@@ -62,19 +67,24 @@ public final class PreparedQueryShardingEngineTest extends BaseShardingEngineTes
@SneakyThrows
private void setRoutingEngine() {
Field field = BaseShardingEngine.class.getDeclaredField("shardingRouter");
Field field = BaseShardingEngine.class.getDeclaredField("dateNodeRouter");
field.setAccessible(true);
field.set(shardingEngine, dateNodeRouter);
field = BaseShardingEngine.class.getDeclaredField("shardingRouteDecorator");
field.setAccessible(true);
field.set(shardingEngine, shardingRouter);
field.set(shardingEngine, shardingRouteDecorator);
}
protected void assertShard() {
when(shardingRouter.route(getSql(), getParameters(), true)).thenReturn(createSQLRouteContext());
RouteContext routeContext = createSQLRouteContext();
when(dateNodeRouter.route(getSql(), getParameters(), true)).thenReturn(routeContext);
when(shardingRouteDecorator.decorate(routeContext)).thenReturn(routeContext);
assertExecutionContext(shardingEngine.shard(getSql(), getParameters()));
}
@Test(expected = SQLException.class)
public void assertWithRouteException() {
when(shardingRouter.route(getSql(), getParameters(), true)).thenThrow(SQLException.class);
when(dateNodeRouter.route(getSql(), getParameters(), true)).thenThrow(SQLException.class);
shardingEngine.shard(getSql(), getParameters());
}
}
......@@ -18,12 +18,14 @@
package org.apache.shardingsphere.core.shard;
import lombok.SneakyThrows;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouter;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouteDecorator;
import org.apache.shardingsphere.sql.parser.SQLParserEngine;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.mockito.Mock;
......@@ -39,7 +41,10 @@ import static org.mockito.Mockito.when;
public final class SimpleQueryShardingEngineTest extends BaseShardingEngineTest {
@Mock
private ShardingRouter shardingRouter;
private DateNodeRouter dateNodeRouter;
@Mock
private ShardingRouteDecorator shardingRouteDecorator;
private SimpleQueryShardingEngine shardingEngine;
......@@ -60,13 +65,18 @@ public final class SimpleQueryShardingEngineTest extends BaseShardingEngineTest
@SneakyThrows
private void setRoutingEngine() {
Field field = BaseShardingEngine.class.getDeclaredField("shardingRouter");
Field field = BaseShardingEngine.class.getDeclaredField("dateNodeRouter");
field.setAccessible(true);
field.set(shardingEngine, dateNodeRouter);
field = BaseShardingEngine.class.getDeclaredField("shardingRouteDecorator");
field.setAccessible(true);
field.set(shardingEngine, shardingRouter);
field.set(shardingEngine, shardingRouteDecorator);
}
protected void assertShard() {
when(shardingRouter.route(getSql(), Collections.emptyList(), false)).thenReturn(createSQLRouteContext());
RouteContext routeContext = createSQLRouteContext();
when(dateNodeRouter.route(getSql(), Collections.emptyList(), false)).thenReturn(routeContext);
when(shardingRouteDecorator.decorate(routeContext)).thenReturn(routeContext);
assertExecutionContext(shardingEngine.shard(getSql(), getParameters()));
}
}
......@@ -25,14 +25,14 @@ import org.apache.shardingsphere.core.yaml.swapper.ShardingRuleConfigurationYaml
import org.apache.shardingsphere.encrypt.rewrite.context.EncryptSQLRewriteContextDecorator;
import org.apache.shardingsphere.sharding.rewrite.context.ShardingSQLRewriteContextDecorator;
import org.apache.shardingsphere.sharding.rewrite.engine.ShardingSQLRewriteEngine;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouter;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouteDecorator;
import org.apache.shardingsphere.sharding.route.engine.context.ShardingRouteContext;
import org.apache.shardingsphere.sql.parser.SQLParserEngine;
import org.apache.shardingsphere.sql.parser.SQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.index.IndexMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.underlying.common.metadata.datasource.DataSourceMetas;
......@@ -42,6 +42,8 @@ import org.apache.shardingsphere.underlying.rewrite.engine.SQLRewriteResult;
import org.apache.shardingsphere.underlying.rewrite.parameterized.engine.AbstractSQLRewriterParameterizedTest;
import org.apache.shardingsphere.underlying.rewrite.parameterized.engine.parameter.SQLRewriteEngineTestParameters;
import org.apache.shardingsphere.underlying.rewrite.parameterized.engine.parameter.SQLRewriteEngineTestParametersBuilder;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.apache.shardingsphere.underlying.route.context.RouteUnit;
import org.junit.runners.Parameterized.Parameters;
......@@ -54,7 +56,6 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Properties;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
......@@ -77,9 +78,11 @@ public final class MixSQLRewriterParameterizedTest extends AbstractSQLRewriterPa
YamlRootShardingConfiguration ruleConfiguration = createRuleConfiguration();
ShardingRule shardingRule = new ShardingRule(new ShardingRuleConfigurationYamlSwapper().swap(ruleConfiguration.getShardingRule()), ruleConfiguration.getDataSources().keySet());
SQLParserEngine sqlParserEngine = SQLParserEngineFactory.getSQLParserEngine(null == getTestParameters().getDatabaseType() ? "SQL92" : getTestParameters().getDatabaseType());
ShardingRouter shardingRouter = new ShardingRouter(shardingRule, new ConfigurationProperties(new Properties()), createShardingSphereMetaData(), sqlParserEngine);
ShardingRouteContext shardingRouteContext = shardingRouter.route(getTestParameters().getInputSQL(), getTestParameters().getInputParameters(), false);
ShardingSphereMetaData metaData = createShardingSphereMetaData();
ConfigurationProperties properties = new ConfigurationProperties(ruleConfiguration.getProps());
RouteContext routeContext = new DateNodeRouter(metaData, sqlParserEngine).route(getTestParameters().getInputSQL(), getTestParameters().getInputParameters(), false);
ShardingRouteDecorator shardingRouteDecorator = new ShardingRouteDecorator(shardingRule, properties, metaData);
ShardingRouteContext shardingRouteContext = (ShardingRouteContext) shardingRouteDecorator.decorate(routeContext);
SQLRewriteContext sqlRewriteContext = new SQLRewriteContext(
mock(SchemaMetaData.class), shardingRouteContext.getSqlStatementContext(), getTestParameters().getInputSQL(), getTestParameters().getInputParameters());
new ShardingSQLRewriteContextDecorator(shardingRouteContext).decorate(shardingRule, properties, sqlRewriteContext);
......
......@@ -24,14 +24,14 @@ import org.apache.shardingsphere.core.yaml.constructor.YamlRootShardingConfigura
import org.apache.shardingsphere.core.yaml.swapper.ShardingRuleConfigurationYamlSwapper;
import org.apache.shardingsphere.sharding.rewrite.context.ShardingSQLRewriteContextDecorator;
import org.apache.shardingsphere.sharding.rewrite.engine.ShardingSQLRewriteEngine;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouter;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouteDecorator;
import org.apache.shardingsphere.sharding.route.engine.context.ShardingRouteContext;
import org.apache.shardingsphere.sql.parser.SQLParserEngine;
import org.apache.shardingsphere.sql.parser.SQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.index.IndexMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.underlying.common.metadata.datasource.DataSourceMetas;
......@@ -41,6 +41,8 @@ import org.apache.shardingsphere.underlying.rewrite.engine.SQLRewriteResult;
import org.apache.shardingsphere.underlying.rewrite.parameterized.engine.AbstractSQLRewriterParameterizedTest;
import org.apache.shardingsphere.underlying.rewrite.parameterized.engine.parameter.SQLRewriteEngineTestParameters;
import org.apache.shardingsphere.underlying.rewrite.parameterized.engine.parameter.SQLRewriteEngineTestParametersBuilder;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.apache.shardingsphere.underlying.route.context.RouteUnit;
import org.junit.runners.Parameterized.Parameters;
......@@ -53,7 +55,6 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Properties;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
......@@ -76,9 +77,11 @@ public final class ShardingSQLRewriterParameterizedTest extends AbstractSQLRewri
YamlRootShardingConfiguration ruleConfiguration = createRuleConfiguration();
ShardingRule shardingRule = new ShardingRule(new ShardingRuleConfigurationYamlSwapper().swap(ruleConfiguration.getShardingRule()), ruleConfiguration.getDataSources().keySet());
SQLParserEngine sqlParserEngine = SQLParserEngineFactory.getSQLParserEngine(null == getTestParameters().getDatabaseType() ? "SQL92" : getTestParameters().getDatabaseType());
ShardingRouter shardingRouter = new ShardingRouter(shardingRule, new ConfigurationProperties(new Properties()), createShardingSphereMetaData(), sqlParserEngine);
ShardingRouteContext shardingRouteContext = shardingRouter.route(getTestParameters().getInputSQL(), getTestParameters().getInputParameters(), false);
ShardingSphereMetaData metaData = createShardingSphereMetaData();
ConfigurationProperties properties = new ConfigurationProperties(ruleConfiguration.getProps());
RouteContext routeContext = new DateNodeRouter(metaData, sqlParserEngine).route(getTestParameters().getInputSQL(), getTestParameters().getInputParameters(), false);
ShardingRouteDecorator shardingRouteDecorator = new ShardingRouteDecorator(shardingRule, properties, metaData);
ShardingRouteContext shardingRouteContext = (ShardingRouteContext) shardingRouteDecorator.decorate(routeContext);
SQLRewriteContext sqlRewriteContext = new SQLRewriteContext(
mock(SchemaMetaData.class), shardingRouteContext.getSqlStatementContext(), getTestParameters().getInputSQL(), getTestParameters().getInputParameters());
new ShardingSQLRewriteContextDecorator(shardingRouteContext).decorate(shardingRule, properties, sqlRewriteContext);
......
......@@ -35,18 +35,16 @@ import org.apache.shardingsphere.sharding.route.engine.keygen.GeneratedKey;
import org.apache.shardingsphere.sharding.route.engine.type.ShardingRouteEngine;
import org.apache.shardingsphere.sharding.route.engine.type.ShardingRouteEngineFactory;
import org.apache.shardingsphere.sharding.route.engine.validator.ShardingStatementValidatorFactory;
import org.apache.shardingsphere.sql.parser.SQLParserEngine;
import org.apache.shardingsphere.sql.parser.binder.SQLStatementContextFactory;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.sql.parser.binder.statement.dml.InsertStatementContext;
import org.apache.shardingsphere.sql.parser.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.sql.parser.sql.statement.SQLStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.dml.DMLStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.underlying.route.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.decorator.RouteDecorator;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.apache.shardingsphere.underlying.route.context.RouteResult;
import java.util.Collections;
......@@ -54,10 +52,10 @@ import java.util.List;
import java.util.Optional;
/**
* Sharding router.
* Sharding route decorator.
*/
@RequiredArgsConstructor
public final class ShardingRouter implements DateNodeRouter {
public final class ShardingRouteDecorator implements RouteDecorator {
private final ShardingRule shardingRule;
......@@ -65,16 +63,15 @@ public final class ShardingRouter implements DateNodeRouter {
private final ShardingSphereMetaData metaData;
private final SQLParserEngine sqlParserEngine;
@Override
@SuppressWarnings("unchecked")
public ShardingRouteContext route(final String sql, final List<Object> parameters, final boolean useCache) {
SQLStatement sqlStatement = parse(sql, useCache);
ShardingStatementValidatorFactory.newInstance(sqlStatement).ifPresent(validator -> validator.validate(shardingRule, sqlStatement, parameters));
SQLStatementContext sqlStatementContext = SQLStatementContextFactory.newInstance(metaData.getSchema(), sql, parameters, sqlStatement);
Optional<GeneratedKey> generatedKey = sqlStatement instanceof InsertStatement
? GeneratedKey.getGenerateKey(shardingRule, metaData.getSchema(), parameters, (InsertStatement) sqlStatement) : Optional.empty();
@Override
public RouteContext decorate(final RouteContext routeContext) {
SQLStatementContext sqlStatementContext = routeContext.getSqlStatementContext();
List<Object> parameters = routeContext.getParameters();
ShardingStatementValidatorFactory.newInstance(
sqlStatementContext.getSqlStatement()).ifPresent(validator -> validator.validate(shardingRule, sqlStatementContext.getSqlStatement(), parameters));
Optional<GeneratedKey> generatedKey = sqlStatementContext.getSqlStatement() instanceof InsertStatement
? GeneratedKey.getGenerateKey(shardingRule, metaData.getSchema(), parameters, (InsertStatement) sqlStatementContext.getSqlStatement()) : Optional.empty();
ShardingConditions shardingConditions = getShardingConditions(parameters, sqlStatementContext, generatedKey.orElse(null), metaData.getSchema());
boolean needMergeShardingValues = isNeedMergeShardingValues(sqlStatementContext);
if (sqlStatementContext.getSqlStatement() instanceof DMLStatement && needMergeShardingValues) {
......@@ -86,18 +83,7 @@ public final class ShardingRouter implements DateNodeRouter {
if (needMergeShardingValues) {
Preconditions.checkState(1 == routeResult.getRouteUnits().size(), "Must have one sharding with subquery.");
}
return new ShardingRouteContext(sqlStatementContext, routeResult, shardingConditions, generatedKey.orElse(null));
}
/*
* To make sure SkyWalking will be available at the next release of ShardingSphere,
* a new plugin should be provided to SkyWalking project if this API changed.
*
* @see <a href="https://github.com/apache/skywalking/blob/master/docs/en/guides/Java-Plugin-Development-Guide.md#user-content-plugin-development-guide">Plugin Development Guide</a>
*
*/
private SQLStatement parse(final String sql, final boolean useCache) {
return sqlParserEngine.parse(sql, useCache);
return new ShardingRouteContext(sqlStatementContext, parameters, routeResult, shardingConditions, generatedKey.orElse(null));
}
private ShardingConditions getShardingConditions(final List<Object> parameters,
......
......@@ -24,6 +24,7 @@ import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.apache.shardingsphere.underlying.route.context.RouteResult;
import java.util.List;
import java.util.Optional;
/**
......@@ -36,14 +37,15 @@ public final class ShardingRouteContext extends RouteContext {
private final GeneratedKey generatedKey;
public ShardingRouteContext(final SQLStatementContext sqlStatementContext, final RouteResult routeResult, final ShardingConditions shardingConditions, final GeneratedKey generatedKey) {
super(sqlStatementContext, routeResult);
public ShardingRouteContext(final SQLStatementContext sqlStatementContext,
final List<Object> parameters, final RouteResult routeResult, final ShardingConditions shardingConditions, final GeneratedKey generatedKey) {
super(sqlStatementContext, parameters, routeResult);
this.shardingConditions = shardingConditions;
this.generatedKey = generatedKey;
}
public ShardingRouteContext(final SQLStatementContext sqlStatementContext, final RouteResult routeResult, final ShardingConditions shardingConditions) {
this(sqlStatementContext, routeResult, shardingConditions, null);
public ShardingRouteContext(final SQLStatementContext sqlStatementContext, final List<Object> parameters, final RouteResult routeResult, final ShardingConditions shardingConditions) {
this(sqlStatementContext, parameters, routeResult, shardingConditions, null);
}
/**
......
......@@ -23,20 +23,22 @@ import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration;
import org.apache.shardingsphere.api.config.sharding.strategy.HintShardingStrategyConfiguration;
import org.apache.shardingsphere.api.config.sharding.strategy.InlineShardingStrategyConfiguration;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouter;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouteDecorator;
import org.apache.shardingsphere.sharding.route.engine.context.ShardingRouteContext;
import org.apache.shardingsphere.sharding.route.fixture.HintShardingAlgorithmFixture;
import org.apache.shardingsphere.spi.database.metadata.DataSourceMetaData;
import org.apache.shardingsphere.sql.parser.SQLParserEngine;
import org.apache.shardingsphere.sql.parser.SQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.index.IndexMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.sql.parser.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaData;
import org.apache.shardingsphere.underlying.common.metadata.datasource.DataSourceMetas;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.junit.Before;
import org.junit.Test;
......@@ -44,7 +46,6 @@ import javax.sql.DataSource;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
......@@ -75,7 +76,10 @@ public final class DatabaseTest {
public void assertDatabaseAllRoutingSQL() {
String originSQL = "select * from tesT";
SQLParserEngine sqlParserEngine = SQLParserEngineFactory.getSQLParserEngine("MySQL");
ShardingRouteContext actual = new ShardingRouter(shardingRule, properties, getMetaDataForAllRoutingSQL(), sqlParserEngine).route(originSQL, Collections.emptyList(), false);
ShardingSphereMetaData metaData = getMetaDataForAllRoutingSQL();
RouteContext routeContext = new DateNodeRouter(metaData, sqlParserEngine).route(originSQL, Collections.emptyList(), false);
ShardingRouteDecorator shardingRouteDecorator = new ShardingRouteDecorator(shardingRule, properties, metaData);
ShardingRouteContext actual = (ShardingRouteContext) shardingRouteDecorator.decorate(routeContext);
assertThat(actual.getRouteResult().getRouteUnits().size(), is(1));
Collection<String> actualDataSources = actual.getRouteResult().getActualDataSourceNames();
assertThat(actualDataSources.size(), is(1));
......@@ -96,11 +100,16 @@ public final class DatabaseTest {
public void assertDatabaseSelectSQLPagination() {
String originSQL = "select user_id from tbl_pagination limit 0,5";
SQLParserEngine sqlParserEngine = SQLParserEngineFactory.getSQLParserEngine("MySQL");
ShardingRouteContext actual = new ShardingRouter(shardingRule, properties, getMetaDataForPagination(), sqlParserEngine).route(originSQL, Collections.emptyList(), false);
ShardingSphereMetaData metaData = getMetaDataForPagination();
RouteContext routeContext = new DateNodeRouter(metaData, sqlParserEngine).route(originSQL, Collections.emptyList(), false);
ShardingRouteDecorator shardingRouteDecorator = new ShardingRouteDecorator(shardingRule, properties, metaData);
ShardingRouteContext actual = (ShardingRouteContext) shardingRouteDecorator.decorate(routeContext);
assertThat(((SelectStatementContext) actual.getSqlStatementContext()).getPaginationContext().getActualOffset(), is(0L));
assertThat(((SelectStatementContext) actual.getSqlStatementContext()).getPaginationContext().getActualRowCount().orElse(null), is(5L));
originSQL = "select user_id from tbl_pagination limit 5,5";
actual = new ShardingRouter(shardingRule, properties, getMetaDataForPagination(), sqlParserEngine).route(originSQL, Collections.emptyList(), false);
routeContext = new DateNodeRouter(metaData, sqlParserEngine).route(originSQL, Collections.emptyList(), false);
shardingRouteDecorator = new ShardingRouteDecorator(shardingRule, properties, metaData);
actual = (ShardingRouteContext) shardingRouteDecorator.decorate(routeContext);
assertThat(((SelectStatementContext) actual.getSqlStatementContext()).getPaginationContext().getActualOffset(), is(5L));
assertThat(((SelectStatementContext) actual.getSqlStatementContext()).getPaginationContext().getActualRowCount().orElse(null), is(5L));
}
......@@ -124,24 +133,24 @@ public final class DatabaseTest {
public void assertDatabasePrepareSelectSQLPagination() {
String shardingPrefix = "user_db";
String shardingTable = "t_user";
Map<String, DataSource> dataSourceMap = new HashMap<>();
dataSourceMap.put(shardingPrefix + "1", null);
dataSourceMap.put(shardingPrefix + "2", null);
TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(shardingTable, shardingPrefix + "${1..2}." + shardingTable);
tableRuleConfig.setDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("city_id", shardingPrefix + "${city_id % 2 + 1}"));
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig);
ShardingRule rule = new ShardingRule(shardingRuleConfig, dataSourceMap.keySet());
String originSQL = "select city_id from t_user where city_id in (?,?) limit 5,10";
ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
when(metaData.getSchema()).thenReturn(mock(SchemaMetaData.class));
SQLParserEngine sqlParserEngine = SQLParserEngineFactory.getSQLParserEngine("MySQL");
ShardingRouteContext actual = new ShardingRouter(rule, properties, metaData, sqlParserEngine).route(originSQL, Lists.newArrayList(13, 173), false);
RouteContext routeContext = new DateNodeRouter(metaData, sqlParserEngine).route(originSQL, Lists.newArrayList(13, 173), false);
ShardingRouteDecorator shardingRouteDecorator = new ShardingRouteDecorator(shardingRule, properties, metaData);
ShardingRouteContext actual = (ShardingRouteContext) shardingRouteDecorator.decorate(routeContext);
assertThat(((SelectStatementContext) actual.getSqlStatementContext()).getPaginationContext().getActualOffset(), is(5L));
assertThat(((SelectStatementContext) actual.getSqlStatementContext()).getPaginationContext().getActualRowCount().orElse(null), is(10L));
assertThat(actual.getRouteResult().getRouteUnits().size(), is(1));
originSQL = "select city_id from t_user where city_id in (?,?) limit 5,10";
actual = new ShardingRouter(rule, properties, metaData, sqlParserEngine).route(originSQL, Lists.newArrayList(89, 84), false);
routeContext = new DateNodeRouter(metaData, sqlParserEngine).route(originSQL, Lists.newArrayList(89, 84), false);
shardingRouteDecorator = new ShardingRouteDecorator(shardingRule, properties, metaData);
actual = (ShardingRouteContext) shardingRouteDecorator.decorate(routeContext);
assertThat(((SelectStatementContext) actual.getSqlStatementContext()).getPaginationContext().getActualOffset(), is(5L));
assertThat(((SelectStatementContext) actual.getSqlStatementContext()).getPaginationContext().getActualRowCount().orElse(null), is(10L));
}
......
......@@ -18,19 +18,20 @@
package org.apache.shardingsphere.sharding.route.engine.type.standard;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouter;
import org.apache.shardingsphere.sharding.route.engine.ShardingRouteDecorator;
import org.apache.shardingsphere.sharding.route.engine.context.ShardingRouteContext;
import org.apache.shardingsphere.sharding.route.fixture.AbstractRoutingEngineTest;
import org.apache.shardingsphere.sql.parser.SQLParserEngine;
import org.apache.shardingsphere.sql.parser.SQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.underlying.common.config.DatabaseAccessConfiguration;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.underlying.common.database.type.DatabaseTypes;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaData;
import org.apache.shardingsphere.underlying.common.metadata.datasource.DataSourceMetas;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import java.util.Arrays;
......@@ -49,8 +50,9 @@ public abstract class AbstractSQLRouteTest extends AbstractRoutingEngineTest {
ShardingRule shardingRule = createAllShardingRule();
ShardingSphereMetaData metaData = new ShardingSphereMetaData(buildDataSourceMetas(), buildSchemaMetaData());
SQLParserEngine sqlParserEngine = SQLParserEngineFactory.getSQLParserEngine("MySQL");
ShardingRouter shardingRouter = new ShardingRouter(shardingRule, new ConfigurationProperties(new Properties()), metaData, sqlParserEngine);
ShardingRouteContext result = shardingRouter.route(sql, parameters, false);
RouteContext routeContext = new DateNodeRouter(metaData, sqlParserEngine).route(sql, parameters, false);
ShardingRouteDecorator shardingRouteDecorator = new ShardingRouteDecorator(shardingRule, new ConfigurationProperties(new Properties()), metaData);
ShardingRouteContext result = (ShardingRouteContext) shardingRouteDecorator.decorate(routeContext);
assertThat(result.getRouteResult().getRouteUnits().size(), is(1));
return result;
}
......
......@@ -19,14 +19,14 @@ package org.apache.shardingsphere.shardingjdbc.jdbc.core.statement;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import lombok.AccessLevel;
import lombok.Getter;
import org.apache.shardingsphere.masterslave.route.engine.MasterSlaveRouter;
import org.apache.shardingsphere.underlying.route.context.RouteUnit;
import org.apache.shardingsphere.masterslave.route.engine.MasterSlaveRouteDecorator;
import org.apache.shardingsphere.shardingjdbc.jdbc.adapter.AbstractMasterSlavePreparedStatementAdapter;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.connection.MasterSlaveConnection;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.constant.SQLExceptionConstant;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.apache.shardingsphere.underlying.route.context.RouteUnit;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
......@@ -43,9 +43,6 @@ public final class MasterSlavePreparedStatement extends AbstractMasterSlavePrepa
private final MasterSlaveConnection connection;
@Getter(AccessLevel.NONE)
private final MasterSlaveRouter masterSlaveRouter;
private final Collection<PreparedStatement> routedStatements = new LinkedList<>();
public MasterSlavePreparedStatement(final MasterSlaveConnection connection, final String sql) throws SQLException {
......@@ -62,9 +59,9 @@ public final class MasterSlavePreparedStatement extends AbstractMasterSlavePrepa
throw new SQLException(SQLExceptionConstant.SQL_STRING_NULL_OR_EMPTY);
}
this.connection = connection;
masterSlaveRouter = new MasterSlaveRouter(connection.getRuntimeContext().getRule(), connection.getRuntimeContext().getSqlParserEngine(),
connection.getRuntimeContext().getProperties().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW));
for (RouteUnit each : masterSlaveRouter.route(sql, Collections.emptyList(), true).getRouteResult().getRouteUnits()) {
DateNodeRouter dateNodeRouter = new DateNodeRouter(connection.getRuntimeContext().getMetaData(), connection.getRuntimeContext().getSqlParserEngine());
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), true));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
PreparedStatement preparedStatement = connection.getConnection(each.getDataSourceMapper().getActualName()).prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability);
routedStatements.add(preparedStatement);
}
......@@ -75,9 +72,9 @@ public final class MasterSlavePreparedStatement extends AbstractMasterSlavePrepa
throw new SQLException(SQLExceptionConstant.SQL_STRING_NULL_OR_EMPTY);
}
this.connection = connection;
masterSlaveRouter = new MasterSlaveRouter(connection.getRuntimeContext().getRule(), connection.getRuntimeContext().getSqlParserEngine(),
connection.getRuntimeContext().getProperties().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW));
for (RouteUnit each : masterSlaveRouter.route(sql, Collections.emptyList(), true).getRouteResult().getRouteUnits()) {
DateNodeRouter dateNodeRouter = new DateNodeRouter(connection.getRuntimeContext().getMetaData(), connection.getRuntimeContext().getSqlParserEngine());
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), true));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
PreparedStatement preparedStatement = connection.getConnection(each.getDataSourceMapper().getActualName()).prepareStatement(sql, autoGeneratedKeys);
routedStatements.add(preparedStatement);
}
......@@ -88,9 +85,9 @@ public final class MasterSlavePreparedStatement extends AbstractMasterSlavePrepa
throw new SQLException(SQLExceptionConstant.SQL_STRING_NULL_OR_EMPTY);
}
this.connection = connection;
masterSlaveRouter = new MasterSlaveRouter(connection.getRuntimeContext().getRule(), connection.getRuntimeContext().getSqlParserEngine(),
connection.getRuntimeContext().getProperties().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW));
for (RouteUnit each : masterSlaveRouter.route(sql, Collections.emptyList(), true).getRouteResult().getRouteUnits()) {
DateNodeRouter dateNodeRouter = new DateNodeRouter(connection.getRuntimeContext().getMetaData(), connection.getRuntimeContext().getSqlParserEngine());
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), true));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
PreparedStatement preparedStatement = connection.getConnection(each.getDataSourceMapper().getActualName()).prepareStatement(sql, columnIndexes);
routedStatements.add(preparedStatement);
}
......@@ -101,9 +98,9 @@ public final class MasterSlavePreparedStatement extends AbstractMasterSlavePrepa
throw new SQLException(SQLExceptionConstant.SQL_STRING_NULL_OR_EMPTY);
}
this.connection = connection;
masterSlaveRouter = new MasterSlaveRouter(connection.getRuntimeContext().getRule(), connection.getRuntimeContext().getSqlParserEngine(),
connection.getRuntimeContext().getProperties().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW));
for (RouteUnit each : masterSlaveRouter.route(sql, Collections.emptyList(), true).getRouteResult().getRouteUnits()) {
DateNodeRouter dateNodeRouter = new DateNodeRouter(connection.getRuntimeContext().getMetaData(), connection.getRuntimeContext().getSqlParserEngine());
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), true));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
PreparedStatement preparedStatement = connection.getConnection(each.getDataSourceMapper().getActualName()).prepareStatement(sql, columnNames);
routedStatements.add(preparedStatement);
}
......
......@@ -21,12 +21,13 @@ import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import lombok.AccessLevel;
import lombok.Getter;
import org.apache.shardingsphere.masterslave.route.engine.MasterSlaveRouter;
import org.apache.shardingsphere.underlying.route.context.RouteUnit;
import org.apache.shardingsphere.masterslave.route.engine.MasterSlaveRouteDecorator;
import org.apache.shardingsphere.shardingjdbc.jdbc.adapter.AbstractStatementAdapter;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.connection.MasterSlaveConnection;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.constant.SQLExceptionConstant;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.apache.shardingsphere.underlying.route.context.RouteUnit;
import java.sql.ResultSet;
import java.sql.SQLException;
......@@ -44,7 +45,7 @@ public final class MasterSlaveStatement extends AbstractStatementAdapter {
private final MasterSlaveConnection connection;
@Getter(AccessLevel.NONE)
private final MasterSlaveRouter masterSlaveRouter;
private final DateNodeRouter dateNodeRouter;
private final int resultSetType;
......@@ -65,8 +66,7 @@ public final class MasterSlaveStatement extends AbstractStatementAdapter {
public MasterSlaveStatement(final MasterSlaveConnection connection, final int resultSetType, final int resultSetConcurrency, final int resultSetHoldability) {
super(Statement.class);
this.connection = connection;
masterSlaveRouter = new MasterSlaveRouter(connection.getRuntimeContext().getRule(), connection.getRuntimeContext().getSqlParserEngine(),
connection.getRuntimeContext().getProperties().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW));
dateNodeRouter = new DateNodeRouter(connection.getRuntimeContext().getMetaData(), connection.getRuntimeContext().getSqlParserEngine());
this.resultSetType = resultSetType;
this.resultSetConcurrency = resultSetConcurrency;
this.resultSetHoldability = resultSetHoldability;
......@@ -78,7 +78,8 @@ public final class MasterSlaveStatement extends AbstractStatementAdapter {
throw new SQLException(SQLExceptionConstant.SQL_STRING_NULL_OR_EMPTY);
}
clearPrevious();
Collection<RouteUnit> routeUnits = masterSlaveRouter.route(sql, Collections.emptyList(), false).getRouteResult().getRouteUnits();
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), false));
Collection<RouteUnit> routeUnits = routeContext.getRouteResult().getRouteUnits();
Preconditions.checkState(1 == routeUnits.size(), "Cannot support executeQuery for DML or DDL");
Statement statement = connection.getConnection(routeUnits.iterator().next().getDataSourceMapper().getActualName()).createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
routedStatements.add(statement);
......@@ -89,7 +90,8 @@ public final class MasterSlaveStatement extends AbstractStatementAdapter {
public int executeUpdate(final String sql) throws SQLException {
clearPrevious();
int result = 0;
for (RouteUnit each : masterSlaveRouter.route(sql, Collections.emptyList(), false).getRouteResult().getRouteUnits()) {
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), false));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
Statement statement = connection.getConnection(each.getDataSourceMapper().getActualName()).createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
routedStatements.add(statement);
result += statement.executeUpdate(sql);
......@@ -101,7 +103,8 @@ public final class MasterSlaveStatement extends AbstractStatementAdapter {
public int executeUpdate(final String sql, final int autoGeneratedKeys) throws SQLException {
clearPrevious();
int result = 0;
for (RouteUnit each : masterSlaveRouter.route(sql, Collections.emptyList(), false).getRouteResult().getRouteUnits()) {
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), false));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
Statement statement = connection.getConnection(each.getDataSourceMapper().getActualName()).createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
routedStatements.add(statement);
result += statement.executeUpdate(sql, autoGeneratedKeys);
......@@ -113,7 +116,8 @@ public final class MasterSlaveStatement extends AbstractStatementAdapter {
public int executeUpdate(final String sql, final int[] columnIndexes) throws SQLException {
clearPrevious();
int result = 0;
for (RouteUnit each : masterSlaveRouter.route(sql, Collections.emptyList(), false).getRouteResult().getRouteUnits()) {
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), false));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
Statement statement = connection.getConnection(each.getDataSourceMapper().getActualName()).createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
routedStatements.add(statement);
result += statement.executeUpdate(sql, columnIndexes);
......@@ -125,7 +129,8 @@ public final class MasterSlaveStatement extends AbstractStatementAdapter {
public int executeUpdate(final String sql, final String[] columnNames) throws SQLException {
clearPrevious();
int result = 0;
for (RouteUnit each : masterSlaveRouter.route(sql, Collections.emptyList(), false).getRouteResult().getRouteUnits()) {
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), false));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
Statement statement = connection.getConnection(each.getDataSourceMapper().getActualName()).createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
routedStatements.add(statement);
result += statement.executeUpdate(sql, columnNames);
......@@ -137,7 +142,8 @@ public final class MasterSlaveStatement extends AbstractStatementAdapter {
public boolean execute(final String sql) throws SQLException {
clearPrevious();
boolean result = false;
for (RouteUnit each : masterSlaveRouter.route(sql, Collections.emptyList(), false).getRouteResult().getRouteUnits()) {
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), false));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
Statement statement = connection.getConnection(each.getDataSourceMapper().getActualName()).createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
routedStatements.add(statement);
result = statement.execute(sql);
......@@ -149,7 +155,8 @@ public final class MasterSlaveStatement extends AbstractStatementAdapter {
public boolean execute(final String sql, final int autoGeneratedKeys) throws SQLException {
clearPrevious();
boolean result = false;
for (RouteUnit each : masterSlaveRouter.route(sql, Collections.emptyList(), false).getRouteResult().getRouteUnits()) {
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), false));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
Statement statement = connection.getConnection(each.getDataSourceMapper().getActualName()).createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
routedStatements.add(statement);
result = statement.execute(sql, autoGeneratedKeys);
......@@ -161,7 +168,8 @@ public final class MasterSlaveStatement extends AbstractStatementAdapter {
public boolean execute(final String sql, final int[] columnIndexes) throws SQLException {
clearPrevious();
boolean result = false;
for (RouteUnit each : masterSlaveRouter.route(sql, Collections.emptyList(), false).getRouteResult().getRouteUnits()) {
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), false));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
Statement statement = connection.getConnection(each.getDataSourceMapper().getActualName()).createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
routedStatements.add(statement);
result = statement.execute(sql, columnIndexes);
......@@ -173,7 +181,8 @@ public final class MasterSlaveStatement extends AbstractStatementAdapter {
public boolean execute(final String sql, final String[] columnNames) throws SQLException {
clearPrevious();
boolean result = false;
for (RouteUnit each : masterSlaveRouter.route(sql, Collections.emptyList(), false).getRouteResult().getRouteUnits()) {
RouteContext routeContext = new MasterSlaveRouteDecorator(connection.getRuntimeContext().getRule()).decorate(dateNodeRouter.route(sql, Collections.emptyList(), false));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
Statement statement = connection.getConnection(each.getDataSourceMapper().getActualName()).createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
routedStatements.add(statement);
result = statement.execute(sql, columnNames);
......
......@@ -22,7 +22,7 @@ import org.apache.shardingsphere.core.rule.ShadowRule;
import org.apache.shardingsphere.core.shard.PreparedQueryShardingEngine;
import org.apache.shardingsphere.encrypt.rewrite.context.EncryptSQLRewriteContextDecorator;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.masterslave.route.engine.MasterSlaveRouter;
import org.apache.shardingsphere.masterslave.route.engine.MasterSlaveRouteDecorator;
import org.apache.shardingsphere.shadow.rewrite.context.ShadowSQLRewriteContextDecorator;
import org.apache.shardingsphere.shadow.rewrite.judgement.ShadowJudgementEngine;
import org.apache.shardingsphere.shadow.rewrite.judgement.impl.PreparedJudgementEngine;
......@@ -37,7 +37,6 @@ import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaDat
import org.apache.shardingsphere.sql.parser.binder.statement.CommonSQLStatementContext;
import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.sql.parser.sql.statement.SQLStatement;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey;
import org.apache.shardingsphere.underlying.common.rule.BaseRule;
import org.apache.shardingsphere.underlying.executor.context.ExecutionContext;
import org.apache.shardingsphere.underlying.executor.context.ExecutionUnit;
......@@ -47,6 +46,8 @@ import org.apache.shardingsphere.underlying.rewrite.context.SQLRewriteContext;
import org.apache.shardingsphere.underlying.rewrite.context.SQLRewriteContextDecorator;
import org.apache.shardingsphere.underlying.rewrite.engine.SQLRewriteResult;
import org.apache.shardingsphere.underlying.rewrite.engine.impl.DefaultSQLRewriteEngine;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.apache.shardingsphere.underlying.route.context.RouteUnit;
import java.sql.Connection;
......@@ -101,8 +102,9 @@ public final class PreparedStatementExecutorWrapper implements JDBCExecutorWrapp
sqlRewriteContext.generateSQLTokens();
String rewriteSQL = new DefaultSQLRewriteEngine().rewrite(sqlRewriteContext).getSql();
ExecutionContext result = new ExecutionContext(sqlStatementContext);
for (RouteUnit each : new MasterSlaveRouter(((MasterSlaveSchema) logicSchema).getMasterSlaveRule(), logicSchema.getSqlParserEngine(),
SHARDING_PROXY_CONTEXT.getProperties().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW)).route(rewriteSQL, parameters, true).getRouteResult().getRouteUnits()) {
DateNodeRouter dateNodeRouter = new DateNodeRouter(logicSchema.getMetaData(), logicSchema.getSqlParserEngine());
RouteContext routeContext = new MasterSlaveRouteDecorator(((MasterSlaveSchema) logicSchema).getMasterSlaveRule()).decorate(dateNodeRouter.route(rewriteSQL, parameters, true));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
result.getExecutionUnits().add(new ExecutionUnit(each.getDataSourceMapper().getActualName(), new SQLUnit(rewriteSQL, parameters)));
}
return result;
......
......@@ -22,7 +22,7 @@ import org.apache.shardingsphere.core.rule.ShadowRule;
import org.apache.shardingsphere.core.shard.SimpleQueryShardingEngine;
import org.apache.shardingsphere.encrypt.rewrite.context.EncryptSQLRewriteContextDecorator;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.masterslave.route.engine.MasterSlaveRouter;
import org.apache.shardingsphere.masterslave.route.engine.MasterSlaveRouteDecorator;
import org.apache.shardingsphere.shadow.rewrite.context.ShadowSQLRewriteContextDecorator;
import org.apache.shardingsphere.shadow.rewrite.judgement.ShadowJudgementEngine;
import org.apache.shardingsphere.shadow.rewrite.judgement.impl.SimpleJudgementEngine;
......@@ -37,7 +37,6 @@ import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaDat
import org.apache.shardingsphere.sql.parser.binder.statement.CommonSQLStatementContext;
import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.sql.parser.sql.statement.SQLStatement;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey;
import org.apache.shardingsphere.underlying.common.rule.BaseRule;
import org.apache.shardingsphere.underlying.executor.context.ExecutionContext;
import org.apache.shardingsphere.underlying.executor.context.ExecutionUnit;
......@@ -47,6 +46,8 @@ import org.apache.shardingsphere.underlying.rewrite.context.SQLRewriteContext;
import org.apache.shardingsphere.underlying.rewrite.context.SQLRewriteContextDecorator;
import org.apache.shardingsphere.underlying.rewrite.engine.SQLRewriteResult;
import org.apache.shardingsphere.underlying.rewrite.engine.impl.DefaultSQLRewriteEngine;
import org.apache.shardingsphere.underlying.route.engine.DateNodeRouter;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.apache.shardingsphere.underlying.route.context.RouteUnit;
import java.sql.Connection;
......@@ -98,8 +99,9 @@ public final class StatementExecutorWrapper implements JDBCExecutorWrapper {
sqlRewriteContext.generateSQLTokens();
String rewriteSQL = new DefaultSQLRewriteEngine().rewrite(sqlRewriteContext).getSql();
ExecutionContext result = new ExecutionContext(sqlStatementContext);
for (RouteUnit each : new MasterSlaveRouter(((MasterSlaveSchema) logicSchema).getMasterSlaveRule(), logicSchema.getSqlParserEngine(),
SHARDING_PROXY_CONTEXT.getProperties().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW)).route(rewriteSQL, Collections.emptyList(), false).getRouteResult().getRouteUnits()) {
DateNodeRouter dateNodeRouter = new DateNodeRouter(logicSchema.getMetaData(), logicSchema.getSqlParserEngine());
RouteContext routeContext = new MasterSlaveRouteDecorator(((MasterSlaveSchema) logicSchema).getMasterSlaveRule()).decorate(dateNodeRouter.route(rewriteSQL, Collections.emptyList(), false));
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
result.getExecutionUnits().add(new ExecutionUnit(each.getDataSourceMapper().getActualName(), new SQLUnit(rewriteSQL, Collections.emptyList())));
}
return result;
......
......@@ -39,6 +39,14 @@ public final class SQLParserEngine {
private final SQLParseResultCache cache = new SQLParseResultCache();
// TODO check skywalking plugin
/*
* To make sure SkyWalking will be available at the next release of ShardingSphere,
* a new plugin should be provided to SkyWalking project if this API changed.
*
* @see <a href="https://github.com/apache/skywalking/blob/master/docs/en/guides/Java-Plugin-Development-Guide.md#user-content-plugin-development-guide">Plugin Development Guide</a>
*
*/
/**
* Parse SQL.
*
......
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.shardingsphere.underlying.route;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import java.util.List;
/**
* Data node router.
*/
public interface DateNodeRouter {
/**
* Route SQL.
*
* @param sql SQL
* @param parameters SQL parameters
* @param useCache whether use cache to save SQL parse result
* @return parse result
*/
RouteContext route(String sql, List<Object> parameters, boolean useCache);
}
......@@ -21,6 +21,8 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
import java.util.List;
/**
* Route context.
*/
......@@ -30,5 +32,7 @@ public class RouteContext {
private final SQLStatementContext sqlStatementContext;
private final List<Object> parameters;
private final RouteResult routeResult;
}
......@@ -15,20 +15,20 @@
* limitations under the License.
*/
package org.apache.shardingsphere.underlying.route;
package org.apache.shardingsphere.underlying.route.decorator;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
/**
* Data node route decorator.
* Route decorator.
*/
public interface DateNodeRouteDecorator {
public interface RouteDecorator {
/**
* Decorate route result.
* Decorate route context.
*
* @param routeContext route context
* @return decorated route result
* @return decorated route context
*/
RouteContext decorate(RouteContext routeContext);
}
......@@ -15,42 +15,46 @@
* limitations under the License.
*/
package org.apache.shardingsphere.masterslave.route.engine;
package org.apache.shardingsphere.underlying.route.engine;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.rule.MasterSlaveRule;
import org.apache.shardingsphere.masterslave.route.engine.impl.MasterSlaveDataSourceRouter;
import org.apache.shardingsphere.masterslave.route.log.MasterSlaveSQLLogger;
import org.apache.shardingsphere.sql.parser.SQLParserEngine;
import org.apache.shardingsphere.underlying.route.DateNodeRouter;
import org.apache.shardingsphere.sql.parser.binder.SQLStatementContextFactory;
import org.apache.shardingsphere.sql.parser.binder.statement.CommonSQLStatementContext;
import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.sql.parser.sql.statement.SQLStatement;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.underlying.route.context.RouteContext;
import org.apache.shardingsphere.underlying.route.context.RouteMapper;
import org.apache.shardingsphere.underlying.route.context.RouteResult;
import org.apache.shardingsphere.underlying.route.context.RouteUnit;
import java.util.Collections;
import java.util.List;
/**
* Master slave router interface.
* Data node router.
*/
@RequiredArgsConstructor
public final class MasterSlaveRouter implements DateNodeRouter {
public final class DateNodeRouter {
private final MasterSlaveRule masterSlaveRule;
private final ShardingSphereMetaData metaData;
private final SQLParserEngine sqlParserEngine;
private final SQLParserEngine parserEngine;
private final boolean showSQL;
@Override
/**
* Route SQL.
*
* @param sql SQL
* @param parameters SQL parameters
* @param useCache whether cache SQL parse result
* @return route context
*/
public RouteContext route(final String sql, final List<Object> parameters, final boolean useCache) {
String dataSourceName = new MasterSlaveDataSourceRouter(masterSlaveRule).route(sqlParserEngine.parse(sql, useCache));
if (showSQL) {
MasterSlaveSQLLogger.logSQL(sql, dataSourceName);
SQLStatement sqlStatement = parserEngine.parse(sql, useCache);
try {
SQLStatementContext sqlStatementContext = SQLStatementContextFactory.newInstance(metaData.getSchema(), sql, parameters, sqlStatement);
return new RouteContext(sqlStatementContext, parameters, new RouteResult());
// TODO should pass parameters for master-slave
} catch (final IndexOutOfBoundsException ex) {
return new RouteContext(new CommonSQLStatementContext(sqlStatement), parameters, new RouteResult());
}
RouteResult routeResult = new RouteResult();
routeResult.getRouteUnits().add(new RouteUnit(new RouteMapper(dataSourceName, dataSourceName), Collections.emptyList()));
return new RouteContext(null, routeResult);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册