public override AlgebraNode VisitFilterAlgebraNode(FilterAlgebraNode node) { node.Input = VisitAlgebraNode(node.Input); ExpressionNode originalPredicate = (ExpressionNode) node.Predicate.Clone(); SpoolExpressionExtractor spoolExpressionExtractor = new SpoolExpressionExtractor(_outerReferences); // HACK: This hack ensures that TRUE literals introduced by SpoolExpressionExtractor are removed. node.Predicate = AstUtil.CombineConditions(LogicalOperator.And, spoolExpressionExtractor.VisitExpression(node.Predicate)); SpoolExpression[] spoolExpressions = spoolExpressionExtractor.GetSpoolExpressions(); // Now we must check that the remaining filter incl. input to the filter don't reference any other // outer reference. bool remainingFilterHasDependenciesToOuterReferences = CheckIfNodeHasDependenciesToOuterReferences(node); if (remainingFilterHasDependenciesToOuterReferences) { // OK; we cannot insert a spool operation here. Undo the expression replacement. node.Predicate = originalPredicate; } else if (spoolExpressions.Length > 0) { SpoolExpression spoolExpression = spoolExpressions[0]; AlgebraNode currentInput; if (node.Predicate is ConstantExpression) currentInput = node.Input; else currentInput = node; RowBufferEntry indexEntry; RowBufferEntryExpression indexExpressionAsRowBufferEntryExpression = spoolExpression.IndexExpression as RowBufferEntryExpression; if (indexExpressionAsRowBufferEntryExpression != null) { indexEntry = indexExpressionAsRowBufferEntryExpression.RowBufferEntry; } else { indexEntry = new RowBufferEntry(spoolExpression.IndexExpression.ExpressionType); ComputedValueDefinition definedValue = new ComputedValueDefinition(); definedValue.Target = indexEntry; definedValue.Expression = spoolExpression.IndexExpression; ComputeScalarAlgebraNode computeScalarAlgebraNode = new ComputeScalarAlgebraNode(); computeScalarAlgebraNode.Input = currentInput; computeScalarAlgebraNode.DefinedValues = new ComputedValueDefinition[] { definedValue }; currentInput = computeScalarAlgebraNode; } IndexSpoolAlgebraNode indexSpoolAlgebraNode = new IndexSpoolAlgebraNode(); indexSpoolAlgebraNode.Input = currentInput; indexSpoolAlgebraNode.IndexEntry = indexEntry; indexSpoolAlgebraNode.ProbeExpression = spoolExpression.ProbeExpression; return indexSpoolAlgebraNode; } return node; }
public override AlgebraNode VisitIndexSpoolAlgebraNode(IndexSpoolAlgebraNode node) { node.OutputList = RemovedUnneededRowBufferColumns(node.OutputList); AddNeededRowBufferEntry(node.IndexEntry); AddNeededRowBufferEntryReferences(node.ProbeExpression); return(base.VisitIndexSpoolAlgebraNode(node)); }
public override AlgebraNode VisitIndexSpoolAlgebraNode(IndexSpoolAlgebraNode node) { base.VisitIndexSpoolAlgebraNode(node); node.IndexEntry = ReplaceRowBufferEntry(node.IndexEntry); return node; }
public override AlgebraNode VisitIndexSpoolAlgebraNode(IndexSpoolAlgebraNode node) { base.VisitIndexSpoolAlgebraNode(node); node.IndexEntry = ReplaceRowBufferEntry(node.IndexEntry); return(node); }
public override AstElement Clone(Dictionary<AstElement, AstElement> alreadyClonedElements) { IndexSpoolAlgebraNode result = new IndexSpoolAlgebraNode(); result.StatisticsIterator = StatisticsIterator; result.OutputList = ArrayHelpers.Clone(OutputList); result.Input = (AlgebraNode)Input.Clone(alreadyClonedElements); result.IndexEntry = _indexEntry; result.ProbeExpression = (ExpressionNode)_probeExpression.Clone(alreadyClonedElements); return result; }
public override AstElement Clone(Dictionary <AstElement, AstElement> alreadyClonedElements) { IndexSpoolAlgebraNode result = new IndexSpoolAlgebraNode(); result.StatisticsIterator = StatisticsIterator; result.OutputList = ArrayHelpers.Clone(OutputList); result.Input = (AlgebraNode)Input.Clone(alreadyClonedElements); result.IndexEntry = _indexEntry; result.ProbeExpression = (ExpressionNode)_probeExpression.Clone(alreadyClonedElements); return(result); }
public override AlgebraNode VisitIndexSpoolAlgebraNode(IndexSpoolAlgebraNode node) { ShowPlanElement inputElement = ConvertNode(node.Input); PropertyListBuilder propertyListBuilder = new PropertyListBuilder(); AddRowBufferEntries(propertyListBuilder, Resources.ShowPlanGroupOutputList, node.OutputList); AddStatistics(propertyListBuilder, node.StatisticsIterator); propertyListBuilder.Write(Resources.ShowPlanKeyLogicalOperator, Resources.ShowPlanLogicalOperatorEagerSpool); propertyListBuilder.Write(Resources.ShowPlanKeyWithStack, Boolean.FalseString); WriteRowBufferEntry(propertyListBuilder, Resources.ShowPlanKeyIndex, node.IndexEntry); propertyListBuilder.Write(Resources.ShowPlanKeyProbe, node.ProbeExpression.GenerateSource()); IList <ShowPlanProperty> properties = propertyListBuilder.ToList(); ShowPlanElement element = new ShowPlanElement(ShowPlanOperator.IndexSpool, properties, inputElement); _currentElement = element; return(node); }
public override AlgebraNode VisitIndexSpoolAlgebraNode(IndexSpoolAlgebraNode node) { IndexSpoolIterator indexSpoolIterator = new IndexSpoolIterator(); indexSpoolIterator.RowBuffer = new object[node.OutputList.Length]; indexSpoolIterator.Input = ConvertAlgebraNode(node.Input); indexSpoolIterator.InputOutput = GetIteratorOutput(0, node.Input.OutputList, node.OutputList); indexSpoolIterator.IndexEntry = GetIteratorInput(node.Input.OutputList, new RowBufferEntry[] { node.IndexEntry })[0]; BoundRowBufferEntrySet boundRowBufferEntrySet = new BoundRowBufferEntrySet(indexSpoolIterator.Input.RowBuffer, node.Input.OutputList); indexSpoolIterator.ProbeExpression = CreateRuntimeExpression(node.ProbeExpression, boundRowBufferEntrySet); SetLastIterator(node, indexSpoolIterator); return node; }
public override AlgebraNode VisitFilterAlgebraNode(FilterAlgebraNode node) { node.Input = VisitAlgebraNode(node.Input); ExpressionNode originalPredicate = (ExpressionNode)node.Predicate.Clone(); SpoolExpressionExtractor spoolExpressionExtractor = new SpoolExpressionExtractor(_outerReferences); // HACK: This hack ensures that TRUE literals introduced by SpoolExpressionExtractor are removed. node.Predicate = AstUtil.CombineConditions(LogicalOperator.And, spoolExpressionExtractor.VisitExpression(node.Predicate)); SpoolExpression[] spoolExpressions = spoolExpressionExtractor.GetSpoolExpressions(); // Now we must check that the remaining filter incl. input to the filter don't reference any other // outer reference. bool remainingFilterHasDependenciesToOuterReferences = CheckIfNodeHasDependenciesToOuterReferences(node); if (remainingFilterHasDependenciesToOuterReferences) { // OK; we cannot insert a spool operation here. Undo the expression replacement. node.Predicate = originalPredicate; } else if (spoolExpressions.Length > 0) { SpoolExpression spoolExpression = spoolExpressions[0]; AlgebraNode currentInput; if (node.Predicate is ConstantExpression) { currentInput = node.Input; } else { currentInput = node; } RowBufferEntry indexEntry; RowBufferEntryExpression indexExpressionAsRowBufferEntryExpression = spoolExpression.IndexExpression as RowBufferEntryExpression; if (indexExpressionAsRowBufferEntryExpression != null) { indexEntry = indexExpressionAsRowBufferEntryExpression.RowBufferEntry; } else { indexEntry = new RowBufferEntry(spoolExpression.IndexExpression.ExpressionType); ComputedValueDefinition definedValue = new ComputedValueDefinition(); definedValue.Target = indexEntry; definedValue.Expression = spoolExpression.IndexExpression; ComputeScalarAlgebraNode computeScalarAlgebraNode = new ComputeScalarAlgebraNode(); computeScalarAlgebraNode.Input = currentInput; computeScalarAlgebraNode.DefinedValues = new ComputedValueDefinition[] { definedValue }; currentInput = computeScalarAlgebraNode; } IndexSpoolAlgebraNode indexSpoolAlgebraNode = new IndexSpoolAlgebraNode(); indexSpoolAlgebraNode.Input = currentInput; indexSpoolAlgebraNode.IndexEntry = indexEntry; indexSpoolAlgebraNode.ProbeExpression = spoolExpression.ProbeExpression; return(indexSpoolAlgebraNode); } return(node); }
public virtual AlgebraNode VisitIndexSpoolAlgebraNode(IndexSpoolAlgebraNode node) { node.Input = VisitAlgebraNode(node.Input); return(node); }
public virtual AlgebraNode VisitIndexSpoolAlgebraNode(IndexSpoolAlgebraNode node) { node.Input = VisitAlgebraNode(node.Input); return node; }
public override AlgebraNode VisitIndexSpoolAlgebraNode(IndexSpoolAlgebraNode node) { node.Input = VisitAlgebraNode(node.Input); node.OutputList = node.Input.OutputList; return(node); }
public override AlgebraNode VisitIndexSpoolAlgebraNode(IndexSpoolAlgebraNode node) { node.Input = VisitAlgebraNode(node.Input); node.OutputList = node.Input.OutputList; return node; }
public override AlgebraNode VisitIndexSpoolAlgebraNode(IndexSpoolAlgebraNode node) { ShowPlanElement inputElement = ConvertNode(node.Input); PropertyListBuilder propertyListBuilder = new PropertyListBuilder(); AddRowBufferEntries(propertyListBuilder, Resources.ShowPlanGroupOutputList, node.OutputList); AddStatistics(propertyListBuilder, node.StatisticsIterator); propertyListBuilder.Write(Resources.ShowPlanKeyLogicalOperator, Resources.ShowPlanLogicalOperatorEagerSpool); propertyListBuilder.Write(Resources.ShowPlanKeyWithStack, Boolean.FalseString); WriteRowBufferEntry(propertyListBuilder, Resources.ShowPlanKeyIndex, node.IndexEntry); propertyListBuilder.Write(Resources.ShowPlanKeyProbe, node.ProbeExpression.GenerateSource()); IList<ShowPlanProperty> properties = propertyListBuilder.ToList(); ShowPlanElement element = new ShowPlanElement(ShowPlanOperator.IndexSpool, properties, inputElement); _currentElement = element; return node; }