Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/adapter/AbstractResultSetAdapter.java +0 −17 Original line number Diff line number Diff line Loading @@ -18,19 +18,15 @@ package com.dangdang.ddframe.rdb.sharding.jdbc.adapter; import com.dangdang.ddframe.rdb.sharding.jdbc.unsupported.AbstractUnsupportedOperationResultSet; import com.dangdang.ddframe.rdb.sharding.util.SQLUtil; import com.google.common.base.Preconditions; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * 代理结果集适配器. Loading @@ -43,24 +39,11 @@ public abstract class AbstractResultSetAdapter extends AbstractUnsupportedOperat @Getter private final List<ResultSet> resultSets; @Getter private final Map<String, Integer> columnLabelIndexMap; private boolean closed; public AbstractResultSetAdapter(final List<ResultSet> resultSets) throws SQLException { Preconditions.checkArgument(!resultSets.isEmpty()); this.resultSets = resultSets; columnLabelIndexMap = generateColumnLabelIndexMap(); } private Map<String, Integer> generateColumnLabelIndexMap() throws SQLException { ResultSetMetaData resultSetMetaData = resultSets.get(0).getMetaData(); Map<String, Integer> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) { result.put(SQLUtil.getExactlyValue(resultSetMetaData.getColumnLabel(i)), i); } return result; } @Override Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/merger/ResultSetMergeContext.java +4 −3 Original line number Diff line number Diff line Loading @@ -17,13 +17,14 @@ package com.dangdang.ddframe.rdb.sharding.merger; import com.dangdang.ddframe.rdb.sharding.jdbc.adapter.AbstractResultSetAdapter; import com.dangdang.ddframe.rdb.sharding.merger.util.ResultSetUtil; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.OrderItem; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.AggregationSelectItem; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatement; import com.google.common.base.Preconditions; import lombok.Getter; import java.sql.SQLException; import java.util.LinkedList; import java.util.List; import java.util.Map; Loading @@ -42,11 +43,11 @@ public final class ResultSetMergeContext { private final List<OrderItem> currentOrderByKeys; public ResultSetMergeContext(final ShardingResultSets shardingResultSets, final SQLStatement sqlStatement) { public ResultSetMergeContext(final ShardingResultSets shardingResultSets, final SQLStatement sqlStatement) throws SQLException { this.shardingResultSets = shardingResultSets; this.sqlStatement = sqlStatement; currentOrderByKeys = new LinkedList<>(sqlStatement.getOrderByList()); Map<String, Integer> columnLabelIndexMap = ((AbstractResultSetAdapter) shardingResultSets.getResultSets().get(0)).getColumnLabelIndexMap(); Map<String, Integer> columnLabelIndexMap = ResultSetUtil.getColumnLabelIndexMap(shardingResultSets.getResultSets().get(0)); setIndexForAggregationItem(columnLabelIndexMap); setIndexForOrderItem(columnLabelIndexMap, sqlStatement.getOrderByList()); setIndexForOrderItem(columnLabelIndexMap, sqlStatement.getGroupByList()); Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/merger/resultset/memory/AbstractMemoryResultSet.java +7 −3 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; import java.util.List; import java.util.Map; /** * 内存结果集抽象类. Loading @@ -56,8 +57,11 @@ public abstract class AbstractMemoryResultSet extends AbstractUnsupportedOperati private boolean wasNull; private final Map<String, Integer> columnLabelIndexMap; public AbstractMemoryResultSet(final List<ResultSet> resultSets) throws SQLException { super(resultSets); columnLabelIndexMap = ResultSetUtil.getColumnLabelIndexMap(getResultSets().get(0)); log.debug("{} join pipeline", hashCode()); } Loading Loading @@ -87,11 +91,11 @@ public abstract class AbstractMemoryResultSet extends AbstractUnsupportedOperati @Override public int findColumn(final String columnLabel) throws SQLException { String formattedColumnLabel = getColumnLabelIndexMap().containsKey(columnLabel) ? columnLabel : SQLUtil.getExactlyValue(columnLabel); if (!getColumnLabelIndexMap().containsKey(formattedColumnLabel)) { String formattedColumnLabel = ResultSetUtil.getColumnLabelIndexMap(getResultSets().get(0)).containsKey(columnLabel) ? columnLabel : SQLUtil.getExactlyValue(columnLabel); if (!columnLabelIndexMap.containsKey(formattedColumnLabel)) { throw new SQLException(String.format("Column label %s does not exist", formattedColumnLabel)); } return getColumnLabelIndexMap().get(formattedColumnLabel); return columnLabelIndexMap.get(formattedColumnLabel); } @Override Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/merger/util/ResultSetUtil.java +22 −0 Original line number Diff line number Diff line Loading @@ -18,13 +18,19 @@ package com.dangdang.ddframe.rdb.sharding.merger.util; import com.dangdang.ddframe.rdb.sharding.exception.ShardingJdbcException; import com.dangdang.ddframe.rdb.sharding.util.SQLUtil; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.util.Date; import java.util.Map; import java.util.TreeMap; /** * 结果集工具类. Loading Loading @@ -119,4 +125,20 @@ public final class ResultSetUtil { throw new ShardingJdbcException("Unsupported Date type:%s", convertType); } } /** * 获取结果集的列标签与索引的映射. * * @param resultSet 结果集对象 * @return 列标签与索引的映射 * @throws SQLException SQL异常 */ public static Map<String, Integer> getColumnLabelIndexMap(final ResultSet resultSet) throws SQLException { ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); Map<String, Integer> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) { result.put(SQLUtil.getExactlyValue(resultSetMetaData.getColumnLabel(i)), i); } return result; } } Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/adapter/AbstractResultSetAdapter.java +0 −17 Original line number Diff line number Diff line Loading @@ -18,19 +18,15 @@ package com.dangdang.ddframe.rdb.sharding.jdbc.adapter; import com.dangdang.ddframe.rdb.sharding.jdbc.unsupported.AbstractUnsupportedOperationResultSet; import com.dangdang.ddframe.rdb.sharding.util.SQLUtil; import com.google.common.base.Preconditions; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * 代理结果集适配器. Loading @@ -43,24 +39,11 @@ public abstract class AbstractResultSetAdapter extends AbstractUnsupportedOperat @Getter private final List<ResultSet> resultSets; @Getter private final Map<String, Integer> columnLabelIndexMap; private boolean closed; public AbstractResultSetAdapter(final List<ResultSet> resultSets) throws SQLException { Preconditions.checkArgument(!resultSets.isEmpty()); this.resultSets = resultSets; columnLabelIndexMap = generateColumnLabelIndexMap(); } private Map<String, Integer> generateColumnLabelIndexMap() throws SQLException { ResultSetMetaData resultSetMetaData = resultSets.get(0).getMetaData(); Map<String, Integer> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) { result.put(SQLUtil.getExactlyValue(resultSetMetaData.getColumnLabel(i)), i); } return result; } @Override Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/merger/ResultSetMergeContext.java +4 −3 Original line number Diff line number Diff line Loading @@ -17,13 +17,14 @@ package com.dangdang.ddframe.rdb.sharding.merger; import com.dangdang.ddframe.rdb.sharding.jdbc.adapter.AbstractResultSetAdapter; import com.dangdang.ddframe.rdb.sharding.merger.util.ResultSetUtil; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.OrderItem; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.AggregationSelectItem; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatement; import com.google.common.base.Preconditions; import lombok.Getter; import java.sql.SQLException; import java.util.LinkedList; import java.util.List; import java.util.Map; Loading @@ -42,11 +43,11 @@ public final class ResultSetMergeContext { private final List<OrderItem> currentOrderByKeys; public ResultSetMergeContext(final ShardingResultSets shardingResultSets, final SQLStatement sqlStatement) { public ResultSetMergeContext(final ShardingResultSets shardingResultSets, final SQLStatement sqlStatement) throws SQLException { this.shardingResultSets = shardingResultSets; this.sqlStatement = sqlStatement; currentOrderByKeys = new LinkedList<>(sqlStatement.getOrderByList()); Map<String, Integer> columnLabelIndexMap = ((AbstractResultSetAdapter) shardingResultSets.getResultSets().get(0)).getColumnLabelIndexMap(); Map<String, Integer> columnLabelIndexMap = ResultSetUtil.getColumnLabelIndexMap(shardingResultSets.getResultSets().get(0)); setIndexForAggregationItem(columnLabelIndexMap); setIndexForOrderItem(columnLabelIndexMap, sqlStatement.getOrderByList()); setIndexForOrderItem(columnLabelIndexMap, sqlStatement.getGroupByList()); Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/merger/resultset/memory/AbstractMemoryResultSet.java +7 −3 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; import java.util.List; import java.util.Map; /** * 内存结果集抽象类. Loading @@ -56,8 +57,11 @@ public abstract class AbstractMemoryResultSet extends AbstractUnsupportedOperati private boolean wasNull; private final Map<String, Integer> columnLabelIndexMap; public AbstractMemoryResultSet(final List<ResultSet> resultSets) throws SQLException { super(resultSets); columnLabelIndexMap = ResultSetUtil.getColumnLabelIndexMap(getResultSets().get(0)); log.debug("{} join pipeline", hashCode()); } Loading Loading @@ -87,11 +91,11 @@ public abstract class AbstractMemoryResultSet extends AbstractUnsupportedOperati @Override public int findColumn(final String columnLabel) throws SQLException { String formattedColumnLabel = getColumnLabelIndexMap().containsKey(columnLabel) ? columnLabel : SQLUtil.getExactlyValue(columnLabel); if (!getColumnLabelIndexMap().containsKey(formattedColumnLabel)) { String formattedColumnLabel = ResultSetUtil.getColumnLabelIndexMap(getResultSets().get(0)).containsKey(columnLabel) ? columnLabel : SQLUtil.getExactlyValue(columnLabel); if (!columnLabelIndexMap.containsKey(formattedColumnLabel)) { throw new SQLException(String.format("Column label %s does not exist", formattedColumnLabel)); } return getColumnLabelIndexMap().get(formattedColumnLabel); return columnLabelIndexMap.get(formattedColumnLabel); } @Override Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/merger/util/ResultSetUtil.java +22 −0 Original line number Diff line number Diff line Loading @@ -18,13 +18,19 @@ package com.dangdang.ddframe.rdb.sharding.merger.util; import com.dangdang.ddframe.rdb.sharding.exception.ShardingJdbcException; import com.dangdang.ddframe.rdb.sharding.util.SQLUtil; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.util.Date; import java.util.Map; import java.util.TreeMap; /** * 结果集工具类. Loading Loading @@ -119,4 +125,20 @@ public final class ResultSetUtil { throw new ShardingJdbcException("Unsupported Date type:%s", convertType); } } /** * 获取结果集的列标签与索引的映射. * * @param resultSet 结果集对象 * @return 列标签与索引的映射 * @throws SQLException SQL异常 */ public static Map<String, Integer> getColumnLabelIndexMap(final ResultSet resultSet) throws SQLException { ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); Map<String, Integer> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) { result.put(SQLUtil.getExactlyValue(resultSetMetaData.getColumnLabel(i)), i); } return result; } }