Class: Squeel::Visitors::AttributeVisitor

Inherits:
Base
  • Object
show all
Defined in:
lib/squeel/visitors/attribute_visitor.rb

Instance Attribute Summary

Attributes inherited from Base

#context

Instance Method Summary collapse

Methods inherited from Base

#accept, #can_accept?, can_accept?, #initialize

Constructor Details

This class inherits a constructor from Squeel::Visitors::Base

Instance Method Details

#implies_context_change?(v) ⇒ Boolean

Returns:

  • (Boolean)


17
18
19
20
# File 'lib/squeel/visitors/attribute_visitor.rb', line 17

def implies_context_change?(v)
  Hash === v || can_accept?(v) ||
  (Array === v && !v.empty? && v.all? {|val| can_accept?(val)})
end

#visit_Array(o, parent) ⇒ Object



41
42
43
# File 'lib/squeel/visitors/attribute_visitor.rb', line 41

def visit_Array(o, parent)
  o.map { |v| can_accept?(v) ? accept(v, parent) : v }.flatten
end

#visit_Hash(o, parent) ⇒ Object



7
8
9
10
11
12
13
14
15
# File 'lib/squeel/visitors/attribute_visitor.rb', line 7

def visit_Hash(o, parent)
  o.map do |k, v|
    if implies_context_change?(v)
      visit_with_context_change(k, v, parent)
    else
      visit_without_context_change(k, v, parent)
    end
  end.flatten
end

#visit_Squeel_Nodes_Function(o, parent) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/squeel/visitors/attribute_visitor.rb', line 63

def visit_Squeel_Nodes_Function(o, parent)
  args = o.args.map do |arg|
    case arg
    when Nodes::Function, Nodes::KeyPath
      accept(arg, parent)
    when Symbol, Nodes::Stub
      Arel.sql(arel_visitor.accept contextualize(parent)[arg.to_sym])
    else
      quoted?(arg) ? Arel.sql(arel_visitor.accept arg) : arg
    end
  end
  Arel::Nodes::NamedFunction.new(o.name, args, o.alias)
end

#visit_Squeel_Nodes_KeyPath(o, parent) ⇒ Object



53
54
55
56
57
# File 'lib/squeel/visitors/attribute_visitor.rb', line 53

def visit_Squeel_Nodes_KeyPath(o, parent)
  parent = traverse(o, parent)

  accept(o.endpoint, parent)
end

#visit_Squeel_Nodes_Operation(o, parent) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/squeel/visitors/attribute_visitor.rb', line 77

def visit_Squeel_Nodes_Operation(o, parent)
  args = o.args.map do |arg|
    case arg
    when Nodes::Function
      accept(arg, parent)
    when Symbol, Nodes::Stub
      Arel.sql(arel_visitor.accept contextualize(parent)[arg.to_sym])
    else
      quoted?(arg) ? Arel.sql(arel_visitor.accept arg) : arg
    end
  end

  op = case o.operator
  when :+
    Arel::Nodes::Addition.new(args[0], args[1])
  when :-
    Arel::Nodes::Subtraction.new(args[0], args[1])
  when :*
    Arel::Nodes::Multiplication.new(args[0], args[1])
  when :/
    Arel::Nodes::Division.new(args[0], args[1])
  else
    Arel.sql("#{arel_visitor.accept(args[0])} #{o.operator} #{arel_visitor.accept(args[1])}")
  end
  o.alias ? op.as(o.alias) : op
end

#visit_Squeel_Nodes_Order(o, parent) ⇒ Object



59
60
61
# File 'lib/squeel/visitors/attribute_visitor.rb', line 59

def visit_Squeel_Nodes_Order(o, parent)
  accept(o.expr, parent).send(o.descending? ? :desc : :asc)
end

#visit_Squeel_Nodes_Stub(o, parent) ⇒ Object



49
50
51
# File 'lib/squeel/visitors/attribute_visitor.rb', line 49

def visit_Squeel_Nodes_Stub(o, parent)
  contextualize(parent)[o.symbol]
end

#visit_Symbol(o, parent) ⇒ Object



45
46
47
# File 'lib/squeel/visitors/attribute_visitor.rb', line 45

def visit_Symbol(o, parent)
  contextualize(parent)[o]
end

#visit_with_context_change(k, v, parent) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/squeel/visitors/attribute_visitor.rb', line 22

def visit_with_context_change(k, v, parent)
  parent = case k
    when Nodes::KeyPath
      traverse(k, parent, true)
    else
      find(k, parent)
    end

  if Array === v
    v.map {|val| accept(val, parent || k)}
  else
    can_accept?(v) ? accept(v, parent || k) : v
  end
end

#visit_without_context_change(k, v, parent) ⇒ Object



37
38
39
# File 'lib/squeel/visitors/attribute_visitor.rb', line 37

def visit_without_context_change(k, v, parent)
  v
end