private Expression rewriteExpressionWithResolvedName(Expression node) { return getSymbol(rewriteBase, node) .map(symbol -> coerceIfNecessary(node, symbol.toSymbolReference())) .orElse(coerceIfNecessary(node, node)); }
@Override public Expression rewriteFieldReference(FieldReference node, Void context, ExpressionTreeRewriter<Void> treeRewriter) { Symbol symbol = rewriteBase.getSymbol(node.getFieldIndex()); checkState(symbol != null, "No symbol mapping for node '%s' (%s)", node, node.getFieldIndex()); return symbol.toSymbolReference(); }
public void put(Expression expression, Symbol symbol) { if (expression instanceof FieldReference) { int fieldIndex = ((FieldReference) expression).getFieldIndex(); fieldSymbols[fieldIndex] = symbol; expressionToSymbols.put(rewriteBase.getSymbol(fieldIndex).toSymbolReference(), symbol); return; } Expression translated = translateNamesToSymbols(expression); expressionToSymbols.put(translated, symbol); // also update the field mappings if this expression is a field reference rewriteBase.getScope().tryResolveField(expression) .filter(ResolvedField::isLocal) .ifPresent(field -> fieldSymbols[field.getHierarchyFieldIndex()] = symbol); }
private PlanNode createOutputPlan(RelationPlan plan, Analysis analysis) { ImmutableList.Builder<Symbol> outputs = ImmutableList.builder(); ImmutableList.Builder<String> names = ImmutableList.builder(); int columnNumber = 0; RelationType outputDescriptor = analysis.getOutputDescriptor(); for (Field field : outputDescriptor.getVisibleFields()) { String name = field.getName().orElse("_col" + columnNumber); names.add(name); int fieldIndex = outputDescriptor.indexOf(field); Symbol symbol = plan.getSymbol(fieldIndex); outputs.add(symbol); columnNumber++; } return new OutputNode(idAllocator.getNextId(), plan.getRoot(), names.build(), outputs.build()); }
@Override public Expression rewriteDereferenceExpression(DereferenceExpression node, Void context, ExpressionTreeRewriter<Void> treeRewriter) { if (analysis.isColumnReference(node)) { Optional<ResolvedField> resolvedField = rewriteBase.getScope().tryResolveField(node); if (resolvedField.isPresent()) { if (resolvedField.get().isLocal()) { return getSymbol(rewriteBase, node) .map(symbol -> coerceIfNecessary(node, symbol.toSymbolReference())) .orElseThrow(() -> new IllegalStateException("No symbol mapping for node " + node)); } } // do not rewrite outer references, it will be handled in outer scope planner return node; } return rewriteExpression(node, context, treeRewriter); }
int leftField = joinAnalysis.getLeftJoinFields().get(i); leftCoercions.put(leftOutput, new Cast( left.getSymbol(leftField).toSymbolReference(), type.getTypeSignature().toString(), false, int rightField = joinAnalysis.getRightJoinFields().get(i); rightCoercions.put(rightOutput, new Cast( right.getSymbol(rightField).toSymbolReference(), type.getTypeSignature().toString(), false,
Symbol input = plan.getSymbol(index); Type tableType = column.getType(); Type queryType = symbolAllocator.getTypes().get(input);
private PlanNode createOutputPlan(RelationPlan plan, Analysis analysis) { ImmutableList.Builder<Symbol> outputs = ImmutableList.builder(); ImmutableList.Builder<String> names = ImmutableList.builder(); int columnNumber = 0; RelationType outputDescriptor = analysis.getOutputDescriptor(); for (Field field : outputDescriptor.getVisibleFields()) { String name = field.getName().orElse("_col" + columnNumber); names.add(name); int fieldIndex = outputDescriptor.indexOf(field); Symbol symbol = plan.getSymbol(fieldIndex); outputs.add(symbol); columnNumber++; } return new OutputNode(idAllocator.getNextId(), plan.getRoot(), names.build(), outputs.build()); }
private Expression rewriteExpressionWithResolvedName(Expression node) { Optional<Integer> fieldIndex = analysis.getFieldIndex(node); checkState(fieldIndex.isPresent(), "No field mapping for node '%s'", node); Symbol symbol = rewriteBase.getSymbol(fieldIndex.get()); checkState(symbol != null, "No symbol mapping for node '%s' (%s)", node, fieldIndex.get()); Expression rewrittenExpression = new QualifiedNameReference(symbol.toQualifiedName()); // cast expression if coercion is registered Type coercion = analysis.getCoercion(node); if (coercion != null) { rewrittenExpression = new Cast(rewrittenExpression, coercion.getTypeSignature().toString()); } return rewrittenExpression; }
public void put(FieldOrExpression fieldOrExpression, Symbol symbol) { if (fieldOrExpression.isFieldReference()) { int fieldIndex = fieldOrExpression.getFieldIndex(); fieldSymbols[fieldIndex] = symbol; expressionMappings.put(new QualifiedNameReference(rewriteBase.getSymbol(fieldIndex).toQualifiedName()), symbol); } else { put(fieldOrExpression.getExpression(), symbol); } }
assignments.put(output, plan.getSymbol(index).toQualifiedNameReference());