diff options
author | Alexander Staubo <alex@origo.no> | 2012-02-22 15:25:10 +0100 |
---|---|---|
committer | Alexander Staubo <alex@origo.no> | 2012-02-22 15:25:10 +0100 |
commit | a1a6fbc189d0cb8c44606eafcb8bda7a010554c0 (patch) | |
tree | 05bb006e6a5b39e5796d5eae302642c169ba7d5b /lib/arel/nodes/window.rb | |
parent | 6e427e589820278908e7a746749eb9b79b0f85e3 (diff) | |
download | rails-a1a6fbc189d0cb8c44606eafcb8bda7a010554c0.tar.gz rails-a1a6fbc189d0cb8c44606eafcb8bda7a010554c0.tar.bz2 rails-a1a6fbc189d0cb8c44606eafcb8bda7a010554c0.zip |
Support ANSI SQL2003 window functions.
Diffstat (limited to 'lib/arel/nodes/window.rb')
-rw-r--r-- | lib/arel/nodes/window.rb | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/lib/arel/nodes/window.rb b/lib/arel/nodes/window.rb new file mode 100644 index 0000000000..b54eb7fe64 --- /dev/null +++ b/lib/arel/nodes/window.rb @@ -0,0 +1,78 @@ +module Arel + module Nodes + class Window < Arel::Nodes::Node + include Arel::Expression + attr_accessor :orders, :framing + + def initialize + @orders = [] + end + + def order *expr + # FIXME: We SHOULD NOT be converting these to SqlLiteral automatically + @orders.concat expr.map { |x| + String === x || Symbol === x ? Nodes::SqlLiteral.new(x.to_s) : x + } + self + end + + def frame(expr) + raise ArgumentError, "Window frame cannot be set more than once" if @frame + @framing = expr + end + + def rows(expr = nil) + frame(Rows.new(expr)) + end + + def range(expr = nil) + frame(Range.new(expr)) + end + + def initialize_copy other + super + @orders = @orders.map { |x| x.clone } + end + end + + class NamedWindow < Window + attr_accessor :name + + def initialize name + super() + @name = name + end + + def initialize_copy other + super + @name = other.name.clone + end + end + + class Rows < Unary + def initialize(expr = nil) + super(expr) + end + end + + class Range < Unary + def initialize(expr = nil) + super(expr) + end + end + + class CurrentRow < Arel::Nodes::Node; end + + class Preceding < Unary + def initialize(expr = nil) + super(expr) + end + end + + class Following < Unary + def initialize(expr = nil) + super(expr) + end + end + end +end
\ No newline at end of file |