未验证 提交 9d0af952 编写于 作者: P panjuan 提交者: GitHub

Merge pull request #2848 from sunbufu/feature#2715

Feature#2715
......@@ -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;
/**
......@@ -47,12 +44,14 @@ import java.util.Set;
*
* @author panjuan
* @author yangyi
* @author sunbufu
*/
@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 +61,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 +115,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 +182,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;
......@@ -49,24 +50,25 @@ public final class MemoryQueryResult implements QueryResult {
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,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;
......@@ -40,26 +41,27 @@ import java.util.Calendar;
*/
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,6 +33,8 @@ 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 {
......@@ -51,7 +54,22 @@ 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
......
......@@ -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,12 +66,30 @@ 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<>();
AggregationDistinctSelectItem distinctCountSelectItem = new AggregationDistinctSelectItem(0, 0, AggregationType.COUNT, "(DISTINCT order_id)", "c", "order_id");
......
......@@ -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,6 +37,7 @@ 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;
......@@ -46,8 +45,11 @@ 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,12 +65,22 @@ 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() {
List<DistinctQueryResult> actual = distinctQueryResult.divide();
......@@ -164,10 +176,8 @@ public class DistinctQueryResultTest {
}
@Test
public void assertGetColumnLabelAndIndexMap() {
Multimap<String, Integer> expected = HashMultimap.create();
expected.put("order_id", 1);
assertThat(distinctQueryResult.getColumnLabelAndIndexMap(), is(expected));
public void assertGetQueryResultMetaData() {
assertThat(distinctQueryResult.getQueryResultMetaData(), is(queryResultMetaData));
}
@Test
......
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package org.apache.shardingsphere.core.execute.sql.execute.result;
import com.google.common.base.Optional;
import lombok.SneakyThrows;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.core.rule.TableRule;
import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor;
import org.hamcrest.core.Is;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Calendar;
import static org.hamcrest.core.Is.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;
@RunWith(MockitoJUnitRunner.class)
public class MemoryQueryResultTest {
@SneakyThrows
private ResultSet getResultSet() {
ResultSet resultSet = mock(ResultSet.class);
when(resultSet.next()).thenReturn(true).thenReturn(false);
when(resultSet.getInt(1)).thenReturn(1);
when(resultSet.wasNull()).thenReturn(false);
doReturn(getResultSetMetaData()).when(resultSet).getMetaData();
return resultSet;
}
@SneakyThrows
private ResultSetMetaData getResultSetMetaData() {
ResultSetMetaData metaData = mock(ResultSetMetaData.class);
when(metaData.getColumnCount()).thenReturn(1);
when(metaData.getColumnLabel(1)).thenReturn("order_id");
when(metaData.getColumnName(1)).thenReturn("order_id");
when(metaData.getColumnType(1)).thenReturn(Types.INTEGER);
when(metaData.getTableName(1)).thenReturn("order");
when(metaData.isCaseSensitive(1)).thenReturn(false);
return metaData;
}
private ShardingEncryptor shardingEncryptor = mock(ShardingEncryptor.class);
@Test
public void assertConstructorWithShardingRule() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet(), getShardingRule());
assertThat(queryResult.getQueryResultMetaData().getShardingEncryptor(1), is(Optional.fromNullable(shardingEncryptor)));
}
@Test
public void assertConstructorWithEncryptRule() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet(), getEncryptRule());
assertThat(queryResult.getQueryResultMetaData().getShardingEncryptor(1), is(Optional.fromNullable(shardingEncryptor)));
}
@Test(expected = SQLException.class)
@SneakyThrows
public void assertConstructorWithSqlException() {
ResultSet resultSet = getResultSet();
when(resultSet.next()).thenThrow(new SQLException());
new MemoryQueryResult(resultSet);
}
private ShardingRule getShardingRule() {
ShardingRule shardingRule = mock(ShardingRule.class);
doReturn(getEncryptRule()).when(shardingRule).getEncryptRule();
doReturn(Optional.fromNullable(getTableRule())).when(shardingRule).findTableRuleByActualTable("order");
return shardingRule;
}
private TableRule getTableRule() {
TableRule tableRule = mock(TableRule.class);
when(tableRule.getLogicTable()).thenReturn("order");
return tableRule;
}
private EncryptRule getEncryptRule() {
EncryptRule encryptRule = mock(EncryptRule.class);
when(encryptRule.getShardingEncryptor("order", "order_id")).thenReturn(Optional.fromNullable(shardingEncryptor));
when(encryptRule.isCipherColumn("order", "order_id")).thenReturn(false);
return encryptRule;
}
@Test
public void assertNext() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet());
assertTrue(queryResult.next());
assertFalse(queryResult.next());
}
@Test
public void assertGetValueWithColumnIndex() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet());
queryResult.next();
assertThat(queryResult.getValue(1, Integer.class), Is.<Object>is(1));
}
@Test
public void assertGetValueWithColumnLabel() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet());
queryResult.next();
assertThat(queryResult.getValue("order_id", Integer.class), Is.<Object>is(1));
}
@Test
public void assertGetValueWithShardingRule() {
when(shardingEncryptor.decrypt("1")).thenReturn("1");
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet(), getShardingRule());
queryResult.next();
assertThat(queryResult.getValue("order_id", Integer.class), Is.<Object>is("1"));
}
@Test(expected = Exception.class)
public void assertGetValueWithException() {
ResultSet resultSet = getResultSetWithException();
MemoryQueryResult queryResult = new MemoryQueryResult(resultSet);
queryResult.next();
queryResult.getValue("order_id", Integer.class);
}
@SneakyThrows
private ResultSet getResultSetWithException() {
ResultSet resultSet = mock(ResultSet.class);
when(resultSet.next()).thenReturn(true).thenReturn(false);
when(resultSet.getInt(1)).thenReturn(1);
when(resultSet.wasNull()).thenReturn(false);
doReturn(getResultSetMetaDataWithException()).when(resultSet).getMetaData();
return resultSet;
}
@SneakyThrows
private ResultSetMetaData getResultSetMetaDataWithException() {
ResultSetMetaData metaData = mock(ResultSetMetaData.class);
when(metaData.getColumnCount()).thenReturn(1);
when(metaData.getColumnLabel(1)).thenReturn("order_id");
when(metaData.getColumnName(1)).thenThrow(new SQLException());
when(metaData.getColumnType(1)).thenReturn(Types.INTEGER);
when(metaData.getTableName(1)).thenReturn("order");
return metaData;
}
@Test
public void assertGetCalendarValueWithColumnIndex() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet());
queryResult.next();
assertThat(queryResult.getCalendarValue(1, Integer.class, Calendar.getInstance()), Is.<Object>is(1));
}
@Test
public void assertGetCalendarValueWithColumnLabel() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet());
queryResult.next();
assertThat(queryResult.getCalendarValue("order_id", Integer.class, Calendar.getInstance()), Is.<Object>is(1));
}
@Test
@SneakyThrows
public void assertGetInputStreamWithColumnIndex() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet());
queryResult.next();
InputStream inputStream = queryResult.getInputStream(1, "Unicode");
assertThat(inputStream.read(), is(getInputStream(1).read()));
}
@Test
@SneakyThrows
public void assertGetInputStreamWithColumnLabel() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet());
queryResult.next();
InputStream inputStream = queryResult.getInputStream("order_id", "Unicode");
assertThat(inputStream.read(), is(getInputStream(1).read()));
}
@SneakyThrows
private InputStream getInputStream(final Object value) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(value);
objectOutputStream.flush();
objectOutputStream.close();
return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
}
@Test
public void assertWasNull() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet());
queryResult.next();
assertFalse(queryResult.wasNull());
queryResult.next();
assertTrue(queryResult.wasNull());
}
@Test
public void assertIsCaseSensitive() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet());
assertFalse(queryResult.isCaseSensitive(1));
}
@Test
public void assertGetColumnCount() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet());
assertThat(queryResult.getColumnCount(), is(1));
}
@Test
public void assertGetColumnLabel() {
MemoryQueryResult queryResult = new MemoryQueryResult(getResultSet());
assertThat(queryResult.getColumnLabel(1), is("order_id"));
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package org.apache.shardingsphere.core.execute.sql.execute.result;
import com.google.common.base.Optional;
import lombok.SneakyThrows;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.core.rule.TableRule;
import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor;
import org.hamcrest.core.Is;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.Calendar;
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.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class StreamQueryResultTest {
@SneakyThrows
private ResultSet getResultSet() {
ResultSet resultSet = mock(ResultSet.class);
when(resultSet.next()).thenReturn(true).thenReturn(false);
when(resultSet.getInt(1)).thenReturn(1);
when(resultSet.wasNull()).thenReturn(false).thenReturn(true);
doReturn(getResultSetMetaData()).when(resultSet).getMetaData();
return resultSet;
}
@SneakyThrows
private ResultSetMetaData getResultSetMetaData() {
ResultSetMetaData metaData = mock(ResultSetMetaData.class);
when(metaData.getColumnCount()).thenReturn(1);
when(metaData.getColumnLabel(1)).thenReturn("order_id");
when(metaData.getColumnName(1)).thenReturn("order_id");
when(metaData.getColumnType(1)).thenReturn(Types.INTEGER);
when(metaData.getTableName(1)).thenReturn("order");
when(metaData.isCaseSensitive(1)).thenReturn(false);
return metaData;
}
private ShardingEncryptor shardingEncryptor = mock(ShardingEncryptor.class);
@Test
public void assertConstructorWithShardingRule() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet(), getShardingRule());
assertThat(queryResult.getQueryResultMetaData().getShardingEncryptor(1), is(Optional.fromNullable(shardingEncryptor)));
}
@Test
public void assertConstructorWithEncryptRule() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet(), getEncryptRule());
assertThat(queryResult.getQueryResultMetaData().getShardingEncryptor(1), is(Optional.fromNullable(shardingEncryptor)));
}
private ShardingRule getShardingRule() {
ShardingRule shardingRule = mock(ShardingRule.class);
doReturn(getEncryptRule()).when(shardingRule).getEncryptRule();
doReturn(Optional.fromNullable(getTableRule())).when(shardingRule).findTableRuleByActualTable("order");
return shardingRule;
}
private TableRule getTableRule() {
TableRule tableRule = mock(TableRule.class);
when(tableRule.getLogicTable()).thenReturn("order");
return tableRule;
}
private EncryptRule getEncryptRule() {
EncryptRule encryptRule = mock(EncryptRule.class);
when(encryptRule.getShardingEncryptor("order", "order_id")).thenReturn(Optional.fromNullable(shardingEncryptor));
when(encryptRule.isCipherColumn("order", "order_id")).thenReturn(false);
return encryptRule;
}
@Test
@SneakyThrows
public void assertNext() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet());
assertTrue(queryResult.next());
assertFalse(queryResult.next());
}
@Test
@SneakyThrows
public void assertGetValueWithColumnIndex() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet());
queryResult.next();
assertThat(queryResult.getValue(1, Integer.class), Is.<Object>is(1));
}
@Test
@SneakyThrows
public void assertGetValueWithColumnLabel() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet());
queryResult.next();
assertThat(queryResult.getValue("order_id", Integer.class), Is.<Object>is(1));
}
@Test
@SneakyThrows
public void assertGetValueWithShardingRule() {
when(shardingEncryptor.decrypt("1")).thenReturn("1");
StreamQueryResult queryResult = new StreamQueryResult(getResultSet(), getShardingRule());
queryResult.next();
assertThat(queryResult.getValue("order_id", Integer.class), Is.<Object>is("1"));
}
@Test(expected = Exception.class)
@SneakyThrows
public void assertGetValueWithException() {
ResultSet resultSet = getResultSetWithException();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getValue("order_id", Integer.class);
}
@SneakyThrows
private ResultSet getResultSetWithException() {
ResultSet resultSet = mock(ResultSet.class);
when(resultSet.next()).thenReturn(true).thenReturn(false);
when(resultSet.getInt(1)).thenReturn(1);
when(resultSet.wasNull()).thenReturn(false);
doReturn(getResultSetMetaDataWithException()).when(resultSet).getMetaData();
return resultSet;
}
@SneakyThrows
private ResultSetMetaData getResultSetMetaDataWithException() {
ResultSetMetaData metaData = mock(ResultSetMetaData.class);
when(metaData.getColumnCount()).thenReturn(1);
when(metaData.getColumnLabel(1)).thenReturn("order_id");
when(metaData.getColumnName(1)).thenThrow(new SQLException());
when(metaData.getColumnType(1)).thenReturn(Types.INTEGER);
when(metaData.getTableName(1)).thenReturn("order");
return metaData;
}
@Test
@SneakyThrows
public void assertGetCalendarValueWithColumnIndexAndDate() {
ResultSet resultSet = getResultSet();
Calendar calendar = Calendar.getInstance();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getCalendarValue(1, Date.class, calendar);
verify(resultSet).getDate(1, calendar);
}
@Test
@SneakyThrows
public void assertGetCalendarValueWithColumnIndexAndTime() {
ResultSet resultSet = getResultSet();
Calendar calendar = Calendar.getInstance();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getCalendarValue(1, Time.class, calendar);
verify(resultSet).getTime(1, calendar);
}
@Test
@SneakyThrows
public void assertGetCalendarValueWithColumnIndexAndTimestamp() {
ResultSet resultSet = getResultSet();
Calendar calendar = Calendar.getInstance();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getCalendarValue(1, Timestamp.class, calendar);
verify(resultSet).getTimestamp(1, calendar);
}
@Test(expected = SQLException.class)
@SneakyThrows
public void assertGetCalendarValueWithColumnIndexAndUnsupportedType() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet());
queryResult.next();
queryResult.getCalendarValue(1, Object.class, Calendar.getInstance());
}
@Test
@SneakyThrows
public void assertGetCalendarValueWithColumnLabelAndDate() {
ResultSet resultSet = getResultSet();
Calendar calendar = Calendar.getInstance();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getCalendarValue("order_id", Date.class, calendar);
verify(resultSet).getDate("order_id", calendar);
}
@Test
@SneakyThrows
public void assertGetCalendarValueWithColumnLabelAndTime() {
ResultSet resultSet = getResultSet();
Calendar calendar = Calendar.getInstance();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getCalendarValue("order_id", Time.class, calendar);
verify(resultSet).getTime("order_id", calendar);
}
@Test
@SneakyThrows
public void assertGetCalendarValueWithColumnLabelAndTimestamp() {
ResultSet resultSet = getResultSet();
Calendar calendar = Calendar.getInstance();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getCalendarValue("order_id", Timestamp.class, calendar);
verify(resultSet).getTimestamp("order_id", calendar);
}
@Test(expected = SQLException.class)
@SneakyThrows
public void assertGetCalendarValueWithColumnLabelAndUnsupportedType() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet());
queryResult.next();
queryResult.getCalendarValue("order_id", Object.class, Calendar.getInstance());
}
@Test
@SneakyThrows
public void assertGetInputStreamWithColumnIndexAndAscii() {
ResultSet resultSet = getResultSet();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getInputStream(1, "Ascii");
verify(resultSet).getAsciiStream(1);
}
@Test
@SneakyThrows
public void assertGetInputStreamWithColumnIndexAndUnicode() {
ResultSet resultSet = getResultSet();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getInputStream(1, "Unicode");
verify(resultSet).getUnicodeStream(1);
}
@Test
@SneakyThrows
public void assertGetInputStreamWithColumnIndexAndBinary() {
ResultSet resultSet = getResultSet();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getInputStream(1, "Binary");
verify(resultSet).getBinaryStream(1);
}
@Test(expected = SQLException.class)
@SneakyThrows
public void assertGetInputStreamWithColumnIndexAndUnsupportedType() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet());
queryResult.next();
queryResult.getInputStream(1, "Unsupported Type");
}
@Test
@SneakyThrows
public void assertGetInputStreamWithColumnLabelAndAscii() {
ResultSet resultSet = getResultSet();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getInputStream("order_id", "Ascii");
verify(resultSet).getAsciiStream("order_id");
}
@Test
@SneakyThrows
public void assertGetInputStreamWithColumnLabelAndUnicode() {
ResultSet resultSet = getResultSet();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getInputStream("order_id", "Unicode");
verify(resultSet).getUnicodeStream("order_id");
}
@Test
@SneakyThrows
public void assertGetInputStreamWithColumnLabelAndBinary() {
ResultSet resultSet = getResultSet();
StreamQueryResult queryResult = new StreamQueryResult(resultSet);
queryResult.next();
queryResult.getInputStream("order_id", "Binary");
verify(resultSet).getBinaryStream("order_id");
}
@Test(expected = SQLException.class)
@SneakyThrows
public void assertGetInputStreamWithColumnLabelAndUnsupportedType() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet());
queryResult.next();
queryResult.getInputStream("order_id", "Unsupported Type");
}
@Test
@SneakyThrows
public void assertWasNull() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet());
queryResult.next();
assertFalse(queryResult.wasNull());
queryResult.next();
assertTrue(queryResult.wasNull());
}
@Test
public void assertIsCaseSensitive() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet());
assertFalse(queryResult.isCaseSensitive(1));
}
@Test
public void assertGetColumnCount() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet());
assertThat(queryResult.getColumnCount(), Is.is(1));
}
@Test
public void assertGetColumnLabel() {
StreamQueryResult queryResult = new StreamQueryResult(getResultSet());
assertThat(queryResult.getColumnLabel(1), Is.is("order_id"));
}
}
......@@ -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;
......@@ -206,6 +207,16 @@ public final class TestQueryResult implements QueryResult {
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();
......
......@@ -664,6 +664,23 @@
</select-items>
</parser-result>
<parser-result sql-case-id="select_distinct_with_owner_column" >
<tables>
<table name="t_order" />
</tables>
<tokens>
<table-token start-index="38" table-name="t_order" length="7" />
</tokens>
<order-by-columns>
<order-by-column name="order_id" order-direction="ASC" />
</order-by-columns>
<select-items start-index="16" stop-index="31" distinctRow="true">
<column-select-items>
<column-select-item text="t_order.order_id" start-index="16" stop-index="31" name="order_id" />
</column-select-items>
</select-items>
</parser-result>
<parser-result sql-case-id="select_distinct_with_multi_column" >
<tables>
<table name="t_order" />
......
<!--
~ Licensed to the Apache Software Foundation (ASF) under one or more
~ contributor license agreements. See the NOTICE file distributed with
~ this work for additional information regarding copyright ownership.
~ The ASF licenses this file to You 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.
-->
<dataset>
<metadata>
<column name="order_id" />
</metadata>
<row values="1000" />
<row values="1001" />
<row values="1100" />
<row values="1101" />
<row values="1200" />
<row values="1201" />
<row values="1300" />
<row values="1301" />
<row values="1400" />
<row values="1401" />
<row values="1500" />
<row values="1501" />
<row values="1600" />
<row values="1601" />
<row values="1700" />
<row values="1701" />
<row values="1800" />
<row values="1801" />
<row values="1900" />
<row values="1901" />
<row values="2000" />
<row values="2001" />
<row values="2100" />
<row values="2101" />
<row values="2200" />
<row values="2201" />
<row values="2300" />
<row values="2301" />
<row values="2400" />
<row values="2401" />
<row values="2500" />
<row values="2501" />
<row values="2600" />
<row values="2601" />
<row values="2700" />
<row values="2701" />
<row values="2800" />
<row values="2801" />
<row values="2900" />
<row values="2901" />
</dataset>
<!--
~ Licensed to the Apache Software Foundation (ASF) under one or more
~ contributor license agreements. See the NOTICE file distributed with
~ this work for additional information regarding copyright ownership.
~ The ASF licenses this file to You 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.
-->
<dataset>
<metadata>
<column name="order_id" />
</metadata>
<row values="1000" />
<row values="1001" />
<row values="1002" />
<row values="1003" />
<row values="1004" />
<row values="1005" />
<row values="1006" />
<row values="1007" />
<row values="1008" />
<row values="1009" />
<row values="1100" />
<row values="1101" />
<row values="1102" />
<row values="1103" />
<row values="1104" />
<row values="1105" />
<row values="1106" />
<row values="1107" />
<row values="1108" />
<row values="1109" />
<row values="1200" />
<row values="1201" />
<row values="1202" />
<row values="1203" />
<row values="1204" />
<row values="1205" />
<row values="1206" />
<row values="1207" />
<row values="1208" />
<row values="1209" />
<row values="1300" />
<row values="1301" />
<row values="1302" />
<row values="1303" />
<row values="1304" />
<row values="1305" />
<row values="1306" />
<row values="1307" />
<row values="1308" />
<row values="1309" />
<row values="1400" />
<row values="1401" />
<row values="1402" />
<row values="1403" />
<row values="1404" />
<row values="1405" />
<row values="1406" />
<row values="1407" />
<row values="1408" />
<row values="1409" />
<row values="1500" />
<row values="1501" />
<row values="1502" />
<row values="1503" />
<row values="1504" />
<row values="1505" />
<row values="1506" />
<row values="1507" />
<row values="1508" />
<row values="1509" />
<row values="1600" />
<row values="1601" />
<row values="1602" />
<row values="1603" />
<row values="1604" />
<row values="1605" />
<row values="1606" />
<row values="1607" />
<row values="1608" />
<row values="1609" />
<row values="1700" />
<row values="1701" />
<row values="1702" />
<row values="1703" />
<row values="1704" />
<row values="1705" />
<row values="1706" />
<row values="1707" />
<row values="1708" />
<row values="1709" />
<row values="1800" />
<row values="1801" />
<row values="1802" />
<row values="1803" />
<row values="1804" />
<row values="1805" />
<row values="1806" />
<row values="1807" />
<row values="1808" />
<row values="1809" />
<row values="1900" />
<row values="1901" />
<row values="1902" />
<row values="1903" />
<row values="1904" />
<row values="1905" />
<row values="1906" />
<row values="1907" />
<row values="1908" />
<row values="1909" />
</dataset>
<!--
~ Licensed to the Apache Software Foundation (ASF) under one or more
~ contributor license agreements. See the NOTICE file distributed with
~ this work for additional information regarding copyright ownership.
~ The ASF licenses this file to You 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.
-->
<dataset>
<metadata>
<column name="order_id" />
</metadata>
<row values="1000" />
<row values="1001" />
<row values="1100" />
<row values="1101" />
<row values="1200" />
<row values="1201" />
<row values="1300" />
<row values="1301" />
<row values="1400" />
<row values="1401" />
<row values="1500" />
<row values="1501" />
<row values="1600" />
<row values="1601" />
<row values="1700" />
<row values="1701" />
<row values="1800" />
<row values="1801" />
<row values="1900" />
<row values="1901" />
<row values="2000" />
<row values="2001" />
<row values="2100" />
<row values="2101" />
<row values="2200" />
<row values="2201" />
<row values="2300" />
<row values="2301" />
<row values="2400" />
<row values="2401" />
<row values="2500" />
<row values="2501" />
<row values="2600" />
<row values="2601" />
<row values="2700" />
<row values="2701" />
<row values="2800" />
<row values="2801" />
<row values="2900" />
<row values="2901" />
</dataset>
<!--
~ Licensed to the Apache Software Foundation (ASF) under one or more
~ contributor license agreements. See the NOTICE file distributed with
~ this work for additional information regarding copyright ownership.
~ The ASF licenses this file to You 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.
-->
<dataset>
<metadata>
<column name="order_id" />
</metadata>
<row values="1000" />
<row values="1001" />
<row values="1002" />
<row values="1003" />
<row values="1004" />
<row values="1005" />
<row values="1006" />
<row values="1007" />
<row values="1008" />
<row values="1009" />
<row values="1100" />
<row values="1101" />
<row values="1102" />
<row values="1103" />
<row values="1104" />
<row values="1105" />
<row values="1106" />
<row values="1107" />
<row values="1108" />
<row values="1109" />
</dataset>
......@@ -400,6 +400,10 @@
<assertion expected-data-file="select_distinct_with_single_column.xml" />
</dql-test-case>
<dql-test-case sql-case-id="select_distinct_with_owner_column">
<assertion expected-data-file="select_distinct_with_owner_column.xml" />
</dql-test-case>
<dql-test-case sql-case-id="select_distinct_with_multi_column">
<assertion expected-data-file="select_distinct_with_multi_column.xml" />
</dql-test-case>
......
......@@ -19,6 +19,7 @@
<sql-cases>
<sql-case id="select_distinct_with_single_column" value="SELECT DISTINCT item_id FROM t_order_item ORDER BY item_id" />
<sql-case id="select_distinct_with_multi_column" value="SELECT DISTINCT order_id, user_id, status FROM t_order ORDER BY order_id" />
<sql-case id="select_distinct_with_owner_column" value="SELECT DISTINCT t_order.order_id FROM t_order ORDER BY order_id" />
<sql-case id="select_distinct_with_star" value="SELECT DISTINCT * FROM t_order WHERE order_id > 1100 ORDER BY order_id" />
<sql-case id="select_distinct_with_owner_star" value="SELECT DISTINCT t_order.*, t_order_item.order_id FROM t_order, t_order_item WHERE t_order.order_id = t_order_item.order_id ORDER BY t_order.order_id" />
<sql-case id="select_distinct_with_sum" value="SELECT SUM(DISTINCT order_id) s FROM t_order WHERE order_id &lt; 1100" />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册