public IExpression optimize()

in java/tsfile/src/main/java/org/apache/tsfile/read/expression/util/ExpressionOptimizer.java [52:98]


  public IExpression optimize(IExpression expression, List<Path> selectedSeries)
      throws QueryFilterOptimizationException {
    if (expression instanceof IUnaryExpression) {
      return expression;
    } else if (expression instanceof IBinaryExpression) {
      ExpressionType relation = expression.getType();
      IExpression left = ((IBinaryExpression) expression).getLeft();
      IExpression right = ((IBinaryExpression) expression).getRight();
      if (left.getType() == ExpressionType.GLOBAL_TIME
          && right.getType() == ExpressionType.GLOBAL_TIME) {
        return combineTwoGlobalTimeFilter(
            (GlobalTimeExpression) left, (GlobalTimeExpression) right, expression.getType());
      } else if (left.getType() == ExpressionType.GLOBAL_TIME
          && right.getType() != ExpressionType.GLOBAL_TIME) {
        return handleOneGlobalTimeFilter(
            (GlobalTimeExpression) left, right, selectedSeries, relation);
      } else if (left.getType() != ExpressionType.GLOBAL_TIME
          && right.getType() == ExpressionType.GLOBAL_TIME) {
        return handleOneGlobalTimeFilter(
            (GlobalTimeExpression) right, left, selectedSeries, relation);
      } else if (left.getType() != ExpressionType.GLOBAL_TIME
          && right.getType() != ExpressionType.GLOBAL_TIME) {
        try {
          IExpression regularLeft = optimize(left, selectedSeries);
          IExpression regularRight = optimize(right, selectedSeries);
          IBinaryExpression midRet = null;
          if (relation == ExpressionType.AND) {
            midRet = BinaryExpression.and(regularLeft, regularRight);
          } else if (relation == ExpressionType.OR) {
            midRet = BinaryExpression.or(regularLeft, regularRight);
          } else {
            throw new UnsupportedOperationException("unsupported IExpression type: " + relation);
          }
          if (midRet.getLeft().getType() == ExpressionType.GLOBAL_TIME
              || midRet.getRight().getType() == ExpressionType.GLOBAL_TIME) {
            return optimize(midRet, selectedSeries);
          } else {
            return midRet;
          }
        } catch (StackOverflowError stackOverflowError) {
          throw new QueryFilterOptimizationException("StackOverflowError is encountered.");
        }
      }
    }
    throw new UnsupportedOperationException(
        "unknown IExpression type: " + expression.getClass().getName());
  }