module OracleSqlParser::Grammar::Select

grammar Order
  rule order_by_clause
    order_keyword space siblings:siblings_keyword? space? by_keyword space order_by_clause_items {
      def ast
        OracleSqlParser::Ast::OrderByClause[
          :siblings => siblings.ast,
          :items => order_by_clause_items.ast
        ]
      end
    }
  end

  rule order_by_clause_items
    order_by_clause_item
    more:(space? ',' space? order_by_clause_item space?)* {
      def ast
        OracleSqlParser::Ast::Array[
          order_by_clause_item.ast, *more_order_by_clause_items.map(&:ast)
        ]
      end

      def more_order_by_clause_items
        more.elements.map(&:order_by_clause_item)
      end
    }
  end

  rule order_by_clause_item
    target:(expr / position / c_alias) space?
    asc:(asc_keyword / desc_keyword)? space?
    nulls:(nulls_keyword space first_or_last:(first_keyword / last_keyword))? {
      def ast
        OracleSqlParser::Ast::OrderByClauseItem[
          :target => target.ast,
          :asc => asc.ast,
          :nulls => nulls.try(:first_or_last).ast,
        ]
      end
    }
  end
end

end