private IQTree propagateDownCondition(IQTree child, Optional<ImmutableExpression> initialConstraint) { try { ExpressionAndSubstitution conditionSimplificationResults = simplifyCondition(Optional.of(getFilterCondition()), ImmutableSet.of()); Optional<ImmutableExpression> downConstraint = computeDownConstraint(initialConstraint, conditionSimplificationResults); IQTree newChild = Optional.of(conditionSimplificationResults.substitution) .filter(s -> !s.isEmpty()) .map(s -> child.applyDescendingSubstitution(s, downConstraint)) .orElseGet(() -> downConstraint .map(child::propagateDownConstraint) .orElse(child)); IQTree filterLevelTree = conditionSimplificationResults.optionalExpression .map(e -> e.equals(getFilterCondition()) ? this : iqFactory.createFilterNode(e)) .map(filterNode -> (IQTree) iqFactory.createUnaryIQTree(filterNode, newChild)) .orElse(newChild); return Optional.of(conditionSimplificationResults.substitution) .filter(s -> !s.isEmpty()) .map(s -> (ImmutableSubstitution<ImmutableTerm>)(ImmutableSubstitution<?>)s) .map(s -> iqFactory.createConstructionNode(child.getVariables(), s)) .map(c -> (IQTree) iqFactory.createUnaryIQTree(c, filterLevelTree)) .orElse(filterLevelTree); } catch (UnsatisfiableConditionException e) { return iqFactory.createEmptyNode(child.getVariables()); } }
ExpressionAndSubstitution expressionAndSubstitution = simplifyCondition(Optional.of(unoptimizedExpression), ImmutableSet.of());
ExpressionAndSubstitution expressionAndSubstitution = simplifyCondition(Optional.of(unoptimizedExpression), ImmutableSet.of());