protected override NodeInfo VisitApplyOp(ApplyBaseOp op, Node n) { ExtendedNodeInfo extendedNodeInfo1 = this.InitExtendedNodeInfo(n); ExtendedNodeInfo extendedNodeInfo2 = this.GetExtendedNodeInfo(n.Child0); ExtendedNodeInfo extendedNodeInfo3 = this.GetExtendedNodeInfo(n.Child1); extendedNodeInfo1.Definitions.Or(extendedNodeInfo2.Definitions); extendedNodeInfo1.Definitions.Or(extendedNodeInfo3.Definitions); extendedNodeInfo1.ExternalReferences.Or(extendedNodeInfo2.ExternalReferences); extendedNodeInfo1.ExternalReferences.Or(extendedNodeInfo3.ExternalReferences); extendedNodeInfo1.ExternalReferences.Minus(extendedNodeInfo1.Definitions); extendedNodeInfo1.Keys.InitFrom(extendedNodeInfo2.Keys, extendedNodeInfo3.Keys); extendedNodeInfo1.NonNullableDefinitions.InitFrom(extendedNodeInfo2.NonNullableDefinitions); if (op.OpType == OpType.CrossApply) { extendedNodeInfo1.NonNullableDefinitions.Or(extendedNodeInfo3.NonNullableDefinitions); } extendedNodeInfo1.NonNullableVisibleDefinitions.InitFrom(extendedNodeInfo2.NonNullableDefinitions); extendedNodeInfo1.NonNullableVisibleDefinitions.Or(extendedNodeInfo3.NonNullableDefinitions); RowCount maxRows = extendedNodeInfo2.MaxRows > RowCount.One || extendedNodeInfo3.MaxRows > RowCount.One ? RowCount.Unbounded : RowCount.One; RowCount minRows = op.OpType == OpType.CrossApply ? RowCount.Zero : extendedNodeInfo2.MinRows; extendedNodeInfo1.SetRowCount(minRows, maxRows); return((NodeInfo)extendedNodeInfo1); }
public override NodeInfo Visit(CrossJoinOp op, Node n) { ExtendedNodeInfo extendedNodeInfo1 = this.InitExtendedNodeInfo(n); List <KeyVec> keyVecList = new List <KeyVec>(); RowCount maxRows = RowCount.Zero; RowCount minRows = RowCount.One; foreach (Node child in n.Children) { ExtendedNodeInfo extendedNodeInfo2 = this.GetExtendedNodeInfo(child); extendedNodeInfo1.Definitions.Or(extendedNodeInfo2.Definitions); extendedNodeInfo1.ExternalReferences.Or(extendedNodeInfo2.ExternalReferences); keyVecList.Add(extendedNodeInfo2.Keys); extendedNodeInfo1.NonNullableDefinitions.Or(extendedNodeInfo2.NonNullableDefinitions); if (extendedNodeInfo2.MaxRows > maxRows) { maxRows = extendedNodeInfo2.MaxRows; } if (extendedNodeInfo2.MinRows < minRows) { minRows = extendedNodeInfo2.MinRows; } } extendedNodeInfo1.Keys.InitFrom(keyVecList); extendedNodeInfo1.SetRowCount(minRows, maxRows); return((NodeInfo)extendedNodeInfo1); }
public override NodeInfo Visit(SingleRowTableOp op, Node n) { ExtendedNodeInfo extendedNodeInfo = this.InitExtendedNodeInfo(n); extendedNodeInfo.Keys.NoKeys = false; extendedNodeInfo.SetRowCount(RowCount.One, RowCount.One); return((NodeInfo)extendedNodeInfo); }
public override NodeInfo Visit(SingleRowOp op, Node n) { ExtendedNodeInfo extendedNodeInfo1 = this.InitExtendedNodeInfo(n); ExtendedNodeInfo extendedNodeInfo2 = this.GetExtendedNodeInfo(n.Child0); extendedNodeInfo1.Definitions.InitFrom(extendedNodeInfo2.Definitions); extendedNodeInfo1.Keys.InitFrom(extendedNodeInfo2.Keys); extendedNodeInfo1.ExternalReferences.InitFrom(extendedNodeInfo2.ExternalReferences); extendedNodeInfo1.NonNullableDefinitions.InitFrom(extendedNodeInfo2.NonNullableDefinitions); extendedNodeInfo1.SetRowCount(RowCount.Zero, RowCount.One); return((NodeInfo)extendedNodeInfo1); }
protected override NodeInfo VisitJoinOp(JoinBaseOp op, Node n) { if (op.OpType != OpType.InnerJoin && op.OpType != OpType.LeftOuterJoin && op.OpType != OpType.FullOuterJoin) { return(this.Unimplemented(n)); } ExtendedNodeInfo extendedNodeInfo1 = this.InitExtendedNodeInfo(n); ExtendedNodeInfo extendedNodeInfo2 = this.GetExtendedNodeInfo(n.Child0); ExtendedNodeInfo extendedNodeInfo3 = this.GetExtendedNodeInfo(n.Child1); NodeInfo nodeInfo = this.GetNodeInfo(n.Child2); extendedNodeInfo1.Definitions.Or(extendedNodeInfo2.Definitions); extendedNodeInfo1.Definitions.Or(extendedNodeInfo3.Definitions); extendedNodeInfo1.ExternalReferences.Or(extendedNodeInfo2.ExternalReferences); extendedNodeInfo1.ExternalReferences.Or(extendedNodeInfo3.ExternalReferences); extendedNodeInfo1.ExternalReferences.Or(nodeInfo.ExternalReferences); extendedNodeInfo1.ExternalReferences.Minus(extendedNodeInfo1.Definitions); extendedNodeInfo1.Keys.InitFrom(extendedNodeInfo2.Keys, extendedNodeInfo3.Keys); if (op.OpType == OpType.InnerJoin || op.OpType == OpType.LeftOuterJoin) { extendedNodeInfo1.NonNullableDefinitions.InitFrom(extendedNodeInfo2.NonNullableDefinitions); } if (op.OpType == OpType.InnerJoin) { extendedNodeInfo1.NonNullableDefinitions.Or(extendedNodeInfo3.NonNullableDefinitions); } extendedNodeInfo1.NonNullableVisibleDefinitions.InitFrom(extendedNodeInfo2.NonNullableDefinitions); extendedNodeInfo1.NonNullableVisibleDefinitions.Or(extendedNodeInfo3.NonNullableDefinitions); RowCount minRows; RowCount maxRows; if (op.OpType == OpType.FullOuterJoin) { minRows = RowCount.Zero; maxRows = RowCount.Unbounded; } else { maxRows = extendedNodeInfo2.MaxRows > RowCount.One || extendedNodeInfo3.MaxRows > RowCount.One ? RowCount.Unbounded : RowCount.One; minRows = op.OpType != OpType.LeftOuterJoin ? RowCount.Zero : extendedNodeInfo2.MinRows; } extendedNodeInfo1.SetRowCount(minRows, maxRows); return((NodeInfo)extendedNodeInfo1); }
protected override NodeInfo VisitSortOp(SortBaseOp op, Node n) { ExtendedNodeInfo extendedNodeInfo1 = this.InitExtendedNodeInfo(n); ExtendedNodeInfo extendedNodeInfo2 = this.GetExtendedNodeInfo(n.Child0); extendedNodeInfo1.Definitions.Or(extendedNodeInfo2.Definitions); extendedNodeInfo1.ExternalReferences.Or(extendedNodeInfo2.ExternalReferences); extendedNodeInfo1.ExternalReferences.Minus(extendedNodeInfo2.Definitions); extendedNodeInfo1.Keys.InitFrom(extendedNodeInfo2.Keys); extendedNodeInfo1.NonNullableDefinitions.InitFrom(extendedNodeInfo2.NonNullableDefinitions); extendedNodeInfo1.NonNullableVisibleDefinitions.InitFrom(extendedNodeInfo2.NonNullableDefinitions); extendedNodeInfo1.InitRowCountFrom(extendedNodeInfo2); if (OpType.ConstrainedSort == op.OpType && n.Child2.Op.OpType == OpType.Constant && !((ConstrainedSortOp)op).WithTies) { ConstantBaseOp op1 = (ConstantBaseOp)n.Child2.Op; if (TypeHelpers.IsIntegerConstant(op1.Type, op1.Value, 1L)) { extendedNodeInfo1.SetRowCount(RowCount.Zero, RowCount.One); } } return((NodeInfo)extendedNodeInfo1); }