@Override public FilterNode clone() { return new FilterNodeImpl(getOptionalFilterCondition().get(), getNullabilityEvaluator()); }
@Override public SubstitutionResults<FilterNode> applyAscendingSubstitution( ImmutableSubstitution<? extends ImmutableTerm> substitution, QueryNode childNode, IntermediateQuery query) { return applyDescendingSubstitution(substitution, query); }
@Override public void validateNode(IQTree child) throws InvalidIntermediateQueryException { checkExpression(getFilterCondition(), ImmutableList.of(child)); }
@Override public FilterNode changeFilterCondition(ImmutableExpression newFilterCondition) { return new FilterNodeImpl(newFilterCondition, getNullabilityEvaluator()); }
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()); } }
@Override public SubstitutionResults<FilterNode> applyDescendingSubstitution( ImmutableSubstitution<? extends ImmutableTerm> substitution, IntermediateQuery query) { EvaluationResult evaluationResult = transformBooleanExpression(substitution, getFilterCondition()); /* * The condition cannot be satisfied --> the sub-tree is empty. */ if (evaluationResult.isEffectiveFalse()) { return DefaultSubstitutionResults.declareAsEmpty(); } else { /* * Propagates the substitution and ... */ return evaluationResult.getOptionalExpression() /* * Still a condition: returns a filter node with the new condition */ .map(exp -> DefaultSubstitutionResults.newNode(changeFilterCondition(exp), substitution)) /* * No condition: the filter node is not needed anymore */ .orElseGet(() -> DefaultSubstitutionResults.replaceByUniqueChild(substitution)); } }
@Override public VariableNullability getVariableNullability(IQTree child) { return updateWithFilter(getFilterCondition(), child.getVariableNullability().getNullableGroups()); }
@Override public boolean isEquivalentTo(QueryNode queryNode) { return (queryNode instanceof FilterNode) && getFilterCondition().equals(((FilterNode) queryNode).getFilterCondition()); }
.applyToBooleanExpression(getFilterCondition()); ExpressionAndSubstitution expressionAndSubstitution = simplifyCondition(Optional.of(unoptimizedExpression), ImmutableSet.of());
@Override public String toString() { return FILTER_NODE_STR + getOptionalFilterString(); } }
@Override public ImmutableExpression getFilterCondition() { return getOptionalFilterCondition().get(); }
@Override public ImmutableSet<Variable> getRequiredVariables(IntermediateQuery query) { return getLocallyRequiredVariables(); }
Optional<ImmutableExpression> constraint, IQTree child) { ImmutableExpression unoptimizedExpression = descendingSubstitution.applyToBooleanExpression(getFilterCondition()); ExpressionAndSubstitution expressionAndSubstitution = simplifyCondition(Optional.of(unoptimizedExpression), ImmutableSet.of()); Optional<ImmutableExpression> downConstraint = computeDownConstraint(constraint, expressionAndSubstitution);
@Override public boolean isSyntacticallyEquivalentTo(QueryNode node) { return (node instanceof FilterNode) && ((FilterNode) node).getFilterCondition().equals(this.getFilterCondition()); }
@Override public String toString() { return FILTER_NODE_STR + getOptionalFilterString(); }
@Override public ImmutableExpression getFilterCondition() { return getOptionalFilterCondition().get(); }
@Override public ImmutableSet<Variable> getRequiredVariables(IntermediateQuery query) { return getLocallyRequiredVariables(); }
@Override public boolean isSyntacticallyEquivalentTo(QueryNode node) { return (node instanceof FilterNode) && ((FilterNode) node).getFilterCondition().equals(this.getFilterCondition()); }
@Override public FilterNode clone() { return iqFactory.createFilterNode(getFilterCondition()); }
@Override public IQTree applyDescendingSubstitutionWithoutOptimizing( ImmutableSubstitution<? extends VariableOrGroundTerm> descendingSubstitution, IQTree child) { FilterNode newFilterNode = iqFactory.createFilterNode( descendingSubstitution.applyToBooleanExpression(getFilterCondition())); return iqFactory.createUnaryIQTree(newFilterNode, child.applyDescendingSubstitutionWithoutOptimizing(descendingSubstitution)); }