/// <summary> /// Creates a new command /// </summary> internal Command(MetadataWorkspace metadataWorkspace) { m_parameterMap = new Dictionary<string, ParameterVar>(); m_vars = new List<Var>(); m_tables = new List<Table>(); m_metadataWorkspace = metadataWorkspace; if(!TryGetPrimitiveType(PrimitiveTypeKind.Boolean, out m_boolType)) { throw EntityUtil.ProviderIncompatible(System.Data.Entity.Strings.Cqt_General_NoProviderBooleanType); } if (!TryGetPrimitiveType(PrimitiveTypeKind.Int32, out m_intType)) { throw EntityUtil.ProviderIncompatible(System.Data.Entity.Strings.Cqt_General_NoProviderIntegerType); } if (!TryGetPrimitiveType(PrimitiveTypeKind.String, out m_stringType)) { throw EntityUtil.ProviderIncompatible(System.Data.Entity.Strings.Cqt_General_NoProviderStringType); } m_trueOp = new ConstantPredicateOp(m_boolType, true); m_falseOp = new ConstantPredicateOp(m_boolType, false); m_nodeInfoVisitor = new NodeInfoVisitor(this); m_keyPullupVisitor = new PlanCompiler.KeyPullup(this); // FreeLists m_freeVarVecEnumerators = new Stack<VarVec.VarVecEnumerator>(); m_freeVarVecs = new Stack<VarVec>(); m_referencedRelProperties = new HashSet<RelProperty>(); }
public override void Visit(ProjectOp op, System.Data.Entity.Core.Query.InternalTrees.Node n) { this.VisitChildren(n); ExtendedNodeInfo extendedNodeInfo = n.Child0.GetExtendedNodeInfo(this.m_command); if (!extendedNodeInfo.Keys.NoKeys) { VarVec varVec = this.m_command.CreateVarVec(op.Outputs); Dictionary <Var, Var> varRemappings = NodeInfoVisitor.ComputeVarRemappings(n.Child1); VarVec other = extendedNodeInfo.Keys.KeyVars.Remap(varRemappings); varVec.Or(other); op.Outputs.InitFrom(varVec); } this.m_command.RecomputeNodeInfo(n); }
/// <summary> /// Pulls up keys for a ProjectOp. First visits its children to pull /// up its keys; then identifies any keys from the input that it may have /// projected out - and adds them to the output list of vars /// </summary> /// <param name="op">Current ProjectOp</param> /// <param name="n">Current subtree</param> public override void Visit(ProjectOp op, Node n) { VisitChildren(n); ExtendedNodeInfo childNodeInfo = n.Child0.GetExtendedNodeInfo(m_command); if (!childNodeInfo.Keys.NoKeys) { VarVec outputVars = m_command.CreateVarVec(op.Outputs); // NOTE: This code appears in NodeInfoVisitor as well. Try to see if we // can share this somehow. Dictionary <Var, Var> varRenameMap = NodeInfoVisitor.ComputeVarRemappings(n.Child1); VarVec mappedKeyVec = childNodeInfo.Keys.KeyVars.Remap(varRenameMap); outputVars.Or(mappedKeyVec); op.Outputs.InitFrom(outputVars); } m_command.RecomputeNodeInfo(n); }