List GetDefaultColumnsForFragment()

in EntityFramework/src/Statements/SelectStatement.cs [198:261]


    List<ColumnFragment> GetDefaultColumnsForFragment(InputFragment input)
    {
      List<ColumnFragment> columns = new List<ColumnFragment>();

      if (input is TableFragment)
      {
        return GetDefaultColumnsForTable(input as TableFragment);
      }
      else if (input is JoinFragment || input is UnionFragment)
      {
        Debug.Assert(input.Left != null);
        if (input is UnionFragment)
        {
          generator.Ops.Push(OpType.Union);
        }
        columns = GetDefaultColumnsForFragment(input.Left);
        if (input is JoinFragment && input.Right != null)
        {
          List<ColumnFragment> right = GetDefaultColumnsForFragment(input.Right);
          columns.AddRange(right);
        }
        if (input is UnionFragment)
        {
          generator.Ops.Pop();
        }
      }
      else if (input is SelectStatement)
      {
        SelectStatement select = input as SelectStatement;
        foreach (ColumnFragment cf in select.Columns)
        {
          ColumnFragment newColumn = new ColumnFragment(cf.TableName,
              string.IsNullOrEmpty(cf.ColumnAlias) ? cf.ActualColumnName : cf.ColumnAlias
              );
          if (generator.GetTopOp() == OpType.Join)
          {
            newColumn.ColumnAlias = cf.ColumnAlias;
            newColumn.PushInput(cf.ActualColumnName);
            if (cf.TableName != null)
              newColumn.PushInput(cf.TableName);
          }
          else
          {
            newColumn.PushInput(cf.ActualColumnName);
            if (cf.TableName != null && cf.ColumnAlias == null)
              newColumn.PushInput(cf.TableName);
          }
          if (select.Name != null)
          {
            newColumn.PushInput(select.Name);      // add the scope 
          }
          columns.Add(newColumn);
        }
        return columns;
      }
      else
        throw new NotImplementedException();
      if (!String.IsNullOrEmpty(input.Name) && input.Name != From.Name)
        foreach (ColumnFragment c in columns)
        {
          c.PushInput(input.Name);
        }
      return columns;
    }