Class: ROM::SQL::Function
- Inherits:
-
Attribute
- Object
- Attribute
- ROM::SQL::Function
- Defined in:
- lib/rom/sql/function.rb
Overview
Specialized attribute type for defining SQL functions
Constant Summary collapse
- WINDOW_FRAMES =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Hash.new do |cache, frame| type = frame.key?(:rows) ? 'ROWS' : 'RANGE' bounds = frame[:rows] || frame[:range] cache[frame] = "#{ type } BETWEEN #{ frame_limit(bounds[0]) } AND #{ frame_limit(bounds[1]) }" end
Class Method Summary collapse
- .frame_limit(value) ⇒ Object private
Instance Method Summary collapse
-
#cast(expr, db_type = TypeSerializer[:default].call(type)) ⇒ ROM::SQL::Attribute
Convert an expression result to another data type.
- #is(other) ⇒ Object
- #name ⇒ Object private
- #not(other) ⇒ Object
-
#over(partition: nil, order: nil, frame: nil) ⇒ SQL::Function
Add an OVER clause making a window function call.
- #qualified(table_alias = nil) ⇒ Object private
- #sql_literal(ds) ⇒ Object private
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(meth, *args) ⇒ Object (private)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/rom/sql/function.rb', line 143 def method_missing(meth, *args) if func if func.respond_to?(meth) (func: func.__send__(meth, *args)) else super end else (func: Sequel::SQL::Function.new(meth.to_s.upcase, *args)) end end |
Class Method Details
.frame_limit(value) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/rom/sql/function.rb', line 11 def frame_limit(value) case value when :current then 'CURRENT ROW' when :start then 'UNBOUNDED PRECEDING' when :end then 'UNBOUNDED FOLLOWING' else if value > 0 "#{ value } FOLLOWING" else "#{ value.abs } PRECEDING" end end end |
Instance Method Details
#cast(expr, db_type = TypeSerializer[:default].call(type)) ⇒ ROM::SQL::Attribute
Convert an expression result to another data type
131 132 133 |
# File 'lib/rom/sql/function.rb', line 131 def cast(expr, db_type = TypeSerializer[:default].call(type)) Attribute[type].(sql_expr: ::Sequel.cast(expr, db_type)) end |
#is(other) ⇒ Object
66 67 68 69 70 |
# File 'lib/rom/sql/function.rb', line 66 def is(other) ::ROM::SQL::Attribute[::ROM::SQL::Types::Bool].( sql_expr: ::Sequel::SQL::BooleanExpression.new(:'=', func, other) ) end |
#name ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
50 51 52 |
# File 'lib/rom/sql/function.rb', line 50 def name [:alias] || super end |
#not(other) ⇒ Object
75 76 77 |
# File 'lib/rom/sql/function.rb', line 75 def not(other) !is(other) end |
#over(partition: nil, order: nil, frame: nil) ⇒ SQL::Function
Add an OVER clause making a window function call
115 116 117 |
# File 'lib/rom/sql/function.rb', line 115 def over(partition: nil, order: nil, frame: nil) super(partition: partition, order: order, frame: WINDOW_FRAMES[frame]) end |
#qualified(table_alias = nil) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
57 58 59 60 61 |
# File 'lib/rom/sql/function.rb', line 57 def qualified(table_alias = nil) ( func: ::Sequel::SQL::Function.new(func.name, *func.args.map { |arg| arg.respond_to?(:qualified) ? arg.qualified(table_alias) : arg }) ) end |
#sql_literal(ds) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
41 42 43 44 45 46 47 |
# File 'lib/rom/sql/function.rb', line 41 def sql_literal(ds) if name ds.literal(func.as(name)) else ds.literal(func) end end |