Class: Cyrel::Expression::Case

Inherits:
Base
  • Object
show all
Defined in:
lib/cyrel/expression/case.rb

Overview

Represents a CASE expression in Cypher. Supports the generic form: CASE WHEN c1 THEN r1 WHEN c2 THEN r2 … ELSE d END TODO: Support simple form: CASE input WHEN v1 THEN r1 … ELSE d END

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#!=, #%, #&, #*, #+, #-, #/, #<, #<=, #==, #=~, #>, #>=, #^, #|

Constructor Details

#initialize(whens: [], else_result: nil) ⇒ Case

Returns a new instance of Case.

Parameters:

  • whens (Array<Array>) (defaults to: [])

    An array of [condition, result] pairs. Condition and result objects will be coerced to Expressions.

  • else_result (Object, nil) (defaults to: nil)

    The value for the ELSE branch (coerced). Optional.

Raises:

  • (ArgumentError)


14
15
16
17
18
19
20
21
22
23
24
# File 'lib/cyrel/expression/case.rb', line 14

def initialize(whens: [], else_result: nil)
  unless whens.is_a?(Array) && whens.all? { |pair| pair.is_a?(Array) && pair.length == 2 }
    raise ArgumentError, "CASE 'whens' must be an array of [condition, result] pairs."
  end

  @whens = whens.map do |condition, result|
    [Expression.coerce(condition), Expression.coerce(result)]
  end
  @else_result = else_result ? Expression.coerce(else_result) : nil
  raise ArgumentError, 'CASE expression requires at least one WHEN clause.' if @whens.empty?
end

Instance Attribute Details

#else_resultObject (readonly)

Returns the value of attribute else_result.



9
10
11
# File 'lib/cyrel/expression/case.rb', line 9

def else_result
  @else_result
end

#whensObject (readonly)

Returns the value of attribute whens.



9
10
11
# File 'lib/cyrel/expression/case.rb', line 9

def whens
  @whens
end

Instance Method Details

#render(query) ⇒ String

Renders the CASE expression.

Parameters:

  • query (Cyrel::Query)

    The query object for rendering conditions/results.

Returns:

  • (String)

    The Cypher string fragment.



29
30
31
32
33
34
35
36
37
# File 'lib/cyrel/expression/case.rb', line 29

def render(query)
  parts = ['CASE']
  @whens.each do |condition, result|
    parts << "WHEN #{condition.render(query)} THEN #{result.render(query)}"
  end
  parts << "ELSE #{@else_result.render(query)}" if @else_result
  parts << 'END'
  parts.join(' ')
end