コード例 #1
0
        public override ISqlNode VisitSelectStatementNode(SelectStatementNode node, object parameter)
        {
            if (Processed)
            {
                return(node);
            }

            if (RowNumberColumnSpecified)
            {
                return(base.VisitSelectStatementNode(node, parameter));
            }

            Processed = true;
            var subStatement = new SelectStatementNode();

            subStatement.SelectClauseNode  = node.SelectClauseNode;
            subStatement.FromClauseNode    = node.FromClauseNode;
            subStatement.WhereClauseNode   = node.WhereClauseNode;
            subStatement.GroupByClauseNode = node.GroupByClauseNode;
            subStatement.HavingClauseNode  = node.HavingClauseNode;
            subStatement.OrderByClauseNode = node.OrderByClauseNode;

            var selectNode = new SelectClauseNode("select");

            selectNode.AddNode(new FragmentNode(" * "));
            var fromNode = new FromClauseNode("from");

            fromNode.AddNode(new FragmentNode($" ( select temp_.*, rownum {RowNumberColumnName} from ( "));
            fromNode.AddNode(subStatement);
            fromNode.AddNode(new FragmentNode(" ) temp_ ) "));
            var whereNode = new WhereClauseNode("where");

            whereNode.AddNode(new FragmentNode(" "));
            if (Offset >= 0)
            {
                whereNode.AddNode(new FragmentNode($"{RowNumberColumnName} > "));
                whereNode.AddNode(new FragmentNode(Offset.ToString()));
            }

            if (Limit > 0)
            {
                if (Offset >= 0)
                {
                    whereNode.AddNode(new FragmentNode(" and "));
                }
                whereNode.AddNode(new FragmentNode($"{RowNumberColumnName} <= "));
                var bias = Offset < 0 ? 0 : Offset;
                whereNode.AddNode(new FragmentNode((bias + Limit).ToString()));
            }

            var result = new SelectStatementNode();

            result.SelectClauseNode    = selectNode;
            result.FromClauseNode      = fromNode;
            result.WhereClauseNode     = whereNode;
            result.ForUpdateClauseNode = node.ForUpdateClauseNode;
            result.OptionClauseNode    = node.OptionClauseNode;
            return(result);
        }
コード例 #2
0
        private void ParseWhereNode()
        {
            Validate();
            var node = new WhereClauseNode(_token);

            if (IsInWhereClauseAwareNode())
            {
                RemoveNodesTo <IWhereClauseAwareNode>();
                var whereClauseAwareNode = (IWhereClauseAwareNode)Peek();
                whereClauseAwareNode.WhereClauseNode = node;
            }
            else
            {
                AppendNode(node);
            }
            _nodeStack.Push(node);
        }
コード例 #3
0
        public override ISqlNode VisitSelectStatementNode(SelectStatementNode node, object parameter)
        {
            if (Processed)
            {
                return(node);
            }

            Processed = true;

            var originalOrderBy = node.OrderByClauseNode;

            if (originalOrderBy == null)
            {
                throw new SqlTransformException(ExceptionMessageId.Esp2201);
            }

            var subStatement = new SelectStatementNode();

            subStatement.SelectClauseNode  = node.SelectClauseNode;
            subStatement.FromClauseNode    = node.FromClauseNode;
            subStatement.WhereClauseNode   = node.WhereClauseNode;
            subStatement.GroupByClauseNode = node.GroupByClauseNode;
            subStatement.HavingClauseNode  = node.HavingClauseNode;

            var orderBy = new OrderByClauseNode(originalOrderBy.WordNode);

            foreach (var child in originalOrderBy.Children)
            {
                if (child is WordNode wordNode)
                {
                    var word  = wordNode.Word;
                    var names = word.Split('.');
                    if (names.Length == 2)
                    {
                        orderBy.AddNode(new WordNode("temp_." + names[1]));
                    }
                    else
                    {
                        orderBy.AddNode(child);
                    }
                }
                else
                {
                    orderBy.AddNode(child);
                }
            }

            var selectNode = new SelectClauseNode("select");

            selectNode.AddNode(new FragmentNode(" * "));
            var fromNode = new FromClauseNode("from");

            fromNode.AddNode(new FragmentNode(" ( select temp_.*, row_number() over( "));
            fromNode.AddNode(orderBy);
            fromNode.AddNode(new FragmentNode($" ) as {RowNumberColumnName} from ( "));
            fromNode.AddNode(subStatement);
            fromNode.AddNode(new FragmentNode(") as temp_ ) as temp2_ "));
            var whereNode = new WhereClauseNode("where");

            whereNode.AddNode(new FragmentNode(" "));
            if (Offset >= 0)
            {
                whereNode.AddNode(new FragmentNode($"{RowNumberColumnName} > "));
                whereNode.AddNode(new FragmentNode(Offset.ToString()));
            }

            if (Limit > 0)
            {
                if (Offset >= 0)
                {
                    whereNode.AddNode(new FragmentNode(" and "));
                }

                var bias = Offset < 0 ? 0 : Offset;
                whereNode.AddNode(new FragmentNode($"{RowNumberColumnName} <= "));
                whereNode.AddNode(new FragmentNode((bias + Limit).ToString()));
            }

            var result = new SelectStatementNode();

            result.SelectClauseNode    = selectNode;
            result.FromClauseNode      = fromNode;
            result.WhereClauseNode     = whereNode;
            result.ForUpdateClauseNode = node.ForUpdateClauseNode;
            result.OptionClauseNode    = node.OptionClauseNode;
            return(result);
        }
コード例 #4
0
 public object VisitWhereClauseNode(WhereClauseNode node, Context parameter)
 {
     return(HandleConditionalClauseNode(node, parameter));
 }
コード例 #5
0
 public virtual void VisitWhereClause(WhereClauseNode node) => throw new NotImplementedException();