Beispiel #1
0
 internal void InsertVertexNode(int index, DryadQueryNode node)
 {
     if (index == -1)
     {
         this.m_vertexNodes.Add(node);
     }
     else
     {
         this.m_vertexNodes.Insert(index, node);
     }
 }
        /// <summary>
        /// Helper for CodeShowVisit: do not revisit a node twice.
        /// </summary>
        /// <param name="plan">Return plan here.</param>
        /// <param name="n">Node to explain.</param>
        /// <param name="visited">Set of nodes already visited.</param>
        private void CodeShowVisit(StringBuilder plan, DryadQueryNode n, HashSet <DryadQueryNode> visited)
        {
            if (visited.Contains(n))
            {
                return;
            }
            visited.Add(n);

            foreach (DryadQueryNode c in n.Children)
            {
                CodeShowVisit(plan, c, visited);
            }

            ExplainNode(plan, n);
        }
Beispiel #3
0
 public QueryNodeInfo(Expression queryExpression,
                      bool isQueryOperator,
                      params QueryNodeInfo[] children)
 {
     this.queryExpression = queryExpression;
     this.isQueryOperator = isQueryOperator;
     this.children        = new List <NodeInfoEdge>(children.Length);
     foreach (QueryNodeInfo childInfo in children)
     {
         NodeInfoEdge edge = new NodeInfoEdge(this, childInfo);
         this.children.Add(edge);
         childInfo.parents.Add(edge);
     }
     this.parents   = new List <NodeInfoEdge>();
     this.queryNode = null;
 }
Beispiel #4
0
        internal override XmlElement CreateElem(XmlDocument queryDoc)
        {
            XmlElement managerElem = queryDoc.CreateElement("DynamicManager");
            XmlElement elem        = queryDoc.CreateElement("Type");

            elem.InnerText = Convert.ToString(this.ManagerType.ToString());
            managerElem.AppendChild(elem);

            elem           = queryDoc.CreateElement("SampleRate");
            elem.InnerText = Convert.ToString(this.m_sampleRate);
            managerElem.AppendChild(elem);

            elem = queryDoc.CreateElement("VertexId");
            DryadQueryNode node = this.m_vertexNodes[0];

            if (node.SuperNode != null)
            {
                node = node.SuperNode;
            }
            elem.InnerText = Convert.ToString(node.m_uniqueId);
            managerElem.AppendChild(elem);

            return(managerElem);
        }
Beispiel #5
0
        internal override DryadQueryNode CreatePartitionNode(LambdaExpression keySel, DryadQueryNode child)
        {
            Expression comparerExpr = Expression.Constant(this.m_comparer, typeof(IEqualityComparer <TKey>));

            return(new DryadHashPartitionNode(keySel, comparerExpr, this.Count, child.QueryExpression, child));
        }
Beispiel #6
0
        internal override DryadQueryNode CreatePartitionNode(LambdaExpression keySel, DryadQueryNode child)
        {
            Expression keysExpr         = Expression.Constant(this.m_partitionKeys);
            Expression comparerExpr     = Expression.Constant(this.m_comparer, typeof(IComparer <TKey>));
            Expression isDescendingExpr = Expression.Constant(this.m_isDescending);

            return(new DryadRangePartitionNode(keySel, null, keysExpr, comparerExpr, isDescendingExpr, null, child.QueryExpression, child));
        }
Beispiel #7
0
 internal override DryadQueryNode CreatePartitionNode(LambdaExpression keySel, DryadQueryNode child)
 {
     throw new DryadLinqException(HpcLinqErrorCode.CannotCreatePartitionNodeRandom,
                                  SR.CannotCreatePartitionNodeRandom);
 }
Beispiel #8
0
 internal abstract DryadQueryNode CreatePartitionNode(LambdaExpression keySelector, DryadQueryNode child);
