public static AggregatedOutputColumn TryParse(string name)
        {
            // looks for aggregation expressions in the name string
            // example: COUNT(someColumn), MIN(someColumn) etc...
            AggregatedOutputColumn result = null;
            bool isAggregated             = false;

            Match aggregationMatch = Regex.Match(name, @"(?<expression>\b(?<aggregationType>(COUNT|SUM|MAX|MIN))\s*\((?<baseColumn>(\w+|\*))\))\s+AS\s+(?<alias>\w+)", RegexOptions.IgnoreCase);

            if (aggregationMatch.Success)
            {
                isAggregated       = true;
                result             = new AggregatedOutputColumn();
                result.Aggregation = (AggregationType)Enum.Parse(typeof(AggregationType), aggregationMatch.Groups["aggregationType"].ToString(), true);
                result.BaseColumn  = aggregationMatch.Groups["baseColumn"].ToString();
                result.Expression  = aggregationMatch.Groups["expression"].ToString();
                result.Alias       = aggregationMatch.Groups["alias"].ToString();
            }

            if (!isAggregated)
            {
                return(null);
            }

            return(result);
        }
 public AggregatedOutputColumn(OutputColumn col) : base()
 {
     Name       = col.Name == null ? "" : col.Name;
     Calculated = col.Calculated;
     if (col is AggregatedOutputColumn)
     {
         AggregatedOutputColumn outCol = (AggregatedOutputColumn)col;
         Aggregation = outCol.Aggregation;
         Expression  = outCol.Expression;
         Alias       = outCol.Alias;
         BaseColumn  = outCol.BaseColumn;
         if (Name == "")
         {
             Name = Alias;
         }
     }
 }