@Override public ImmutableSet<Variable> getLocallyRequiredVariables() { return getChildVariables(); }
@Override public ImmutableSet<Variable> getLocallyRequiredVariables() { return getChildVariables(); }
@Override public boolean isVariableNullable(IntermediateQuery query, Variable variable) { if (getChildVariables().contains(variable)) return isChildVariableNullable(query, variable); return Optional.ofNullable(substitution.get(variable)) .map(t -> isTermNullable(query, t)) .orElseThrow(() -> new IllegalArgumentException("The variable " + variable + " is not projected by " + this)); }
@Override public boolean isVariableNullable(IntermediateQuery query, Variable variable) { if (getChildVariables().contains(variable)) return isChildVariableNullable(query, variable); return Optional.ofNullable(substitution.get(variable)) .map(t -> isTermNullable(query, t)) .orElseThrow(() -> new IllegalArgumentException("The variable " + variable + " is not projected by " + this)); }
@Override public boolean isConstructed(Variable variable, IQTree child) { return substitution.isDefining(variable) || (getChildVariables().contains(variable) && child.isConstructed(variable)); }
@Override public void validateNode(IQTree child) throws InvalidQueryNodeException, InvalidIntermediateQueryException { validateNode(); ImmutableSet<Variable> requiredChildVariables = getChildVariables(); ImmutableSet<Variable> childVariables = child.getVariables(); if (!childVariables.containsAll(requiredChildVariables)) { throw new InvalidIntermediateQueryException("This child " + child + " does not project all the variables " + "required by the CONSTRUCTION node (" + requiredChildVariables + ")\n" + this); } }