Class: Squeel::Visitors::AttributeVisitor
- Inherits:
-
Base
- Object
- Base
- Squeel::Visitors::AttributeVisitor
show all
- Defined in:
- lib/squeel/visitors/attribute_visitor.rb
Instance Attribute Summary
Attributes inherited from Base
#context
Instance Method Summary
collapse
-
#implies_context_change?(v) ⇒ Boolean
-
#visit_Array(o, parent) ⇒ Object
-
#visit_Hash(o, parent) ⇒ Object
-
#visit_Squeel_Nodes_Function(o, parent) ⇒ Object
-
#visit_Squeel_Nodes_KeyPath(o, parent) ⇒ Object
-
#visit_Squeel_Nodes_Operation(o, parent) ⇒ Object
-
#visit_Squeel_Nodes_Order(o, parent) ⇒ Object
-
#visit_Squeel_Nodes_Stub(o, parent) ⇒ Object
-
#visit_Symbol(o, parent) ⇒ Object
-
#visit_with_context_change(k, v, parent) ⇒ Object
-
#visit_without_context_change(k, v, parent) ⇒ Object
Methods inherited from Base
#accept, #can_accept?, can_accept?, #initialize
Instance Method Details
#implies_context_change?(v) ⇒ 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
|