示例#1
0
 // 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);
 }
示例#2
0
 // 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;
 }
示例#3
0
 protected override Expression VisitColumn(ColumnExpression node)
 {
     WriteColumnName(node.Name);
     return node;
 }
示例#4
0
 /// <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;
 }
示例#5
0
 protected virtual Expression VisitColumn(ColumnExpression node)
 {
     return node;
 }
示例#6
0
 // protected override methods
 protected override Expression VisitColumn(ColumnExpression node)
 {
     MarkColumnAsUsed(node.Alias, node.Name);
     return node;
 }