提交 01f5a950 编写于 作者: T terrymanu

refactor api for generate key, multiple keys => single key 3rd version

上级 fe0765d1
......@@ -19,16 +19,14 @@ package com.dangdang.ddframe.rdb.sharding.jdbc;
import com.dangdang.ddframe.rdb.sharding.jdbc.unsupported.AbstractUnsupportedGeneratedKeysResultSet;
import com.google.common.base.Preconditions;
import com.google.common.collect.Table;
import com.google.common.collect.TreeBasedTable;
import lombok.RequiredArgsConstructor;
import java.math.BigDecimal;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import java.util.Collections;
import java.util.Iterator;
/**
* 生成键结果集.
......@@ -38,46 +36,47 @@ import java.util.Map;
@RequiredArgsConstructor
public class GeneratedKeysResultSet extends AbstractUnsupportedGeneratedKeysResultSet {
private final Table<Integer, Integer, Object> valueTable;
private final Iterator<Number> generatedKeys;
private final Map<String, Integer> columnNameToIndexMap;
private final String generatedKeyColumn;
private final Statement statement;
private boolean isClosed;
private boolean closed;
private int rowIndex = -1;
private Number currentGeneratedKey;
public GeneratedKeysResultSet() {
valueTable = TreeBasedTable.create();
columnNameToIndexMap = new HashMap<>();
generatedKeys = Collections.<Number>emptyList().iterator();
generatedKeyColumn = null;
statement = null;
isClosed = true;
closed = true;
}
@Override
public boolean isClosed() throws SQLException {
return isClosed;
return closed;
}
@Override
public boolean next() throws SQLException {
if (isClosed()) {
if (closed || !generatedKeys.hasNext()) {
currentGeneratedKey = null;
return false;
}
rowIndex++;
return rowIndex + 1 <= valueTable.rowKeySet().size();
currentGeneratedKey = generatedKeys.next();
return true;
}
@Override
public void close() throws SQLException {
isClosed = true;
closed = true;
}
@Override
public ResultSetMetaData getMetaData() throws SQLException {
checkState();
return new GeneratedKeysResultSetMetaData(valueTable, columnNameToIndexMap);
return new GeneratedKeysResultSetMetaData(generatedKeyColumn);
}
@Override
......@@ -88,146 +87,129 @@ public class GeneratedKeysResultSet extends AbstractUnsupportedGeneratedKeysResu
@Override
public String getString(final int columnIndex) throws SQLException {
checkState();
return valueTable.get(rowIndex, columnIndex - 1).toString();
checkStateForGetData();
return currentGeneratedKey.toString();
}
@Override
public String getString(final String columnLabel) throws SQLException {
checkState();
return valueTable.get(rowIndex, findColumn(columnLabel)).toString();
return getString(1);
}
@Override
public byte getByte(final int columnIndex) throws SQLException {
checkState();
return getNumberValue(columnIndex - 1).byteValue();
checkStateForGetData();
return currentGeneratedKey.byteValue();
}
@Override
public byte getByte(final String columnLabel) throws SQLException {
checkState();
return getNumberValue(findColumn(columnLabel)).byteValue();
return getByte(1);
}
@Override
public short getShort(final int columnIndex) throws SQLException {
checkState();
return getNumberValue(columnIndex - 1).shortValue();
checkStateForGetData();
return currentGeneratedKey.shortValue();
}
@Override
public short getShort(final String columnLabel) throws SQLException {
checkState();
return getNumberValue(findColumn(columnLabel)).shortValue();
return getShort(1);
}
@Override
public int getInt(final int columnIndex) throws SQLException {
checkState();
return getNumberValue(columnIndex - 1).intValue();
checkStateForGetData();
return currentGeneratedKey.intValue();
}
@Override
public int getInt(final String columnLabel) throws SQLException {
checkState();
return getNumberValue(findColumn(columnLabel)).intValue();
return getInt(1);
}
@Override
public long getLong(final int columnIndex) throws SQLException {
checkState();
return getNumberValue(columnIndex - 1).longValue();
checkStateForGetData();
return currentGeneratedKey.longValue();
}
@Override
public long getLong(final String columnLabel) throws SQLException {
checkState();
return getNumberValue(findColumn(columnLabel)).longValue();
return getLong(1);
}
@Override
public float getFloat(final int columnIndex) throws SQLException {
checkState();
return getNumberValue(columnIndex - 1).floatValue();
checkStateForGetData();
return currentGeneratedKey.floatValue();
}
@Override
public float getFloat(final String columnLabel) throws SQLException {
checkState();
return getNumberValue(findColumn(columnLabel)).floatValue();
return getFloat(1);
}
@Override
public double getDouble(final int columnIndex) throws SQLException {
checkState();
return getNumberValue(columnIndex - 1).doubleValue();
checkStateForGetData();
return currentGeneratedKey.doubleValue();
}
@Override
public double getDouble(final String columnLabel) throws SQLException {
checkState();
return getNumberValue(findColumn(columnLabel)).doubleValue();
return getDouble(1);
}
@Override
public BigDecimal getBigDecimal(final int columnIndex, final int scale) throws SQLException {
checkState();
return new BigDecimal(getNumberValue(columnIndex - 1).longValue()).setScale(scale, BigDecimal.ROUND_HALF_UP);
checkStateForGetData();
return new BigDecimal(currentGeneratedKey.longValue()).setScale(scale, BigDecimal.ROUND_HALF_UP);
}
@Override
public BigDecimal getBigDecimal(final String columnLabel, final int scale) throws SQLException {
checkState();
return new BigDecimal(getNumberValue(findColumn(columnLabel)).longValue()).setScale(scale, BigDecimal.ROUND_HALF_UP);
return getBigDecimal(1, scale);
}
@Override
public BigDecimal getBigDecimal(final int columnIndex) throws SQLException {
checkState();
return new BigDecimal(getNumberValue(columnIndex - 1).longValue());
checkStateForGetData();
return new BigDecimal(currentGeneratedKey.longValue());
}
@Override
public BigDecimal getBigDecimal(final String columnLabel) throws SQLException {
checkState();
return new BigDecimal(getNumberValue(findColumn(columnLabel)).longValue());
}
private Number getNumberValue(final int columnIndex) {
Object value = valueTable.get(rowIndex, columnIndex);
Preconditions.checkState(value instanceof Number);
return (Number) value;
return getBigDecimal(1);
}
@Override
public byte[] getBytes(final int columnIndex) throws SQLException {
checkState();
checkStateForGetData();
return getString(columnIndex).getBytes();
}
@Override
public byte[] getBytes(final String columnLabel) throws SQLException {
checkState();
return getString(columnLabel).getBytes();
return getBytes(1);
}
@Override
public Object getObject(final int columnIndex) throws SQLException {
checkState();
return valueTable.get(rowIndex, columnIndex - 1);
checkStateForGetData();
return currentGeneratedKey;
}
@Override
public Object getObject(final String columnLabel) throws SQLException {
checkState();
return valueTable.get(rowIndex, findColumn(columnLabel));
return getObject(1);
}
@Override
public int findColumn(final String columnLabel) throws SQLException {
checkState();
return columnNameToIndexMap.get(columnLabel);
return 1;
}
@Override
......@@ -249,6 +231,11 @@ public class GeneratedKeysResultSet extends AbstractUnsupportedGeneratedKeysResu
}
private void checkState() throws SQLException {
Preconditions.checkState(!isClosed(), "ResultSet has closed");
Preconditions.checkState(!closed, "ResultSet has closed.");
}
private void checkStateForGetData() throws SQLException {
Preconditions.checkState(!closed, "ResultSet has closed.");
Preconditions.checkNotNull(currentGeneratedKey, "ResultSet should call next or has no more data.");
}
}
......@@ -17,175 +17,146 @@
package com.dangdang.ddframe.rdb.sharding.jdbc;
import com.dangdang.ddframe.rdb.sharding.jdbc.adapter.WrapperAdapter;
import com.google.common.base.Preconditions;
import com.google.common.collect.Table;
import lombok.RequiredArgsConstructor;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;
/**
* 生成键结果集元数据.
*
* @author gaohongtao
*/
class GeneratedKeysResultSetMetaData implements ResultSetMetaData {
@RequiredArgsConstructor
class GeneratedKeysResultSetMetaData extends WrapperAdapter implements ResultSetMetaData {
private final Map<Integer, String> indexToColumnNameMap = new HashMap<>();
private final Table<Integer, Integer, Object> autoIncrementValueTable;
GeneratedKeysResultSetMetaData(final Table<Integer, Integer, Object> autoIncrementValueTable, final Map<String, Integer> autoIncrementColumnNameToIndexMap) {
this.autoIncrementValueTable = autoIncrementValueTable;
for (Map.Entry<String, Integer> each : autoIncrementColumnNameToIndexMap.entrySet()) {
indexToColumnNameMap.put(each.getValue(), each.getKey());
}
}
private final String generatedKeyColumn;
@Override
public int getColumnCount() throws SQLException {
return indexToColumnNameMap.size();
return 1;
}
@Override
public boolean isAutoIncrement(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return true;
}
@Override
public boolean isCaseSensitive(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return true;
}
@Override
public boolean isSearchable(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return false;
}
@Override
public boolean isCurrency(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return false;
}
@Override
public int isNullable(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return columnNoNulls;
}
@Override
public boolean isSigned(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return true;
}
@Override
public int getColumnDisplaySize(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return 0;
}
@Override
public String getColumnLabel(final int column) throws SQLException {
checkIndex(column);
return indexToColumnNameMap.get(column - 1);
Preconditions.checkArgument(column == 1);
return generatedKeyColumn;
}
@Override
public String getColumnName(final int column) throws SQLException {
checkIndex(column);
return indexToColumnNameMap.get(column - 1);
Preconditions.checkArgument(column == 1);
return generatedKeyColumn;
}
@Override
public String getSchemaName(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return "";
}
@Override
public int getPrecision(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return 0;
}
@Override
public int getScale(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return 0;
}
@Override
public String getTableName(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return "";
}
@Override
public String getCatalogName(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return "";
}
@Override
public int getColumnType(final int column) throws SQLException {
checkIndex(column);
Object value = autoIncrementValueTable.get(0, column - 1);
return value instanceof Number ? Types.BIGINT : Types.VARCHAR;
Preconditions.checkArgument(column == 1);
return Types.BIGINT;
}
@Override
public String getColumnTypeName(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return "";
}
@Override
public boolean isReadOnly(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return true;
}
@Override
public boolean isWritable(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return false;
}
@Override
public boolean isDefinitelyWritable(final int column) throws SQLException {
checkIndex(column);
Preconditions.checkArgument(column == 1);
return false;
}
@Override
public String getColumnClassName(final int column) throws SQLException {
checkIndex(column);
Object value = autoIncrementValueTable.get(0, column - 1);
return value.getClass().getName();
}
@Override
@SuppressWarnings("unchecked")
public <T> T unwrap(final Class<T> iface) throws SQLException {
if (isWrapperFor(iface)) {
return (T) this;
}
throw new SQLException(String.format("[%s] cannot be unwrapped as [%s]", getClass().getName(), iface.getName()));
}
@Override
public boolean isWrapperFor(final Class<?> iface) throws SQLException {
return iface.isInstance(this);
}
private void checkIndex(final int column) {
Preconditions.checkArgument(column >= 1 && column <= indexToColumnNameMap.size());
Preconditions.checkArgument(column == 1);
return Number.class.getName();
}
}
......@@ -33,6 +33,7 @@ import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
......@@ -49,11 +50,7 @@ public final class ShardingPreparedStatement extends AbstractPreparedStatementAd
private final List<PreparedStatementExecutorWrapper> cachedPreparedStatementWrappers = new ArrayList<>();
private Integer autoGeneratedKeys;
private int[] columnIndexes;
private String[] columnNames;
private boolean autoGeneratedKeys;
private int batchIndex;
......@@ -74,17 +71,17 @@ public final class ShardingPreparedStatement extends AbstractPreparedStatementAd
ShardingPreparedStatement(final ShardingConnection shardingConnection, final String sql, final int autoGeneratedKeys) {
this(shardingConnection, sql);
this.autoGeneratedKeys = autoGeneratedKeys;
this.autoGeneratedKeys = Statement.RETURN_GENERATED_KEYS == autoGeneratedKeys;
}
ShardingPreparedStatement(final ShardingConnection shardingConnection, final String sql, final int[] columnIndexes) {
this(shardingConnection, sql);
this.columnIndexes = columnIndexes;
autoGeneratedKeys = true;
}
ShardingPreparedStatement(final ShardingConnection shardingConnection, final String sql, final String[] columnNames) {
this(shardingConnection, sql);
this.columnNames = columnNames;
autoGeneratedKeys = true;
}
@Override
......@@ -137,10 +134,6 @@ public final class ShardingPreparedStatement extends AbstractPreparedStatementAd
each.mapBatchIndex(batchIndex);
}
batchIndex++;
Optional<GeneratedKeyContext> generatedKeyContext = getGeneratedKeyContext();
if (generatedKeyContext.isPresent()) {
generatedKeyContext.get().addRow();
}
} finally {
resetBatch();
}
......@@ -192,23 +185,9 @@ public final class ShardingPreparedStatement extends AbstractPreparedStatementAd
protected BackendStatementWrapper generateStatement(final Connection conn, final String shardingSql) throws SQLException {
Optional<GeneratedKeyContext> generatedKeyContext = getGeneratedKeyContext();
if (null != autoGeneratedKeys) {
if (generatedKeyContext.isPresent()) {
generatedKeyContext.get().setAutoGeneratedKeys(autoGeneratedKeys);
}
return new BackendPreparedStatementWrapper(conn.prepareStatement(shardingSql, autoGeneratedKeys), shardingSql);
}
if (null != columnIndexes) {
if (generatedKeyContext.isPresent()) {
generatedKeyContext.get().setColumnIndexes(columnIndexes);
}
return new BackendPreparedStatementWrapper(conn.prepareStatement(shardingSql, columnIndexes), shardingSql);
}
if (null != columnNames) {
if (generatedKeyContext.isPresent()) {
generatedKeyContext.get().setColumnNames(columnNames);
}
return new BackendPreparedStatementWrapper(conn.prepareStatement(shardingSql, columnNames), shardingSql);
if (autoGeneratedKeys && generatedKeyContext.isPresent()) {
generatedKeyContext.get().setAutoGeneratedKeys(true);
return new BackendPreparedStatementWrapper(conn.prepareStatement(shardingSql, Statement.RETURN_GENERATED_KEYS), shardingSql);
}
if (0 != getResultSetHoldability()) {
return new BackendPreparedStatementWrapper(conn.prepareStatement(shardingSql, getResultSetType(), getResultSetConcurrency(), getResultSetHoldability()), shardingSql);
......
......@@ -31,8 +31,6 @@ import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import com.google.common.collect.Table;
import com.google.common.collect.TreeBasedTable;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
......@@ -47,7 +45,6 @@ import java.util.Deque;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* 支持分片的静态语句对象.
......@@ -138,8 +135,8 @@ public class ShardingStatement extends AbstractStatementAdapter {
return generateExecutor(sql).executeUpdate(autoGeneratedKeys);
} finally {
Optional<GeneratedKeyContext> generatedKeyContext = getGeneratedKeyContext();
if (generatedKeyContext.isPresent()) {
generatedKeyContext.get().setAutoGeneratedKeys(autoGeneratedKeys);
if (generatedKeyContext.isPresent() && Statement.RETURN_GENERATED_KEYS == autoGeneratedKeys) {
generatedKeyContext.get().setAutoGeneratedKeys(true);
}
clearRouteContext();
}
......@@ -152,7 +149,7 @@ public class ShardingStatement extends AbstractStatementAdapter {
} finally {
Optional<GeneratedKeyContext> generatedKeyContext = getGeneratedKeyContext();
if (generatedKeyContext.isPresent()) {
generatedKeyContext.get().setColumnIndexes(columnIndexes);
generatedKeyContext.get().setAutoGeneratedKeys(true);
}
clearRouteContext();
}
......@@ -165,7 +162,7 @@ public class ShardingStatement extends AbstractStatementAdapter {
} finally {
Optional<GeneratedKeyContext> generatedKeyContext = getGeneratedKeyContext();
if (generatedKeyContext.isPresent()) {
generatedKeyContext.get().setColumnNames(columnNames);
generatedKeyContext.get().setAutoGeneratedKeys(true);
}
clearRouteContext();
}
......@@ -186,8 +183,8 @@ public class ShardingStatement extends AbstractStatementAdapter {
return generateExecutor(sql).execute(autoGeneratedKeys);
} finally {
Optional<GeneratedKeyContext> generatedKeyContext = getGeneratedKeyContext();
if (generatedKeyContext.isPresent()) {
generatedKeyContext.get().setAutoGeneratedKeys(autoGeneratedKeys);
if (generatedKeyContext.isPresent() && Statement.RETURN_GENERATED_KEYS == autoGeneratedKeys) {
generatedKeyContext.get().setAutoGeneratedKeys(true);
}
clearRouteContext();
}
......@@ -200,7 +197,7 @@ public class ShardingStatement extends AbstractStatementAdapter {
} finally {
Optional<GeneratedKeyContext> generatedKeyContext = getGeneratedKeyContext();
if (generatedKeyContext.isPresent()) {
generatedKeyContext.get().setColumnIndexes(columnIndexes);
generatedKeyContext.get().setAutoGeneratedKeys(true);
}
clearRouteContext();
}
......@@ -213,7 +210,7 @@ public class ShardingStatement extends AbstractStatementAdapter {
} finally {
Optional<GeneratedKeyContext> generatedKeyContext = getGeneratedKeyContext();
if (generatedKeyContext.isPresent()) {
generatedKeyContext.get().setColumnNames(columnNames);
generatedKeyContext.get().setAutoGeneratedKeys(true);
}
clearRouteContext();
}
......@@ -232,42 +229,10 @@ public class ShardingStatement extends AbstractStatementAdapter {
}
return generatedKeysResultSet = new GeneratedKeysResultSet();
}
if (Statement.RETURN_GENERATED_KEYS != generatedKeyContext.get().getAutoGeneratedKeys()
&& null == generatedKeyContext.get().getColumnIndexes() && null == generatedKeyContext.get().getColumnNames()) {
if (!generatedKeyContext.get().isAutoGeneratedKeys()) {
return generatedKeysResultSet = new GeneratedKeysResultSet();
}
return generatedKeysResultSet = new GeneratedKeysResultSet(generateAutoIncrementTable(generatedKeyContext.get()), generatedKeyContext.get().getColumnNameToIndexMap(), this);
}
private Table<Integer, Integer, Object> generateAutoIncrementTable(final GeneratedKeyContext generatedKeyContext) {
if (null != generatedKeyContext.getColumnIndexes()) {
return subTable(generatedKeyContext, generatedKeyContext.getColumnIndexes());
} else if (null != generatedKeyContext.getColumnNames()) {
List<Integer> columnIndexes = new ArrayList<>(generatedKeyContext.getColumnNames().length);
for (String each : generatedKeyContext.getColumnNames()) {
if (!generatedKeyContext.getColumnNameToIndexMap().containsKey(each)) {
continue;
}
columnIndexes.add(generatedKeyContext.getColumnNameToIndexMap().get(each) + 1);
}
int[] parameter = new int[columnIndexes.size()];
int index = 0;
for (Integer each : columnIndexes) {
parameter[index++] = each;
}
return subTable(generatedKeyContext, parameter);
}
return generatedKeyContext.getValueTable();
}
private Table<Integer, Integer, Object> subTable(final GeneratedKeyContext generatedKeyContext, final int[] columnIndexes) {
Table<Integer, Integer, Object> result = TreeBasedTable.create();
for (int each : columnIndexes) {
for (Map.Entry<Integer, Object> eachEntry : generatedKeyContext.getValueTable().column(each - 1).entrySet()) {
result.put(eachEntry.getKey(), each - 1, eachEntry.getValue());
}
}
return result;
return generatedKeysResultSet = new GeneratedKeysResultSet(generatedKeyContext.get().getValues().iterator(), generatedKeyContext.get().getColumn(), this);
}
protected final Optional<GeneratedKeyContext> getGeneratedKeyContext() {
......
......@@ -17,15 +17,13 @@
package com.dangdang.ddframe.rdb.sharding.parsing.parser.context;
import com.google.common.collect.Table;
import com.google.common.collect.TreeBasedTable;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.util.HashMap;
import java.util.Map;
import java.util.LinkedList;
import java.util.List;
/**
* 自动生成键上下文.
......@@ -33,51 +31,14 @@ import java.util.Map;
* @author gaohongtao
*/
@RequiredArgsConstructor
@Getter
@ToString
public final class GeneratedKeyContext {
@Getter
private final String column;
@Getter
private final Map<String, Integer> columnNameToIndexMap = new HashMap<>();
@Getter
private final Table<Integer, Integer, Object> valueTable = TreeBasedTable.create();
private int rowIndex;
private int columnIndex;
@Setter
@Getter
private int autoGeneratedKeys;
private final List<Number> values = new LinkedList<>();
@Setter
@Getter
private int[] columnIndexes;
@Setter
@Getter
private String[] columnNames;
/**
* 放入生成的键值.
*
* @param columnName 列名称
* @param value 键值
*/
public void putValue(final String columnName, final Number value) {
valueTable.put(rowIndex, columnIndex, value);
columnNameToIndexMap.put(columnName, columnIndex);
columnIndex++;
}
/**
* 结果集增加一行.
*/
public void addRow() {
rowIndex++;
columnIndex = 0;
}
private boolean autoGeneratedKeys;
}
......@@ -98,7 +98,7 @@ public final class InsertSQLContext extends AbstractSQLContext {
generatedKey = null;
}
result.put(generatedKeyContext.getColumn(), generatedKey);
generatedKeyContext.putValue(generatedKeyContext.getColumn(), generatedKey);
generatedKeyContext.getValues().add(generatedKey);
return result;
}
......
......@@ -19,11 +19,14 @@ package com.dangdang.ddframe.rdb.sharding.jdbc;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import javax.sql.rowset.RowSetMetaDataImpl;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Arrays;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertEquals;
......@@ -37,132 +40,112 @@ public class GeneratedKeysResultSetMetaDataTest {
@Before
public void init() throws SQLException {
actualMetaData = GeneratedKeysResultSetTest.createMock().getMetaData();
actualMetaData = new GeneratedKeysResultSet(Arrays.<Number>asList(1L, 2L).iterator(), "order_id", Mockito.mock(Statement.class)).getMetaData();
}
@Test
public void getColumnCount() throws Exception {
assertThat(actualMetaData.getColumnCount(), is(2));
assertThat(actualMetaData.getColumnCount(), is(1));
}
@Test
public void isAutoIncrement() throws Exception {
assertTrue(actualMetaData.isAutoIncrement(1));
assertTrue(actualMetaData.isAutoIncrement(2));
}
@Test
public void isCaseSensitive() throws Exception {
assertTrue(actualMetaData.isCaseSensitive(1));
assertTrue(actualMetaData.isCaseSensitive(2));
}
@Test
public void isSearchable() throws Exception {
assertFalse(actualMetaData.isSearchable(1));
assertFalse(actualMetaData.isSearchable(2));
}
@Test
public void isCurrency() throws Exception {
assertFalse(actualMetaData.isCurrency(1));
assertFalse(actualMetaData.isCurrency(2));
}
@Test
public void isNullable() throws Exception {
assertEquals(actualMetaData.isNullable(1), ResultSetMetaData.columnNoNulls);
assertEquals(actualMetaData.isNullable(2), ResultSetMetaData.columnNoNulls);
}
@Test
public void isSigned() throws Exception {
assertTrue(actualMetaData.isSigned(1));
assertTrue(actualMetaData.isSigned(2));
}
@Test
public void getColumnDisplaySize() throws Exception {
assertEquals(actualMetaData.getColumnDisplaySize(1), 0);
assertEquals(actualMetaData.getColumnDisplaySize(2), 0);
}
@Test
public void getColumnLabel() throws Exception {
assertThat(actualMetaData.getColumnLabel(1), is("order_id"));
assertThat(actualMetaData.getColumnLabel(2), is("order_no"));
}
@Test
public void getColumnName() throws Exception {
assertThat(actualMetaData.getColumnName(1), is("order_id"));
assertThat(actualMetaData.getColumnName(2), is("order_no"));
}
@Test
public void getSchemaName() throws Exception {
assertThat(actualMetaData.getSchemaName(1), is(""));
assertThat(actualMetaData.getSchemaName(2), is(""));
}
@Test
public void getPrecision() throws Exception {
assertEquals(actualMetaData.getPrecision(1), 0);
assertEquals(actualMetaData.getPrecision(2), 0);
}
@Test
public void getScale() throws Exception {
assertEquals(actualMetaData.getScale(1), 0);
assertEquals(actualMetaData.getScale(2), 0);
}
@Test
public void getTableName() throws Exception {
assertThat(actualMetaData.getTableName(1), is(""));
assertThat(actualMetaData.getTableName(2), is(""));
}
@Test
public void getCatalogName() throws Exception {
assertThat(actualMetaData.getCatalogName(1), is(""));
assertThat(actualMetaData.getCatalogName(2), is(""));
}
@Test
public void getColumnType() throws Exception {
assertEquals(actualMetaData.getColumnType(1), Types.BIGINT);
assertEquals(actualMetaData.getColumnType(2), Types.VARCHAR);
assertThat(actualMetaData.getColumnType(1), is(Types.BIGINT));
}
@Test
public void getColumnTypeName() throws Exception {
assertThat(actualMetaData.getColumnTypeName(1), is(""));
assertThat(actualMetaData.getColumnTypeName(2), is(""));
}
@Test
public void isReadOnly() throws Exception {
assertTrue(actualMetaData.isReadOnly(1));
assertTrue(actualMetaData.isReadOnly(2));
}
@Test
public void isWritable() throws Exception {
assertFalse(actualMetaData.isWritable(1));
assertFalse(actualMetaData.isWritable(2));
}
@Test
public void isDefinitelyWritable() throws Exception {
assertFalse(actualMetaData.isDefinitelyWritable(1));
assertFalse(actualMetaData.isDefinitelyWritable(2));
}
@Test
public void getColumnClassName() throws Exception {
assertThat(actualMetaData.getColumnClassName(1), is("java.lang.Long"));
assertThat(actualMetaData.getColumnClassName(2), is("java.lang.String"));
assertThat(actualMetaData.getColumnClassName(1), is("java.lang.Number"));
}
@Test
......@@ -179,5 +162,4 @@ public class GeneratedKeysResultSetMetaDataTest {
public void isWrapperFor() throws Exception {
assertTrue(actualMetaData.isWrapperFor(GeneratedKeysResultSetMetaData.class));
}
}
......@@ -17,8 +17,6 @@
package com.dangdang.ddframe.rdb.sharding.jdbc;
import com.google.common.collect.Table;
import com.google.common.collect.TreeBasedTable;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
......@@ -26,8 +24,7 @@ import org.mockito.Mockito;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import java.util.Arrays;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
......@@ -41,21 +38,9 @@ public class GeneratedKeysResultSetTest {
private GeneratedKeysResultSet actualResultSet;
static GeneratedKeysResultSet createMock() {
Map<String, Integer> columnMap = new HashMap<>();
columnMap.put("order_id", 0);
columnMap.put("order_no", 1);
Table<Integer, Integer, Object> valueTable = TreeBasedTable.create();
valueTable.put(0, 0, 1L);
valueTable.put(0, 1, "OL_1");
valueTable.put(1, 0, 2L);
valueTable.put(1, 1, "OL_2");
return new GeneratedKeysResultSet(valueTable, columnMap, STATEMENT);
}
@Before
public void init() {
actualResultSet = createMock();
actualResultSet = new GeneratedKeysResultSet(Arrays.<Number>asList(1L, 2L).iterator(), "order_id", STATEMENT);
}
@Test
......@@ -87,9 +72,9 @@ public class GeneratedKeysResultSetTest {
@Test
public void getString() throws Exception {
assertTrue(actualResultSet.next());
assertThat(actualResultSet.getString(2), is("OL_1"));
assertThat(actualResultSet.getString(1), is("1"));
assertTrue(actualResultSet.next());
assertThat(actualResultSet.getString("order_no"), is("OL_2"));
assertThat(actualResultSet.getString("order_id"), is("2"));
assertFalse(actualResultSet.next());
}
......@@ -161,18 +146,18 @@ public class GeneratedKeysResultSetTest {
@Test
public void getBytes() throws Exception {
assertTrue(actualResultSet.next());
assertThat(actualResultSet.getBytes(2), is("OL_1".getBytes()));
assertThat(actualResultSet.getBytes(1), is("1".getBytes()));
assertTrue(actualResultSet.next());
assertThat(actualResultSet.getBytes("order_no"), is("OL_2".getBytes()));
assertThat(actualResultSet.getBytes("order_id"), is("2".getBytes()));
assertFalse(actualResultSet.next());
}
@Test
public void getObject() throws Exception {
assertTrue(actualResultSet.next());
assertThat(actualResultSet.getObject(2), is((Object) "OL_1"));
assertThat(actualResultSet.getObject(1), is((Object) 1L));
assertTrue(actualResultSet.next());
assertThat(actualResultSet.getObject("order_no"), is((Object) "OL_2"));
assertThat(actualResultSet.getObject("order_id"), is((Object) 2L));
assertFalse(actualResultSet.next());
}
......@@ -190,5 +175,4 @@ public class GeneratedKeysResultSetTest {
public void getStatement() throws Exception {
assertThat(actualResultSet.getStatement(), is(STATEMENT));
}
}
......@@ -27,7 +27,6 @@ import java.sql.SQLException;
import java.sql.Statement;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
......@@ -198,17 +197,19 @@ public final class ShardingStatementTest extends AbstractShardingDataBasesOnlyDB
assertFalse(stmt.getGeneratedKeys().next());
assertFalse(stmt.execute(String.format(sql, 1, "init"), Statement.RETURN_GENERATED_KEYS));
assertTrue(stmt.getGeneratedKeys().next());
assertEquals(stmt.getGeneratedKeys().getLong(1), 3);
assertThat(stmt.getGeneratedKeys().getLong(1), is(3L));
assertFalse(stmt.execute(String.format(sql, 1, "init"), new int[]{1}));
assertTrue(stmt.getGeneratedKeys().next());
assertEquals(stmt.getGeneratedKeys().getLong(1), 4);
assertThat(stmt.getGeneratedKeys().getLong(1), is(4L));
assertFalse(stmt.execute(String.format(sql, 1, "init"), new String[]{"user_id"}));
assertTrue(stmt.getGeneratedKeys().next());
assertEquals(stmt.getGeneratedKeys().getLong(1), 5);
assertThat(stmt.getGeneratedKeys().getLong(1), is(5L));
assertFalse(stmt.execute(String.format(sql, 1, "init"), new int[]{2}));
assertFalse(stmt.getGeneratedKeys().next());
assertTrue(stmt.getGeneratedKeys().next());
assertThat(stmt.getGeneratedKeys().getLong(1), is(6L));
assertFalse(stmt.execute(String.format(sql, 1, "init"), new String[]{"no"}));
assertFalse(stmt.getGeneratedKeys().next());
assertTrue(stmt.getGeneratedKeys().next());
assertThat(stmt.getGeneratedKeys().getLong(1), is(7L));
}
}
}
......@@ -19,7 +19,7 @@ package com.dangdang.ddframe.rdb.sharding.util;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
public class SQLUtilTest {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册