Class: QueryKit::CaseBuilder

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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_nameObject (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

#columnObject (readonly)

Returns the value of attribute column.



7
8
9
# File 'lib/querykit/case_builder.rb', line 7

def column
  @column
end

#else_valueObject (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

#whensObject (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

#bindingsObject

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_sqlObject

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

Parameters:

  • condition (String, Array)

    Column name or [column, operator, value]

  • operator (String, Object) (defaults to: nil)

    Operator or value if condition is column name

  • value (Object) (defaults to: nil)

    Value to compare (only if operator provided)



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