public Optional<ResolvedField> tryResolveField(Expression node, QualifiedName name) { return resolveField(node, name, 0, true); }
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(); } }
@Override protected Type visitIdentifier(Identifier node, StackableAstVisitorContext<Context> context) { ResolvedField resolvedField = context.getContext().getScope().resolveField(node, QualifiedName.of(node.getValue())); return handleResolvedField(node, resolvedField, context); }
ResolvedField resolvedField = lambdaScope.resolveField(lambdaArgument, QualifiedName.of(lambdaArgument.getName().getValue())); fieldToLambdaArgumentDeclaration.put(FieldId.from(resolvedField), lambdaArgument);