Beispiel #9
0
        internal virtual string AddVertexCode(DryadQueryNode node,
                                              CodeMemberMethod vertexMethod,
                                              string[] readerNames,
                                              string[] writerNames)
        {
            switch (node.NodeType)
            {
            case QueryNodeType.InputTable:
            {
                return(this.Visit((DryadInputNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.OutputTable:
            {
                return(this.Visit((DryadOutputNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Aggregate:
            {
                return(this.Visit((DryadAggregateNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Select:
            case QueryNodeType.SelectMany:
            {
                return(this.Visit((DryadSelectNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Where:
            {
                return(this.Visit((DryadWhereNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Distinct:
            {
                return(this.Visit((DryadDistinctNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.BasicAggregate:
            {
                return(this.Visit((DryadBasicAggregateNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.GroupBy:
            {
                return(this.Visit((DryadGroupByNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.OrderBy:
            {
                return(this.Visit((DryadOrderByNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Skip:
            case QueryNodeType.SkipWhile:
            case QueryNodeType.Take:
            case QueryNodeType.TakeWhile:
            {
                return(this.Visit((DryadPartitionOpNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Contains:
            {
                return(this.Visit((DryadContainsNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Join:
            case QueryNodeType.GroupJoin:
            {
                return(this.Visit((DryadJoinNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Union:
            case QueryNodeType.Intersect:
            case QueryNodeType.Except:
            {
                return(this.Visit((DryadSetOperationNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Concat:
            {
                return(this.Visit((DryadConcatNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Zip:
            {
                return(this.Visit((DryadZipNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Super:
            {
                return(this.Visit((DryadSuperNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.RangePartition:
            {
                return(this.Visit((DryadRangePartitionNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.HashPartition:
            {
                return(this.Visit((DryadHashPartitionNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Merge:
            {
                return(this.Visit((DryadMergeNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Apply:
            {
                return(this.Visit((DryadApplyNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Fork:
            {
                return(this.Visit((DryadForkNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Tee:
            {
                return(this.Visit((DryadTeeNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Dynamic:
            {
                return(this.Visit((DryadDynamicNode)node, vertexMethod, readerNames, writerNames));
            }

            case QueryNodeType.Dummy:
            {
                return(this.Visit((DryadDummyNode)node, vertexMethod, readerNames, writerNames));
            }

            default:
                throw new DryadLinqException("Internal error: unhandled node type " + node.NodeType);
            }
        }
Beispiel #10
0
 /// <summary>
 /// Create a dynamic manager with a single parameter node.
 /// </summary>
 /// <param name="type">Type of manager to create.</param>
 /// <param name="node">Node that the manager depends on.</param>
 internal DynamicManager(DynamicManagerType type, DryadQueryNode node)
     : this(type)
 {
     this.m_vertexNodes.Add(node);
 }
Beispiel #11
0
 internal DynamicRangeDistributor(DryadQueryNode node)
     : base(DynamicManagerType.RangeDistributor, node)
 {
     //@@TODO[P2]: This sample rate used here should really be its own constant.
     this.m_sampleRate = HpcLinqSampler.SAMPLE_RATE;
 }
Beispiel #12
0
        /// <summary>
        /// Explain one query node.
        /// </summary>
        /// <param name="plan">Return plan here.</param>
        /// <param name="n">Node to explain.</param>
        internal static void ExplainNode(StringBuilder plan, DryadQueryNode n)
        {
            if (n is DryadTeeNode || n is DryadOutputNode)
            {
                return;
            }
            else if (n is DryadInputNode)
            {
                plan.AppendLine("Input:");
                plan.Append("\t");
                n.BuildString(plan);
                plan.AppendLine();
                return;
            }

            plan.Append(n.m_vertexEntryMethod);
            plan.AppendLine(":");

            HashSet <DryadQueryNode> allchildren = new HashSet <DryadQueryNode>();

            if (n is DryadSuperNode)
            {
                DryadSuperNode        sn      = n as DryadSuperNode;
                List <DryadQueryNode> tovisit = new List <DryadQueryNode>();

                tovisit.Add(sn.RootNode);

                while (tovisit.Count > 0)
                {
                    DryadQueryNode t = tovisit[0];
                    tovisit.RemoveAt(0);
                    if (!(t is DryadSuperNode))
                    {
                        allchildren.Add(t);
                    }
                    foreach (DryadQueryNode tc in t.Children)
                    {
                        if (!allchildren.Contains(tc) && sn.Contains(tc))
                        {
                            tovisit.Add(tc);
                        }
                    }
                }
            }
            else
            {
                allchildren.Add(n);
            }

            foreach (DryadQueryNode nc in allchildren.Reverse())
            {
                Expression    expression = null;                // expression to print
                List <string> additional = new List <string>(); // additional arguments to print
                int           argsToSkip = 0;
                string        methodname = nc.OpName;

                plan.Append("\t");

                if (nc is DryadMergeNode)
                {
                    expression = ((DryadMergeNode)nc).ComparerExpression;
                }
                else if (nc is DryadHashPartitionNode)
                {
                    DryadHashPartitionNode hp = (DryadHashPartitionNode)nc;
                    expression = hp.KeySelectExpression;
                    additional.Add(hp.NumberOfPartitions.ToString());
                }
                else if (nc is DryadGroupByNode)
                {
                    DryadGroupByNode gb = (DryadGroupByNode)nc;
                    expression = gb.KeySelectExpression;
                    if (gb.ElemSelectExpression != null)
                    {
                        additional.Add(HpcLinqExpression.Summarize(gb.ElemSelectExpression));
                    }
                    if (gb.ResSelectExpression != null)
                    {
                        additional.Add(HpcLinqExpression.Summarize(gb.ResSelectExpression));
                    }
                    if (gb.ComparerExpression != null)
                    {
                        additional.Add(HpcLinqExpression.Summarize(gb.ComparerExpression));
                    }
                    if (gb.SeedExpression != null)
                    {
                        additional.Add(HpcLinqExpression.Summarize(gb.SeedExpression));
                    }
                    if (gb.AccumulatorExpression != null)
                    {
                        additional.Add(HpcLinqExpression.Summarize(gb.AccumulatorExpression));
                    }
                }
                else if (nc is DryadOrderByNode)
                {
                    DryadOrderByNode ob = (DryadOrderByNode)nc;
                    expression = ob.KeySelectExpression;
                    if (ob.ComparerExpression != null)
                    {
                        additional.Add(HpcLinqExpression.Summarize(ob.ComparerExpression));
                    }
                }
                else if (nc is DryadWhereNode)
                {
                    expression = ((DryadWhereNode)nc).WhereExpression;
                }
                else if (nc is DryadSelectNode)
                {
                    DryadSelectNode s = (DryadSelectNode)nc;
                    expression = s.SelectExpression;
                    if (s.ResultSelectExpression != null)
                    {
                        additional.Add(HpcLinqExpression.Summarize(s.ResultSelectExpression));
                    }
                }
                else if (nc is DryadAggregateNode)
                {
                    DryadAggregateNode a = (DryadAggregateNode)nc;
                    expression = a.FuncLambda;
                    if (a.SeedExpression != null)
                    {
                        additional.Add(HpcLinqExpression.Summarize(a.SeedExpression));
                    }
                    if (a.ResultLambda != null)
                    {
                        additional.Add(HpcLinqExpression.Summarize(a.ResultLambda));
                    }
                }
                else if (nc is DryadPartitionOpNode)
                {
                    expression = ((DryadPartitionOpNode)nc).ControlExpression;
                }
                else if (nc is DryadJoinNode)
                {
                    DryadJoinNode j = (DryadJoinNode)nc;
                    expression = j.OuterKeySelectorExpression;
                    additional.Add(HpcLinqExpression.Summarize(j.InnerKeySelectorExpression));
                    additional.Add(HpcLinqExpression.Summarize(j.ResultSelectorExpression));
                    if (j.ComparerExpression != null)
                    {
                        additional.Add(HpcLinqExpression.Summarize(j.ComparerExpression));
                    }
                }
                else if (nc is DryadDistinctNode)
                {
                    expression = ((DryadDistinctNode)nc).ComparerExpression;
                }
                else if (nc is DryadContainsNode)
                {
                    DryadContainsNode c = (DryadContainsNode)nc;
                    expression = c.ValueExpression;
                    if (c.ComparerExpression != null)
                    {
                        additional.Add(HpcLinqExpression.Summarize(c.ComparerExpression));
                    }
                }
                else if (nc is DryadBasicAggregateNode)
                {
                    expression = ((DryadBasicAggregateNode)nc).SelectExpression;
                }
                else if (nc is DryadConcatNode)
                // nothing to do
                {
                }
                else if (nc is DryadSetOperationNode)
                {
                    expression = ((DryadSetOperationNode)nc).ComparerExpression;
                }
                else if (nc is DryadRangePartitionNode)
                {
                    DryadRangePartitionNode r = (DryadRangePartitionNode)nc;
                    expression = r.CountExpression;
                    // TODO: there's some other possible interesting info
                }
                else if (nc is DryadApplyNode)
                {
                    expression = ((DryadApplyNode)nc).LambdaExpression;
                }

                else if (nc is DryadForkNode)
                {
                    expression = ((DryadForkNode)nc).ForkLambda;
                }

                else if (nc is DryadTeeNode)
                {
                    // nothing
                }
                else if (nc is DryadDynamicNode)
                {
                    // nothing
                }
                else
                {
                    expression = nc.QueryExpression;
                }

                if (expression is MethodCallExpression)
                {
                    MethodCallExpression mc = (MethodCallExpression)expression;
                    methodname = mc.Method.Name;  // overwrite methodname

                    // determine which arguments to skip
                    #region LINQMETHODS
                    switch (mc.Method.Name)
                    {
                    case "Aggregate":
                    case "AggregateAsQuery":
                    case "Select":
                    case "LongSelect":
                    case "SelectMany":
                    case "LongSelectMany":
                    case "OfType":
                    case "Where":
                    case "LongWhere":
                    case "First":
                    case "FirstOrDefault":
                    case "FirstAsQuery":
                    case "Single":
                    case "SingleOrDefault":
                    case "SingleAsQuery":
                    case "Last":
                    case "LastOrDefault":
                    case "LastAsQuery":
                    case "Distinct":
                    case "Any":
                    case "AnyAsQuery":
                    case "All":
                    case "AllAsQuery":
                    case "Count":
                    case "CountAsQuery":
                    case "LongCount":
                    case "LongCountAsQuery":
                    case "Sum":
                    case "SumAsQuery":
                    case "Min":
                    case "MinAsQuery":
                    case "Max":
                    case "MaxAsQuery":
                    case "Average":
                    case "AverageAsQuery":
                    case "GroupBy":
                    case "OrderBy":
                    case "OrderByDescending":
                    case "ThenBy":
                    case "ThenByDescending":
                    case "Take":
                    case "TakeWhile":
                    case "LongTakeWhile":
                    case "Skip":
                    case "SkipWhile":
                    case "LongSkipWhile":
                    case "Contains":
                    case "ContainsAsQuery":
                    case "Reverse":
                    case "Merge":
                    case "HashPartition":
                    case "RangePartition":
                    case "Fork":
                    case "ForkChoose":
                    case "AssumeHashPartition":
                    case "AssumeRangePartition":
                    case "AssumeOrderBy":
                    case "ToPartitionedTableLazy":
                    case "AddCacheEntry":
                    case "SlidingWindow":
                    case "SelectWithPartitionIndex":
                    case "ApplyWithPartitionIndex":
                        argsToSkip = 1;
                        break;

                    case "Join":
                    case "GroupJoin":
                    case "Concat":
                    case "MultiConcat":
                    case "Union":
                    case "Intersect":
                    case "Except":
                    case "SequenceEqual":
                    case "SequenceEqualAsQuery":
                    case "Zip":
                        argsToSkip = 2;
                        break;

                    case "Apply":
                    case "ApplyPerPartition":
                        if (mc.Arguments.Count < 3)
                        {
                            argsToSkip = 1;
                        }
                        else
                        {
                            argsToSkip = 2;
                        }
                        break;

                    default:
                        throw DryadLinqException.Create(HpcLinqErrorCode.OperatorNotSupported,
                                                        String.Format(SR.OperatorNotSupported, mc.Method.Name),
                                                        expression);
                    }
                    #endregion

                    plan.Append(methodname);
                    plan.Append("(");

                    int argno = 0;
                    foreach (var arg in mc.Arguments)
                    {
                        argno++;
                        if (argno <= argsToSkip)
                        {
                            continue;
                        }
                        if (argno > argsToSkip + 1)
                        {
                            plan.Append(",");
                        }
                        plan.Append(HpcLinqExpression.Summarize(arg));
                    }
                    plan.AppendLine(")");
                }
                else
                {
                    // expression is not methodcall
                    plan.Append(methodname);
                    plan.Append("(");
                    if (expression != null)
                    {
                        plan.Append(HpcLinqExpression.Summarize(expression));
                    }
                    foreach (string e in additional)
                    {
                        plan.Append(",");
                        plan.Append(e);
                    }
                    plan.AppendLine(")");
                }
            }
        }