提交 00ce0051 编写于 作者: T terrymanu

for #660: add sql case type demension

上级 ccf91790
......@@ -20,8 +20,6 @@ package io.shardingjdbc.core.parsing.integrate.engine;
import com.google.common.base.Optional;
import io.shardingjdbc.core.constant.DatabaseType;
import io.shardingjdbc.core.parsing.SQLParsingEngine;
import io.shardingjdbc.core.parsing.integrate.asserts.ParserAssertHelper;
import io.shardingjdbc.core.parsing.integrate.asserts.ParserJAXBHelper;
import io.shardingjdbc.core.parsing.integrate.jaxb.condition.ConditionAssert;
import io.shardingjdbc.core.parsing.integrate.jaxb.condition.Value;
import io.shardingjdbc.core.parsing.integrate.jaxb.root.ParserAssert;
......@@ -41,7 +39,6 @@ import io.shardingjdbc.core.parsing.parser.context.condition.Conditions;
import io.shardingjdbc.core.parsing.parser.context.table.Table;
import io.shardingjdbc.core.parsing.parser.context.table.Tables;
import io.shardingjdbc.core.parsing.parser.sql.SQLStatement;
import io.shardingjdbc.core.parsing.parser.sql.dql.select.SelectStatement;
import io.shardingjdbc.core.parsing.parser.token.GeneratedKeyToken;
import io.shardingjdbc.core.parsing.parser.token.IndexToken;
import io.shardingjdbc.core.parsing.parser.token.ItemsToken;
......@@ -51,6 +48,7 @@ import io.shardingjdbc.core.parsing.parser.token.OrderByToken;
import io.shardingjdbc.core.parsing.parser.token.RowCountToken;
import io.shardingjdbc.core.parsing.parser.token.SQLToken;
import io.shardingjdbc.core.parsing.parser.token.TableToken;
import io.shardingjdbc.test.sql.SQLCaseType;
import io.shardingjdbc.test.sql.SQLCasesLoader;
import lombok.RequiredArgsConstructor;
import org.junit.Test;
......@@ -79,38 +77,35 @@ public final class IntegrateSupportedSQLParsingTest extends AbstractBaseIntegrat
private final DatabaseType databaseType;
@Parameters(name = "{0}In{1}")
private final SQLCaseType sqlCaseType;
@Parameters(name = "{0}_in_{1}_for_{2}")
public static Collection<Object[]> getTestParameters() {
return sqlCasesLoader.getSupportedSQLTestParameters(Arrays.<Enum>asList(DatabaseType.values()), DatabaseType.class);
}
@Test
public void assertLiteralSQL() throws NoSuchFieldException, IllegalAccessException {
assertSQLStatement(new SQLParsingEngine(
databaseType, sqlCasesLoader.getSupportedLiteralSQL(sqlCaseId, parserAssertsLoader.getParserAssert(sqlCaseId).getParameters()), getShardingRule()).parse(), false);
public void assertSupportedSQL() throws NoSuchFieldException, IllegalAccessException {
String sql = sqlCasesLoader.getSupportedSQL(sqlCaseId, sqlCaseType, parserAssertsLoader.getParserAssert(sqlCaseId).getParameters());
assertSQLStatement(new SQLParsingEngine(databaseType, sql, getShardingRule()).parse());
}
@Test
public void assertPlaceholderSQL() throws NoSuchFieldException, IllegalAccessException {
assertSQLStatement(new SQLParsingEngine(databaseType, sqlCasesLoader.getSupportedPlaceholderSQL(sqlCaseId), getShardingRule()).parse(), true);
}
private void assertSQLStatement(final SQLStatement actual, final boolean withPlaceholder) throws NoSuchFieldException, IllegalAccessException {
private void assertSQLStatement(final SQLStatement actual) throws NoSuchFieldException, IllegalAccessException {
ParserAssert parserAssert = parserAssertsLoader.getParserAssert(sqlCaseId);
assertTables(actual.getTables(), parserAssert.getTables());
assertConditions(actual.getConditions(), parserAssert.getConditions());
assertSQLTokens(actual.getSqlTokens(), parserAssert.getTokens(), withPlaceholder);
assertSQLTokens(actual.getSqlTokens(), parserAssert.getTokens());
if (actual instanceof SelectStatement) {
SelectStatement selectStatement = (SelectStatement) actual;
SelectStatement expectedSqlStatement = ParserJAXBHelper.getSelectStatement(parserAssert);
ParserAssertHelper.assertOrderBy(expectedSqlStatement.getOrderByItems(), selectStatement.getOrderByItems());
ParserAssertHelper.assertGroupBy(expectedSqlStatement.getGroupByItems(), selectStatement.getGroupByItems());
ParserAssertHelper.assertAggregationSelectItem(expectedSqlStatement.getAggregationSelectItems(), selectStatement.getAggregationSelectItems());
ParserAssertHelper.assertLimit(parserAssert.getLimit(), selectStatement.getLimit(), withPlaceholder);
}
// if (actual instanceof SelectStatement) {
// SelectStatement selectStatement = (SelectStatement) actual;
// SelectStatement expectedSqlStatement = ParserJAXBHelper.getSelectStatement(parserAssert);
// ParserAssertHelper.assertOrderBy(expectedSqlStatement.getOrderByItems(), selectStatement.getOrderByItems());
// ParserAssertHelper.assertGroupBy(expectedSqlStatement.getGroupByItems(), selectStatement.getGroupByItems());
// ParserAssertHelper.assertAggregationSelectItem(expectedSqlStatement.getAggregationSelectItems(), selectStatement.getAggregationSelectItems());
// ParserAssertHelper.assertLimit(parserAssert.getLimit(), selectStatement.getLimit(), withPlaceholder);
// }
}
private void assertTables(final Tables actual, final List<TableAssert> expected) {
......@@ -165,13 +160,13 @@ public final class IntegrateSupportedSQLParsingTest extends AbstractBaseIntegrat
return field.get(actual);
}
private void assertSQLTokens(final List<SQLToken> actual, final SQLTokenAsserts expected, final boolean withPlaceholder) {
private void assertSQLTokens(final List<SQLToken> actual, final SQLTokenAsserts expected) {
assertTableTokens(actual, expected);
assertIndexToken(actual, expected);
assertItemsToken(actual, expected);
assertGeneratedKeyToken(actual, expected, withPlaceholder);
assertGeneratedKeyToken(actual, expected);
assertMultipleInsertValuesToken(actual, expected);
assertOrderByToken(actual, expected, withPlaceholder);
assertOrderByToken(actual, expected);
// TODO fix offset and row count
// assertOffsetToken(actual, expected);
// assertRowCountToken(actual, expected);
......@@ -249,17 +244,17 @@ public final class IntegrateSupportedSQLParsingTest extends AbstractBaseIntegrat
return Optional.absent();
}
private void assertGeneratedKeyToken(final List<SQLToken> actual, final SQLTokenAsserts expected, final boolean withPlaceholder) {
private void assertGeneratedKeyToken(final List<SQLToken> actual, final SQLTokenAsserts expected) {
Optional<GeneratedKeyToken> generatedKeyToken = getGeneratedKeyToken(actual);
if (generatedKeyToken.isPresent()) {
assertGeneratedKeyToken(generatedKeyToken.get(), expected.getGeneratedKeyToken(), withPlaceholder);
assertGeneratedKeyToken(generatedKeyToken.get(), expected.getGeneratedKeyToken());
} else {
assertNull(expected.getGeneratedKeyToken());
}
}
private void assertGeneratedKeyToken(final GeneratedKeyToken actual, final GeneratedKeyTokenAssert expected, final boolean withPlaceholder) {
if (withPlaceholder) {
private void assertGeneratedKeyToken(final GeneratedKeyToken actual, final GeneratedKeyTokenAssert expected) {
if (SQLCaseType.Placeholder == sqlCaseType) {
assertThat(actual.getBeginPosition(), is(expected.getBeginPositionWithPlaceholder()));
} else {
assertThat(actual.getBeginPosition(), is(expected.getBeginPositionWithoutPlaceholder()));
......@@ -298,17 +293,17 @@ public final class IntegrateSupportedSQLParsingTest extends AbstractBaseIntegrat
return Optional.absent();
}
private void assertOrderByToken(final List<SQLToken> actual, final SQLTokenAsserts expected, final boolean withPlaceholder) {
private void assertOrderByToken(final List<SQLToken> actual, final SQLTokenAsserts expected) {
Optional<OrderByToken> orderByToken = getOrderByToken(actual);
if (orderByToken.isPresent()) {
assertOrderByToken(orderByToken.get(), expected.getOrderByToken(), withPlaceholder);
assertOrderByToken(orderByToken.get(), expected.getOrderByToken());
} else {
assertNull(expected.getOrderByToken());
}
}
private void assertOrderByToken(final OrderByToken actual, final OrderByTokenAssert expected, final boolean withPlaceholder) {
if (withPlaceholder) {
private void assertOrderByToken(final OrderByToken actual, final OrderByTokenAssert expected) {
if (SQLCaseType.Placeholder == sqlCaseType) {
assertThat(actual.getBeginPosition(), is(expected.getBeginPositionWithPlaceholder()));
} else {
assertThat(actual.getBeginPosition(), is(expected.getBeginPositionWithoutPlaceholder()));
......@@ -369,4 +364,21 @@ public final class IntegrateSupportedSQLParsingTest extends AbstractBaseIntegrat
}
return Optional.absent();
}
private String getFullAssertMessage(final String assertMessage) {
StringBuilder result = new StringBuilder(System.getProperty("line.separator"));
result.append("SQL case id: ");
result.append(sqlCaseId);
result.append(System.getProperty("line.separator"));
result.append("SQL: ");
if (SQLCaseType.Placeholder == sqlCaseType) {
result.append(SQLCasesLoader.getInstance().getSupportedPlaceholderSQL(sqlCaseId));
} else {
result.append(SQLCasesLoader.getInstance().getSupportedLiteralSQL(sqlCaseId, parserAssertsLoader.getParserAssert(sqlCaseId).getParameters()));
}
result.append(System.getProperty("line.separator"));
result.append(assertMessage);
result.append(System.getProperty("line.separator"));
return result.toString();
}
}
......@@ -20,6 +20,7 @@ package io.shardingjdbc.core.parsing.integrate.engine;
import io.shardingjdbc.core.constant.DatabaseType;
import io.shardingjdbc.core.parsing.SQLParsingEngine;
import io.shardingjdbc.core.parsing.parser.exception.SQLParsingUnsupportedException;
import io.shardingjdbc.test.sql.SQLCaseType;
import io.shardingjdbc.test.sql.SQLCasesLoader;
import lombok.RequiredArgsConstructor;
import org.junit.Test;
......@@ -27,6 +28,7 @@ import org.junit.runners.Parameterized.Parameters;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@RequiredArgsConstructor
public final class IntegrateUnsupportedSQLParsingTest extends AbstractBaseIntegrateSQLParsingTest {
......@@ -37,13 +39,15 @@ public final class IntegrateUnsupportedSQLParsingTest extends AbstractBaseIntegr
private final DatabaseType databaseType;
@Parameters(name = "{0}In{1}")
private final SQLCaseType sqlCaseType;
@Parameters(name = "{0}_in_{1}_for_{2}")
public static Collection<Object[]> getTestParameters() {
return sqlCasesLoader.getUnsupportedSQLTestParameters(Arrays.<Enum>asList(DatabaseType.values()), DatabaseType.class);
}
@Test(expected = SQLParsingUnsupportedException.class)
public void assertUnsupportedSQL() {
new SQLParsingEngine(databaseType, sqlCasesLoader.getUnsupportedSQL(sqlCaseId), getShardingRule()).parse();
new SQLParsingEngine(databaseType, sqlCasesLoader.getUnsupportedSQL(sqlCaseId, sqlCaseType, Collections.emptyList()), getShardingRule()).parse();
}
}
/*
* Copyright 1999-2015 dangdang.com.
* <p>
* 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.
* </p>
*/
package io.shardingjdbc.test.sql;
/**
* SQL case type.
*
* @author zhangliang
*/
public enum SQLCaseType {
Literal, Placeholder
}
......@@ -165,13 +165,50 @@ public final class SQLCasesLoader {
return getSQLFromMap(sqlCaseId, supportedSQLCaseMap).replace("%s", "?").replace("%%", "%");
}
/**
* Get supported SQL.
*
* @param sqlCaseId SQL case ID
* @param sqlCaseType SQL case type
* @param parameters SQL parameters
* @return SQL
*/
public String getSupportedSQL(final String sqlCaseId, final SQLCaseType sqlCaseType, final List<?> parameters) {
return getSQL(supportedSQLCaseMap, sqlCaseId, sqlCaseType, parameters);
}
/**
* Get unsupported SQL.
*
* @param sqlCaseId SQL case ID
* @param sqlCaseType SQL case type
* @param parameters SQL parameters
* @return SQL
*/
public String getUnsupportedSQL(final String sqlCaseId) {
return getSQLFromMap(sqlCaseId, unsupportedSQLCaseMap);
public String getUnsupportedSQL(final String sqlCaseId, final SQLCaseType sqlCaseType, final List<?> parameters) {
return getSQL(unsupportedSQLCaseMap, sqlCaseId, sqlCaseType, parameters);
}
private String getSQL(final Map<String, SQLCase> sqlCaseMap, final String sqlCaseId, final SQLCaseType sqlCaseType, final List<?> parameters) {
switch (sqlCaseType) {
case Literal:
return getLiteralSQL(getSQLFromMap(sqlCaseId, sqlCaseMap), parameters);
case Placeholder:
return getPlaceholderSQL(getSQLFromMap(sqlCaseId, sqlCaseMap));
default:
throw new UnsupportedOperationException(sqlCaseType.name());
}
}
private String getPlaceholderSQL(final String sql) {
return sql.replace("%s", "?").replace("%%", "%");
}
private String getLiteralSQL(final String sql, final List<?> parameters) {
if (null == parameters || parameters.isEmpty()) {
return sql;
}
return String.format(sql, parameters.toArray()).replace("%%", "%");
}
private String getSQLFromMap(final String id, final Map<String, SQLCase> sqlCaseMap) {
......@@ -205,17 +242,27 @@ public final class SQLCasesLoader {
private Collection<Object[]> getTestParameters(final Map<String, SQLCase> sqlCaseMap, final Collection<? extends Enum> allDatabaseTypes, final Class<? extends Enum> enumType) {
Collection<Object[]> result = new LinkedList<>();
for (SQLCase each : sqlCaseMap.values()) {
result.addAll(getTestParameters(each, allDatabaseTypes, enumType));
result.addAll(getTestParameters(allDatabaseTypes, enumType, each));
}
return result;
}
private Collection<Object[]> getTestParameters(final Collection<? extends Enum> allDatabaseTypes, final Class<? extends Enum> enumType, final SQLCase sqlCase) {
Collection<Object[]> result = new LinkedList<>();
for (final SQLCaseType each : SQLCaseType.values()) {
result.addAll(getTestParameters(sqlCase, allDatabaseTypes, enumType, each));
}
return result;
}
private static Collection<Object[]> getTestParameters(final SQLCase sqlCase, final Collection<? extends Enum> allDatabaseTypes, final Class<? extends Enum> enumType) {
private static Collection<Object[]> getTestParameters(
final SQLCase sqlCase, final Collection<? extends Enum> allDatabaseTypes, final Class<? extends Enum> enumType, final SQLCaseType sqlCaseType) {
Collection<Object[]> result = new LinkedList<>();
for (Enum each : getDatabaseTypes(sqlCase.getDatabaseTypes(), allDatabaseTypes, enumType)) {
Object[] parameters = new Object[2];
Object[] parameters = new Object[3];
parameters[0] = sqlCase.getId();
parameters[1] = each;
parameters[2] = sqlCaseType;
result.add(parameters);
}
return result;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册