Beispiel #1
0
 // Return true iff EPG is modified by this method.
 public bool RewriteOne(int idx)
 {
     QueryNodeInfo curNode = this.m_nodeInfos[idx];
     if (curNode.OperatorName == "Where" && !curNode.Children[0].Child.IsForked)
     {
         LambdaExpression lambda = DryadLinqExpression.GetLambda(((MethodCallExpression)curNode.QueryExpression).Arguments[1]);
         if (lambda.Type.GetGenericArguments().Length == 2)
         {
             QueryNodeInfo child = curNode.Children[0].Child;
             string[] names = new string[] { "OrderBy", "Distinct", "RangePartition", "HashPartition" };
             if (names.Contains(child.OperatorName))
             {
                 curNode.Swap(child);
                 return true;
             }
             if (child.OperatorName == "Concat")
             {
                 curNode.Delete();
                 for (int i = 0; i < child.Children.Count; i++)
                 {
                     NodeInfoEdge edge = child.Children[i];
                     QueryNodeInfo node = curNode.Clone();
                     this.m_nodeInfos.Add(node);
                     edge.Insert(node);
                 }
                 return true;
             }
         }
     }
     else if ((curNode.OperatorName == "Select" || curNode.OperatorName == "SelectMany") &&
              !curNode.Children[0].Child.IsForked)
     {
         LambdaExpression lambda = DryadLinqExpression.GetLambda(((MethodCallExpression)curNode.QueryExpression).Arguments[1]);
         if (lambda.Type.GetGenericArguments().Length == 2)
         {
             QueryNodeInfo child = curNode.Children[0].Child;
             if (child.OperatorName == "Concat")
             {
                 curNode.Delete();
                 for (int i = 0; i < child.Children.Count; i++)
                 {
                     NodeInfoEdge edge = child.Children[i];
                     QueryNodeInfo node = curNode.Clone();
                     this.m_nodeInfos.Add(node);
                     edge.Insert(node);
                 }
                 return true;
             }
         }
     }
     else if (curNode.OperatorName == "Take" && !curNode.Children[0].Child.IsForked)
     {
         QueryNodeInfo child = curNode.Children[0].Child;
         if (child.OperatorName == "Select")
         {
             QueryNodeInfo cchild = child.Children[0].Child;
             if (cchild.OperatorName != "GroupBy")
             {
                 curNode.Swap(child);
                 return true;
             }
         }
     }
     else if ((curNode.OperatorName == "Contains" ||
               curNode.OperatorName == "ContainsAsQuery" ||
               curNode.OperatorName == "All" ||
               curNode.OperatorName == "AllAsQuery" ||
               curNode.OperatorName == "Any" ||
               curNode.OperatorName == "AnyAsQuery") &&
              !curNode.Children[0].Child.IsForked)
     {
         QueryNodeInfo child = curNode.Children[0].Child;
         string[] names = new string[] { "OrderBy", "Distinct", "RangePartition", "HashPartition" };
         if (names.Contains(child.OperatorName))
         {
             child.Delete();
             return true;
         }
     }
     return false;
 }