sunstone 5.0.0.2 → 5.0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/ext/active_record/relation.rb +39 -22
- data/lib/arel/collectors/sunstone.rb +10 -6
- data/lib/arel/visitors/sunstone.rb +21 -21
- data/lib/sunstone/version.rb +1 -1
- data/test/active_record/query_test.rb +16 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca2db5a6c3ea14865f367dbb2e47581ac78dcf5d
|
4
|
+
data.tar.gz: 8c7c0ea51ded30b1b39fb09eee852989f588574f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7fc4a0e6209543012c12f674a33b10c3a1a27a21e3bb6cc0a7f647f28a83490caddfe619546df1b86caf759504616588978ab42e7d1e65623f3c9d5a690089f5
|
7
|
+
data.tar.gz: 33421456a4d97c91a606f250914a4b4c15ae889fee4ae33a6f08e13409b28fd10128edc9ca00cf482735169f28809587e7bc227b274f6f7874553260f7de73e6
|
data/.gitignore
CHANGED
@@ -3,30 +3,47 @@ module ActiveRecord
|
|
3
3
|
|
4
4
|
def to_sql
|
5
5
|
@to_sql ||= begin
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
relation = self
|
7
|
+
connection = klass.connection
|
8
|
+
visitor = if connection.visitor.is_a?(Arel::Visitors::Sunstone)
|
9
|
+
Arel::Visitors::ToSql.new(connection)
|
10
|
+
else
|
11
|
+
connection.visitor
|
12
|
+
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
if eager_loading?
|
15
|
+
find_with_associations { |rel| relation = rel }
|
16
|
+
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
18
|
+
binds = relation.bound_attributes
|
19
|
+
binds = connection.prepare_binds_for_database(binds)
|
20
|
+
binds.map! { |value| connection.quote(value) }
|
21
|
+
collect = visitor.accept(relation.arel.ast, Arel::Collectors::Bind.new)
|
22
|
+
collect.substitute_binds(binds).join
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_sar
|
27
|
+
@to_sar ||= begin
|
28
|
+
relation = self
|
29
|
+
connection = klass.connection
|
30
|
+
visitor = if connection.visitor.is_a?(Arel::Visitors::ToSql)
|
31
|
+
Arel::Visitors::Sunstone.new(connection)
|
32
|
+
else
|
33
|
+
connection.visitor
|
34
|
+
end
|
35
|
+
|
36
|
+
if eager_loading?
|
37
|
+
find_with_associations { |rel| relation = rel }
|
38
|
+
end
|
39
|
+
|
40
|
+
binds = relation.bound_attributes
|
41
|
+
binds = connection.prepare_binds_for_database(binds)
|
42
|
+
binds.map! { |value| connection.quote(value) }
|
43
|
+
collect = visitor.accept(relation.arel.ast, Arel::Collectors::Sunstone.new)
|
44
|
+
collect.compile binds
|
45
|
+
end
|
28
46
|
end
|
29
|
-
|
30
47
|
|
31
48
|
end
|
32
|
-
end
|
49
|
+
end
|
@@ -6,6 +6,9 @@ module Arel
|
|
6
6
|
|
7
7
|
attr_accessor :request_type, :table, :where, :limit, :offset, :order, :operation, :columns, :updates, :eager_loads, :id, :distinct, :distinct_on
|
8
8
|
|
9
|
+
# This is used to removed an bind values. It is not used in the request
|
10
|
+
attr_accessor :join_source
|
11
|
+
|
9
12
|
def cast_attribute(v)
|
10
13
|
if (v.is_a?(ActiveRecord::Attribute))
|
11
14
|
v.value_for_database
|
@@ -70,6 +73,10 @@ module Arel
|
|
70
73
|
}
|
71
74
|
end
|
72
75
|
|
76
|
+
if join_source
|
77
|
+
substitute_binds(join_source.clone, bvs)
|
78
|
+
end
|
79
|
+
|
73
80
|
params = {}
|
74
81
|
if where
|
75
82
|
params[:where] = substitute_binds(where.clone, bvs)
|
@@ -77,7 +84,7 @@ module Arel
|
|
77
84
|
params[:where] = params[:where].pop
|
78
85
|
end
|
79
86
|
end
|
80
|
-
|
87
|
+
|
81
88
|
if eager_loads
|
82
89
|
params[:include] = eager_loads.clone
|
83
90
|
end
|
@@ -94,14 +101,14 @@ module Arel
|
|
94
101
|
params[:limit] = limit
|
95
102
|
end
|
96
103
|
|
104
|
+
params[:order] = substitute_binds(order, bvs) if order
|
105
|
+
|
97
106
|
if offset.is_a?(Arel::Nodes::BindParam)
|
98
107
|
params[:offset] = substitute_binds(offset, bvs)
|
99
108
|
elsif offset
|
100
109
|
params[:offset] = offset
|
101
110
|
end
|
102
111
|
|
103
|
-
params[:order] = substitute_binds(order, bvs) if order
|
104
|
-
|
105
112
|
case operation
|
106
113
|
when :count
|
107
114
|
path += "/#{operation}"
|
@@ -143,6 +150,3 @@ module Arel
|
|
143
150
|
end
|
144
151
|
end
|
145
152
|
end
|
146
|
-
|
147
|
-
|
148
|
-
|
@@ -58,7 +58,7 @@ module Arel
|
|
58
58
|
collector = maybe_visit o.set_quantifier, collector
|
59
59
|
|
60
60
|
if o.source && !o.source.empty?
|
61
|
-
collector
|
61
|
+
collector = visit o.source, collector
|
62
62
|
end
|
63
63
|
|
64
64
|
if !o.wheres.empty?
|
@@ -628,11 +628,14 @@ module Arel
|
|
628
628
|
#
|
629
629
|
def visit_Arel_Nodes_JoinSource o, collector
|
630
630
|
if o.left
|
631
|
-
collector =
|
631
|
+
collector.table = o.left.name
|
632
632
|
end
|
633
633
|
if o.right.any?
|
634
|
-
|
635
|
-
|
634
|
+
# We need to visit the right to get remove bind values, but we don't
|
635
|
+
# add it to the collector
|
636
|
+
# collector << " " if o.left
|
637
|
+
# collector = inject_join o.right, collector, ' '
|
638
|
+
collector.join_source = inject_join(o.right, Arel::Collectors::Sunstone.new, ' ')
|
636
639
|
end
|
637
640
|
collector
|
638
641
|
end
|
@@ -663,23 +666,20 @@ module Arel
|
|
663
666
|
# def visit_Arel_Nodes_RightOuterJoin o
|
664
667
|
# "RIGHT OUTER JOIN #{visit o.left} #{visit o.right}"
|
665
668
|
# end
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
# visit o.expr, collector
|
681
|
-
# end
|
682
|
-
#
|
669
|
+
|
670
|
+
def visit_Arel_Nodes_InnerJoin o, collector
|
671
|
+
collector = visit o.left, collector
|
672
|
+
if o.right
|
673
|
+
visit(o.right, collector)
|
674
|
+
else
|
675
|
+
collector
|
676
|
+
end
|
677
|
+
end
|
678
|
+
|
679
|
+
def visit_Arel_Nodes_On o, collector
|
680
|
+
visit o.expr, collector
|
681
|
+
end
|
682
|
+
|
683
683
|
# def visit_Arel_Nodes_Not o, collector
|
684
684
|
# collector << "NOT ("
|
685
685
|
# visit(o.expr, collector) << ")"
|
data/lib/sunstone/version.rb
CHANGED
@@ -35,7 +35,7 @@ class ActiveRecord::QueryTest < Minitest::Test
|
|
35
35
|
|
36
36
|
assert_nil Ship.first
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
test '::last' do
|
40
40
|
webmock(:get, "/ships", { limit: 1, order: [{id: :desc}] }).to_return(body: [].to_json)
|
41
41
|
|
@@ -134,5 +134,19 @@ class ActiveRecord::QueryTest < Minitest::Test
|
|
134
134
|
test '#to_sql' do
|
135
135
|
assert_equal "SELECT ships.* FROM ships WHERE ships.id = 10", Ship.where(:id => 10).to_sql
|
136
136
|
end
|
137
|
-
|
137
|
+
|
138
|
+
test '#to_sql binds correctly when joining' do
|
139
|
+
assert_equal 'SELECT ships.* FROM ships INNER JOIN ownerships ON ownerships.asset_id = ships.id AND ownerships.asset_type = \'Ship\' WHERE ownerships.id = 1', Ship.joins(:ownerships).where({ ownerships: { id: 1 } }).to_sql
|
140
|
+
end
|
141
|
+
|
142
|
+
test '#to_sar' do
|
143
|
+
assert_equal "/ships?%81%A5where%81%A2id%A210", Ship.where(:id => 10).to_sar.path
|
144
|
+
end
|
145
|
+
|
146
|
+
test 'bind params get eaten when joining' do
|
147
|
+
uri = URI(Ship.joins(:ownerships).where({ ownerships: { id: 1 } }).to_sar.path)
|
148
|
+
query = MessagePack.unpack(CGI.unescape(uri.query))
|
149
|
+
assert_equal({"where"=>{"ownerships"=>{"id"=>{"eq"=>"1"}}}}, query)
|
150
|
+
end
|
151
|
+
|
138
152
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sunstone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.0.
|
4
|
+
version: 5.0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Bracy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -344,7 +344,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
344
344
|
version: '0'
|
345
345
|
requirements: []
|
346
346
|
rubyforge_project:
|
347
|
-
rubygems_version: 2.
|
347
|
+
rubygems_version: 2.5.1
|
348
348
|
signing_key:
|
349
349
|
specification_version: 4
|
350
350
|
summary: A library for interacting with REST APIs
|