blob: a06149882a19ed46ba4c3e699fe74c46bd3a6c7d [file] [log] [blame]
/*
* 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.distsql.parser.api;
import org.apache.shardingsphere.distsql.parser.segment.DataSourceSegment;
import org.apache.shardingsphere.distsql.parser.segment.TableRuleSegment;
import org.apache.shardingsphere.distsql.parser.segment.rdl.ShardingBindingTableRuleSegment;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourceStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingBindingTableRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingBroadcastTableRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingTableRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropResourceStatement;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
public final class DistSQLStatementParserEngineTest {
private static final String RDL_ADD_RESOURCE_SINGLE_WITHOUT_PASSWORD = "ADD RESOURCE ds_0(HOST=127.0.0.1,PORT=3306,DB=test0,USER=ROOT);";
private static final String RDL_ADD_RESOURCE_SINGLE_WITH_PASSWORD = "ADD RESOURCE ds_0(HOST=127.0.0.1,PORT=3306,DB=test0,USER=ROOT,PASSWORD=123456);";
private static final String RDL_ADD_RESOURCE_MULTIPLE = "ADD RESOURCE ds_0(HOST=127.0.0.1,PORT=3306,DB=test0,USER=ROOT,PASSWORD=123456),"
+ "ds_1(HOST=127.0.0.1,PORT=3306,DB=test1,USER=ROOT,PASSWORD=123456);";
private static final String RDL_DROP_RESOURCE = "DROP RESOURCE ds_0,ds_1";
private static final String RDL_CREATE_SHARDING_TABLE_RULE = "CREATE SHARDING TABLE RULE t_order ("
+ "RESOURCES(ms_group_0,ms_group_1),"
+ "SHARDING_COLUMN=order_id,"
+ "TYPE(NAME=hash_mod,PROPERTIES('sharding-count'=4)),"
+ "GENERATED_KEY(COLUMN=another_id,TYPE(NAME=snowflake,PROPERTIES(\"worker-id\"=123))))";
private static final String RDL_CREATE_SHARDING_BINDING_TABLE_RULES = "CREATE SHARDING BINDING TABLE RULES ("
+ "binding_rule_1(t_order,t_order_item)," + "binding_rule_2(t_1,t_2))";
private static final String RDL_CREATE_SHARDING_BROADCAST_TABLE_RULES = "CREATE SHARDING BROADCAST TABLE RULES(t_1,t_2)";
private final DistSQLStatementParserEngine engine = new DistSQLStatementParserEngine();
@Test
public void assertParseAddSingleResourceWithoutPassword() {
SQLStatement sqlStatement = engine.parse(RDL_ADD_RESOURCE_SINGLE_WITHOUT_PASSWORD);
assertTrue(sqlStatement instanceof AddResourceStatement);
assertThat(((AddResourceStatement) sqlStatement).getDataSources().size(), is(1));
DataSourceSegment dataSourceSegment = ((AddResourceStatement) sqlStatement).getDataSources().iterator().next();
assertThat(dataSourceSegment.getName(), is("ds_0"));
assertThat(dataSourceSegment.getHostName(), is("127.0.0.1"));
assertThat(dataSourceSegment.getPort(), is("3306"));
assertThat(dataSourceSegment.getDb(), is("test0"));
assertThat(dataSourceSegment.getUser(), is("ROOT"));
}
@Test
public void assertParseAddSingleResourceWithPassword() {
SQLStatement sqlStatement = engine.parse(RDL_ADD_RESOURCE_SINGLE_WITH_PASSWORD);
assertTrue(sqlStatement instanceof AddResourceStatement);
assertThat(((AddResourceStatement) sqlStatement).getDataSources().size(), is(1));
DataSourceSegment dataSourceSegment = ((AddResourceStatement) sqlStatement).getDataSources().iterator().next();
assertThat(dataSourceSegment.getName(), is("ds_0"));
assertThat(dataSourceSegment.getHostName(), is("127.0.0.1"));
assertThat(dataSourceSegment.getPort(), is("3306"));
assertThat(dataSourceSegment.getDb(), is("test0"));
assertThat(dataSourceSegment.getUser(), is("ROOT"));
assertThat(dataSourceSegment.getPassword(), is("123456"));
}
@Test
public void assertParseAddMultipleResources() {
SQLStatement sqlStatement = engine.parse(RDL_ADD_RESOURCE_MULTIPLE);
assertTrue(sqlStatement instanceof AddResourceStatement);
assertThat(((AddResourceStatement) sqlStatement).getDataSources().size(), is(2));
List<DataSourceSegment> dataSourceSegments = new ArrayList(((AddResourceStatement) sqlStatement).getDataSources());
DataSourceSegment dataSourceSegment = dataSourceSegments.get(0);
assertThat(dataSourceSegment.getName(), is("ds_0"));
assertThat(dataSourceSegment.getHostName(), is("127.0.0.1"));
assertThat(dataSourceSegment.getPort(), is("3306"));
assertThat(dataSourceSegment.getDb(), is("test0"));
assertThat(dataSourceSegment.getUser(), is("ROOT"));
assertThat(dataSourceSegment.getPassword(), is("123456"));
dataSourceSegment = dataSourceSegments.get(1);
assertThat(dataSourceSegment.getName(), is("ds_1"));
assertThat(dataSourceSegment.getHostName(), is("127.0.0.1"));
assertThat(dataSourceSegment.getPort(), is("3306"));
assertThat(dataSourceSegment.getDb(), is("test1"));
assertThat(dataSourceSegment.getUser(), is("ROOT"));
assertThat(dataSourceSegment.getPassword(), is("123456"));
}
@Test
public void assertParseDropResource() {
SQLStatement sqlStatement = engine.parse(RDL_DROP_RESOURCE);
assertTrue(sqlStatement instanceof DropResourceStatement);
assertThat(((DropResourceStatement) sqlStatement).getResourceNames().size(), is(2));
assertTrue(((DropResourceStatement) sqlStatement).getResourceNames().containsAll(Arrays.asList("ds_0", "ds_1")));
}
@Test
public void assertParseCreateShardingTableRule() {
SQLStatement sqlStatement = engine.parse(RDL_CREATE_SHARDING_TABLE_RULE);
assertTrue(sqlStatement instanceof CreateShardingTableRuleStatement);
assertThat(((CreateShardingTableRuleStatement) sqlStatement).getTables().size(), is(1));
TableRuleSegment tableRuleSegment = ((CreateShardingTableRuleStatement) sqlStatement).getTables().iterator().next();
assertThat(tableRuleSegment.getLogicTable(), is("t_order"));
assertTrue(tableRuleSegment.getDataSources().containsAll(Arrays.asList("ms_group_0", "ms_group_1")));
assertThat(tableRuleSegment.getTableStrategyColumn(), is("order_id"));
assertThat(tableRuleSegment.getKeyGenerateStrategy().getAlgorithmName(), is("snowflake"));
assertThat(tableRuleSegment.getKeyGenerateStrategy().getAlgorithmProps().getProperty("worker-id"), is("123"));
assertThat(tableRuleSegment.getKeyGenerateStrategyColumn(), is("another_id"));
assertThat(tableRuleSegment.getTableStrategy().getAlgorithmName(), is("hash_mod"));
assertThat(tableRuleSegment.getTableStrategy().getAlgorithmProps().getProperty("sharding-count"), is("4"));
}
@Test
public void assertParseCreateShardingBindingTableRules() {
SQLStatement sqlStatement = engine.parse(RDL_CREATE_SHARDING_BINDING_TABLE_RULES);
assertTrue(sqlStatement instanceof CreateShardingBindingTableRulesStatement);
List<ShardingBindingTableRuleSegment> shardingBindingTableRuleSegments = new ArrayList<>(((CreateShardingBindingTableRulesStatement) sqlStatement).getRules());
assertThat(shardingBindingTableRuleSegments.size(), is(2));
ShardingBindingTableRuleSegment segment = shardingBindingTableRuleSegments.get(0);
assertThat(segment.getRuleName(), is("binding_rule_1"));
assertThat(segment.getTables(), is("t_order,t_order_item"));
segment = shardingBindingTableRuleSegments.get(1);
assertThat(segment.getRuleName(), is("binding_rule_2"));
assertThat(segment.getTables(), is("t_1,t_2"));
}
@Test
public void assertParseCreateShardingBroadcastTableRules() {
SQLStatement sqlStatement = engine.parse(RDL_CREATE_SHARDING_BROADCAST_TABLE_RULES);
assertTrue(sqlStatement instanceof CreateShardingBroadcastTableRulesStatement);
assertThat(((CreateShardingBroadcastTableRulesStatement) sqlStatement).getTables(), is(Arrays.asList("t_1", "t_2")));
}
}