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); }
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>(); }
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); }