Esempio n. 1
0
        public QsiExpressionNode VisitGroupSpecifcation(GroupingSpecification groupingSpecification)
        {
            switch (groupingSpecification)
            {
            case CompositeGroupingSpecification compositeGroupingSpecification:
                return(TreeHelper.Create <QsiInvokeExpressionNode>(n =>
                {
                    n.Member.SetValue(TreeHelper.CreateFunction("COMPOSITE"));
                    n.Parameters.AddRange(compositeGroupingSpecification.Items.Select(VisitGroupSpecifcation));

                    SqlServerTree.PutFragmentSpan(n, compositeGroupingSpecification);
                }));

            // CUBE ( ... )
            case CubeGroupingSpecification cubeGroupingSpecification:
                return(TreeHelper.Create <QsiInvokeExpressionNode>(n =>
                {
                    n.Member.SetValue(TreeHelper.CreateFunction("CUBE"));
                    n.Parameters.AddRange(cubeGroupingSpecification.Arguments.Select(VisitGroupSpecifcation));

                    SqlServerTree.PutFragmentSpan(n, cubeGroupingSpecification);
                }));

            case ExpressionGroupingSpecification expressionGroupingSpecification:
                return(ExpressionVisitor.VisitScalarExpression(expressionGroupingSpecification.Expression));

            // ROLLUP ( ... )
            case RollupGroupingSpecification rollupGroupingSpecification:
                return(TreeHelper.Create <QsiInvokeExpressionNode>(n =>
                {
                    n.Member.SetValue(TreeHelper.CreateFunction("ROLLUP"));
                    n.Parameters.AddRange(rollupGroupingSpecification.Arguments.Select(VisitGroupSpecifcation));

                    SqlServerTree.PutFragmentSpan(n, rollupGroupingSpecification);
                }));

            // ()
            case GrandTotalGroupingSpecification grandTotalGroupingSpecification:
                return(TreeHelper.Create <QsiInvokeExpressionNode>(n =>
                {
                    n.Member.SetValue(TreeHelper.CreateFunction("GRAND_TOTAL"));
                    SqlServerTree.PutFragmentSpan(n, grandTotalGroupingSpecification);
                }));

            // GROUPING SETS ( ... )
            case GroupingSetsGroupingSpecification groupingSetsGroupingSpecification:
                return(TreeHelper.Create <QsiInvokeExpressionNode>(n =>
                {
                    n.Member.SetValue(TreeHelper.CreateFunction("GROUPING_SETS"));
                    n.Parameters.AddRange(groupingSetsGroupingSpecification.Sets.Select(VisitGroupSpecifcation));

                    SqlServerTree.PutFragmentSpan(n, groupingSetsGroupingSpecification);
                }));

            default:
                throw TreeHelper.NotSupportedTree(groupingSpecification);
            }
        }
        public override void ExplicitVisit(GroupingSpecification node)
        {
            // Check that the GROUP BY clause is valid for conversion to FetchXML.
            // FetchXML can handle grouping by a column or a DATEPART function of a column
            base.ExplicitVisit(node);

            if (!Valid)
            {
                return;
            }

            if (!(node is ExpressionGroupingSpecification exprGroup))
            {
                Valid           = false;
                InvalidFragment = node;
                return;
            }

            if (exprGroup.Expression is ColumnReferenceExpression)
            {
                return;
            }

            if (!(exprGroup.Expression is FunctionCall func))
            {
                Valid           = false;
                InvalidFragment = node;
                return;
            }

            if (!func.FunctionName.Value.Equals("DATEPART", StringComparison.OrdinalIgnoreCase))
            {
                Valid           = false;
                InvalidFragment = node;
                return;
            }

            if (func.Parameters.Count != 2)
            {
                Valid           = false;
                InvalidFragment = node;
                return;
            }

            if (!(func.Parameters[1] is ColumnReferenceExpression))
            {
                Valid           = false;
                InvalidFragment = node;
                return;
            }
        }
        internal gsGroupByTerm GetGroupByTerm(GroupingSpecification groupingSpec)
        {
            gsGroupByTerm groupByTerm;

            if (groupingSpec is ExpressionGroupingSpecification)
            {
                groupByTerm = GetGroupByTerm(groupingSpec as ExpressionGroupingSpecification);
            }
            else
            {
                throw new NotImplementedException($"ExpressionGroupingSpecification.Expression {(groupingSpec as ExpressionGroupingSpecification).Expression.GetType().Name} not supported");
            }

            return(groupByTerm);
        }
 public static object Evaluate(GroupingSpecification groupingSpec, RowArgument row, Scope scope) =>
 groupingSpec switch
 {
 /// <summary>
 /// KzLib.SqlServer.TransactSql.ScriptDom.AddWhereBooleanExpressionVisitor をインスタンス化します。
 /// </summary>
 /// <param name="findGroupingSpecification">GropuBy句のトップから、追加したいGroupingSpecification の親に到達するまでの式</param>
 /// <param name="groupingSpecification">追加する集計キー</param>
 public AddGroupingSpecificationVisitor(GroupingSpecification groupingSpecification)
 {
     FindGroupingSpecifications = g => g.GroupingSpecifications;
     GroupingSpecification      = groupingSpecification;
 }
 /// <summary>
 /// KzLib.SqlServer.TransactSql.ScriptDom.AddWhereBooleanExpressionVisitor をインスタンス化します。
 /// </summary>
 /// <param name="findGroupingSpecification">GropuBy句のトップから、追加したいGroupingSpecification の親に到達するまでの式</param>
 /// <param name="groupingSpecification">追加する集計キー</param>
 public AddGroupingSpecificationVisitor(Expression <Func <Microsoft.SqlServer.TransactSql.ScriptDom.GroupByClause, IList <GroupingSpecification> > > findGroupingSpecifications, GroupingSpecification groupingSpecification)
 {
     FindGroupingSpecifications = findGroupingSpecifications;
     GroupingSpecification      = groupingSpecification;
 }
 public override void ExplicitVisit(GroupingSpecification fragment)
 {
     _fragments.Add(fragment);
 }
 public sealed override void ExplicitVisit(GroupingSpecification node)
 {
     base.ExplicitVisit(node);
 }
Esempio n. 9
0
 public override void ExplicitVisit(GroupingSpecification node) { this.action(node); }