Class: Squeel::Visitors::SelectVisitor
- Inherits:
-
Base
- Object
- Base
- Squeel::Visitors::SelectVisitor
show all
- Defined in:
- lib/squeel/visitors/select_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_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
18
19
20
21
|
# File 'lib/squeel/visitors/select_visitor.rb', line 18
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
42
43
44
|
# File 'lib/squeel/visitors/select_visitor.rb', line 42
def visit_Array(o, parent)
o.map { |v| can_accept?(v) ? accept(v, parent) : v }.flatten
end
|
#visit_Hash(o, parent) ⇒ Object
8
9
10
11
12
13
14
15
16
|
# File 'lib/squeel/visitors/select_visitor.rb', line 8
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
60
61
62
63
64
65
66
67
68
69
70
71
72
|
# File 'lib/squeel/visitors/select_visitor.rb', line 60
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
54
55
56
57
58
|
# File 'lib/squeel/visitors/select_visitor.rb', line 54
def visit_Squeel_Nodes_KeyPath(o, parent)
parent = traverse(o, parent)
accept(o.endpoint, parent)
end
|
#visit_Squeel_Nodes_Operation(o, parent) ⇒ Object
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
# File 'lib/squeel/visitors/select_visitor.rb', line 74
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_Stub(o, parent) ⇒ Object
50
51
52
|
# File 'lib/squeel/visitors/select_visitor.rb', line 50
def visit_Squeel_Nodes_Stub(o, parent)
contextualize(parent)[o.symbol]
end
|
#visit_Symbol(o, parent) ⇒ Object
46
47
48
|
# File 'lib/squeel/visitors/select_visitor.rb', line 46
def visit_Symbol(o, parent)
contextualize(parent)[o]
end
|
#visit_with_context_change(k, v, parent) ⇒ Object
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
# File 'lib/squeel/visitors/select_visitor.rb', line 23
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
38
39
40
|
# File 'lib/squeel/visitors/select_visitor.rb', line 38
def visit_without_context_change(k, v, parent)
v
end
|