Class: ArelExtensions::Nodes::Concat

Inherits:
Function 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

Methods inherited from Arel::Nodes::Function

#as

Methods included from ArelExtensions::NullFunctions

#coalesce, #coalesce_blank, #if_present, #is_not_null, #is_null

Methods included from BooleanFunctions

#and, #or, #then, #⋀, #⋁

Methods included from StringFunctions

#&, #[], #ai_collate, #ai_imatches, #ai_matches, #blank, #byte_length, #char_length, #ci_collate, #collate, #downcase, #edit_distance, #group_concat, #idoes_not_match, #idoes_not_match_all, #idoes_not_match_any, #imatches, #imatches_all, #imatches_any, #length, #levenshtein_distance, #locate, #ltrim, #md5, #not_blank, #regexp_replace, #repeat, #replace, #rtrim, #smatches, #soundex, #substring, #trim, #upcase

Methods included from MathFunctions

#*, #/, #abs, #ceil, #floor, #format_number, #log10, #pow, #power, #round, #std, #sum, #variance

Methods included from DateDuration

#day, #format, #format_date, #hour, #minute, #month, #second, #wday, #week, #year

Methods included from Comparators

#!~, #<, #<=, #=~, #>, #>=

Methods included from Math

#+, #-

Methods included from Aliases

#xas

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.quoted(res.last.expr.to_s + b.expr.to_s)
    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