Class: QueryKit::CaseBuilder
- Inherits:
-
Object
- Object
- QueryKit::CaseBuilder
- Defined in:
- lib/querykit/case_builder.rb
Overview
Builder for CASE WHEN expressions Used internally by Query when select_case is called
Instance Attribute Summary collapse
-
#alias_name ⇒ Object
readonly
Returns the value of attribute alias_name.
-
#column ⇒ Object
readonly
Returns the value of attribute column.
-
#else_value ⇒ Object
readonly
Returns the value of attribute else_value.
-
#whens ⇒ Object
readonly
Returns the value of attribute whens.
Instance Method Summary collapse
-
#as(alias_name) ⇒ Object
Set the alias for the CASE expression.
-
#bindings ⇒ Object
Get bindings for the CASE expression.
-
#else(value) ⇒ Object
Set the ELSE value.
-
#initialize(column = nil) ⇒ CaseBuilder
constructor
A new instance of CaseBuilder.
-
#then(value) ⇒ Object
Set the THEN value for the last WHEN.
-
#to_sql ⇒ Object
Build the CASE expression.
-
#when(condition, operator = nil, value = nil) ⇒ Object
Add a WHEN condition.
Constructor Details
#initialize(column = nil) ⇒ CaseBuilder
Returns a new instance of CaseBuilder.
9 10 11 12 13 14 |
# File 'lib/querykit/case_builder.rb', line 9 def initialize(column = nil) @column = column @whens = [] @else_value = nil @alias_name = nil end |
Instance Attribute Details
#alias_name ⇒ Object (readonly)
Returns the value of attribute alias_name.
7 8 9 |
# File 'lib/querykit/case_builder.rb', line 7 def alias_name @alias_name end |
#column ⇒ Object (readonly)
Returns the value of attribute column.
7 8 9 |
# File 'lib/querykit/case_builder.rb', line 7 def column @column end |
#else_value ⇒ Object (readonly)
Returns the value of attribute else_value.
7 8 9 |
# File 'lib/querykit/case_builder.rb', line 7 def else_value @else_value end |
#whens ⇒ Object (readonly)
Returns the value of attribute whens.
7 8 9 |
# File 'lib/querykit/case_builder.rb', line 7 def whens @whens end |
Instance Method Details
#as(alias_name) ⇒ Object
Set the alias for the CASE expression
51 52 53 54 |
# File 'lib/querykit/case_builder.rb', line 51 def as(alias_name) @alias_name = alias_name self end |
#bindings ⇒ Object
Get bindings for the CASE expression
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/querykit/case_builder.rb', line 83 def bindings bindings = [] @whens.each do |w| if @column && !w[:raw] # Simple CASE: need value in WHEN clause bindings << w[:value] elsif !w[:raw] # Searched CASE: value goes in condition bindings << w[:value] end bindings << w[:then] end bindings << @else_value if @else_value bindings end |
#else(value) ⇒ Object
Set the ELSE value
45 46 47 48 |
# File 'lib/querykit/case_builder.rb', line 45 def else(value) @else_value = value self end |
#then(value) ⇒ Object
Set the THEN value for the last WHEN
38 39 40 41 42 |
# File 'lib/querykit/case_builder.rb', line 38 def then(value) raise 'No WHEN clause to add THEN to' if @whens.empty? @whens.last[:then] = value self end |
#to_sql ⇒ Object
Build the CASE expression
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/querykit/case_builder.rb', line 57 def to_sql raise 'CASE expression must have at least one WHEN clause' if @whens.empty? sql = 'CASE' sql += " #{@column}" if @column @whens.each do |w| if w[:raw] sql += " WHEN #{w[:raw]} THEN ?" elsif @column # Simple CASE: CASE column WHEN value THEN result sql += " WHEN ? THEN ?" else # Searched CASE: CASE WHEN column op value THEN result sql += " WHEN #{w[:column]} #{w[:operator]} ? THEN ?" end end sql += ' ELSE ?' if @else_value sql += ' END' sql += " AS #{@alias_name}" if @alias_name sql end |
#when(condition, operator = nil, value = nil) ⇒ Object
Add a WHEN condition
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/querykit/case_builder.rb', line 20 def when(condition, operator = nil, value = nil) if @column && operator.nil? # Simple CASE with column: when('value') -> WHEN ? (comparing against @column) @whens << { value: condition, then: nil } elsif value.nil? && !operator.nil? # when('age', 18) -> WHEN age = 18 @whens << { column: condition, operator: '=', value: operator, then: nil } elsif !value.nil? # when('age', '>', 18) -> WHEN age > 18 @whens << { column: condition, operator: operator, value: value, then: nil } else # when('age > 18') -> WHEN age > 18 (raw condition) @whens << { raw: condition, then: nil } end self end |