コード例 #1
0
        private AlgebraNode MegeWithConstantScan(ComputeScalarAlgebraNode node)
        {
            ConstantScanAlgebraNode constantScanAlgebraNode = (ConstantScanAlgebraNode)node.Input;

            constantScanAlgebraNode.DefinedValues = ArrayHelpers.JoinArrays(constantScanAlgebraNode.DefinedValues, node.DefinedValues);
            return(VisitAlgebraNode(constantScanAlgebraNode));
        }
コード例 #2
0
        private static AlgebraNode CreateConstantScan()
        {
            ConstantScanAlgebraNode constantScanAlgebraNode = new ConstantScanAlgebraNode();

            constantScanAlgebraNode.DefinedValues = new ComputedValueDefinition[0];
            return(constantScanAlgebraNode);
        }
コード例 #3
0
        public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node)
        {
            _xmlWriter.WriteStartElement("constantScanAlgebraNode");
            _xmlWriter.WriteEndElement();

            return(node);
        }
コード例 #4
0
		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;
		}
コード例 #5
0
        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);
        }
コード例 #6
0
ファイル: RowBufferEntryNamer.cs プロジェクト: chenzuo/nquery
        public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node)
        {
            base.VisitConstantScanAlgebraNode(node);

            foreach (ComputedValueDefinition definedValue in node.DefinedValues)
                NameEntry(definedValue.Target, EXPRESSION_NAME_FMT_STR);

            return node;
        }
コード例 #7
0
        public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node)
        {
            base.VisitConstantScanAlgebraNode(node);

            foreach (ComputedValueDefinition definedValue in node.DefinedValues)
            {
                NameEntry(definedValue.Target, EXPRESSION_NAME_FMT_STR);
            }

            return(node);
        }
コード例 #8
0
        public virtual AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node)
        {
            if (node.DefinedValues != null)
            {
                foreach (ComputedValueDefinition definedValue in node.DefinedValues)
                {
                    definedValue.Expression = VisitExpression(definedValue.Expression);
                }
            }

            return(node);
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
ファイル: Algebrizer.cs プロジェクト: chenzuo/nquery
		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;
		}
コード例 #13
0
ファイル: NullScanOptimizer.cs プロジェクト: chenzuo/nquery
		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;
		}
コード例 #14
0
ファイル: SubqueryExpander.cs プロジェクト: chenzuo/nquery
 private static AlgebraNode CreateConstantScan()
 {
     ConstantScanAlgebraNode constantScanAlgebraNode = new ConstantScanAlgebraNode();
     constantScanAlgebraNode.DefinedValues = new ComputedValueDefinition[0];
     return constantScanAlgebraNode;
 }
コード例 #15
0
ファイル: DefinedValuesFinder.cs プロジェクト: chenzuo/nquery
		public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node)
		{
			AddDefinedValues(node.DefinedValues);

			return node;
		}
コード例 #16
0
        public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node)
        {
            AddDefinedValues(node.DefinedValues);

            return(node);
        }
コード例 #17
0
ファイル: OutputListGenerator.cs プロジェクト: chenzuo/nquery
 public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node)
 {
     node.OutputList = GetRowBufferEntries(node.DefinedValues);
     return node;
 }
コード例 #18
0
 public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node)
 {
     node.DefinedValues = RemovedUnneededDefinedValues(node.DefinedValues);
     node.OutputList    = RemovedUnneededRowBufferColumns(node.OutputList);
     return(base.VisitConstantScanAlgebraNode(node));
 }
コード例 #19
0
ファイル: XmlProducer.cs プロジェクト: chenzuo/nquery
		public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node)
		{
			_xmlWriter.WriteStartElement("constantScanAlgebraNode");
			_xmlWriter.WriteEndElement();

			return node;
		}
コード例 #20
0
 public override AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node)
 {
     node.OutputList = GetRowBufferEntries(node.DefinedValues);
     return(node);
 }
コード例 #21
0
ファイル: StandardVisitor.cs プロジェクト: chenzuo/nquery
		public virtual AlgebraNode VisitConstantScanAlgebraNode(ConstantScanAlgebraNode node)
		{
			if (node.DefinedValues != null)
			{
				foreach (ComputedValueDefinition definedValue in node.DefinedValues)
					definedValue.Expression = VisitExpression(definedValue.Expression);
			}

			return node;
		}
コード例 #22
0
ファイル: IteratorCreator.cs プロジェクト: chenzuo/nquery
		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;
		}
コード例 #23
0
ファイル: ShowPlanBuilder.cs プロジェクト: chenzuo/nquery
        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;
        }