// protected override methods protected override Expression Visit(Expression expression) { if (_candidates.Contains(expression)) { string columnName; if (expression.NodeType == (ExpressionType) PigExpressionType.Column) { var column = (ColumnExpression) expression; ColumnExpression mapped; if (_map.TryGetValue(column, out mapped)) { return mapped; } if (_existingAliases.Contains(column.Alias)) { columnName = GetUniqueColumnName(column.Name); _columns.Add(new ColumnDeclaration(columnName, column)); mapped = new ColumnExpression(column.Type, _newAlias, columnName); _map[column] = mapped; _columnNames.Add(columnName); return mapped; } // must be referring to outer scope return column; } columnName = GetNextColumnName(); _columns.Add(new ColumnDeclaration(columnName, expression)); return new ColumnExpression(expression.Type, _newAlias, columnName); } return base.Visit(expression); }
// protected override methods protected override Expression VisitColumn(ColumnExpression node) { Dictionary<String, Expression> nameMap; if (_map.TryGetValue(node.Alias, out nameMap)) { Expression expr; if (nameMap.TryGetValue(node.Name, out expr)) { return Visit(expr); } throw new Exception("Reference to undefined column"); } return node; }
protected override Expression VisitColumn(ColumnExpression node) { WriteColumnName(node.Name); return node; }
/// <summary> /// Rebind order expressions to reference a new alias and add to column declarations if necessary /// </summary> protected virtual BindResult RebindOrderings(IEnumerable<OrderByExpression> orderings, SourceAlias alias, HashSet<SourceAlias> existingAliases, IEnumerable<ColumnDeclaration> existingColumns) { List<ColumnDeclaration> newColumns = null; var newOrderings = new List<OrderByExpression>(); foreach (OrderByExpression ordering in orderings) { Expression expr = ordering.Expression; var column = expr as ColumnExpression; if (column == null || (existingAliases != null && existingAliases.Contains(column.Alias))) { // check to see if a declared column already contains a similar expression Int32 iOrdinal = 0; if (existingColumns != null) { foreach (ColumnDeclaration decl in existingColumns) { var declColumn = decl.Expression as ColumnExpression; if (decl.Expression == ordering.Expression || (column != null && declColumn != null && column.Alias == declColumn.Alias && column.Name == declColumn.Name)) { // found it, so make a reference to this column if (column != null) expr = new ColumnExpression(column.Type, alias, decl.Name); break; } iOrdinal++; } // if not already projected, add a new column declaration for it if (expr == ordering.Expression) { if (newColumns == null) { newColumns = new List<ColumnDeclaration>(existingColumns); existingColumns = newColumns; } String colName = column != null ? column.Name : "c" + iOrdinal; newColumns.Add(new ColumnDeclaration(colName, ordering.Expression)); expr = new ColumnExpression(expr.Type, alias, colName); } } newOrderings.Add(new OrderByExpression(expr, ordering.Direction)); } } return existingColumns != null ? new BindResult(existingColumns, newOrderings) : null; }
protected virtual Expression VisitColumn(ColumnExpression node) { return node; }
// protected override methods protected override Expression VisitColumn(ColumnExpression node) { MarkColumnAsUsed(node.Alias, node.Name); return node; }