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