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
- 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.
-
#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
209 210 211 212 213 214 215 |
# File 'lib/rom/sql/attribute.rb', line 209 def method_missing(meth, *args, &block) if 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
23 24 25 |
# File 'lib/rom/sql/attribute.rb', line 23 def aliased(name) super.(sql_expr: sql_expr.as(name)) end |
#canonical ⇒ Object
Return a new attribute in its canonical form
31 32 33 34 35 36 37 |
# File 'lib/rom/sql/attribute.rb', line 31 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
180 181 182 |
# File 'lib/rom/sql/attribute.rb', line 180 def concat(other, sep = ' ') Function.new(type).concat(self, sep, other) end |
#foreign_key ⇒ SQL::Attribute
Return a new attribute marked as a FK
106 107 108 |
# File 'lib/rom/sql/attribute.rb', line 106 def foreign_key (foreign_key: true) end |
#func(&block) ⇒ SQL::Function
Create a function DSL from the attribute
163 164 165 |
# File 'lib/rom/sql/attribute.rb', line 163 def func(&block) ProjectionDSL.new(name => self).call(&block).first end |
#is(other) ⇒ Object
Return a boolean expression with ‘=` operator
151 152 153 |
# File 'lib/rom/sql/attribute.rb', line 151 def is(other) Sequel::SQL::BooleanExpression.new(:'=', self, 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
67 68 69 |
# File 'lib/rom/sql/attribute.rb', line 67 def joined (joined: true) end |
#joined? ⇒ Boolean
Return if an attribute was used in a join
82 83 84 |
# File 'lib/rom/sql/attribute.rb', line 82 def joined? [:joined].equal?(true) end |
#qualified ⇒ SQL::Attribute
Return a new attribute marked as qualified
47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/rom/sql/attribute.rb', line 47 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
97 98 99 |
# File 'lib/rom/sql/attribute.rb', line 97 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
189 190 191 192 193 194 195 |
# File 'lib/rom/sql/attribute.rb', line 189 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
128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/rom/sql/attribute.rb', line 128 def to_sym @_to_sym ||= if qualified? && aliased? :"#{source.dataset}__#{name}___#{[:alias]}" elsif qualified? :"#{source.dataset}__#{name}" elsif aliased? :"#{name}___#{[:alias]}" else name end end |