/* * Copyright 1999-2015 dangdang.com. *
* Licensed 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 com.dangdang.ddframe.rdb.sharding.parsing.parser.statement; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; import com.dangdang.ddframe.rdb.sharding.constant.DatabaseType; import com.dangdang.ddframe.rdb.sharding.constant.ShardingOperator; import com.dangdang.ddframe.rdb.sharding.parsing.SQLParsingEngine; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.Column; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.Condition; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.delete.DeleteStatement; import com.dangdang.ddframe.rdb.sharding.rewrite.SQLRewriteEngine; import org.junit.Test; import java.sql.SQLException; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; public final class DeleteStatementParserTest extends AbstractStatementParserTest { @Test public void parseWithoutCondition() throws SQLException { String sql = "DELETE FROM TABLE_XXX"; ShardingRule shardingRule = createShardingRule(); SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, sql, shardingRule); DeleteStatement deleteStatement = (DeleteStatement) statementParser.parse(); assertThat(deleteStatement.getTables().find("TABLE_XXX").get().getName(), is("TABLE_XXX")); // TODO 放入rewrite模块断言 assertThat(new SQLRewriteEngine(sql, deleteStatement).rewrite().toString(), is("DELETE FROM [Token(TABLE_XXX)]")); } @Test public void parseWithoutParameter() throws SQLException { String sql = "DELETE FROM TABLE_XXX xxx WHERE field4<10 AND TABLE_XXX.field1=1 AND field5>10 AND xxx.field2 IN (1,3) AND field6<=10 AND field3 BETWEEN 5 AND 20 AND field7>=10"; ShardingRule shardingRule = createShardingRule(); SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, sql, shardingRule); DeleteStatement deleteStatement = (DeleteStatement) statementParser.parse(); assertDeleteStatementWithoutParameter(deleteStatement); // TODO 放入rewrite模块断言 assertThat(new SQLRewriteEngine(sql, deleteStatement).rewrite().toString(), is( "DELETE FROM [Token(TABLE_XXX)] xxx WHERE field4<10 AND [Token(TABLE_XXX)].field1=1 AND field5>10 AND xxx.field2 IN (1,3) AND field6<=10 AND field3 BETWEEN 5 AND 20 AND field7>=10")); } private void assertDeleteStatementWithoutParameter(final DeleteStatement deleteStatement) { assertThat(deleteStatement.getTables().find("TABLE_XXX").get().getName(), is("TABLE_XXX")); assertThat(deleteStatement.getTables().find("xxx").get().getAlias().get(), is("xxx")); Condition condition1 = deleteStatement.find(new Column("field1", "TABLE_XXX")).get(); assertThat(condition1.getOperator(), is(ShardingOperator.EQUAL)); assertThat(condition1.getValues(Collections.emptyList()).size(), is(1)); assertThat(condition1.getValues(Collections.emptyList()).get(0), is((Comparable) 1)); Condition condition2 = deleteStatement.find(new Column("field2", "TABLE_XXX")).get(); assertThat(condition2.getOperator(), is(ShardingOperator.IN)); assertThat(condition2.getValues(Collections.emptyList()).size(), is(2)); assertThat(condition2.getValues(Collections.emptyList()).get(0), is((Comparable) 1)); assertThat(condition2.getValues(Collections.emptyList()).get(1), is((Comparable) 3)); Condition condition3 = deleteStatement.find(new Column("field3", "TABLE_XXX")).get(); assertThat(condition3.getOperator(), is(ShardingOperator.BETWEEN)); assertThat(condition3.getValues(Collections.emptyList()).size(), is(2)); assertThat(condition3.getValues(Collections.emptyList()).get(0), is((Comparable) 5)); assertThat(condition3.getValues(Collections.emptyList()).get(1), is((Comparable) 20)); } @Test public void parseWithParameter() throws SQLException { String sql = "DELETE FROM TABLE_XXX xxx WHERE field4 AND field1=? AND field5>? AND field2 IN (?,?) AND field6<=? AND field3 BETWEEN ? AND ? AND field7>=?"; ShardingRule shardingRule = createShardingRule(); SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, sql, shardingRule); DeleteStatement deleteStatement = (DeleteStatement) statementParser.parse(); assertDeleteStatementWithParameter(deleteStatement); // TODO 放入rewrite模块断言 assertThat(new SQLRewriteEngine(sql, deleteStatement).rewrite().toString(), is( "DELETE FROM [Token(TABLE_XXX)] xxx WHERE field4 AND field1=? AND field5>? AND field2 IN (?,?) AND field6<=? AND field3 BETWEEN ? AND ? AND field7>=?")); } private void assertDeleteStatementWithParameter(final DeleteStatement deleteStatement) { assertThat(deleteStatement.getTables().find("TABLE_XXX").get().getName(), is("TABLE_XXX")); assertThat(deleteStatement.getTables().find("xxx").get().getAlias().get(), is("xxx")); List