Class: ROM::SQL::Attribute
- Inherits:
-
ROM::Schema::Attribute
- Object
- ROM::Schema::Attribute
- ROM::SQL::Attribute
- Defined in:
- lib/rom/sql/attribute.rb
Overview
Extended schema attributes tailored for SQL databases
Constant Summary collapse
- OPERATORS =
i[>= <= > <].freeze
- QualifyError =
Error raised when an attribute cannot be qualified
Class.new(StandardError)
Instance Method Summary collapse
-
#aliased(name) ⇒ SQL::Attribute
(also: #as)
Return a new attribute with an alias.
-
#canonical ⇒ Object
Return a new attribute in its canonical form.
-
#concat(other, sep = ' ') ⇒ SQL::Function
Create a CONCAT function from the attribute.
-
#foreign_key ⇒ SQL::Attribute
Return a new attribute marked as a FK.
-
#func(&block) ⇒ SQL::Function
Create a function DSL from the attribute.
-
#in(*args) ⇒ Object
Return a boolean expression with an inclusion test.
-
#is(other) ⇒ Object
Return a boolean expression with ‘=` operator.
-
#joined ⇒ SQL::Attribute
Return a new attribute marked as joined.
-
#joined? ⇒ Boolean
Return if an attribute was used in a join.
-
#qualified ⇒ SQL::Attribute
Return a new attribute marked as qualified.
-
#qualified? ⇒ Boolean
Return if an attribute type is qualified.
-
#sql_literal(ds) ⇒ Object
private
Sequel calls this method to coerce an attribute into SQL string.
-
#to_sym ⇒ Symbol
Return symbol representation of an attribute.
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(meth, *args, &block) ⇒ 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.
Delegate to sql expression if it responds to a given method
241 242 243 244 245 246 247 248 249 |
# File 'lib/rom/sql/attribute.rb', line 241 def method_missing(meth, *args, &block) if OPERATORS.include?(meth) __cmp__(meth, args[0]) elsif sql_expr.respond_to?(meth) (sql_expr: sql_expr.__send__(meth, *args, &block)) else super end end |
Instance Method Details
#aliased(name) ⇒ SQL::Attribute Also known as: as
Return a new attribute with an alias
25 26 27 |
# File 'lib/rom/sql/attribute.rb', line 25 def aliased(name) super.(name: .fetch(:name, name), sql_expr: sql_expr.as(name)) end |
#canonical ⇒ Object
Return a new attribute in its canonical form
33 34 35 36 37 38 39 |
# File 'lib/rom/sql/attribute.rb', line 33 def canonical if aliased? (alias: nil, sql_expr: nil) else self end end |
#concat(other, sep = ' ') ⇒ SQL::Function
Create a CONCAT function from the attribute
212 213 214 |
# File 'lib/rom/sql/attribute.rb', line 212 def concat(other, sep = ' ') Function.new(type).concat(self, sep, other) end |
#foreign_key ⇒ SQL::Attribute
Return a new attribute marked as a FK
108 109 110 |
# File 'lib/rom/sql/attribute.rb', line 108 def foreign_key (foreign_key: true) end |
#func(&block) ⇒ SQL::Function
Create a function DSL from the attribute
195 196 197 |
# File 'lib/rom/sql/attribute.rb', line 195 def func(&block) ProjectionDSL.new(name => self).call(&block).first end |
#in(*args) ⇒ Object
Return a boolean expression with an inclusion test
If the single argument passed to the method is a Range object then the resulting expression will restrict the attribute value with range’s bounds. Upper bound condition will be inclusive/non-inclusive depending on the range type.
If more than one argument is passed to the method or the first argument is not Range then the result will be a simple IN check.
175 176 177 178 179 180 181 182 183 184 185 |
# File 'lib/rom/sql/attribute.rb', line 175 def in(*args) if args.first.is_a?(Range) range = args.first lower_cond = __cmp__(:>=, range.begin) upper_cond = __cmp__(range.exclude_end? ? :< : :<=, range.end) Sequel::SQL::BooleanExpression.new(:AND, lower_cond, upper_cond) else __cmp__(:IN, args) end end |
#is(other) ⇒ Object
Return a boolean expression with ‘=` operator
153 154 155 |
# File 'lib/rom/sql/attribute.rb', line 153 def is(other) __cmp__(:'=', other) end |
#joined ⇒ SQL::Attribute
Return a new attribute marked as joined
Whenever you join two schemas, the right schema’s attribute will be marked as joined using this method
69 70 71 |
# File 'lib/rom/sql/attribute.rb', line 69 def joined (joined: true) end |
#joined? ⇒ Boolean
Return if an attribute was used in a join
84 85 86 |
# File 'lib/rom/sql/attribute.rb', line 84 def joined? [:joined].equal?(true) end |
#qualified ⇒ SQL::Attribute
Return a new attribute marked as qualified
49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/rom/sql/attribute.rb', line 49 def qualified return self if qualified? case sql_expr when Sequel::SQL::AliasedExpression, Sequel::SQL::Identifier type = (qualified: true) type.(qualified: true, sql_expr: Sequel[type.to_sym]) else raise QualifyError, "can't qualify #{name.inspect} (#{sql_expr.inspect})" end end |
#qualified? ⇒ Boolean
Return if an attribute type is qualified
99 100 101 |
# File 'lib/rom/sql/attribute.rb', line 99 def qualified? [:qualified].equal?(true) 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.
Sequel calls this method to coerce an attribute into SQL string
221 222 223 224 225 226 227 |
# File 'lib/rom/sql/attribute.rb', line 221 def sql_literal(ds) if sql_expr sql_expr.sql_literal(ds) else Sequel[to_sym].sql_literal(ds) end end |
#to_sym ⇒ Symbol
Return symbol representation of an attribute
This uses convention from sequel where double underscore in the name is used for qualifying, and triple underscore means aliasing
130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/rom/sql/attribute.rb', line 130 def to_sym @_to_sym ||= if qualified? && aliased? :"#{source.dataset}__#{name}___#{meta[:alias]}" elsif qualified? :"#{source.dataset}__#{name}" elsif aliased? :"#{name}___#{meta[:alias]}" else name end end |