提交 cbe27b10 编写于 作者: S sunbufu

1. add getQueryResultMetaData() method on QueryResult.

2. add QueryResultMetaData on StreamQueryResult class.
3. modify AggregationDistinctQueryResult constructor to use queryResultMetaData instead of columnLabelAndIndexMap.
4. use HashMultimap instead of TreeMap on QueryResultMetaData.
5. modify unit test class.
上级 a04c7997
......@@ -17,14 +17,12 @@
package org.apache.shardingsphere.core.execute.sql.execute.result;
import com.google.common.collect.Multimap;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.exception.ShardingException;
import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.AggregationDistinctSelectItem;
import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.AggregationSelectItem;
import org.apache.shardingsphere.core.parse.core.constant.AggregationType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
......@@ -50,8 +48,8 @@ public final class AggregationDistinctQueryMetaData {
private final Map<Integer, Integer> aggregationDistinctColumnIndexAndSumColumnIndexes = new HashMap<>();
public AggregationDistinctQueryMetaData(final Collection<AggregationDistinctSelectItem> aggregationDistinctSelectItems, final Multimap<String, Integer> columnLabelAndIndexMap) {
aggregationDistinctColumnMetaDataList.addAll(getColumnMetaDataList(aggregationDistinctSelectItems, columnLabelAndIndexMap));
public AggregationDistinctQueryMetaData(final Collection<AggregationDistinctSelectItem> aggregationDistinctSelectItems, final QueryResultMetaData queryResultMetaData) {
aggregationDistinctColumnMetaDataList.addAll(getColumnMetaDataList(aggregationDistinctSelectItems, queryResultMetaData));
aggregationDistinctColumnIndexAndLabels.putAll(getAggregationDistinctColumnIndexAndLabels());
aggregationDistinctColumnIndexAndAggregationTypes.putAll(getAggregationDistinctColumnIndexAndAggregationTypes());
aggregationDistinctColumnIndexAndCountColumnIndexes.putAll(getAggregationDistinctColumnIndexAndCountColumnIndexes());
......@@ -59,22 +57,22 @@ public final class AggregationDistinctQueryMetaData {
}
private Collection<AggregationDistinctColumnMetaData> getColumnMetaDataList(final Collection<AggregationDistinctSelectItem> aggregationDistinctSelectItems,
final Multimap<String, Integer> columnLabelAndIndexMap) {
final QueryResultMetaData queryResultMetaData) {
Collection<AggregationDistinctColumnMetaData> result = new LinkedList<>();
for (AggregationDistinctSelectItem each : aggregationDistinctSelectItems) {
result.add(getAggregationDistinctColumnMetaData(each, new ArrayList<>(columnLabelAndIndexMap.get(each.getColumnLabel())).get(0), columnLabelAndIndexMap));
result.add(getAggregationDistinctColumnMetaData(each, queryResultMetaData.getColumnIndex(each.getColumnLabel()), queryResultMetaData));
}
return result;
}
private AggregationDistinctColumnMetaData getAggregationDistinctColumnMetaData(final AggregationDistinctSelectItem selectItem,
final int aggregationDistinctColumnIndex, final Multimap<String, Integer> columnLabelAndIndexMap) {
final int aggregationDistinctColumnIndex, final QueryResultMetaData queryResultMetaData) {
List<AggregationSelectItem> derivedSelectItems = selectItem.getDerivedAggregationItems();
if (derivedSelectItems.isEmpty()) {
return new AggregationDistinctColumnMetaData(aggregationDistinctColumnIndex, selectItem.getColumnLabel(), selectItem.getType());
}
int countDerivedIndex = columnLabelAndIndexMap.get(derivedSelectItems.get(0).getColumnLabel()).iterator().next();
int sumDerivedIndex = columnLabelAndIndexMap.get(derivedSelectItems.get(1).getColumnLabel()).iterator().next();
int countDerivedIndex = queryResultMetaData.getColumnIndex(derivedSelectItems.get(0).getColumnLabel());
int sumDerivedIndex = queryResultMetaData.getColumnIndex(derivedSelectItems.get(1).getColumnLabel());
return new AggregationDistinctColumnMetaData(aggregationDistinctColumnIndex, selectItem.getColumnLabel(), selectItem.getType(), countDerivedIndex, sumDerivedIndex);
}
......
......@@ -20,7 +20,6 @@ package org.apache.shardingsphere.core.execute.sql.execute.result;
import com.google.common.base.Function;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import lombok.SneakyThrows;
import org.apache.shardingsphere.core.execute.sql.execute.row.QueryRow;
import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.AggregationDistinctSelectItem;
......@@ -33,7 +32,6 @@ import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
/**
......@@ -45,9 +43,9 @@ public final class AggregationDistinctQueryResult extends DistinctQueryResult {
private final AggregationDistinctQueryMetaData metaData;
private AggregationDistinctQueryResult(final Multimap<String, Integer> columnLabelAndIndexMap, final List<Boolean> columnCaseSensitive, final Iterator<QueryRow> resultData,
private AggregationDistinctQueryResult(final QueryResultMetaData queryResultMetaData, final List<Boolean> columnCaseSensitive, final Iterator<QueryRow> resultData,
final AggregationDistinctQueryMetaData distinctQueryMetaData) {
super(columnLabelAndIndexMap, columnCaseSensitive, resultData);
super(queryResultMetaData, columnCaseSensitive, resultData);
metaData = distinctQueryMetaData;
}
......@@ -60,7 +58,7 @@ public final class AggregationDistinctQueryResult extends DistinctQueryResult {
return input.getDistinctColumnLabel();
}
}));
metaData = new AggregationDistinctQueryMetaData(aggregationDistinctSelectItems, getColumnLabelAndIndexMap());
metaData = new AggregationDistinctQueryMetaData(aggregationDistinctSelectItems, getQueryResultMetaData());
}
/**
......@@ -76,7 +74,7 @@ public final class AggregationDistinctQueryResult extends DistinctQueryResult {
public DistinctQueryResult apply(final QueryRow input) {
Set<QueryRow> resultData = new LinkedHashSet<>();
resultData.add(input);
return new AggregationDistinctQueryResult(getColumnLabelAndIndexMap(), getColumnCaseSensitive(), resultData.iterator(), metaData);
return new AggregationDistinctQueryResult(getQueryResultMetaData(), getColumnCaseSensitive(), resultData.iterator(), metaData);
}
}));
}
......@@ -133,20 +131,14 @@ public final class AggregationDistinctQueryResult extends DistinctQueryResult {
return null == getCurrentRow();
}
@Override
public int getColumnCount() {
return getColumnLabelAndIndexMap().size();
}
@Override
public String getColumnLabel(final int columnIndex) throws SQLException {
if (metaData.isAggregationDistinctColumnIndex(columnIndex)) {
return metaData.getAggregationDistinctColumnLabel(columnIndex);
}
for (Entry<String, Integer> entry : getColumnLabelAndIndexMap().entries()) {
if (columnIndex == entry.getValue()) {
return entry.getKey();
}
String columnLabel = getQueryResultMetaData().getColumnLabel(columnIndex);
if (null != columnLabel) {
return columnLabel;
}
throw new SQLException("Column index out of range", "9999");
}
......
......@@ -18,10 +18,8 @@
package org.apache.shardingsphere.core.execute.sql.execute.result;
import com.google.common.base.Function;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
......@@ -39,7 +37,6 @@ import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
/**
......@@ -51,8 +48,9 @@ import java.util.Set;
@RequiredArgsConstructor
@Getter(AccessLevel.PROTECTED)
public class DistinctQueryResult implements QueryResult {
private final Multimap<String, Integer> columnLabelAndIndexMap;
@Getter
private final QueryResultMetaData queryResultMetaData;
private final List<Boolean> columnCaseSensitive;
......@@ -62,20 +60,12 @@ public class DistinctQueryResult implements QueryResult {
@SneakyThrows
public DistinctQueryResult(final Collection<QueryResult> queryResults, final List<String> distinctColumnLabels) {
this.columnLabelAndIndexMap = getColumnLabelAndIndexMap(queryResults.iterator().next());
this.columnCaseSensitive = getColumnCaseSensitive(queryResults.iterator().next());
QueryResult firstQueryResult = queryResults.iterator().next();
this.queryResultMetaData = firstQueryResult.getQueryResultMetaData();
this.columnCaseSensitive = getColumnCaseSensitive(firstQueryResult);
resultData = getResultData(queryResults, distinctColumnLabels);
}
@SneakyThrows
private Multimap<String, Integer> getColumnLabelAndIndexMap(final QueryResult queryResult) {
Multimap<String, Integer> result = HashMultimap.create();
for (int columnIndex = 1; columnIndex <= queryResult.getColumnCount(); columnIndex++) {
result.put(queryResult.getColumnLabel(columnIndex), columnIndex);
}
return result;
}
@SneakyThrows
private List<Boolean> getColumnCaseSensitive(final QueryResult queryResult) {
List<Boolean> result = Lists.newArrayList(false);
......@@ -124,7 +114,7 @@ public class DistinctQueryResult implements QueryResult {
public DistinctQueryResult apply(final QueryRow row) {
Set<QueryRow> resultData = new LinkedHashSet<>();
resultData.add(row);
return new DistinctQueryResult(columnLabelAndIndexMap, columnCaseSensitive, resultData.iterator());
return new DistinctQueryResult(queryResultMetaData, columnCaseSensitive, resultData.iterator());
}
}));
}
......@@ -191,20 +181,19 @@ public class DistinctQueryResult implements QueryResult {
@Override
public int getColumnCount() {
return columnLabelAndIndexMap.size();
return queryResultMetaData.getColumnCount();
}
@Override
public String getColumnLabel(final int columnIndex) throws SQLException {
for (Entry<String, Integer> entry : columnLabelAndIndexMap.entries()) {
if (columnIndex == entry.getValue()) {
return entry.getKey();
}
String columnLabel = queryResultMetaData.getColumnLabel(columnIndex);
if (null != columnLabel) {
return columnLabel;
}
throw new SQLException("Column index out of range", "9999");
}
protected Integer getColumnIndex(final String columnLabel) {
return new ArrayList<>(columnLabelAndIndexMap.get(columnLabel)).get(0);
return queryResultMetaData.getColumnIndex(columnLabel);
}
}
......@@ -18,6 +18,7 @@
package org.apache.shardingsphere.core.execute.sql.execute.result;
import com.google.common.base.Optional;
import lombok.Getter;
import lombok.SneakyThrows;
import org.apache.shardingsphere.core.execute.sql.execute.row.QueryRow;
import org.apache.shardingsphere.core.rule.EncryptRule;
......@@ -48,25 +49,26 @@ public final class MemoryQueryResult implements QueryResult {
private final Iterator<QueryRow> resultData;
private QueryRow currentRow;
private final QueryResultMetaData metaData;
@Getter
private final QueryResultMetaData queryResultMetaData;
@SneakyThrows
public MemoryQueryResult(final ResultSet resultSet, final ShardingRule shardingRule) {
resultData = getResultData(resultSet);
metaData = new QueryResultMetaData(resultSet.getMetaData(), shardingRule);
queryResultMetaData = new QueryResultMetaData(resultSet.getMetaData(), shardingRule);
}
@SneakyThrows
public MemoryQueryResult(final ResultSet resultSet, final EncryptRule encryptRule) {
resultData = getResultData(resultSet);
metaData = new QueryResultMetaData(resultSet.getMetaData(), encryptRule);
queryResultMetaData = new QueryResultMetaData(resultSet.getMetaData(), encryptRule);
}
@SneakyThrows
public MemoryQueryResult(final ResultSet resultSet) {
resultData = getResultData(resultSet);
metaData = new QueryResultMetaData(resultSet.getMetaData());
queryResultMetaData = new QueryResultMetaData(resultSet.getMetaData());
}
@SneakyThrows
......@@ -99,7 +101,7 @@ public final class MemoryQueryResult implements QueryResult {
@Override
public Object getValue(final String columnLabel, final Class<?> type) {
return decrypt(columnLabel, currentRow.getColumnValue(metaData.getColumnIndex(columnLabel)));
return decrypt(columnLabel, currentRow.getColumnValue(queryResultMetaData.getColumnIndex(columnLabel)));
}
@Override
......@@ -109,7 +111,7 @@ public final class MemoryQueryResult implements QueryResult {
@Override
public Object getCalendarValue(final String columnLabel, final Class<?> type, final Calendar calendar) {
return currentRow.getColumnValue(metaData.getColumnIndex(columnLabel));
return currentRow.getColumnValue(queryResultMetaData.getColumnIndex(columnLabel));
}
@Override
......@@ -119,7 +121,7 @@ public final class MemoryQueryResult implements QueryResult {
@Override
public InputStream getInputStream(final String columnLabel, final String type) {
return getInputStream(currentRow.getColumnValue(metaData.getColumnIndex(columnLabel)));
return getInputStream(currentRow.getColumnValue(queryResultMetaData.getColumnIndex(columnLabel)));
}
@SneakyThrows
......@@ -139,27 +141,27 @@ public final class MemoryQueryResult implements QueryResult {
@Override
public boolean isCaseSensitive(final int columnIndex) {
return metaData.isCaseSensitive(columnIndex);
return queryResultMetaData.isCaseSensitive(columnIndex);
}
@Override
public int getColumnCount() {
return metaData.getColumnCount();
return queryResultMetaData.getColumnCount();
}
@Override
public String getColumnLabel(final int columnIndex) {
return metaData.getColumnLabel(columnIndex);
return queryResultMetaData.getColumnLabel(columnIndex);
}
@SneakyThrows
private Object decrypt(final String columnLabel, final Object value) {
return decrypt(metaData.getColumnIndex(columnLabel), value);
return decrypt(queryResultMetaData.getColumnIndex(columnLabel), value);
}
@SneakyThrows
private Object decrypt(final int columnIndex, final Object value) {
Optional<ShardingEncryptor> shardingEncryptor = metaData.getShardingEncryptor(columnIndex);
Optional<ShardingEncryptor> shardingEncryptor = queryResultMetaData.getShardingEncryptor(columnIndex);
return shardingEncryptor.isPresent() ? shardingEncryptor.get().decrypt(getCiphertext(value)) : value;
}
......
......@@ -132,4 +132,11 @@ public interface QueryResult {
* @throws SQLException SQL Exception
*/
boolean isCaseSensitive(int columnIndex) throws SQLException;
/**
* Get QueryResultMetaData.
*
* @return QueryResultMetaData
*/
QueryResultMetaData getQueryResultMetaData();
}
......@@ -18,6 +18,8 @@
package org.apache.shardingsphere.core.execute.sql.execute.result;
import com.google.common.base.Optional;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import lombok.SneakyThrows;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.rule.ShardingRule;
......@@ -26,8 +28,7 @@ import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Map;
import java.util.TreeMap;
import java.util.ArrayList;
/**
* Query result meta data.
......@@ -42,8 +43,8 @@ public final class QueryResultMetaData {
private final ShardingRule shardingRule;
private final EncryptRule encryptRule;
private final Map<String, Integer> columnLabelAndIndexes;
private final Multimap<String, Integer> columnLabelAndIndexes;
@SneakyThrows
public QueryResultMetaData(final ResultSetMetaData resultSetMetaData, final ShardingRule shardingRule) {
......@@ -70,8 +71,8 @@ public final class QueryResultMetaData {
}
@SneakyThrows
private Map<String, Integer> getColumnLabelAndIndexMap() {
Map<String, Integer> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
private Multimap<String, Integer> getColumnLabelAndIndexMap() {
Multimap<String, Integer> result = HashMultimap.create();
for (int columnIndex = resultSetMetaData.getColumnCount(); columnIndex > 0; columnIndex--) {
result.put(resultSetMetaData.getColumnLabel(columnIndex), columnIndex);
}
......@@ -117,7 +118,7 @@ public final class QueryResultMetaData {
* @return column name
*/
public Integer getColumnIndex(final String columnLabel) {
return columnLabelAndIndexes.get(columnLabel);
return new ArrayList<>(columnLabelAndIndexes.get(columnLabel)).get(0);
}
/**
......
......@@ -18,6 +18,7 @@
package org.apache.shardingsphere.core.execute.sql.execute.result;
import com.google.common.base.Optional;
import lombok.Getter;
import lombok.SneakyThrows;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.rule.ShardingRule;
......@@ -39,27 +40,28 @@ import java.util.Calendar;
* @author yangyi
*/
public final class StreamQueryResult implements QueryResult {
private final QueryResultMetaData metaData;
@Getter
private final QueryResultMetaData queryResultMetaData;
private final ResultSet resultSet;
@SneakyThrows
public StreamQueryResult(final ResultSet resultSet, final ShardingRule shardingRule) {
this.resultSet = resultSet;
metaData = new QueryResultMetaData(resultSet.getMetaData(), shardingRule);
queryResultMetaData = new QueryResultMetaData(resultSet.getMetaData(), shardingRule);
}
@SneakyThrows
public StreamQueryResult(final ResultSet resultSet, final EncryptRule encryptRule) {
this.resultSet = resultSet;
metaData = new QueryResultMetaData(resultSet.getMetaData(), encryptRule);
queryResultMetaData = new QueryResultMetaData(resultSet.getMetaData(), encryptRule);
}
@SneakyThrows
public StreamQueryResult(final ResultSet resultSet) {
this.resultSet = resultSet;
metaData = new QueryResultMetaData(resultSet.getMetaData());
queryResultMetaData = new QueryResultMetaData(resultSet.getMetaData());
}
@Override
......@@ -74,7 +76,7 @@ public final class StreamQueryResult implements QueryResult {
@Override
public Object getValue(final String columnLabel, final Class<?> type) throws SQLException {
return decrypt(columnLabel, QueryResultUtil.getValue(resultSet, metaData.getColumnIndex(columnLabel)));
return decrypt(columnLabel, QueryResultUtil.getValue(resultSet, queryResultMetaData.getColumnIndex(columnLabel)));
}
@Override
......@@ -142,27 +144,27 @@ public final class StreamQueryResult implements QueryResult {
@Override
public boolean isCaseSensitive(final int columnIndex) {
return metaData.isCaseSensitive(columnIndex);
return queryResultMetaData.isCaseSensitive(columnIndex);
}
@Override
public int getColumnCount() {
return metaData.getColumnCount();
return queryResultMetaData.getColumnCount();
}
@Override
public String getColumnLabel(final int columnIndex) {
return metaData.getColumnLabel(columnIndex);
return queryResultMetaData.getColumnLabel(columnIndex);
}
@SneakyThrows
private Object decrypt(final String columnLabel, final Object value) {
return decrypt(metaData.getColumnIndex(columnLabel), value);
return decrypt(queryResultMetaData.getColumnIndex(columnLabel), value);
}
@SneakyThrows
private Object decrypt(final int columnIndex, final Object value) {
Optional<ShardingEncryptor> shardingEncryptor = metaData.getShardingEncryptor(columnIndex);
Optional<ShardingEncryptor> shardingEncryptor = queryResultMetaData.getShardingEncryptor(columnIndex);
return shardingEncryptor.isPresent() ? shardingEncryptor.get().decrypt(getCiphertext(value)) : value;
}
......
......@@ -19,6 +19,7 @@ package org.apache.shardingsphere.core.execute.sql.execute.result;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import lombok.SneakyThrows;
import org.apache.shardingsphere.core.exception.ShardingException;
import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.AggregationDistinctSelectItem;
import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.AggregationSelectItem;
......@@ -32,11 +33,13 @@ import java.util.LinkedList;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class AggregationDistinctQueryMetaDataTest {
private AggregationDistinctQueryMetaData distinctQueryMetaData;
private AggregationDistinctQueryMetaData distinctQueryMetaData;
@Before
public void setUp() {
Collection<AggregationDistinctSelectItem> aggregationDistinctSelectItems = new LinkedList<>();
......@@ -51,61 +54,76 @@ public class AggregationDistinctQueryMetaDataTest {
columnLabelAndIndexMap.put("a", 2);
columnLabelAndIndexMap.put("AVG_DERIVED_COUNT_0", 3);
columnLabelAndIndexMap.put("AVG_DERIVED_SUM_0", 4);
distinctQueryMetaData = new AggregationDistinctQueryMetaData(aggregationDistinctSelectItems, columnLabelAndIndexMap);
distinctQueryMetaData = new AggregationDistinctQueryMetaData(aggregationDistinctSelectItems, getQueryResultMetaData());
}
@SneakyThrows
private QueryResultMetaData getQueryResultMetaData() {
QueryResultMetaData queryResultMetaData = mock(QueryResultMetaData.class);
when(queryResultMetaData.getColumnCount()).thenReturn(4);
when(queryResultMetaData.getColumnLabel(1)).thenReturn("c");
when(queryResultMetaData.getColumnLabel(2)).thenReturn("a");
when(queryResultMetaData.getColumnLabel(3)).thenReturn("AVG_DERIVED_COUNT_0");
when(queryResultMetaData.getColumnLabel(4)).thenReturn("AVG_DERIVED_SUM_0");
when(queryResultMetaData.getColumnIndex("c")).thenReturn(1);
when(queryResultMetaData.getColumnIndex("a")).thenReturn(2);
when(queryResultMetaData.getColumnIndex("AVG_DERIVED_COUNT_0")).thenReturn(3);
when(queryResultMetaData.getColumnIndex("AVG_DERIVED_SUM_0")).thenReturn(4);
return queryResultMetaData;
}
@Test
public void assertIsAggregationDistinctColumnIndex() {
assertTrue(distinctQueryMetaData.isAggregationDistinctColumnIndex(1));
}
@Test
public void assertIsAggregationDistinctColumnLabel() {
assertTrue(distinctQueryMetaData.isAggregationDistinctColumnLabel("c"));
}
@Test
public void assertGetAggregationType() {
AggregationType actual = distinctQueryMetaData.getAggregationType(2);
assertThat(actual, is(AggregationType.AVG));
}
@Test
public void assertIsDerivedCountColumnIndex() {
assertTrue(distinctQueryMetaData.isDerivedCountColumnIndex(3));
}
@Test
public void assertIsDerivedSumColumnIndex() {
assertTrue(distinctQueryMetaData.isDerivedSumColumnIndex(4));
}
@Test
public void assertGetAggregationDistinctColumnIndexByColumnLabel() {
int actual = distinctQueryMetaData.getAggregationDistinctColumnIndex("a");
assertThat(actual, is(2));
}
@Test(expected = ShardingException.class)
public void assertGetAggregationDistinctColumnIndexByColumnLabelWithException() {
int actual = distinctQueryMetaData.getAggregationDistinctColumnIndex("f");
assertThat(actual, is(2));
}
@Test
public void assertGetAggregationDistinctColumnIndexBySumIndex() {
int actual = distinctQueryMetaData.getAggregationDistinctColumnIndex(4);
assertThat(actual, is(2));
}
@Test(expected = ShardingException.class)
public void assertGetAggregationDistinctColumnIndexBySumIndexWithException() {
int actual = distinctQueryMetaData.getAggregationDistinctColumnIndex(0);
assertThat(actual, is(2));
}
@Test
public void assertGetAggregationDistinctColumnLabel() {
public void assertGetAggregationDistinctColumnLabel() {
String actual = distinctQueryMetaData.getAggregationDistinctColumnLabel(1);
assertThat(actual, is("c"));
}
......
......@@ -36,6 +36,7 @@ import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
......@@ -65,11 +66,29 @@ public class AggregationDistinctQueryResultTest {
when(queryResult.getValue(3, Object.class)).thenReturn(10 * i);
when(queryResult.getValue(4, Object.class)).thenReturn(10 * i);
when(queryResult.getValue(5, Object.class)).thenReturn(10 * i);
doReturn(getQueryResultMetaData()).when(queryResult).getQueryResultMetaData();
result.add(queryResult);
result.add(queryResult);
}
return result;
}
@SneakyThrows
private QueryResultMetaData getQueryResultMetaData() {
QueryResultMetaData queryResultMetaData = mock(QueryResultMetaData.class);
when(queryResultMetaData.getColumnCount()).thenReturn(5);
when(queryResultMetaData.getColumnLabel(1)).thenReturn("order_id");
when(queryResultMetaData.getColumnLabel(2)).thenReturn("c");
when(queryResultMetaData.getColumnLabel(3)).thenReturn("a");
when(queryResultMetaData.getColumnLabel(4)).thenReturn("AVG_DERIVED_COUNT_0");
when(queryResultMetaData.getColumnLabel(5)).thenReturn("AVG_DERIVED_SUM_0");
when(queryResultMetaData.getColumnIndex("order_id")).thenReturn(1);
when(queryResultMetaData.getColumnIndex("c")).thenReturn(2);
when(queryResultMetaData.getColumnIndex("a")).thenReturn(3);
when(queryResultMetaData.getColumnIndex("AVG_DERIVED_COUNT_0")).thenReturn(4);
when(queryResultMetaData.getColumnIndex("AVG_DERIVED_SUM_0")).thenReturn(5);
return queryResultMetaData;
}
private List<AggregationDistinctSelectItem> getAggregationDistinctSelectItems() {
List<AggregationDistinctSelectItem> result = new LinkedList<>();
......
......@@ -17,9 +17,7 @@
package org.apache.shardingsphere.core.execute.sql.execute.result;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import lombok.SneakyThrows;
import org.junit.Before;
import org.junit.Test;
......@@ -39,15 +37,19 @@ import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class DistinctQueryResultTest {
private DistinctQueryResult distinctQueryResult;
private QueryResultMetaData queryResultMetaData;
@Before
public void setUp() {
queryResultMetaData = getQueryResultMetaData();
Collection<QueryResult> queryResults = getQueryResults();
List<String> distinctColumnLabels = Collections.singletonList("order_id");
distinctQueryResult = new DistinctQueryResult(queryResults, distinctColumnLabels);
......@@ -63,11 +65,21 @@ public class DistinctQueryResultTest {
when(queryResult.getColumnLabel(1)).thenReturn("order_id");
when(queryResult.getValue(1, Object.class)).thenReturn(10 * i);
when(queryResult.isCaseSensitive(1)).thenReturn(true);
doReturn(queryResultMetaData).when(queryResult).getQueryResultMetaData();
result.add(queryResult);
result.add(queryResult);
}
return result;
}
@SneakyThrows
private QueryResultMetaData getQueryResultMetaData() {
QueryResultMetaData queryResultMetaData = mock(QueryResultMetaData.class);
when(queryResultMetaData.getColumnCount()).thenReturn(1);
when(queryResultMetaData.getColumnLabel(1)).thenReturn("order_id");
when(queryResultMetaData.getColumnIndex("order_id")).thenReturn(1);
return queryResultMetaData;
}
@Test
public void assertDivide() {
......@@ -165,9 +177,7 @@ public class DistinctQueryResultTest {
@Test
public void assertGetColumnLabelAndIndexMap() {
Multimap<String, Integer> expected = HashMultimap.create();
expected.put("order_id", 1);
assertThat(distinctQueryResult.getColumnLabelAndIndexMap(), is(expected));
assertThat(distinctQueryResult.getQueryResultMetaData(), is(queryResultMetaData));
}
@Test
......
......@@ -19,6 +19,7 @@ package org.apache.shardingsphere.core.merge.fixture;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.execute.sql.execute.result.QueryResult;
import org.apache.shardingsphere.core.execute.sql.execute.result.QueryResultMetaData;
import java.io.InputStream;
import java.io.Reader;
......@@ -205,7 +206,17 @@ public final class TestQueryResult implements QueryResult {
public boolean isCaseSensitive(final int columnIndex) throws SQLException {
return resultSet.getMetaData().isCaseSensitive(columnIndex);
}
@Override
public QueryResultMetaData getQueryResultMetaData() {
try {
return new QueryResultMetaData(resultSet.getMetaData());
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public int getColumnCount() throws SQLException {
return resultSet.getMetaData().getColumnCount();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册