You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2017/08/07 17:43:24 UTC
geode git commit: GEODE-3073: Renamed OrderByComparatorUnmapped to
OrderByComparatorMapped and refactored the code a bit.
Repository: geode
Updated Branches:
refs/heads/develop 488f3ceaa -> 79cf78c9b
GEODE-3073: Renamed OrderByComparatorUnmapped to OrderByComparatorMapped and refactored the code a bit.
This closes #591
Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/79cf78c9
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/79cf78c9
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/79cf78c9
Branch: refs/heads/develop
Commit: 79cf78c9bf80e836d07a1eccd515550601f31a0e
Parents: 488f3ce
Author: YehEmily <em...@gmail.com>
Authored: Fri Jun 16 13:41:21 2017 -0700
Committer: Kirk Lund <kl...@apache.org>
Committed: Mon Aug 7 09:27:19 2017 -0700
----------------------------------------------------------------------
.../cache/query/internal/CompiledSelect.java | 261 ++++++++++---------
.../query/internal/OrderByComparatorMapped.java | 126 +++++++++
.../internal/OrderByComparatorUnmapped.java | 147 -----------
.../internal/OrderByComparatorJUnitTest.java | 6 +-
.../codeAnalysis/sanctionedSerializables.txt | 2 +-
5 files changed, 274 insertions(+), 268 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/geode/blob/79cf78c9/geode-core/src/main/java/org/apache/geode/cache/query/internal/CompiledSelect.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/cache/query/internal/CompiledSelect.java b/geode-core/src/main/java/org/apache/geode/cache/query/internal/CompiledSelect.java
index fc64d67..808ea9d 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/query/internal/CompiledSelect.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/query/internal/CompiledSelect.java
@@ -15,6 +15,7 @@
package org.apache.geode.cache.query.internal;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
@@ -171,7 +172,7 @@ public class CompiledSelect extends AbstractCompiledValue {
@Override
public Set computeDependencies(ExecutionContext context)
- throws TypeMismatchException, AmbiguousNameException, NameResolutionException {
+ throws TypeMismatchException, NameResolutionException {
// bind iterators in new scope in order to determine dependencies
context.cachePut(scopeID, context.associateScopeID());
context.newScope((Integer) context.cacheGet(scopeID));
@@ -225,7 +226,7 @@ public class CompiledSelect extends AbstractCompiledValue {
}
protected void doTreeTransformation(ExecutionContext context)
- throws AmbiguousNameException, TypeMismatchException, NameResolutionException {
+ throws TypeMismatchException, NameResolutionException {
if (!this.transformationDone) {
this.cachedElementTypeForOrderBy = prepareResultType(context);
this.mapOrderByColumns(context);
@@ -238,7 +239,7 @@ public class CompiledSelect extends AbstractCompiledValue {
* Transforms the group by clause into distinct order by clause, if possible
*/
private void transformGroupByIfPossible(ExecutionContext context)
- throws AmbiguousNameException, TypeMismatchException, NameResolutionException {
+ throws TypeMismatchException, NameResolutionException {
// for time being assume that the group by cols are explicitly mentioned in proj
if (this.groupBy != null) {
List projAttribs = this.projAttrs;
@@ -306,7 +307,7 @@ public class CompiledSelect extends AbstractCompiledValue {
}
protected void modifyGroupByToOrderBy(boolean setDistinct, ExecutionContext context)
- throws AmbiguousNameException, TypeMismatchException, NameResolutionException {
+ throws TypeMismatchException, NameResolutionException {
if (setDistinct) {
this.distinct = setDistinct;
}
@@ -321,7 +322,7 @@ public class CompiledSelect extends AbstractCompiledValue {
}
private void mapOrderByColumns(ExecutionContext context)
- throws AmbiguousNameException, TypeMismatchException, NameResolutionException {
+ throws TypeMismatchException, NameResolutionException {
if (this.orderByAttrs != null) {
Iterator<CompiledSortCriterion> iter = this.orderByAttrs.iterator();
while (iter.hasNext()) {
@@ -347,7 +348,7 @@ public class CompiledSelect extends AbstractCompiledValue {
private void evalCanonicalizedExpressionForCSC(CompiledSortCriterion csc,
ExecutionContext context, StringBuilder buffer)
- throws AmbiguousNameException, TypeMismatchException, NameResolutionException {
+ throws TypeMismatchException, NameResolutionException {
csc.getExpr().generateCanonicalizedExpression(buffer, context);
}
@@ -402,7 +403,7 @@ public class CompiledSelect extends AbstractCompiledValue {
try {
// set flag to keep objects serialized for "select *" queries
- if ((DefaultQuery) context.getQuery() != null) {
+ if (context.getQuery() != null) {
((DefaultQuery) context.getQuery()).keepResultsSerialized(this, context);
}
Iterator iter = iterators.iterator();
@@ -455,7 +456,7 @@ public class CompiledSelect extends AbstractCompiledValue {
int numInd = context.getAllIndependentIteratorsOfCurrentScope().size();
// If order by clause is defined, then the first column should be the preferred index
if (this.orderByAttrs != null && numInd == 1) {
- CompiledSortCriterion csc = (CompiledSortCriterion) orderByAttrs.get(0);
+ CompiledSortCriterion csc = orderByAttrs.get(0);
StringBuilder preferredIndexCondn = new StringBuilder();
this.evalCanonicalizedExpressionForCSC(csc, context, preferredIndexCondn);
context.cachePut(PREF_INDEX_COND, preferredIndexCondn.toString());
@@ -490,7 +491,7 @@ public class CompiledSelect extends AbstractCompiledValue {
StringBuilder temp = null;
if (this.orderByAttrs != null) {
temp = new StringBuilder();
- CompiledSortCriterion csc = (CompiledSortCriterion) this.orderByAttrs.get(0);
+ CompiledSortCriterion csc = this.orderByAttrs.get(0);
this.evalCanonicalizedExpressionForCSC(csc, context, temp);
}
@@ -557,7 +558,7 @@ public class CompiledSelect extends AbstractCompiledValue {
assert result != null;
// drop duplicates if this is DISTINCT
if (result instanceof SelectResults) {
- SelectResults sr = (SelectResults) result;
+ SelectResults sr = result;
CollectionType colnType = sr.getCollectionType();
// if (this.distinct && colnType.allowsDuplicates()) {
if (this.distinct) {
@@ -589,7 +590,7 @@ public class CompiledSelect extends AbstractCompiledValue {
* If SelectResult size is zero then we need to put Integer for 0 count.
*/
if (this.count) {
- SelectResults res = (SelectResults) result;
+ SelectResults res = result;
if ((this.distinct || evalAsFilters || countStartQueryResult == 0)) {
// Retrun results as it is as distinct is applied
@@ -761,8 +762,8 @@ public class CompiledSelect extends AbstractCompiledValue {
// returns the number of elements added in the return ResultSet
private int doNestedIterations(int level, SelectResults results, ExecutionContext context,
- boolean evaluateWhereClause, int numElementsInResult) throws TypeMismatchException,
- AmbiguousNameException, FunctionDomainException, NameResolutionException,
+ boolean evaluateWhereClause, int numElementsInResult)
+ throws TypeMismatchException, FunctionDomainException, NameResolutionException,
QueryInvocationTargetException, CompiledSelect.NullIteratorException {
List iterList = context.getCurrentIterators();
if (level == iterList.size()) {
@@ -792,14 +793,14 @@ public class CompiledSelect extends AbstractCompiledValue {
}
}
if (addToResults) {
- int occurence =
+ int occurrence =
applyProjectionAndAddToResultSet(context, results, this.orderByAttrs == null);
- // If the occurence is greater than 1, then only in case of
+ // If the occurrence is greater than 1, then only in case of
// non distinct query should it be treated as contributing to size
// else duplication will be eliminated when making it distinct using
// ResultsCollectionWrapper and we will fall short of limit
- if (occurence == 1 || (occurence > 1 && !this.distinct)) {
- // (Unique i.e first time occurence) or subsequent occurence
+ if (occurrence == 1 || (occurrence > 1 && !this.distinct)) {
+ // (Unique i.e first time occurrence) or subsequent occurrence
// for non distinct query
++numElementsInResult;
}
@@ -823,18 +824,17 @@ public class CompiledSelect extends AbstractCompiledValue {
// #44807: select * query should not deserialize objects
// In case of "select *" queries we can keep the results in serialized
// form and send it to the client.
- if ((DefaultQuery) context.getQuery() != null
- && ((DefaultQuery) context.getQuery()).isKeepSerialized() && sr instanceof QRegion) {
+ if (context.getQuery() != null && ((DefaultQuery) context.getQuery()).isKeepSerialized()
+ && sr instanceof QRegion) {
((QRegion) sr).setKeepSerialized(true);
}
// Iterate through the data set.
- Iterator cIter = sr.iterator();
- while (cIter.hasNext()) {
+ for (Object aSr : sr) {
// Check if query execution on this thread is canceled.
QueryMonitor.isQueryExecutionCanceled();
- Object currObj = cIter.next();
+ Object currObj = aSr;
rIter.setCurrent(currObj);
QueryObserver observer = QueryObserverHolder.getInstance();
observer.beforeIterationEvaluation(rIter, currObj);
@@ -850,26 +850,19 @@ public class CompiledSelect extends AbstractCompiledValue {
}
private SelectResults applyProjectionOnCollection(SelectResults resultSet,
- ExecutionContext context, boolean ignoreOrderBy)
- throws TypeMismatchException, AmbiguousNameException, FunctionDomainException,
- NameResolutionException, QueryInvocationTargetException {
+ ExecutionContext context, boolean ignoreOrderBy) throws TypeMismatchException,
+ FunctionDomainException, NameResolutionException, QueryInvocationTargetException {
List iterators = context.getCurrentIterators();
if (projAttrs == null && (this.orderByAttrs == null || ignoreOrderBy)) {
- // If the projection attribute is null( ie.e specified as *) &
- // there is only one
- // Runtime Iteratir we can return the set as it is.But if the proejction
- // attribute is null & multiple Iterators are defined we need to rectify
- // the
- // the StructBag that is returned. It is to be noted that in case of
- // single from clause
- // where the from clause itself is defined as nested select query with
- // multiple
- // from clauses , the resultset returned will be a StructBag which we
- // have to return
- // as it is.
+ // If the projection attribute is null (ie specified as *) & there is only one Runtime
+ // Iterator we can return the set as it is. But if the projection attribute is null & multiple
+ // Iterators are defined we need to rectify the StructBag that is returned. It is to be noted
+ // that in case of single from clause where the from clause itself is defined as nested select
+ // query with multiple from clauses, the result set returned will be a StructBag which we have
+ // to return as it is.
if (iterators.size() > 1) {
StructType type = createStructTypeForNullProjection(iterators, context);
- ((SelectResults) resultSet).setElementType(type);
+ resultSet.setElementType(type);
}
return resultSet;
@@ -880,11 +873,11 @@ public class CompiledSelect extends AbstractCompiledValue {
&& resultSet.getCollectionType().getElementType().isStructType();
if (isStructType) {
Iterator resultsIter = resultSet.iterator();
- // Apply limit if there is no order by.
+ // Apply limit if there is no order by
Integer limitValue = evaluateLimitValue(context, this.limit);
while (((this.orderByAttrs != null && !ignoreOrderBy) || limitValue < 0
|| (numElementsAdded < limitValue)) && resultsIter.hasNext()) {
- // Check if query execution on this thread is canceled.
+ // Check if query execution on this thread is canceled
QueryMonitor.isQueryExecutionCanceled();
Object values[] = ((Struct) resultsIter.next()).getFieldValues();
@@ -893,7 +886,7 @@ public class CompiledSelect extends AbstractCompiledValue {
}
int occurence = applyProjectionAndAddToResultSet(context, pResultSet, ignoreOrderBy);
if (occurence == 1 || (occurence > 1 && !this.distinct)) {
- // (Unique i.e first time occurence) or subsequent occurence
+ // (Unique i.e first time occurrence) or subsequent occurrence
// for non distinct query
++numElementsAdded;
}
@@ -901,15 +894,15 @@ public class CompiledSelect extends AbstractCompiledValue {
// return pResultSet;
} else if (iterators.size() == 1) {
RuntimeIterator rIter = (RuntimeIterator) iterators.get(0);
- Iterator resultsIter = ((SelectResults) resultSet).iterator();
+ Iterator resultsIter = resultSet.iterator();
// Apply limit if there is no order by.
Integer limitValue = evaluateLimitValue(context, this.limit);
while (((this.orderByAttrs != null && !ignoreOrderBy) || limitValue < 0
|| (numElementsAdded < limitValue)) && resultsIter.hasNext()) {
rIter.setCurrent(resultsIter.next());
- int occurence = applyProjectionAndAddToResultSet(context, pResultSet, ignoreOrderBy);
- if (occurence == 1 || (occurence > 1 && !this.distinct)) {
- // (Unique i.e first time occurence) or subsequent occurence
+ int occurrence = applyProjectionAndAddToResultSet(context, pResultSet, ignoreOrderBy);
+ if (occurrence == 1 || (occurrence > 1 && !this.distinct)) {
+ // (Unique i.e first time occurrence) or subsequent occurrence
// for non distinct query
++numElementsAdded;
}
@@ -923,81 +916,119 @@ public class CompiledSelect extends AbstractCompiledValue {
}
}
+ public enum DataContainerType {
+ // isOrdered, distinct, elementType.isStructType(), ignoreOrderBy
+ UNORDERED_DISTINCT_STRUCT(false, true, true, true),
+ UNORDERED_DISTINCT_RESULTS(false, true, false, true),
+ UNORDERED_INDISTINCT_STRUCT(false, false, true, true),
+ UNORDERED_INDISTINCT_RESULTS(false, false, false, true),
+
+ ORDERED_DISTINCT_STRUCT_IGNORED(true, true, true, true),
+ ORDERED_INDISTINCT_STRUCT_IGNORED(true, false, true, true),
+ ORDERED_DISTINCT_STRUCT_UNIGNORED(true, true, true, false),
+ ORDERED_INDISTINCT_STRUCT_UNIGNORED(true, false, true, false),
+ ORDERED_DISTINCT_RESULTS_IGNORED(true, true, false, true),
+ ORDERED_INDISTINCT_RESULTS_IGNORED(true, false, false, true),
+ ORDERED_DISTINCT_RESULTS_UNIGNORED(true, true, false, false),
+ ORDERED_INDISTINCT_RESULTS_UNIGNORED(true, false, false, false);
+
+ public static DataContainerType determineDataContainerType(boolean getOrdered,
+ boolean getDistinct, boolean getStructType, boolean getIgnoreOrderBy)
+ throws TypeMismatchException {
+ // if not isOrdered, then isIgnoreOrderBy is irrelevant
+ return Arrays.stream(DataContainerType.values()).filter(type -> type.isOrdered == getOrdered)
+ .filter(type -> type.isDistinct == getDistinct)
+ .filter(type -> type.isStructType == getStructType)
+ .filter(type -> type.isIgnoreOrderBy == getIgnoreOrderBy || !type.isOrdered).findFirst()
+ .orElseThrow(() -> new TypeMismatchException("Logical inconsistency in CompiledSelect"));
+ }
+
+ DataContainerType(boolean isOrdered, boolean isDistinct, boolean isStructType,
+ boolean isIgnoreOrderBy) {
+ this.isOrdered = isOrdered;
+ this.isDistinct = isDistinct;
+ this.isStructType = isStructType;
+ this.isIgnoreOrderBy = isIgnoreOrderBy;
+ }
+
+ private final boolean isOrdered, isDistinct, isStructType, isIgnoreOrderBy;
+ }
+
private SelectResults prepareEmptyResultSet(ExecutionContext context, boolean ignoreOrderBy)
throws TypeMismatchException, AmbiguousNameException {
- // if no projection attributes or '*'as projection attribute
- // & more than one/RunTimeIterator then create a StrcutSet.
- // If attribute is null or '*' & only one RuntimeIterator then create a
- // ResultSet.
- // If single attribute is present without alias name , then create
- // ResultSet
- // Else if more than on attribute or single attribute with alias is
- // present then return a StrcutSet
- // create StructSet which will contain root objects of all iterators in
- // from clause
-
+ // If no projection attributes or '*' as projection attribute & more than one/RunTimeIterator
+ // then create a StructSet.
+ // If attribute is null or '*' & only one RuntimeIterator then create a ResultSet.
+ // If single attribute is present without alias name, then create ResultSet.
+ // Else if more than on attribute or single attribute with alias is present then return a
+ // StructSet.
+ // Create StructSet which will contain root objects of all iterators in from clause.
ObjectType elementType = this.cachedElementTypeForOrderBy != null
? this.cachedElementTypeForOrderBy : prepareResultType(context);
SelectResults results;
- if (this.distinct || !this.count) {
- if (this.orderByAttrs != null) {
- boolean nullValuesAtStart = !((CompiledSortCriterion) orderByAttrs.get(0)).getCriterion();
- if (elementType.isStructType()) {
- if (ignoreOrderBy) {
- results = this.distinct ? new LinkedStructSet((StructTypeImpl) elementType)
- : new SortedResultsBag(elementType, nullValuesAtStart);
- } else {
- OrderByComparator comparator = this.hasUnmappedOrderByCols
- ? new OrderByComparatorUnmapped(this.orderByAttrs, (StructTypeImpl) elementType,
- context)
- : new OrderByComparator(this.orderByAttrs, (StructTypeImpl) elementType, context);
- results = this.distinct ? new SortedStructSet(comparator, (StructTypeImpl) elementType)
- : new SortedStructBag(comparator, (StructType) elementType, nullValuesAtStart);
-
- }
- } else {
- if (ignoreOrderBy) {
- results =
- this.distinct ? new LinkedResultSet() : new SortedResultsBag(nullValuesAtStart);
-
- } else {
- OrderByComparator comparator = this.hasUnmappedOrderByCols
- ? new OrderByComparatorUnmapped(this.orderByAttrs, elementType, context)
- : new OrderByComparator(this.orderByAttrs, elementType, context);
- results = this.distinct ? new SortedResultSet(comparator)
- : new SortedResultsBag(comparator, nullValuesAtStart);
- }
- results.setElementType(elementType);
- }
- } else {
- if (this.distinct) {
- if (elementType.isStructType()) {
- results = new StructSet((StructType) elementType);
- } else {
- results = new ResultsSet(elementType);
- }
- } else {
- if (elementType.isStructType()) {
- results = new StructBag((StructType) elementType, context.getCachePerfStats());
- } else {
- results = new ResultsBag(elementType, context.getCachePerfStats());
- }
- }
- }
- } else {
- // Shobhit: If its a 'COUNT' query and no End processing required Like for
- // 'DISTINCT'
- // we can directly keep count in ResultSet and ResultBag is good enough
- // for that.
- results =
- new ResultsBag(new ObjectTypeImpl(Integer.class), 1 /*
- * initial capacity for count value
- */, context.getCachePerfStats());
+ if (!this.distinct && this.count) {
+ // Shobhit: If it's a 'COUNT' query and no End processing required Like for 'DISTINCT'
+ // we can directly keep count in ResultSet and ResultBag is good enough for that.
+ results = new ResultsBag(new ObjectTypeImpl(Integer.class), 1, context.getCachePerfStats());
countStartQueryResult = 0;
+ return results;
+ }
+ // Potential edge-case: Could this be non-null but empty?
+ boolean nullValuesAtStart = orderByAttrs != null && !orderByAttrs.get(0).getCriterion();
+ OrderByComparator comparator;
+ boolean isOrdered = this.orderByAttrs != null;
+
+ switch (DataContainerType.determineDataContainerType(isOrdered, distinct,
+ elementType.isStructType(), ignoreOrderBy)) {
+ case UNORDERED_DISTINCT_STRUCT:
+ return new StructSet((StructType) elementType);
+ case UNORDERED_DISTINCT_RESULTS:
+ return new ResultsSet(elementType);
+ case UNORDERED_INDISTINCT_STRUCT:
+ return new StructBag((StructType) elementType, context.getCachePerfStats());
+ case UNORDERED_INDISTINCT_RESULTS:
+ return new ResultsBag(elementType, context.getCachePerfStats());
+
+ case ORDERED_DISTINCT_STRUCT_IGNORED:
+ return new LinkedStructSet((StructTypeImpl) elementType);
+ case ORDERED_INDISTINCT_STRUCT_IGNORED:
+ return new SortedResultsBag(elementType, nullValuesAtStart);
+ case ORDERED_DISTINCT_STRUCT_UNIGNORED:
+ comparator = this.hasUnmappedOrderByCols
+ ? new OrderByComparatorMapped(this.orderByAttrs, elementType, context)
+ : new OrderByComparator(this.orderByAttrs, elementType, context);
+ return new SortedStructSet(comparator, (StructTypeImpl) elementType);
+ case ORDERED_INDISTINCT_STRUCT_UNIGNORED:
+ comparator = this.hasUnmappedOrderByCols
+ ? new OrderByComparatorMapped(this.orderByAttrs, elementType, context)
+ : new OrderByComparator(this.orderByAttrs, elementType, context);
+ return new SortedStructBag(comparator, (StructType) elementType, nullValuesAtStart);
+ case ORDERED_DISTINCT_RESULTS_IGNORED:
+ results = new LinkedResultSet();
+ results.setElementType(elementType);
+ return results;
+ case ORDERED_INDISTINCT_RESULTS_IGNORED:
+ results = new SortedResultsBag(nullValuesAtStart);
+ results.setElementType(elementType);
+ return results;
+ case ORDERED_DISTINCT_RESULTS_UNIGNORED:
+ comparator = this.hasUnmappedOrderByCols
+ ? new OrderByComparatorMapped(this.orderByAttrs, elementType, context)
+ : new OrderByComparator(this.orderByAttrs, elementType, context);
+ results = new SortedResultSet(comparator);
+ results.setElementType(elementType);
+ return results;
+ case ORDERED_INDISTINCT_RESULTS_UNIGNORED:
+ comparator = this.hasUnmappedOrderByCols
+ ? new OrderByComparatorMapped(this.orderByAttrs, elementType, context)
+ : new OrderByComparator(this.orderByAttrs, elementType, context);
+ results = new SortedResultsBag(comparator, nullValuesAtStart);
+ results.setElementType(elementType);
+ return results;
}
- return results;
+ throw new TypeMismatchException("Logical inconsistency in CompiledSelect");
}
protected ObjectType prepareResultType(ExecutionContext context)
@@ -1278,7 +1309,7 @@ public class CompiledSelect extends AbstractCompiledValue {
&& !context.getCache().getPdxReadSerialized()) {
values[i] = ((PdxInstance) values[i]).getObject();
} else if (values[i] instanceof PdxString) {
- values[i] = ((PdxString) values[i]).toString();
+ values[i] = values[i].toString();
}
}
}
@@ -1415,11 +1446,7 @@ public class CompiledSelect extends AbstractCompiledValue {
// add UNDEFINED to results only for NOT EQUALS queries
if (this.whereClause.getType() == COMPARISON) {
int operator = ((Filter) this.whereClause).getOperator();
- if ((operator != TOK_NE && operator != TOK_NE_ALT)) {
- return false;
- } else {
- return true;
- }
+ return operator == TOK_NE || operator == TOK_NE_ALT;
} else {
return false;
}
http://git-wip-us.apache.org/repos/asf/geode/blob/79cf78c9/geode-core/src/main/java/org/apache/geode/cache/query/internal/OrderByComparatorMapped.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/cache/query/internal/OrderByComparatorMapped.java b/geode-core/src/main/java/org/apache/geode/cache/query/internal/OrderByComparatorMapped.java
new file mode 100644
index 0000000..9746a2d
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/cache/query/internal/OrderByComparatorMapped.java
@@ -0,0 +1,126 @@
+/*
+ * 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.geode.cache.query.internal;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap;
+
+import org.apache.geode.cache.query.FunctionDomainException;
+import org.apache.geode.cache.query.NameResolutionException;
+import org.apache.geode.cache.query.QueryInvocationTargetException;
+import org.apache.geode.cache.query.QueryService;
+import org.apache.geode.cache.query.TypeMismatchException;
+import org.apache.geode.cache.query.types.ObjectType;
+import org.apache.geode.pdx.internal.PdxString;
+
+public class OrderByComparatorMapped extends OrderByComparator {
+
+ private final Map<Object, Object[]> orderByMap;
+
+ public OrderByComparatorMapped(List<CompiledSortCriterion> orderByAttrs, ObjectType objType,
+ ExecutionContext context) {
+ super(orderByAttrs, objType, context);
+ if (objType.isStructType()) {
+ orderByMap = new Object2ObjectOpenCustomHashMap<Object, Object[]>(
+ new StructBag.ObjectArrayFUHashingStrategy());
+ } else {
+ this.orderByMap = new HashMap<Object, Object[]>();
+ }
+ }
+
+ @Override
+ void addEvaluatedSortCriteria(Object row, ExecutionContext context)
+ throws FunctionDomainException, TypeMismatchException, NameResolutionException,
+ QueryInvocationTargetException {
+ this.orderByMap.put(row, this.calculateSortCriteria(context, row));
+ }
+
+ @Override
+ public int evaluateSortCriteria(Object obj1, Object obj2) {
+ int result = -1;
+ Object[] list1 = this.evaluateSortCriteria(obj1);
+ Object[] list2 = this.evaluateSortCriteria(obj2);
+ if (list1.length != list2.length) {
+ Support.assertionFailed("Error Occurred due to improper sort criteria evaluation ");
+ } else {
+ for (int i = 0; i < list1.length; i++) {
+ Object arr1[] = (Object[]) list1[i];
+ Object arr2[] = (Object[]) list2[i];
+
+ if (arr1[0] == null) {
+ result = (arr2[0] == null ? 0 : -1);
+ } else if (arr2[0] == null) {
+ result = 1;
+ } else if (arr1[0] == QueryService.UNDEFINED) {
+ result = (arr2[0] == QueryService.UNDEFINED ? 0 : -1);
+ } else if (arr2[0] == QueryService.UNDEFINED) {
+ result = 1;
+ } else {
+ if (arr1[0] instanceof Number && arr2[0] instanceof Number) {
+ Number num1 = (Number) arr1[0];
+ Number num2 = (Number) arr2[0];
+ result = Double.compare(num1.doubleValue(), num2.doubleValue());
+ } else {
+ if (arr1[0] instanceof PdxString && arr2[0] instanceof String) {
+ arr2[0] = new PdxString((String) arr2[0]);
+ } else if (arr2[0] instanceof PdxString && arr1[0] instanceof String) {
+ arr1[0] = new PdxString((String) arr1[0]);
+ }
+ result = ((Comparable) arr1[0]).compareTo(arr2[0]);
+ }
+ }
+
+ if (result != 0) {
+ // not equal, change the sign based on the order by type (asc,
+ // desc)
+ if (((Boolean) arr1[1]).booleanValue()) {
+ result *= -1;
+ }
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+ @Override
+ protected Object[] evaluateSortCriteria(Object row) {
+ return orderByMap.get(row);
+ }
+
+ private Object[] calculateSortCriteria(ExecutionContext context, Object row)
+ throws FunctionDomainException, TypeMismatchException, NameResolutionException,
+ QueryInvocationTargetException {
+ if (orderByAttrs != null) {
+ Object[] evaluatedResult = new Object[this.orderByAttrs.size()];
+ int index = 0;
+ for (CompiledSortCriterion csc : orderByAttrs) {
+ Object[] arr = new Object[2];
+ if (csc.getColumnIndex() == -1) {
+ arr[0] = csc.evaluate(context);
+ } else {
+ arr[0] = csc.evaluate(row, context);
+ }
+ arr[1] = csc.getCriterion();
+ evaluatedResult[index++] = arr;
+ }
+ return evaluatedResult;
+ }
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/geode/blob/79cf78c9/geode-core/src/main/java/org/apache/geode/cache/query/internal/OrderByComparatorUnmapped.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/cache/query/internal/OrderByComparatorUnmapped.java b/geode-core/src/main/java/org/apache/geode/cache/query/internal/OrderByComparatorUnmapped.java
deleted file mode 100644
index ee2caa0..0000000
--- a/geode-core/src/main/java/org/apache/geode/cache/query/internal/OrderByComparatorUnmapped.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * 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.geode.cache.query.internal;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap;
-
-import org.apache.geode.cache.query.FunctionDomainException;
-import org.apache.geode.cache.query.NameResolutionException;
-import org.apache.geode.cache.query.QueryInvocationTargetException;
-import org.apache.geode.cache.query.QueryService;
-import org.apache.geode.cache.query.TypeMismatchException;
-import org.apache.geode.cache.query.types.ObjectType;
-import org.apache.geode.pdx.internal.PdxString;
-
-public class OrderByComparatorUnmapped extends OrderByComparator {
-
- private final Map<Object, Object[]> orderByMap;
-
- public OrderByComparatorUnmapped(List<CompiledSortCriterion> orderByAttrs, ObjectType objType,
- ExecutionContext context) {
- super(orderByAttrs, objType, context);
- if (objType.isStructType()) {
- orderByMap = new Object2ObjectOpenCustomHashMap<Object, Object[]>(
- new StructBag.ObjectArrayFUHashingStrategy());
- } else {
- this.orderByMap = new HashMap<Object, Object[]>();
- }
-
- }
-
- @Override
- void addEvaluatedSortCriteria(Object row, ExecutionContext context)
- throws FunctionDomainException, TypeMismatchException, NameResolutionException,
- QueryInvocationTargetException {
-
- this.orderByMap.put(row, this.calculateSortCriteria(context, row));
- }
-
- @Override
- public int evaluateSortCriteria(Object obj1, Object obj2) {
- int result = -1;
- Object[] list1 = this.evaluateSortCriteria(obj1);
- Object[] list2 = this.evaluateSortCriteria(obj2);
-
- if (list1.length != list2.length) {
- Support.assertionFailed("Error Occurred due to improper sort criteria evaluation ");
- } else {
- for (int i = 0; i < list1.length; i++) {
- Object arr1[] = (Object[]) list1[i];
- Object arr2[] = (Object[]) list2[i];
- // check for null.
- if (arr1[0] == null || arr2[0] == null) {
- if (arr1[0] == null) {
- result = (arr2[0] == null ? 0 : -1);
- } else {
- result = 1;
- }
- } else if (arr1[0] == QueryService.UNDEFINED || arr2[0] == QueryService.UNDEFINED) {
- if (arr1[0] == QueryService.UNDEFINED) {
- result = (arr2[0] == QueryService.UNDEFINED ? 0 : -1);
- } else {
- result = 1;
- }
- } else {
- if (arr1[0] instanceof Number && arr2[0] instanceof Number) {
- double diff = ((Number) arr1[0]).doubleValue() - ((Number) arr2[0]).doubleValue();
- result = diff > 0 ? 1 : diff < 0 ? -1 : 0;
- } else {
- if (arr1[0] instanceof PdxString && arr2[0] instanceof String) {
- arr2[0] = new PdxString((String) arr2[0]);
- } else if (arr2[0] instanceof PdxString && arr1[0] instanceof String) {
- arr1[0] = new PdxString((String) arr1[0]);
- }
- result = ((Comparable) arr1[0]).compareTo(arr2[0]);
- }
-
- }
-
- // equals.
- if (result == 0) {
- continue;
- } else {
- // not equal, change the sign based on the order by type (asc,
- // desc).
- if (((Boolean) arr1[1]).booleanValue()) {
- result = (result * -1);
- }
- break;
- }
- }
- }
- return result;
- }
-
-
-
- @Override
- protected Object[] evaluateSortCriteria(Object row) {
- return orderByMap.get(row);
- }
-
-
- private Object[] calculateSortCriteria(ExecutionContext context, Object row)
-
- throws FunctionDomainException, TypeMismatchException, NameResolutionException,
- QueryInvocationTargetException {
-
- CompiledSortCriterion csc;
- if (orderByAttrs != null) {
- Object[] evaluatedResult = new Object[this.orderByAttrs.size()];
-
- Iterator<CompiledSortCriterion> orderiter = orderByAttrs.iterator();
- int index = 0;
- while (orderiter.hasNext()) {
- csc = orderiter.next();
- Object[] arr = new Object[2];
- if (csc.getColumnIndex() == -1) {
- arr[0] = csc.evaluate(context);
- } else {
- arr[0] = csc.evaluate(row, context);
- }
- arr[1] = Boolean.valueOf(csc.getCriterion());
- evaluatedResult[index++] = arr;
- }
- return evaluatedResult;
- }
- return null;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/geode/blob/79cf78c9/geode-core/src/test/java/org/apache/geode/cache/query/internal/OrderByComparatorJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/cache/query/internal/OrderByComparatorJUnitTest.java b/geode-core/src/test/java/org/apache/geode/cache/query/internal/OrderByComparatorJUnitTest.java
index 6c365cd..8481e17 100644
--- a/geode-core/src/test/java/org/apache/geode/cache/query/internal/OrderByComparatorJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/cache/query/internal/OrderByComparatorJUnitTest.java
@@ -22,7 +22,6 @@ import static org.junit.Assert.fail;
import java.lang.reflect.Field;
import java.util.Collection;
-import java.util.List;
import org.junit.After;
import org.junit.Before;
@@ -81,7 +80,8 @@ public class OrderByComparatorJUnitTest {
Collection base = (Collection) baseField.get(rcw);
assertTrue(base instanceof SortedStructSet);
SortedStructSet sss = (SortedStructSet) base;
- assertTrue(sss.comparator() instanceof OrderByComparatorUnmapped);
+ assertTrue(sss.comparator() instanceof OrderByComparatorMapped);
+
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
@@ -118,7 +118,7 @@ public class OrderByComparatorJUnitTest {
Collection base = (Collection) baseField.get(rcw);
assertTrue(base instanceof SortedStructSet);
SortedStructSet sss = (SortedStructSet) base;
- assertFalse(sss.comparator() instanceof OrderByComparatorUnmapped);
+ assertFalse(sss.comparator() instanceof OrderByComparatorMapped);
assertTrue(sss.comparator() instanceof OrderByComparator);
} catch (Exception e) {
e.printStackTrace();
http://git-wip-us.apache.org/repos/asf/geode/blob/79cf78c9/geode-core/src/test/resources/org/apache/geode/codeAnalysis/sanctionedSerializables.txt
----------------------------------------------------------------------
diff --git a/geode-core/src/test/resources/org/apache/geode/codeAnalysis/sanctionedSerializables.txt b/geode-core/src/test/resources/org/apache/geode/codeAnalysis/sanctionedSerializables.txt
index d627da9..743a8c2 100755
--- a/geode-core/src/test/resources/org/apache/geode/codeAnalysis/sanctionedSerializables.txt
+++ b/geode-core/src/test/resources/org/apache/geode/codeAnalysis/sanctionedSerializables.txt
@@ -152,6 +152,7 @@ org/apache/geode/cache/query/QueryInvalidException,true,2849255122285215114
org/apache/geode/cache/query/QueryInvocationTargetException,true,2978208305701582906
org/apache/geode/cache/query/RegionNotFoundException,true,592495934010222373
org/apache/geode/cache/query/TypeMismatchException,true,4205901708655503775
+org/apache/geode/cache/query/internal/CompiledSelect$DataContainerType,false,isDistinct:boolean,isIgnoreOrderBy:boolean,isOrdered:boolean,isStructType:boolean
org/apache/geode/cache/query/internal/CompiledSelect$NullIteratorException,false
org/apache/geode/cache/query/internal/CompiledSortCriterion$1,false,this$0:org/apache/geode/cache/query/internal/CompiledSortCriterion
org/apache/geode/cache/query/internal/ObjectIntHashMap,true,7718697444988416372,hashingStrategy:org/apache/geode/cache/query/internal/HashingStrategy,loadFactor:float,threshold:int
@@ -447,7 +448,6 @@ org/apache/geode/internal/process/PidUnavailableException,true,-1660269538268828
org/apache/geode/internal/process/signal/Signal,false,description:java/lang/String,name:java/lang/String,number:int,type:org/apache/geode/internal/process/signal/SignalType
org/apache/geode/internal/process/signal/SignalEvent,false,signal:org/apache/geode/internal/process/signal/Signal
org/apache/geode/internal/process/signal/SignalType,false,description:java/lang/String
-org/apache/geode/internal/security/SecurityServiceType,false
org/apache/geode/internal/sequencelog/GraphType,false
org/apache/geode/internal/sequencelog/model/GraphID,false,graphName:java/lang/String,type:org/apache/geode/internal/sequencelog/GraphType
org/apache/geode/internal/size/ReflectionObjectSizer,false