提交 c4a626d9 编写于 作者: G gaoht

Change limit result set

上级 6f5c3438
......@@ -179,6 +179,10 @@ public class ShardingStatement extends AbstractStatementAdapter {
return currentResultSet;
}
List<ResultSet> resultSets = new ArrayList<>(getRoutedStatements().size());
if (getRoutedStatements().size() == 1) {
currentResultSet = getRoutedStatements().iterator().next().getResultSet();
return currentResultSet;
}
for (Statement each : getRoutedStatements()) {
resultSets.add(each.getResultSet());
}
......
......@@ -51,12 +51,12 @@ public final class ResultSetFactory {
*/
public static ResultSet getResultSet(final List<ResultSet> resultSets, final MergeContext mergeContext) throws SQLException {
ShardingResultSets shardingResultSets = new ShardingResultSets(resultSets);
log.trace("Sharding-JDBC: Sharding result sets type is '{}'", shardingResultSets.getType().toString());
log.debug("Sharding-JDBC: Sharding result sets type is '{}'", shardingResultSets.getType().toString());
switch (shardingResultSets.getType()) {
case EMPTY:
return buildEmpty(resultSets);
case SINGLE:
return buildSingle(shardingResultSets, mergeContext);
return buildSingle(shardingResultSets);
case MULTIPLE:
return buildMultiple(shardingResultSets, mergeContext);
default:
......@@ -68,8 +68,8 @@ public final class ResultSetFactory {
return resultSets.get(0);
}
private static ResultSet buildSingle(final ShardingResultSets shardingResultSets, final MergeContext mergeContext) throws SQLException {
return mergeContext.hasLimit() ? new LimitCouplingResultSet(shardingResultSets.getResultSets().get(0), mergeContext) : shardingResultSets.getResultSets().get(0);
private static ResultSet buildSingle(final ShardingResultSets shardingResultSets) throws SQLException {
return shardingResultSets.getResultSets().get(0);
}
private static ResultSet buildMultiple(final ShardingResultSets shardingResultSets, final MergeContext mergeContext) throws SQLException {
......
......@@ -22,6 +22,7 @@ import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import java.io.InputStream;
import java.io.Reader;
......@@ -61,6 +62,7 @@ public abstract class AbstractDelegateResultSet extends AbstractResultSetAdapter
public AbstractDelegateResultSet(final List<ResultSet> resultSets) throws SQLException {
super(resultSets);
delegate = resultSets.get(0);
LoggerFactory.getLogger(this.getClass().getName()).debug("{} join pipeline", this.hashCode());
}
@Override
......@@ -68,7 +70,7 @@ public abstract class AbstractDelegateResultSet extends AbstractResultSetAdapter
boolean result = beforeFirst ? firstNext() : afterFirstNext();
beforeFirst = false;
if (result) {
log.trace("Access result set, total size is: {}, result set hashcode is: {}, offset is: {}", getResultSets().size(), delegate.hashCode(), ++offset);
LoggerFactory.getLogger(this.getClass().getName()).trace("Access result set, total size is: {}, result set hashcode is: {}, offset is: {}", getResultSets().size(), delegate.hashCode(), ++offset);
}
return result;
}
......
......@@ -25,6 +25,7 @@ import com.google.common.base.Preconditions;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.net.MalformedURLException;
......@@ -58,6 +59,7 @@ public abstract class AbstractMemoryResultSet extends AbstractUnsupportedOperati
public AbstractMemoryResultSet(final List<ResultSet> resultSets) throws SQLException {
super(resultSets);
LoggerFactory.getLogger(this.getClass().getName()).debug("{} join pipeline", this.hashCode());
}
@Override
......
......@@ -57,6 +57,12 @@ public final class ShardingDataBasesOnlyForStatementWithSelectTest extends Abstr
assertDataSet("integrate/dataset/Empty.xml", shardingDataSource.getConnection(), "t_order", String.format(sql, 10, 12, 15, 1309, 1408));
}
@Test
public void assertSelectLimitWithSingleTable() throws SQLException, DatabaseUnitException {
String sql = "SELECT * FROM `t_order` WHERE `order_id` in (%s, %s, %s) AND `user_id` in (%s,%s) limit 1,2";
assertDataSet("integrate/dataset/db/expect/select/SelectLimitWithSingleTable.xml", shardingDataSource.getConnection(), "t_order", String.format(sql, 1000, 1001, 2000,10,20));
}
@Test
public void assertSelectLimitWithBindingTable() throws SQLException, DatabaseUnitException {
String sql = "SELECT i.* FROM `t_order` o JOIN `t_order_item` i ON o.user_id = i.user_id AND o.order_id = i.order_id"
......
......@@ -27,7 +27,6 @@ import org.junit.Test;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collections;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
......@@ -67,28 +66,4 @@ public final class IteratorResultSetTest {
}
assertThat(count, is(1));
}
@Test
public void assertNextWithLimitForSingleResultSet() throws SQLException {
MergeContext mergeContext = new MergeContext();
mergeContext.setLimit(new Limit(2, 3, Optional.<Integer>absent(), Optional.<Integer>absent()));
ResultSet resultSet = ResultSetFactory.getResultSet(Collections.<ResultSet>singletonList(new MockResultSet<>(1, 2, 3, 4, 5, 6)), mergeContext);
int count = 0;
while (resultSet.next()) {
count++;
}
assertThat(count, is(3));
}
@Test
public void assertNextWithLimitForSingleResultSetNotFull() throws SQLException {
MergeContext mergeContext = new MergeContext();
mergeContext.setLimit(new Limit(2, 10, Optional.<Integer>absent(), Optional.<Integer>absent()));
ResultSet resultSet = ResultSetFactory.getResultSet(Collections.<ResultSet>singletonList(new MockResultSet<>(1, 2, 3, 4, 5, 6)), mergeContext);
int count = 0;
while (resultSet.next()) {
count++;
}
assertThat(count, is(4));
}
}
<dataset>
<t_order order_id="1001" user_id="10" status="init" />
<t_order order_id="2000" user_id="20" status="init" />
</dataset>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册