Class: ArelExtensions::Nodes::Concat

Inherits:
Function
  • Object
show all
Defined in:
lib/arel_extensions/nodes/concat.rb

Constant Summary collapse

RETURN_TYPE =
:string

Constants inherited from Function

Function::MBSTRING

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Function

#!=, #==, #as, #convert_to_date_node, #convert_to_datetime_node, #convert_to_node, #convert_to_number, #convert_to_string_node, #expr, #left, #return_type, #right, #type_of_attribute

Methods included from Predications

#cast, #convert_to_node, #imatches, #in, #matches, #not_in, #when

Constructor Details

#initialize(expr) ⇒ Concat

Returns a new instance of Concat.



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/arel_extensions/nodes/concat.rb', line 5

def initialize expr
  tab = expr.map { |arg|
    # flatten nested concats.
    node = convert_to_node(arg)
    if node.is_a?(Concat)
      node.expressions
    else
      node
    end
  }.flatten.reduce([]) { |res, b|
    # concatenate successive literal strings.
    if b.is_a?(Arel::Nodes::Quoted) && b.expr == ""
      res
    elsif res.last && res.last.is_a?(Arel::Nodes::Quoted) && b.is_a?(Arel::Nodes::Quoted)
      res[-1] = Arel::Nodes.build_quoted(res.last.expr + b.expr)
    else
      res << b
    end
    res
  }
  super(tab)
end

Class Method Details

.new(expr) ⇒ Object



28
29
30
31
32
33
34
35
# File 'lib/arel_extensions/nodes/concat.rb', line 28

def self.new expr
  o = super(expr)
  if o.expressions.length == 1
    o.expressions[0]
  else
    o
  end
end

Instance Method Details

#concat(other) ⇒ Object



37
38
39
# File 'lib/arel_extensions/nodes/concat.rb', line 37

def concat(other)
  Concat.new(self.expressions + [other])
end