Exemple #1
0
        private static IOrderedEnumerable <Row> Order(
            IOrderedEnumerable <Row> seq,
            ExpressionWithSortOrder element,
            Scope scope)
        {
            object Func(Row x) => Evaluate(element.Expression, new RowArgument(x), scope);

            return(element.SortOrder == SortOrder.Descending ? seq.ThenByDescending(Func) : seq.ThenBy(Func));
        }
Exemple #2
0
        public QsiOrderExpressionNode VisitExpressionWithSortOrder(ExpressionWithSortOrder expressionWithSortOrder)
        {
            return(TreeHelper.Create <QsiOrderExpressionNode>(n =>
            {
                n.Expression.SetValue(ExpressionVisitor.VisitScalarExpression(expressionWithSortOrder.Expression));
                n.Order = expressionWithSortOrder.SortOrder == SortOrder.Descending ? QsiSortOrder.Descending : QsiSortOrder.Ascending;

                SqlServerTree.PutFragmentSpan(n, expressionWithSortOrder);
            }));
        }
        internal gsOrderByTerm GetOrderByTerm(ExpressionWithSortOrder orderByElement)
        {
            gsOrderByTerm orderByTerm;

            gsSelectColumn selCol = gsScalarExpressionParserFactory.CreateParser(orderByElement.Expression, null).Parse();

            orderByTerm = new gsOrderByTerm()
            {
                Direction = orderByElement.SortOrder.ToOrderByDirection(),
                Field     = selCol.ColumnName
            };

            orderByTerm.Table = selCol.Table;

            return(orderByTerm);
        }
        /// <summary>
        /// ソート順をインスタンス化します。
        /// </summary>
        public OrderByItem(string expression)
        {
            if (!string.IsNullOrEmpty(expression))
            {
                try
                {
                    var tokens = TransactSQL._Parser.GetTokenStream(new StringReader(expression), out IList <ParseError> errors).ToList();
                    if (errors.Count > 0)
                    {
                        throw new ArgumentException("指定された SQL 文の解析に失敗しました。");
                    }
                    var lastToken = tokens.Where(token => token.TokenType != TSqlTokenType.EndOfFile).LastOrDefault();
                    var sortOrder = SortOrder.NotSpecified;
                    if (lastToken != null)
                    {
                        var upperLastToken = lastToken.Text.ToUpper();
                        if (upperLastToken == "ASC")
                        {
                            sortOrder = SortOrder.Ascending;
                            tokens.Remove(lastToken);
                        }
                        else if (upperLastToken == "DESC")
                        {
                            sortOrder = SortOrder.Descending;
                            tokens.Remove(lastToken);
                        }
                    }

                    var scalarSql = tokens.ConvertAll(token => token.Text).Aggregate((partialPhrase, word) => $"{partialPhrase}{word}");
                    var expressionWithSortOrder = new ExpressionWithSortOrder()
                    {
                        Expression = TransactSQL._Parser.ParseExpression(new StringReader(scalarSql), out errors),
                        SortOrder  = sortOrder
                    };

                    if (errors.Count > 0)
                    {
                        throw new ArgumentException("指定された SQL 文の解析に失敗しました。");
                    }
                    ExpressionWithSortOrder = expressionWithSortOrder;
                }
                catch (InvalidCastException)
                {
                    throw new ArgumentException("指定された SQL 文の解析に失敗しました。");
                }
            }
        }
 private void ProcessOrderExpression(ExpressionWithSortOrder Expression)
 {
     string SubExpressionType = FragmentTypeParser.GetFragmentType(Expression.Expression);
     switch (SubExpressionType)
     {
         case "IntegerLiteral":
             _smells.SendFeedBack(7, Expression);
             break;
         case "CastCall":
             var CastCall = (CastCall) Expression.Expression;
             if (FragmentTypeParser.GetFragmentType(CastCall.Parameter) == "ColumnReferenceExpression")
             {
                 _smells.SendFeedBack(6, Expression);
             }
             break;
     }
 }
Exemple #6
0
        private void ProcessOrderExpression(ExpressionWithSortOrder Expression)
        {
            string SubExpressionType = FragmentTypeParser.GetFragmentType(Expression.Expression);

            switch (SubExpressionType)
            {
            case "IntegerLiteral":
                _smells.SendFeedBack(7, Expression);
                break;

            case "CastCall":
                var CastCall = (CastCall)Expression.Expression;
                if (FragmentTypeParser.GetFragmentType(CastCall.Parameter) == "ColumnReferenceExpression")
                {
                    _smells.SendFeedBack(6, Expression);
                }
                break;
            }
        }
Exemple #7
0
 public override void ExplicitVisit(ExpressionWithSortOrder node)
 {
     base.ExplicitVisit(node);
     ReplaceExpression(node, n => n.Expression);
 }
 public override void Visit(ExpressionWithSortOrder node) { this.action(node); }
 public override void ExplicitVisit(ExpressionWithSortOrder fragment)
 {
     _fragments.Add(fragment);
 }
Exemple #10
0
 /// <summary>
 /// KzLib.SqlServer.TransactSql.ScriptDom.AddWhereBooleanExpressionVisitor をインスタンス化します。
 /// </summary>
 /// <param name="expressionWithSortOrder">追加するソート順</param>
 public AddExpressionWithSortOrderVisitor(ExpressionWithSortOrder expressionWithSortOrder)
 {
     ExpressionWithSortOrder = expressionWithSortOrder;
 }
 /// <summary>
 /// ソート順をインスタンス化します。
 /// </summary>
 internal OrderByItem(ExpressionWithSortOrder expressionWithSortOrder)
 {
     ExpressionWithSortOrder = expressionWithSortOrder;
 }