@Override
    public SelectResults filterEvaluate(ExecutionContext context, SelectResults iterationLimit,
        boolean completeExpansionNeeded, CompiledValue iterOperands, RuntimeIterator[] indpndntItrs,
        boolean isIntersection, boolean conditioningNeeded, boolean evalProj)
        throws FunctionDomainException, TypeMismatchException, NameResolutionException,
        QueryInvocationTargetException {
      ObjectType resultType = indxInfo._index.getResultSetType();
      int indexFieldsSize = -1;
      SelectResults set = null;
      Boolean orderByClause = (Boolean) context.cacheGet(CompiledValue.CAN_APPLY_ORDER_BY_AT_INDEX);
      boolean useLinkedDataStructure = false;
      boolean nullValuesAtStart = true;
      if (orderByClause != null && orderByClause) {
        List orderByAttrs = (List) context.cacheGet(CompiledValue.ORDERBY_ATTRIB);
        useLinkedDataStructure = orderByAttrs.size() == 1;
        nullValuesAtStart = !((CompiledSortCriterion) orderByAttrs.get(0)).getCriterion();
      }

      if (resultType instanceof StructType) {
        if (context.getCache().getLogger().fineEnabled()) {
          context.getCache().getLogger()
              .fine("StructType resultType.class=" + resultType.getClass().getName());
        }
        if (useLinkedDataStructure) {
          set = context.isDistinct() ? new LinkedStructSet((StructTypeImpl) resultType)
              : new SortedResultsBag<>(resultType, nullValuesAtStart);
        } else {
          set = QueryUtils.createStructCollection(context, (StructTypeImpl) resultType);
        }
        indexFieldsSize = ((StructTypeImpl) resultType).getFieldNames().length;
      } else {
        if (context.getCache().getLogger().fineEnabled()) {
          context.getCache().getLogger()
              .fine("non-StructType resultType.class=" + resultType.getClass().getName());
        }
        if (useLinkedDataStructure) {
          set = context.isDistinct() ? new LinkedResultSet(resultType)
              : new SortedResultsBag(resultType, nullValuesAtStart);
        } else {
          set = QueryUtils.createResultCollection(context, resultType);
        }
        indexFieldsSize = 1;
      }
      // actual index lookup
      QueryObserver observer = QueryObserverHolder.getInstance();
      /*
       * Asif : First obtain the match level of index resultset. If the match level happens to be
       * zero , this implies that we just have to change the StructType ( again if only the Index
       * resultset is a StructBag). If the match level is zero & expand to to top level flag is true
       * & iff the total no. of iterators in current scope is greater than the no. of fields in
       * StructBag , then only we need to do any expansion.
       *
       */
      try {
        observer.beforeIndexLookup(indxInfo._index, OQLLexerTokenTypes.TOK_NE,
            notEqualTypeKeys);
        context.cachePut(CompiledValue.INDEX_INFO, indxInfo);
        indxInfo._index.query(set, notEqualTypeKeys, context);
      } finally {
        observer.afterIndexLookup(set);
      }
      return QueryUtils.getConditionedIndexResults(set, indxInfo, context, indexFieldsSize,
          completeExpansionNeeded, iterOperands, indpndntItrs);
    }
@param notEqualTypeKeys java.utils.Set object containing the Keys of the 'NOT EQUAL' type
       conditions ( a != 3 and a !=5) For DoubleCondnRangeJunctionEvaluator , this may be
       null
@param indxInfo The IndexInfo object corresponding to the RangeJunction
geode-core/src/main/java/org/apache/geode/cache/query/internal/RangeJunction.java