private Optional<ResolvedField> resolveField(Expression node, QualifiedName name, int fieldIndexOffset, boolean local) { List<Field> matches = relation.resolveFields(name); if (matches.size() > 1) { throw ambiguousAttributeException(node, name); } else if (matches.size() == 1) { return Optional.of(asResolvedField(getOnlyElement(matches), fieldIndexOffset, local)); } else { if (isColumnReference(name, relation)) { return Optional.empty(); } if (parent.isPresent()) { return parent.get().resolveField(node, name, fieldIndexOffset + relation.getAllFieldCount(), local && !queryBoundary); } return Optional.empty(); } }