예제 #1
0
  private void consumeChildEvaluation(LongTreeMap<Object> childResult) {
    boolean prepareResult = false;
    int size = childResult.size();
    if (size == 1 && expression.resultType == DataType.NUMBER) {
      Object resultItem = childResult.firstEntry().value;
      if (resultItem instanceof Double && ((Double) resultItem).isNaN()) {
        result.clear();
        prepareResult = true;
      }
    }

    if (size > 0) {
      if (predicateChain == 0) fireInstantResult(childResult);
      if (result.size() > 0) {
        if (nodeSetListener != null) {
          for (LongTreeMap.Entry<Object> entry = childResult.firstEntry();
              entry != null;
              entry = entry.next()) {
            if (result.put(entry.getKey(), entry.value) != null)
              nodeSetListener.discard(entry.getKey());
          }
        } else result.putAll(childResult);
      } else result = childResult;
    }
    consumedResult();

    if (prepareResult) resultPrepared();
  }
예제 #2
0
 private int pendingCount() {
   int count = 0;
   for (LongTreeMap.Entry<EvaluationInfo> entry = evaluations.firstEntry();
       entry != null;
       entry = entry.next()) {
     if (entry.value.eval != null) count++;
   }
   return count;
 }
예제 #3
0
 private void fireInstantResult(LongTreeMap<Object> result) {
   LongTreeMap.Entry<Object> entry = result.firstEntry();
   while (entry != null) {
     if (entry.value instanceof NodeItem) {
       event.onInstantResult(expression, (NodeItem) entry.value);
       entry.value = Event.DUMMY_VALUE;
     }
     entry = entry.next();
   }
   result.clear(); // to avoid memory leak
 }
예제 #4
0
 @Override
 protected void dispose() {
   if (nodeSetListener != null) {
     for (LongTreeMap.Entry<Object> entry = result.firstEntry();
         entry != null;
         entry = entry.next()) nodeSetListener.discard(entry.getKey());
   }
   manuallyExpired = true;
   for (LinkableEvaluation pendingEval = pendingEvaluationHead;
       pendingEval != null;
       pendingEval = pendingEval.next) pendingEval.removeListener(this);
   pendingEvaluationHead = pendingEvaluationTail = null;
   if (predicateResult == null) predicateEvaluation.removeListener(this);
 }
예제 #5
0
 @SuppressWarnings({"unchecked"})
 public Object computeResult() {
   if (expression.forEach) {
     List<Object> result = new ArrayList<Object>(evaluations.size());
     for (LongTreeMap.Entry entry = evaluations.firstEntry(); entry != null; entry = entry.next())
       result.add(computeResultItem(((EvaluationInfo) entry.value).result));
     return result;
   } else {
     LongTreeMap result = new LongTreeMap();
     for (LongTreeMap.Entry<EvaluationInfo> entry = evaluations.firstEntry();
         entry != null;
         entry = entry.next()) result.putAll(entry.value.result);
     return computeResultItem(result);
   }
 }
예제 #6
0
 @SuppressWarnings({"unchecked", "UnnecessaryBoxing"})
 private Object computeResultItem(LongTreeMap result) {
   switch (expression.resultType) {
     case NODESET:
     case STRINGS:
     case NUMBERS:
       return new ArrayList(result.values());
     case NUMBER:
       if (expression.relativeExpression instanceof Count) return new Double(result.size());
       else {
         double d = 0;
         for (LongTreeMap.Entry entry = result.firstEntry(); entry != null; entry = entry.next())
           d += (Double) entry.value;
         return d;
       }
     case BOOLEAN:
       return !result.isEmpty();
     default:
       if (result.isEmpty()) return expression.resultType.defaultValue;
       else return result.firstEntry().value;
   }
 }
예제 #7
0
  @Override
  public final void finished(Evaluation evaluation) {
    assert !finished : "can't consume evaluation result after finish";

    if (evaluation == predicateEvaluation) {
      predicateResult = (Boolean) evaluation.getResult();
      assert predicateResult != null : "evaluation result should be non-null";
      if (predicateResult == Boolean.FALSE) {
        if (nodeSetListener != null) {
          for (LongTreeMap.Entry<Object> entry = result.firstEntry();
              entry != null;
              entry = entry.next()) nodeSetListener.discard(entry.getKey());
        }
        result.clear();
        if (stringEvaluations != null) {
          for (Evaluation stringEval : stringEvaluations) stringEval.removeListener(this);
          stringEvaluations = null;
        }
        resultPrepared();
      } else {
        if (predicateChain != -1) decreasePredicateChain();
        if (resultPrepared) finished();
      }
    } else if (evaluation instanceof PredicateEvaluation) {
      PredicateEvaluation predicateEvaluation = (PredicateEvaluation) evaluation;
      remove(predicateEvaluation);

      if (predicateEvaluation.result != null) {
        Object resultItem = predicateEvaluation.result;
        if (resultItem instanceof Evaluation) {
          Evaluation stringEval = (Evaluation) resultItem;
          stringEvaluations.add(stringEval);
          stringEval.addListener(this);
        }
        consumeChildEvaluation(predicateEvaluation.order, resultItem);
      } else {
        if (nodeSetListener != null) nodeSetListener.discard(predicateEvaluation.order);
        consumedResult();
      }
    } else if (evaluation instanceof LocationEvaluation) {
      LocationEvaluation locEval = (LocationEvaluation) evaluation;
      remove(locEval);

      if (locEval.stringEvaluations != null) {
        for (Evaluation stringEval : locEval.stringEvaluations) stringEval.addListener(this);
        stringEvaluations.addAll(locEval.stringEvaluations);
      }
      boolean wasExpired = expired;
      consumeChildEvaluation(locEval.result);
      if (!wasExpired && expired) {
        assert !finished;
        LinkableEvaluation eval = locEval.next;
        while (eval != null) {
          eval.removeListener(this);
          remove(eval);
          eval = eval.next;
        }
        if (pendingEvaluationHead == null) resultPrepared();
      }
    } else {
      stringEvaluations.remove(evaluation);
      consumeChildEvaluation(evaluation.order, evaluation.getResult());
    }
  }