Commit f148a637 authored by terrymanu's avatar terrymanu
Browse files

refactor generateColumnLabelIndexMap to ResultSetUtil

parent 7af99396
Loading
Loading
Loading
Loading
+0 −17
Original line number Diff line number Diff line
@@ -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;

/**
 * 代理结果集适配器.
@@ -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
+4 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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());
+7 −3
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.List;
import java.util.Map;

/**
 * 内存结果集抽象类.
@@ -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());
    }
    
@@ -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
+22 −0
Original line number Diff line number Diff line
@@ -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;

/**
 * 结果集工具类.
@@ -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;
    }
}