private AlgebraNode MegeWithConstantScan(ComputeScalarAlgebraNode node) { ConstantScanAlgebraNode constantScanAlgebraNode = (ConstantScanAlgebraNode)node.Input; constantScanAlgebraNode.DefinedValues = ArrayHelpers.JoinArrays(constantScanAlgebraNode.DefinedValues, node.DefinedValues); return(VisitAlgebraNode(constantScanAlgebraNode)); }
private static AlgebraNode CreateConstantScan() { ConstantScanAlgebraNode constantScanAlgebraNode = new ConstantScanAlgebraNode(); constantScanAlgebraNode.DefinedValues = new ComputedValueDefinition[0]; return(constantScanAlgebraNode); }
public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { _xmlWriter.WriteStartElement("constantScanAlgebraNode"); _xmlWriter.WriteEndElement(); return(node); }
public override AstElement Clone(Dictionary<AstElement, AstElement> alreadyClonedElements) { ConstantScanAlgebraNode result = new ConstantScanAlgebraNode(); result.StatisticsIterator = StatisticsIterator; result.OutputList = ArrayHelpers.Clone(OutputList); result.DefinedValues = ArrayHelpers.CreateDeepCopyOfAstElementArray(_definedValues, alreadyClonedElements); return result; }
public override AstElement Clone(Dictionary <AstElement, AstElement> alreadyClonedElements) { ConstantScanAlgebraNode result = new ConstantScanAlgebraNode(); result.StatisticsIterator = StatisticsIterator; result.OutputList = ArrayHelpers.Clone(OutputList); result.DefinedValues = ArrayHelpers.CreateDeepCopyOfAstElementArray(_definedValues, alreadyClonedElements); return(result); }
public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { base.VisitConstantScanAlgebraNode(node); foreach (ComputedValueDefinition definedValue in node.DefinedValues) NameEntry(definedValue.Target, EXPRESSION_NAME_FMT_STR); return node; }
public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { base.VisitConstantScanAlgebraNode(node); foreach (ComputedValueDefinition definedValue in node.DefinedValues) { NameEntry(definedValue.Target, EXPRESSION_NAME_FMT_STR); } return(node); }
public virtual AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { if (node.DefinedValues != null) { foreach (ComputedValueDefinition definedValue in node.DefinedValues) { definedValue.Expression = VisitExpression(definedValue.Expression); } } return(node); }
public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { PropertyListBuilder propertyListBuilder = new PropertyListBuilder(); propertyListBuilder.Write(Resources.ShowPlanKeyEmpty, Boolean.FalseString); AddRowBufferEntries(propertyListBuilder, Resources.ShowPlanGroupOutputList, node.OutputList); AddStatistics(propertyListBuilder, node.StatisticsIterator); if (node.DefinedValues != null && node.DefinedValues.Length > 0) { AddDefinedValues(propertyListBuilder, node.DefinedValues); } IList <ShowPlanProperty> properties = propertyListBuilder.ToList(); ShowPlanElement element = new ShowPlanElement(ShowPlanOperator.ConstantScan, properties); _currentElement = element; return(node); }
public override AlgebraNode VisitAggregateAlgebraNode(AggregateAlgebraNode node) { node.Input = VisitAlgebraNode(node.Input); if (node.Input is NullScanAlgebraNode) { if (node.Groups != null && node.Groups.Length > 0) { // Grouped queries return nothing on empty input. return(CreateNullScan(node.OutputList)); } else { // Non-grouped aggregation. We return the result value of the aggregates // executed against an empty input as a single row. List <RowBufferEntry> outputList = new List <RowBufferEntry>(); List <ComputedValueDefinition> emptyValueList = new List <ComputedValueDefinition>(); foreach (AggregatedValueDefinition definedValue in node.DefinedValues) { IAggregator aggregator = definedValue.Aggregator; aggregator.Init(); object emptyValue = aggregator.Terminate(); ComputedValueDefinition computedBufferedValue = new ComputedValueDefinition(); computedBufferedValue.Target = definedValue.Target; computedBufferedValue.Expression = LiteralExpression.FromTypedValue(emptyValue, aggregator.ReturnType); emptyValueList.Add(computedBufferedValue); outputList.Add(computedBufferedValue.Target); } ConstantScanAlgebraNode constantScanAlgebraNode = new ConstantScanAlgebraNode(); constantScanAlgebraNode.DefinedValues = emptyValueList.ToArray(); constantScanAlgebraNode.OutputList = outputList.ToArray(); return(constantScanAlgebraNode); } } return(node); }
public override QueryNode VisitSelectQuery(SelectQuery query) { // Calculate needed row buffers RowBufferCalculator rowBufferCalculator = query.RowBufferCalculator; // Emit FROM if (query.TableReferences != null) { Visit(query.TableReferences); } else { ConstantScanAlgebraNode constantScanAlgebraNode = new ConstantScanAlgebraNode(); constantScanAlgebraNode.DefinedValues = new ComputedValueDefinition[0]; SetLastAlgebraNode(constantScanAlgebraNode); } // Emit WHERE if (query.WhereClause != null) { FilterAlgebraNode filterAlgebraNode = new FilterAlgebraNode(); filterAlgebraNode.Input = GetLastAlgebraNode(); filterAlgebraNode.Predicate = query.WhereClause; SetLastAlgebraNode(filterAlgebraNode); } // Emit GROUP BY if (query.GroupByColumns != null || query.IsAggregated) { EmitComputeScalarIfNeeded(rowBufferCalculator.ComputedGroupColumns); List <AggregatedValueDefinition> definedValues = new List <AggregatedValueDefinition>(); foreach (AggregateExpression aggregateDependency in query.AggregateDependencies) { definedValues.Add(aggregateDependency.ValueDefinition); } if (query.GroupByColumns != null) { SortAlgebraNode sortAlgebraNode = new SortAlgebraNode(); sortAlgebraNode.Input = GetLastAlgebraNode(); sortAlgebraNode.SortEntries = rowBufferCalculator.GroupColumns; sortAlgebraNode.SortOrders = CreateAscendingSortOrders(sortAlgebraNode.SortEntries.Length); SetLastAlgebraNode(sortAlgebraNode); } AggregateAlgebraNode algebraNode = new AggregateAlgebraNode(); algebraNode.Input = GetLastAlgebraNode(); algebraNode.DefinedValues = definedValues.ToArray(); algebraNode.Groups = rowBufferCalculator.GroupColumns; SetLastAlgebraNode(algebraNode); } // Emit HAVING if (query.HavingClause != null) { FilterAlgebraNode filterAlgebraNode = new FilterAlgebraNode(); filterAlgebraNode.Input = GetLastAlgebraNode(); filterAlgebraNode.Predicate = query.HavingClause; SetLastAlgebraNode(filterAlgebraNode); } // Emit compute scalar to calculate expressions needed in SELECT and ORDER BY EmitComputeScalarIfNeeded(rowBufferCalculator.ComputedSelectAndOrderColumns); // Emit DISTINCT and ORDER BY if (query.IsDistinct && query.OrderByColumns != null) { List <RowBufferEntry> sortEntries = new List <RowBufferEntry>(); List <SortOrder> sortOrderList = new List <SortOrder>(); for (int i = 0; i < query.OrderByColumns.Length; i++) { sortEntries.Add(rowBufferCalculator.OrderColumns[i]); sortOrderList.Add(query.OrderByColumns[i].SortOrder); } foreach (RowBufferEntry selectColumn in rowBufferCalculator.SelectColumns) { bool selectColumnMustBeSorted = !sortEntries.Contains(selectColumn); if (selectColumnMustBeSorted) { sortEntries.Add(selectColumn); sortOrderList.Add(SortOrder.Ascending); } } SortAlgebraNode sortAlgebraNode = new SortAlgebraNode(); sortAlgebraNode.Distinct = true; sortAlgebraNode.Input = GetLastAlgebraNode(); sortAlgebraNode.SortEntries = sortEntries.ToArray(); sortAlgebraNode.SortOrders = sortOrderList.ToArray(); SetLastAlgebraNode(sortAlgebraNode); } else { if (query.IsDistinct) { SortAlgebraNode sortAlgebraNode = new SortAlgebraNode(); sortAlgebraNode.Distinct = true; sortAlgebraNode.Input = GetLastAlgebraNode(); sortAlgebraNode.SortEntries = rowBufferCalculator.SelectColumns; sortAlgebraNode.SortOrders = CreateAscendingSortOrders(sortAlgebraNode.SortEntries.Length); SetLastAlgebraNode(sortAlgebraNode); } if (query.OrderByColumns != null) { List <SortOrder> sortOrderList = new List <SortOrder>(); foreach (OrderByColumn orderByColumn in query.OrderByColumns) { sortOrderList.Add(orderByColumn.SortOrder); } SortAlgebraNode sortAlgebraNode = new SortAlgebraNode(); sortAlgebraNode.Input = GetLastAlgebraNode(); sortAlgebraNode.SortEntries = rowBufferCalculator.OrderColumns; sortAlgebraNode.SortOrders = sortOrderList.ToArray(); SetLastAlgebraNode(sortAlgebraNode); } } // Emit TOP if (query.TopClause != null) { TopAlgebraNode algebraNode = new TopAlgebraNode(); algebraNode.Input = GetLastAlgebraNode(); algebraNode.Limit = query.TopClause.Value; if (query.TopClause.WithTies) { algebraNode.TieEntries = rowBufferCalculator.OrderColumns; } SetLastAlgebraNode(algebraNode); } // Emit select list List <string> columnNames = new List <string>(); foreach (SelectColumn columnSource in query.SelectColumns) { if (columnSource.Alias != null) { columnNames.Add(columnSource.Alias.Text); } else { columnNames.Add(null); } } ResultAlgebraNode resultAlgebraNode = new ResultAlgebraNode(); resultAlgebraNode.Input = GetLastAlgebraNode(); resultAlgebraNode.OutputList = rowBufferCalculator.SelectColumns; resultAlgebraNode.ColumnNames = columnNames.ToArray(); SetLastAlgebraNode(resultAlgebraNode); return(query); }
public override QueryNode VisitSelectQuery(SelectQuery query) { // Calculate needed row buffers RowBufferCalculator rowBufferCalculator = query.RowBufferCalculator; // Emit FROM if (query.TableReferences != null) { Visit(query.TableReferences); } else { ConstantScanAlgebraNode constantScanAlgebraNode = new ConstantScanAlgebraNode(); constantScanAlgebraNode.DefinedValues = new ComputedValueDefinition[0]; SetLastAlgebraNode(constantScanAlgebraNode); } // Emit WHERE if (query.WhereClause != null) { FilterAlgebraNode filterAlgebraNode = new FilterAlgebraNode(); filterAlgebraNode.Input = GetLastAlgebraNode(); filterAlgebraNode.Predicate = query.WhereClause; SetLastAlgebraNode(filterAlgebraNode); } // Emit GROUP BY if (query.GroupByColumns != null || query.IsAggregated) { EmitComputeScalarIfNeeded(rowBufferCalculator.ComputedGroupColumns); List<AggregatedValueDefinition> definedValues = new List<AggregatedValueDefinition>(); foreach (AggregateExpression aggregateDependency in query.AggregateDependencies) definedValues.Add(aggregateDependency.ValueDefinition); if (query.GroupByColumns != null) { SortAlgebraNode sortAlgebraNode = new SortAlgebraNode(); sortAlgebraNode.Input = GetLastAlgebraNode(); sortAlgebraNode.SortEntries = rowBufferCalculator.GroupColumns; sortAlgebraNode.SortOrders = CreateAscendingSortOrders(sortAlgebraNode.SortEntries.Length); SetLastAlgebraNode(sortAlgebraNode); } AggregateAlgebraNode algebraNode = new AggregateAlgebraNode(); algebraNode.Input = GetLastAlgebraNode(); algebraNode.DefinedValues = definedValues.ToArray(); algebraNode.Groups = rowBufferCalculator.GroupColumns; SetLastAlgebraNode(algebraNode); } // Emit HAVING if (query.HavingClause != null) { FilterAlgebraNode filterAlgebraNode = new FilterAlgebraNode(); filterAlgebraNode.Input = GetLastAlgebraNode(); filterAlgebraNode.Predicate = query.HavingClause; SetLastAlgebraNode(filterAlgebraNode); } // Emit compute scalar to calculate expressions needed in SELECT and ORDER BY EmitComputeScalarIfNeeded(rowBufferCalculator.ComputedSelectAndOrderColumns); // Emit DISTINCT and ORDER BY if (query.IsDistinct && query.OrderByColumns != null) { List<RowBufferEntry> sortEntries = new List<RowBufferEntry>(); List<SortOrder> sortOrderList = new List<SortOrder>(); for (int i = 0; i < query.OrderByColumns.Length; i++) { sortEntries.Add(rowBufferCalculator.OrderColumns[i]); sortOrderList.Add(query.OrderByColumns[i].SortOrder); } foreach (RowBufferEntry selectColumn in rowBufferCalculator.SelectColumns) { bool selectColumnMustBeSorted = !sortEntries.Contains(selectColumn); if (selectColumnMustBeSorted) { sortEntries.Add(selectColumn); sortOrderList.Add(SortOrder.Ascending); } } SortAlgebraNode sortAlgebraNode = new SortAlgebraNode(); sortAlgebraNode.Distinct = true; sortAlgebraNode.Input = GetLastAlgebraNode(); sortAlgebraNode.SortEntries = sortEntries.ToArray(); sortAlgebraNode.SortOrders = sortOrderList.ToArray(); SetLastAlgebraNode(sortAlgebraNode); } else { if (query.IsDistinct) { SortAlgebraNode sortAlgebraNode = new SortAlgebraNode(); sortAlgebraNode.Distinct = true; sortAlgebraNode.Input = GetLastAlgebraNode(); sortAlgebraNode.SortEntries = rowBufferCalculator.SelectColumns; sortAlgebraNode.SortOrders = CreateAscendingSortOrders(sortAlgebraNode.SortEntries.Length); SetLastAlgebraNode(sortAlgebraNode); } if (query.OrderByColumns != null) { List<SortOrder> sortOrderList = new List<SortOrder>(); foreach (OrderByColumn orderByColumn in query.OrderByColumns) sortOrderList.Add(orderByColumn.SortOrder); SortAlgebraNode sortAlgebraNode = new SortAlgebraNode(); sortAlgebraNode.Input = GetLastAlgebraNode(); sortAlgebraNode.SortEntries = rowBufferCalculator.OrderColumns; sortAlgebraNode.SortOrders = sortOrderList.ToArray(); SetLastAlgebraNode(sortAlgebraNode); } } // Emit TOP if (query.TopClause != null) { TopAlgebraNode algebraNode = new TopAlgebraNode(); algebraNode.Input = GetLastAlgebraNode(); algebraNode.Limit = query.TopClause.Value; if (query.TopClause.WithTies) algebraNode.TieEntries = rowBufferCalculator.OrderColumns; SetLastAlgebraNode(algebraNode); } // Emit select list List<string> columnNames = new List<string>(); foreach (SelectColumn columnSource in query.SelectColumns) { if (columnSource.Alias != null) columnNames.Add(columnSource.Alias.Text); else columnNames.Add(null); } ResultAlgebraNode resultAlgebraNode = new ResultAlgebraNode(); resultAlgebraNode.Input = GetLastAlgebraNode(); resultAlgebraNode.OutputList = rowBufferCalculator.SelectColumns; resultAlgebraNode.ColumnNames = columnNames.ToArray(); SetLastAlgebraNode(resultAlgebraNode); return query; }
public override AlgebraNode VisitAggregateAlgebraNode(AggregateAlgebraNode node) { node.Input = VisitAlgebraNode(node.Input); if (node.Input is NullScanAlgebraNode) { if (node.Groups != null && node.Groups.Length > 0) { // Grouped queries return nothing on empty input. return CreateNullScan(node.OutputList); } else { // Non-grouped aggregation. We return the result value of the aggregates // executed against an empty input as a single row. List<RowBufferEntry> outputList = new List<RowBufferEntry>(); List<ComputedValueDefinition> emptyValueList = new List<ComputedValueDefinition>(); foreach (AggregatedValueDefinition definedValue in node.DefinedValues) { IAggregator aggregator = definedValue.Aggregator; aggregator.Init(); object emptyValue = aggregator.Terminate(); ComputedValueDefinition computedBufferedValue = new ComputedValueDefinition(); computedBufferedValue.Target = definedValue.Target; computedBufferedValue.Expression = LiteralExpression.FromTypedValue(emptyValue, aggregator.ReturnType); emptyValueList.Add(computedBufferedValue); outputList.Add(computedBufferedValue.Target); } ConstantScanAlgebraNode constantScanAlgebraNode = new ConstantScanAlgebraNode(); constantScanAlgebraNode.DefinedValues = emptyValueList.ToArray(); constantScanAlgebraNode.OutputList = outputList.ToArray(); return constantScanAlgebraNode; } } return node; }
private static AlgebraNode CreateConstantScan() { ConstantScanAlgebraNode constantScanAlgebraNode = new ConstantScanAlgebraNode(); constantScanAlgebraNode.DefinedValues = new ComputedValueDefinition[0]; return constantScanAlgebraNode; }
public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { AddDefinedValues(node.DefinedValues); return node; }
public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { AddDefinedValues(node.DefinedValues); return(node); }
public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { node.OutputList = GetRowBufferEntries(node.DefinedValues); return node; }
public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { node.DefinedValues = RemovedUnneededDefinedValues(node.DefinedValues); node.OutputList = RemovedUnneededRowBufferColumns(node.OutputList); return(base.VisitConstantScanAlgebraNode(node)); }
public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { _xmlWriter.WriteStartElement("constantScanAlgebraNode"); _xmlWriter.WriteEndElement(); return node; }
public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { node.OutputList = GetRowBufferEntries(node.DefinedValues); return(node); }
public virtual AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { if (node.DefinedValues != null) { foreach (ComputedValueDefinition definedValue in node.DefinedValues) definedValue.Expression = VisitExpression(definedValue.Expression); } return node; }
public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { ConstantIterator constantIterator = new ConstantIterator(); constantIterator.RowBuffer = new object[node.OutputList.Length]; constantIterator.DefinedValues = GetDefinedValues(node.OutputList, node.DefinedValues); SetLastIterator(node, constantIterator); return node; }
public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node) { PropertyListBuilder propertyListBuilder = new PropertyListBuilder(); propertyListBuilder.Write(Resources.ShowPlanKeyEmpty, Boolean.FalseString); AddRowBufferEntries(propertyListBuilder, Resources.ShowPlanGroupOutputList, node.OutputList); AddStatistics(propertyListBuilder, node.StatisticsIterator); if (node.DefinedValues != null && node.DefinedValues.Length > 0) AddDefinedValues(propertyListBuilder, node.DefinedValues); IList<ShowPlanProperty> properties = propertyListBuilder.ToList(); ShowPlanElement element = new ShowPlanElement(ShowPlanOperator.ConstantScan, properties); _currentElement = element; return node; }