コード例 #1
0
        protected override NodeInfo VisitGroupByOp(GroupByBaseOp op, Node n)
        {
            ExtendedNodeInfo extendedNodeInfo1 = this.InitExtendedNodeInfo(n);
            ExtendedNodeInfo extendedNodeInfo2 = this.GetExtendedNodeInfo(n.Child0);

            extendedNodeInfo1.Definitions.InitFrom(op.Outputs);
            extendedNodeInfo1.LocalDefinitions.InitFrom(extendedNodeInfo1.Definitions);
            extendedNodeInfo1.ExternalReferences.Or(extendedNodeInfo2.ExternalReferences);
            foreach (Node child in n.Child1.Children)
            {
                NodeInfo nodeInfo = this.GetNodeInfo(child.Child0);
                extendedNodeInfo1.ExternalReferences.Or(nodeInfo.ExternalReferences);
                if (NodeInfoVisitor.IsDefinitionNonNullable(child.Child0, extendedNodeInfo2.NonNullableDefinitions))
                {
                    extendedNodeInfo1.NonNullableDefinitions.Set(((VarDefOp)child.Op).Var);
                }
            }
            extendedNodeInfo1.NonNullableDefinitions.Or(extendedNodeInfo2.NonNullableDefinitions);
            extendedNodeInfo1.NonNullableDefinitions.And(op.Keys);
            for (int index = 2; index < n.Children.Count; ++index)
            {
                foreach (Node child in n.Children[index].Children)
                {
                    NodeInfo nodeInfo = this.GetNodeInfo(child.Child0);
                    extendedNodeInfo1.ExternalReferences.Or(nodeInfo.ExternalReferences);
                }
            }
            extendedNodeInfo1.ExternalReferences.Minus(extendedNodeInfo2.Definitions);
            extendedNodeInfo1.Keys.InitFrom((IEnumerable <Var>)op.Keys);
            extendedNodeInfo1.MinRows = op.Keys.IsEmpty ? RowCount.One : (extendedNodeInfo2.MinRows == RowCount.One ? RowCount.One : RowCount.Zero);
            extendedNodeInfo1.MaxRows = op.Keys.IsEmpty ? RowCount.One : extendedNodeInfo2.MaxRows;
            return((NodeInfo)extendedNodeInfo1);
        }
コード例 #2
0
 internal Command(MetadataWorkspace metadataWorkspace)
 {
     this.m_parameterMap      = new Dictionary <string, ParameterVar>();
     this.m_vars              = new List <Var>();
     this.m_tables            = new List <Table>();
     this.m_metadataWorkspace = metadataWorkspace;
     if (!Command.TryGetPrimitiveType(PrimitiveTypeKind.Boolean, out this.m_boolType))
     {
         throw new ProviderIncompatibleException(Strings.Cqt_General_NoProviderBooleanType);
     }
     if (!Command.TryGetPrimitiveType(PrimitiveTypeKind.Int32, out this.m_intType))
     {
         throw new ProviderIncompatibleException(Strings.Cqt_General_NoProviderIntegerType);
     }
     if (!Command.TryGetPrimitiveType(PrimitiveTypeKind.String, out this.m_stringType))
     {
         throw new ProviderIncompatibleException(Strings.Cqt_General_NoProviderStringType);
     }
     this.m_trueOp                  = new ConstantPredicateOp(this.m_boolType, true);
     this.m_falseOp                 = new ConstantPredicateOp(this.m_boolType, false);
     this.m_nodeInfoVisitor         = new NodeInfoVisitor(this);
     this.m_keyPullupVisitor        = new KeyPullup(this);
     this.m_freeVarVecEnumerators   = new Stack <VarVec.VarVecEnumerator>();
     this.m_freeVarVecs             = new Stack <VarVec>();
     this.m_referencedRelProperties = new HashSet <RelProperty>();
 }
コード例 #3
0
        public override NodeInfo Visit(ProjectOp op, Node n)
        {
            ExtendedNodeInfo extendedNodeInfo1 = this.InitExtendedNodeInfo(n);
            ExtendedNodeInfo extendedNodeInfo2 = this.GetExtendedNodeInfo(n.Child0);

            foreach (Var output in op.Outputs)
            {
                if (extendedNodeInfo2.Definitions.IsSet(output))
                {
                    extendedNodeInfo1.Definitions.Set(output);
                }
                else
                {
                    extendedNodeInfo1.ExternalReferences.Set(output);
                }
            }
            extendedNodeInfo1.NonNullableDefinitions.InitFrom(extendedNodeInfo2.NonNullableDefinitions);
            extendedNodeInfo1.NonNullableDefinitions.And(op.Outputs);
            extendedNodeInfo1.NonNullableVisibleDefinitions.InitFrom(extendedNodeInfo2.NonNullableDefinitions);
            foreach (Node child in n.Child1.Children)
            {
                VarDefOp op1      = child.Op as VarDefOp;
                NodeInfo nodeInfo = this.GetNodeInfo(child.Child0);
                extendedNodeInfo1.LocalDefinitions.Set(op1.Var);
                extendedNodeInfo1.ExternalReferences.Clear(op1.Var);
                extendedNodeInfo1.Definitions.Set(op1.Var);
                extendedNodeInfo1.ExternalReferences.Or(nodeInfo.ExternalReferences);
                if (NodeInfoVisitor.IsDefinitionNonNullable(child.Child0, extendedNodeInfo1.NonNullableVisibleDefinitions))
                {
                    extendedNodeInfo1.NonNullableDefinitions.Set(op1.Var);
                }
            }
            extendedNodeInfo1.ExternalReferences.Minus(extendedNodeInfo2.Definitions);
            extendedNodeInfo1.ExternalReferences.Or(extendedNodeInfo2.ExternalReferences);
            extendedNodeInfo1.Keys.NoKeys = true;
            if (!extendedNodeInfo2.Keys.NoKeys)
            {
                VarVec varVec1 = this.m_command.CreateVarVec(extendedNodeInfo2.Keys.KeyVars).Remap(NodeInfoVisitor.ComputeVarRemappings(n.Child1));
                VarVec varVec2 = varVec1.Clone();
                VarVec varVec3 = this.m_command.CreateVarVec(op.Outputs);
                varVec1.Minus(varVec3);
                if (varVec1.IsEmpty)
                {
                    extendedNodeInfo1.Keys.InitFrom((IEnumerable <Var>)varVec2);
                }
            }
            extendedNodeInfo1.InitRowCountFrom(extendedNodeInfo2);
            return((NodeInfo)extendedNodeInfo1);
        }