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); }
public override void ExplicitVisit(GroupingSpecification node) { this.action(node); }