Skip to content

Commit

Permalink
Merge fff8c5b into 5d048d2
Browse files Browse the repository at this point in the history
  • Loading branch information
sunbufu committed Aug 11, 2019
2 parents 5d048d2 + fff8c5b commit 45510f1
Show file tree
Hide file tree
Showing 20 changed files with 1,060 additions and 101 deletions.
Expand Up @@ -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;
Expand All @@ -50,31 +48,31 @@ 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());
aggregationDistinctColumnIndexAndSumColumnIndexes.putAll(getAggregationDistinctColumnIndexAndSumColumnIndexes());
}

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);
}

Expand Down
Expand Up @@ -20,7 +20,6 @@
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;
Expand All @@ -33,7 +32,6 @@
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;

/**
Expand All @@ -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;
}

Expand All @@ -60,7 +58,7 @@ public String apply(final AggregationDistinctSelectItem input) {
return input.getDistinctColumnLabel();
}
}));
metaData = new AggregationDistinctQueryMetaData(aggregationDistinctSelectItems, getColumnLabelAndIndexMap());
metaData = new AggregationDistinctQueryMetaData(aggregationDistinctSelectItems, getQueryResultMetaData());
}

/**
Expand All @@ -76,7 +74,7 @@ public List<DistinctQueryResult> divide() {
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);
}
}));
}
Expand Down Expand Up @@ -133,20 +131,14 @@ public boolean wasNull() {
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");
}
Expand Down
Expand Up @@ -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;
Expand All @@ -39,20 +37,21 @@
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;

/**
* Distinct query result.
*
* @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;

Expand All @@ -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);
Expand Down Expand Up @@ -124,7 +115,7 @@ public List<DistinctQueryResult> divide() {
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());
}
}));
}
Expand Down Expand Up @@ -191,20 +182,19 @@ public boolean isCaseSensitive(final int columnIndex) {

@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);
}
}
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -99,7 +101,7 @@ public Object getValue(final int columnIndex, final Class<?> type) {

@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
Expand All @@ -109,7 +111,7 @@ public Object getCalendarValue(final int columnIndex, final Class<?> type, final

@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
Expand All @@ -119,7 +121,7 @@ public InputStream getInputStream(final int columnIndex, final String type) {

@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
Expand All @@ -139,27 +141,27 @@ public boolean wasNull() {

@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;
}

Expand Down
Expand Up @@ -132,4 +132,11 @@ public interface QueryResult {
* @throws SQLException SQL Exception
*/
boolean isCaseSensitive(int columnIndex) throws SQLException;

/**
* Get QueryResultMetaData.
*
* @return QueryResultMetaData
*/
QueryResultMetaData getQueryResultMetaData();
}
Expand Up @@ -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;
Expand All @@ -26,8 +28,7 @@

import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Map;
import java.util.TreeMap;
import java.util.ArrayList;

/**
* Query result meta data.
Expand All @@ -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) {
Expand All @@ -70,8 +71,8 @@ public QueryResultMetaData(final ResultSetMetaData resultSetMetaData) {
}

@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);
}
Expand Down Expand Up @@ -117,7 +118,7 @@ public String getColumnName(final int columnIndex) {
* @return column name
*/
public Integer getColumnIndex(final String columnLabel) {
return columnLabelAndIndexes.get(columnLabel);
return new ArrayList<>(columnLabelAndIndexes.get(columnLabel)).get(0);
}

/**
Expand Down

0 comments on commit 45510f1

Please sign in to comment.