Commit 0be05100 authored by terrymanu's avatar terrymanu
Browse files

add MergeEngineFactory

parent c239dc4e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ package io.shardingjdbc.core.merger;
import java.sql.SQLException;

/**
 * result set merge engine.
 * Result set merge engine.
 *
 * @author zhangliang
 */
+58 −0
Original line number Diff line number Diff line
/*
 * 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.core.merger;

import io.shardingjdbc.core.merger.dal.DALMergeEngine;
import io.shardingjdbc.core.merger.dql.DQLMergeEngine;
import io.shardingjdbc.core.parsing.parser.sql.SQLStatement;
import io.shardingjdbc.core.parsing.parser.sql.dal.DALStatement;
import io.shardingjdbc.core.parsing.parser.sql.dql.select.SelectStatement;
import io.shardingjdbc.core.rule.ShardingRule;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import java.sql.SQLException;
import java.util.List;

/**
 * Result merge engine factory.
 *
 * @author zhangliang
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class MergeEngineFactory {
    
    /**
     * Create merge engine instance.
     *
     * @param shardingRule sharding rule
     * @param queryResults query results
     * @param sqlStatement SQL statement
     * @return merge engine instance
     * @throws SQLException SQL exception
     */
    public static MergeEngine newInstance(final ShardingRule shardingRule, final List<QueryResult> queryResults, final SQLStatement sqlStatement) throws SQLException {
        if (sqlStatement instanceof SelectStatement) {
            return new DQLMergeEngine(queryResults, (SelectStatement) sqlStatement);
        } 
        if (sqlStatement instanceof DALStatement) {
            return new DALMergeEngine(shardingRule, queryResults, (DALStatement) sqlStatement);
        }
        throw new UnsupportedOperationException(String.format("Cannot support type '%s'", sqlStatement.getType()));
    }
}
+4 −17
Original line number Diff line number Diff line
@@ -30,10 +30,9 @@ import io.shardingjdbc.core.jdbc.core.ShardingContext;
import io.shardingjdbc.core.jdbc.core.connection.ShardingConnection;
import io.shardingjdbc.core.jdbc.core.resultset.GeneratedKeysResultSet;
import io.shardingjdbc.core.jdbc.core.resultset.ShardingResultSet;
import io.shardingjdbc.core.merger.dal.DALMergeEngine;
import io.shardingjdbc.core.merger.dql.DQLMergeEngine;
import io.shardingjdbc.core.merger.JDBCQueryResult;
import io.shardingjdbc.core.merger.MergeEngine;
import io.shardingjdbc.core.merger.MergeEngineFactory;
import io.shardingjdbc.core.merger.QueryResult;
import io.shardingjdbc.core.parsing.parser.context.GeneratedKey;
import io.shardingjdbc.core.parsing.parser.sql.dal.DALStatement;
@@ -127,14 +126,7 @@ public final class ShardingPreparedStatement extends AbstractShardingPreparedSta
            for (ResultSet each : resultSets) {
                queryResults.add(new JDBCQueryResult(each));
            }
            MergeEngine mergeEngine;
            if (routeResult.getSqlStatement() instanceof SelectStatement) {
                mergeEngine = new DQLMergeEngine(queryResults, (SelectStatement) routeResult.getSqlStatement());
            } else if (routeResult.getSqlStatement() instanceof DALStatement) {
                mergeEngine = new DALMergeEngine(connection.getShardingContext().getShardingRule(), queryResults, (DALStatement) routeResult.getSqlStatement());
            } else {
                throw new UnsupportedOperationException(String.format("Cannot support type '%s'", routeResult.getSqlStatement().getType()));
            }
            MergeEngine mergeEngine = MergeEngineFactory.newInstance(connection.getShardingContext().getShardingRule(), queryResults, routeResult.getSqlStatement());
            result = new ShardingResultSet(resultSets, mergeEngine.merge(), this);
        } finally {
            clearBatch();
@@ -294,13 +286,8 @@ public final class ShardingPreparedStatement extends AbstractShardingPreparedSta
            resultSets.add(resultSet);
            queryResults.add(new JDBCQueryResult(resultSet));
        }
        MergeEngine mergeEngine = null;
        if (routeResult.getSqlStatement() instanceof SelectStatement) {
            mergeEngine = new DQLMergeEngine(queryResults, (SelectStatement) routeResult.getSqlStatement());
        } else if (routeResult.getSqlStatement() instanceof DALStatement) {
            mergeEngine = new DALMergeEngine(connection.getShardingContext().getShardingRule(), queryResults, (DALStatement) routeResult.getSqlStatement());
        }
        if (null != mergeEngine) {
        if (routeResult.getSqlStatement() instanceof SelectStatement || routeResult.getSqlStatement() instanceof DALStatement) {
            MergeEngine mergeEngine = MergeEngineFactory.newInstance(connection.getShardingContext().getShardingRule(), queryResults, routeResult.getSqlStatement());
            currentResultSet = new ShardingResultSet(resultSets, mergeEngine.merge(), this);
        }
        return currentResultSet;
+5 −18
Original line number Diff line number Diff line
@@ -26,11 +26,10 @@ import io.shardingjdbc.core.jdbc.core.ShardingContext;
import io.shardingjdbc.core.jdbc.core.connection.ShardingConnection;
import io.shardingjdbc.core.jdbc.core.resultset.GeneratedKeysResultSet;
import io.shardingjdbc.core.jdbc.core.resultset.ShardingResultSet;
import io.shardingjdbc.core.merger.dal.DALMergeEngine;
import io.shardingjdbc.core.merger.dql.DQLMergeEngine;
import io.shardingjdbc.core.merger.JDBCQueryResult;
import io.shardingjdbc.core.merger.MergeEngine;
import io.shardingjdbc.core.merger.MergeEngineFactory;
import io.shardingjdbc.core.merger.QueryResult;
import io.shardingjdbc.core.merger.JDBCQueryResult;
import io.shardingjdbc.core.parsing.parser.context.GeneratedKey;
import io.shardingjdbc.core.parsing.parser.sql.dal.DALStatement;
import io.shardingjdbc.core.parsing.parser.sql.dml.insert.InsertStatement;
@@ -106,14 +105,7 @@ public class ShardingStatement extends AbstractStatementAdapter {
            for (ResultSet each : resultSets) {
                queryResults.add(new JDBCQueryResult(each));
            }
            MergeEngine mergeEngine;
            if (routeResult.getSqlStatement() instanceof SelectStatement) {
                mergeEngine = new DQLMergeEngine(queryResults, (SelectStatement) routeResult.getSqlStatement());
            } else if (routeResult.getSqlStatement() instanceof DALStatement) {
                mergeEngine = new DALMergeEngine(connection.getShardingContext().getShardingRule(), queryResults, (DALStatement) routeResult.getSqlStatement());
            } else {
                throw new UnsupportedOperationException(String.format("Cannot support type '%s'", routeResult.getSqlStatement().getType()));
            }
            MergeEngine mergeEngine = MergeEngineFactory.newInstance(connection.getShardingContext().getShardingRule(), queryResults, routeResult.getSqlStatement());
            result = new ShardingResultSet(resultSets, mergeEngine.merge(), this);
        } finally {
            currentResultSet = null;
@@ -269,13 +261,8 @@ public class ShardingStatement extends AbstractStatementAdapter {
            resultSets.add(resultSet);
            queryResults.add(new JDBCQueryResult(resultSet));
        }
        MergeEngine mergeEngine = null;
        if (routeResult.getSqlStatement() instanceof SelectStatement) {
            mergeEngine = new DQLMergeEngine(queryResults, (SelectStatement) routeResult.getSqlStatement());
        } else if (routeResult.getSqlStatement() instanceof DALStatement && !queryResults.isEmpty()) {
            mergeEngine = new DALMergeEngine(connection.getShardingContext().getShardingRule(), queryResults, (DALStatement) routeResult.getSqlStatement());
        }
        if (null != mergeEngine) {
        if (routeResult.getSqlStatement() instanceof SelectStatement || routeResult.getSqlStatement() instanceof DALStatement) {
            MergeEngine mergeEngine = MergeEngineFactory.newInstance(connection.getShardingContext().getShardingRule(), queryResults, routeResult.getSqlStatement());
            currentResultSet = new ShardingResultSet(resultSets, mergeEngine.merge(), this);
        }
        return currentResultSet;