private void GetSingleTablePredicates( List <VarVec> tableDefinitions, out List <Predicate> singleTablePredicates, out Predicate otherPredicates) { singleTablePredicates = new List <Predicate>(); foreach (VarVec tableDefinition in tableDefinitions) { singleTablePredicates.Add(new Predicate(this.m_command)); } otherPredicates = new Predicate(this.m_command); VarVec varVec = this.m_command.CreateVarVec(); foreach (System.Data.Entity.Core.Query.InternalTrees.Node part in this.m_parts) { NodeInfo nodeInfo = this.m_command.GetNodeInfo(part); bool flag = false; for (int index = 0; index < tableDefinitions.Count; ++index) { VarVec tableDefinition = tableDefinitions[index]; if (tableDefinition != null) { varVec.InitFrom(nodeInfo.ExternalReferences); varVec.Minus(tableDefinition); if (varVec.IsEmpty) { flag = true; singleTablePredicates[index].AddPart(part); break; } } } if (!flag) { otherPredicates.AddPart(part); } } }
private void GetSingleTablePredicates(List <VarVec> tableDefinitions, out List <Predicate> singleTablePredicates, out Predicate otherPredicates) { singleTablePredicates = new List <Predicate>(); foreach (VarVec vec in tableDefinitions) { singleTablePredicates.Add(new Predicate(m_command)); } otherPredicates = new Predicate(m_command); VarVec externalRefs = m_command.CreateVarVec(); foreach (Node part in m_parts) { NodeInfo nodeInfo = m_command.GetNodeInfo(part); bool singleTablePart = false; for (int i = 0; i < tableDefinitions.Count; i++) { VarVec tableColumns = tableDefinitions[i]; if (tableColumns != null) { externalRefs.InitFrom(nodeInfo.ExternalReferences); externalRefs.Minus(tableColumns); if (externalRefs.IsEmpty) { singleTablePart = true; singleTablePredicates[i].AddPart(part); break; } } } if (!singleTablePart) { otherPredicates.AddPart(part); } } }
private void Map(VarVec vec) { var newVec = m_command.CreateVarVec(MapVars(vec)); vec.InitFrom(newVec); }
private void Map(VarVec vec) { VarVec newVec = m_command.CreateVarVec(MapVars(vec)); vec.InitFrom(newVec); }
private void Map(VarVec vec) { VarVec varVec = this.m_command.CreateVarVec(this.MapVars((IEnumerable <Var>)vec)); vec.InitFrom(varVec); }
private static bool ProcessJoinOverProject( RuleProcessingContext context, System.Data.Entity.Core.Query.InternalTrees.Node joinNode, out System.Data.Entity.Core.Query.InternalTrees.Node newNode) { newNode = joinNode; TransformationRulesContext transformationRulesContext = (TransformationRulesContext)context; Command command = transformationRulesContext.Command; System.Data.Entity.Core.Query.InternalTrees.Node node1 = joinNode.HasChild2 ? joinNode.Child2 : (System.Data.Entity.Core.Query.InternalTrees.Node)null; Dictionary <Var, int> varRefMap = new Dictionary <Var, int>(); if (node1 != null && !transformationRulesContext.IsScalarOpTree(node1, varRefMap)) { return(false); } VarVec varVec1 = command.CreateVarVec(); List <System.Data.Entity.Core.Query.InternalTrees.Node> args = new List <System.Data.Entity.Core.Query.InternalTrees.Node>(); if (joinNode.Op.OpType != OpType.LeftOuterJoin && joinNode.Child0.Op.OpType == OpType.Project && joinNode.Child1.Op.OpType == OpType.Project) { ProjectOp op1 = (ProjectOp)joinNode.Child0.Op; ProjectOp op2 = (ProjectOp)joinNode.Child1.Op; Dictionary <Var, System.Data.Entity.Core.Query.InternalTrees.Node> varMap1 = transformationRulesContext.GetVarMap(joinNode.Child0.Child1, varRefMap); Dictionary <Var, System.Data.Entity.Core.Query.InternalTrees.Node> varMap2 = transformationRulesContext.GetVarMap(joinNode.Child1.Child1, varRefMap); if (varMap1 == null || varMap2 == null) { return(false); } System.Data.Entity.Core.Query.InternalTrees.Node node2; if (node1 != null) { System.Data.Entity.Core.Query.InternalTrees.Node node3 = transformationRulesContext.ReMap(node1, varMap1); System.Data.Entity.Core.Query.InternalTrees.Node node4 = transformationRulesContext.ReMap(node3, varMap2); node2 = context.Command.CreateNode(joinNode.Op, joinNode.Child0.Child0, joinNode.Child1.Child0, node4); } else { node2 = context.Command.CreateNode(joinNode.Op, joinNode.Child0.Child0, joinNode.Child1.Child0); } varVec1.InitFrom(op1.Outputs); foreach (Var output in op2.Outputs) { varVec1.Set(output); } ProjectOp projectOp = command.CreateProjectOp(varVec1); args.AddRange((IEnumerable <System.Data.Entity.Core.Query.InternalTrees.Node>)joinNode.Child0.Child1.Children); args.AddRange((IEnumerable <System.Data.Entity.Core.Query.InternalTrees.Node>)joinNode.Child1.Child1.Children); System.Data.Entity.Core.Query.InternalTrees.Node node5 = command.CreateNode((Op)command.CreateVarDefListOp(), args); System.Data.Entity.Core.Query.InternalTrees.Node node6 = command.CreateNode((Op)projectOp, node2, node5); newNode = node6; return(true); } int index1; int index2; if (joinNode.Child0.Op.OpType == OpType.Project) { index1 = 0; index2 = 1; } else { System.Data.Entity.Core.Query.PlanCompiler.PlanCompiler.Assert(joinNode.Op.OpType != OpType.LeftOuterJoin, "unexpected non-LeftOuterJoin"); index1 = 1; index2 = 0; } System.Data.Entity.Core.Query.InternalTrees.Node child = joinNode.Children[index1]; ProjectOp op = child.Op as ProjectOp; Dictionary <Var, System.Data.Entity.Core.Query.InternalTrees.Node> varMap = transformationRulesContext.GetVarMap(child.Child1, varRefMap); if (varMap == null) { return(false); } ExtendedNodeInfo extendedNodeInfo = command.GetExtendedNodeInfo(joinNode.Children[index2]); VarVec varVec2 = command.CreateVarVec(op.Outputs); varVec2.Or(extendedNodeInfo.Definitions); op.Outputs.InitFrom(varVec2); if (node1 != null) { System.Data.Entity.Core.Query.InternalTrees.Node node2 = transformationRulesContext.ReMap(node1, varMap); joinNode.Child2 = node2; } joinNode.Children[index1] = child.Child0; context.Command.RecomputeNodeInfo(joinNode); newNode = context.Command.CreateNode((Op)op, joinNode, child.Child1); return(true); }