pggraphql 0.1.1 → 0.1.2
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/lib/pggraphql.rb +49 -14
- data/lib/pggraphql/version.rb +1 -1
- data/test/test_pggraphql.rb +137 -12
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99fb888e996dd5a6d047dfe87d4b486aa5bdc1ba
|
4
|
+
data.tar.gz: c213c7424178a7f0471e7992d47cdb81712b343a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd11586d6134db20251c457d277f99e5c2e5d3efe7fa472798d5a41dd2680c0fe11c18e288074622956e5035b004139340c65e3ece5a9bc032fcd55e6a74dbc6
|
7
|
+
data.tar.gz: 69bc3ba9ca3f7e081c743ae483208fd109e8da9dafe218e109847e1726207fdbe604314d31bc80ec11bbd617f4273b3d611e9c57dd3eace0907ef93c5cb4ee0d
|
data/lib/pggraphql.rb
CHANGED
@@ -24,9 +24,17 @@ module PgGraphQl
|
|
24
24
|
yield(type) if block_given?
|
25
25
|
end
|
26
26
|
|
27
|
-
def handle_sql_part(part, params, level, table_levels)
|
27
|
+
def handle_sql_part(part, params, level, table_levels, guard=nil)
|
28
28
|
next_part = if part.is_a?(Array)
|
29
|
-
part.slice(1..-1).each
|
29
|
+
part.slice(1..-1).each do |param|
|
30
|
+
params << param
|
31
|
+
end
|
32
|
+
|
33
|
+
cnt1 = part[0].scan(/\?/).count
|
34
|
+
cnt2 = part.length - 1
|
35
|
+
|
36
|
+
raise "placeholder mismatch #{cnt1} != #{cnt2} in #{part}" if cnt1 != cnt2
|
37
|
+
|
30
38
|
part[0]
|
31
39
|
elsif part.is_a?(String)
|
32
40
|
part
|
@@ -71,7 +79,7 @@ module PgGraphQl
|
|
71
79
|
type = link ? link.type : self.types[e[0].to_s.split("@").first.singularize.to_sym]
|
72
80
|
ids = e[1][:id]
|
73
81
|
|
74
|
-
unless type
|
82
|
+
unless type
|
75
83
|
ap({
|
76
84
|
"known types": self.types.keys,
|
77
85
|
"link name": link_name,
|
@@ -106,7 +114,22 @@ module PgGraphQl
|
|
106
114
|
raise "unknown link #{field_name.inspect} on type #{type.name.inspect}" if f[1].is_a?(Hash) && !type.links.include?(field_name.to_s.split("@").first.to_sym)
|
107
115
|
|
108
116
|
if f[1].is_a?(Hash)
|
109
|
-
"(" + to_sql([f].to_h, level + 1, params, table_levels, type, nested_link_name) + ")
|
117
|
+
inner_sql_proc = ->{ "(" + to_sql([f].to_h, level + 1, params, table_levels, type, nested_link_name) + ")" }
|
118
|
+
inner_link = type.links[nested_link_name.to_s.split("@").first.to_sym]
|
119
|
+
|
120
|
+
inner_sql = if inner_link.guard
|
121
|
+
guarded_value = inner_link.many? ? "to_json('[]'::json)" : "null"
|
122
|
+
guard = handle_sql_part(inner_link.guard, params, level, table_levels)
|
123
|
+
|
124
|
+
"case
|
125
|
+
when #{guard} then #{inner_sql_proc.call}
|
126
|
+
else #{guarded_value}
|
127
|
+
end"
|
128
|
+
else
|
129
|
+
inner_sql_proc.call
|
130
|
+
end
|
131
|
+
|
132
|
+
inner_sql + " as \"#{field_name}\""
|
110
133
|
else
|
111
134
|
field_def = type.fields.detect{|f| f[:name] == field_name}
|
112
135
|
|
@@ -115,15 +138,27 @@ module PgGraphQl
|
|
115
138
|
else
|
116
139
|
field_def[:name]
|
117
140
|
end
|
118
|
-
|
141
|
+
|
119
142
|
unless column_name.to_s.index(".")
|
120
143
|
column_name = :"{#{type.table}}.#{column_name}"
|
121
144
|
end
|
122
145
|
|
123
|
-
|
124
|
-
|
146
|
+
column_expr_proc = -> do
|
147
|
+
if field_def[:expr]
|
148
|
+
handle_sql_part(field_def[:expr].call(column_name), params, level, table_levels)
|
149
|
+
else
|
150
|
+
handle_sql_part("#{column_name}", params, level, table_levels)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
column_expr = if field_def[:guard]
|
155
|
+
guard = handle_sql_part(field_def[:guard], params, level, table_levels)
|
156
|
+
column_expr = "case
|
157
|
+
when #{guard} then #{column_expr_proc.call}
|
158
|
+
else null
|
159
|
+
end"
|
125
160
|
else
|
126
|
-
|
161
|
+
column_expr_proc.call
|
127
162
|
end
|
128
163
|
|
129
164
|
"#{column_expr}" + (field_def[:as] ? " as #{field_def[:as]}" : "")
|
@@ -170,7 +205,7 @@ module PgGraphQl
|
|
170
205
|
sql += "x.*"
|
171
206
|
sql += "), '[]'::json)" if is_many
|
172
207
|
sql += ") from (select #{columns} from #{type.table} as #{table_as}"
|
173
|
-
|
208
|
+
|
174
209
|
unless type.subtypes.empty?
|
175
210
|
sql += "\n" + type.subtypes.map do |f|
|
176
211
|
subtype = f[1]
|
@@ -191,7 +226,7 @@ module PgGraphQl
|
|
191
226
|
|
192
227
|
end.join
|
193
228
|
else
|
194
|
-
root_sql = wrap_root(query.map do |e|
|
229
|
+
root_sql = wrap_root(query.map do |e|
|
195
230
|
sql = to_sql([e].to_h, 1, params, table_levels)
|
196
231
|
"select '#{e[0]}'::text as key, (#{sql}) as value"
|
197
232
|
end.join("\nunion all\n"))
|
@@ -244,7 +279,7 @@ module PgGraphQl
|
|
244
279
|
field
|
245
280
|
else
|
246
281
|
raise "unsupported field #{field.inspect}"
|
247
|
-
end
|
282
|
+
end
|
248
283
|
end
|
249
284
|
|
250
285
|
def one(name, opts={})
|
@@ -264,7 +299,7 @@ module PgGraphQl
|
|
264
299
|
end
|
265
300
|
def subtype(name, opts={})
|
266
301
|
subtype = @subtypes[name] = SubType.new(self, name)
|
267
|
-
{fk: :subtype}.merge(opts).each_pair do |key, val|
|
302
|
+
{fk: :subtype}.merge(opts).each_pair do |key, val|
|
268
303
|
subtype.send(:"#{key}=", val)
|
269
304
|
end
|
270
305
|
yield(subtype) if block_given?
|
@@ -272,7 +307,7 @@ module PgGraphQl
|
|
272
307
|
end
|
273
308
|
def create_link(name, many, opts)
|
274
309
|
link = @links[name] = Link.new(self, name, many)
|
275
|
-
opts.each_pair do |key, val|
|
310
|
+
opts.each_pair do |key, val|
|
276
311
|
link.send(:"#{key}=", val)
|
277
312
|
end
|
278
313
|
link
|
@@ -303,7 +338,7 @@ module PgGraphQl
|
|
303
338
|
end
|
304
339
|
|
305
340
|
class Link
|
306
|
-
attr_accessor :name, :filter, :fk, :order_by
|
341
|
+
attr_accessor :name, :filter, :fk, :order_by, :guard
|
307
342
|
def initialize(owner, name, many)
|
308
343
|
@owner = owner
|
309
344
|
@name = name
|
data/lib/pggraphql/version.rb
CHANGED
data/test/test_pggraphql.rb
CHANGED
@@ -14,7 +14,7 @@ module PgGraphQl
|
|
14
14
|
s.class.send(:define_method, :wrap_root) do |unwrapped_sql|
|
15
15
|
unwrapped_sql
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
res = s.to_sql(query)
|
19
19
|
|
20
20
|
sql, params = res.values_at(:sql, :params)
|
@@ -136,7 +136,7 @@ module PgGraphQl
|
|
136
136
|
from (select users1.id,
|
137
137
|
users1.email as email
|
138
138
|
from users as users1
|
139
|
-
where users1.id = ? limit 1) x) as value
|
139
|
+
where users1.id = ? limit 1) x) as value
|
140
140
|
SQL
|
141
141
|
), token(res[:sql])
|
142
142
|
assert_equal [1], res[:params]
|
@@ -160,6 +160,110 @@ module PgGraphQl
|
|
160
160
|
|
161
161
|
end
|
162
162
|
|
163
|
+
def test_guard_field
|
164
|
+
res = to_sql({user: {id: 1, email: nil}}) do |s|
|
165
|
+
s.root :user
|
166
|
+
s.type :user, fields: [{name: :email, guard: "true"}]
|
167
|
+
end
|
168
|
+
|
169
|
+
assert_equal token(<<-SQL
|
170
|
+
select 'user'::text as key,
|
171
|
+
(select to_json(x.*)
|
172
|
+
from (select users1.id,
|
173
|
+
case
|
174
|
+
when true then users1.email
|
175
|
+
else null
|
176
|
+
end as email
|
177
|
+
from users as users1
|
178
|
+
where users1.id = ? limit 1) x) as value
|
179
|
+
SQL
|
180
|
+
), token(res[:sql])
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_guard_link_belongs_to
|
184
|
+
res = to_sql({user: {id: 1, email: nil, address: {id: "99"}}}) do |s|
|
185
|
+
s.root :user
|
186
|
+
s.type :user, fields: [:email] do |t|
|
187
|
+
t.belongs_to :address, guard: "true"
|
188
|
+
end
|
189
|
+
s.type :address
|
190
|
+
end
|
191
|
+
|
192
|
+
assert_equal token(<<-SQL
|
193
|
+
select 'user'::text as key,
|
194
|
+
(select to_json(x.*)
|
195
|
+
from (select users1.id,
|
196
|
+
users1.email as email,
|
197
|
+
case
|
198
|
+
when true then (select to_json(x.*)
|
199
|
+
from (select addresses2.id
|
200
|
+
from addresses as addresses2
|
201
|
+
where addresses2.id = ? and (addresses2.id = users1.address_id) limit 1) x)
|
202
|
+
else null
|
203
|
+
end as "address"
|
204
|
+
from users as users1
|
205
|
+
where users1.id = ? limit 1) x) as value
|
206
|
+
SQL
|
207
|
+
), token(res[:sql])
|
208
|
+
assert_equal ["99", 1], res[:params]
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_guard_link_many
|
212
|
+
res = to_sql({user: {id: 1, email: nil, address: {id: "99"}}}) do |s|
|
213
|
+
s.root :user
|
214
|
+
s.type :user, fields: [:email] do |t|
|
215
|
+
t.many :address, guard: "true"
|
216
|
+
end
|
217
|
+
s.type :address
|
218
|
+
end
|
219
|
+
|
220
|
+
assert_equal token(<<-SQL
|
221
|
+
select 'user'::text as key,
|
222
|
+
(select to_json(x.*)
|
223
|
+
from (select users1.id,
|
224
|
+
users1.email as email,
|
225
|
+
case
|
226
|
+
when true then (select to_json(coalesce(json_agg(x.*), '[]'::json))
|
227
|
+
from (select addresses2.id
|
228
|
+
from addresses as addresses2
|
229
|
+
where addresses2.id = ? and (addresses2.user_id = users1.id)) x)
|
230
|
+
else to_json('[]'::json)
|
231
|
+
end as "address"
|
232
|
+
from users as users1
|
233
|
+
where users1.id = ? limit 1) x) as value
|
234
|
+
SQL
|
235
|
+
), token(res[:sql])
|
236
|
+
end
|
237
|
+
|
238
|
+
def test_guard_link_many_with_fk
|
239
|
+
res = to_sql({user: {id: 1, email: nil, address: {id: 99}}}) do |s|
|
240
|
+
s.root :user
|
241
|
+
s.type :user, fields: [:email] do |t|
|
242
|
+
t.many :address, guard: ["2 = ?", 2]
|
243
|
+
end
|
244
|
+
s.type :address
|
245
|
+
end
|
246
|
+
|
247
|
+
assert_equal token(<<-SQL
|
248
|
+
select 'user'::text as key,
|
249
|
+
(select to_json(x.*)
|
250
|
+
from (select users1.id,
|
251
|
+
users1.email as email,
|
252
|
+
case
|
253
|
+
when 2 = ? then (select to_json(coalesce(json_agg(x.*), '[]'::json))
|
254
|
+
from (select addresses2.id
|
255
|
+
from addresses as addresses2
|
256
|
+
where addresses2.id = ? and (addresses2.user_id = users1.id)) x)
|
257
|
+
else to_json('[]'::json)
|
258
|
+
end as "address"
|
259
|
+
from users as users1
|
260
|
+
where users1.id = ? limit 1) x) as value
|
261
|
+
SQL
|
262
|
+
), token(res[:sql])
|
263
|
+
|
264
|
+
assert_equal [2, 99, 1], res[:params]
|
265
|
+
end
|
266
|
+
|
163
267
|
def test_simple_fail_when_accessing_non_root
|
164
268
|
assert_raise_message ":user is not a root type" do
|
165
269
|
res = to_sql({user: {id: 1, email: "email"}}) do |s|
|
@@ -238,7 +342,7 @@ module PgGraphQl
|
|
238
342
|
(select to_json(coalesce(json_agg(x.*), '[]'::json))
|
239
343
|
from (select users1.id,
|
240
344
|
users1.email as email
|
241
|
-
from users as users1 where users1.id in ?) x) as value
|
345
|
+
from users as users1 where users1.id in ?) x) as value
|
242
346
|
SQL
|
243
347
|
), token(res[:sql])
|
244
348
|
assert_equal [["1"]], res[:params]
|
@@ -255,7 +359,7 @@ module PgGraphQl
|
|
255
359
|
(select to_json(x.*)
|
256
360
|
from (select users1.id,
|
257
361
|
users1.email as email
|
258
|
-
from users as users1 where users1.id = ? limit 1) x) as value
|
362
|
+
from users as users1 where users1.id = ? limit 1) x) as value
|
259
363
|
SQL
|
260
364
|
), token(res[:sql])
|
261
365
|
assert_equal ["1"], res[:params]
|
@@ -272,7 +376,7 @@ module PgGraphQl
|
|
272
376
|
(select to_json(coalesce(json_agg(x.*), '[]'::json))
|
273
377
|
from (select users1.id,
|
274
378
|
users1.email as email
|
275
|
-
from users as users1 where users1.id in ?) x) as value
|
379
|
+
from users as users1 where users1.id in ?) x) as value
|
276
380
|
SQL
|
277
381
|
), token(res[:sql])
|
278
382
|
assert_equal [[1]], res[:params]
|
@@ -289,7 +393,7 @@ module PgGraphQl
|
|
289
393
|
(select to_json(coalesce(json_agg(x.*), '[]'::json))
|
290
394
|
from (select users1.id,
|
291
395
|
users1.email as email
|
292
|
-
from users as users1 where users1.id in ?) x) as value
|
396
|
+
from users as users1 where users1.id in ?) x) as value
|
293
397
|
SQL
|
294
398
|
), token(res[:sql])
|
295
399
|
assert_equal [[1,2]], res[:params]
|
@@ -306,7 +410,7 @@ module PgGraphQl
|
|
306
410
|
(select to_json(coalesce(json_agg(x.*), '[]'::json))
|
307
411
|
from (select users1.id,
|
308
412
|
users1.email as email
|
309
|
-
from users as users1 where users1.id in ?) x) as value
|
413
|
+
from users as users1 where users1.id in ?) x) as value
|
310
414
|
SQL
|
311
415
|
), token(res[:sql])
|
312
416
|
assert_equal [["1","2"]], res[:params]
|
@@ -470,7 +574,7 @@ module PgGraphQl
|
|
470
574
|
and products1.type = 'download')) x) as value
|
471
575
|
SQL
|
472
576
|
), token(res[:sql])
|
473
|
-
assert_equal [], res[:params]
|
577
|
+
assert_equal [], res[:params]
|
474
578
|
|
475
579
|
# ------
|
476
580
|
|
@@ -520,7 +624,7 @@ module PgGraphQl
|
|
520
624
|
and products1.type = 'clickout')) x) as value
|
521
625
|
SQL
|
522
626
|
), token(res[:sql])
|
523
|
-
assert_equal [], res[:params]
|
627
|
+
assert_equal [], res[:params]
|
524
628
|
end
|
525
629
|
|
526
630
|
def test_inherit_with_pk
|
@@ -539,7 +643,7 @@ module PgGraphQl
|
|
539
643
|
assert_equal token(<<-SQL
|
540
644
|
select 'products'::text as key,
|
541
645
|
(select to_json(x.*)
|
542
|
-
from (select products1.id,
|
646
|
+
from (select products1.id,
|
543
647
|
products1.type as type,
|
544
648
|
clickout1.destination_url as clickout__destination_url
|
545
649
|
from products as products1
|
@@ -548,7 +652,7 @@ module PgGraphQl
|
|
548
652
|
SQL
|
549
653
|
), token(res[:sql])
|
550
654
|
assert_equal [1], res[:params]
|
551
|
-
|
655
|
+
|
552
656
|
end
|
553
657
|
|
554
658
|
#####################
|
@@ -737,7 +841,7 @@ module PgGraphQl
|
|
737
841
|
end
|
738
842
|
s.type :address
|
739
843
|
end
|
740
|
-
end
|
844
|
+
end
|
741
845
|
end
|
742
846
|
|
743
847
|
|
@@ -1032,5 +1136,26 @@ module PgGraphQl
|
|
1032
1136
|
assert_equal ["99", 1], res[:params]
|
1033
1137
|
end
|
1034
1138
|
|
1139
|
+
def test_handle_sql_part
|
1140
|
+
s = PgGraphQl::Schema.new
|
1141
|
+
|
1142
|
+
params = []
|
1143
|
+
level = 1
|
1144
|
+
table_levels={}
|
1145
|
+
|
1146
|
+
assert_equal "users1.id = 1", s.handle_sql_part("{users}.id = 1", params, level, table_levels)
|
1147
|
+
assert_equal "users2.id = 2", s.handle_sql_part("{users}.id = 2", params, level + 1, table_levels)
|
1148
|
+
assert_equal "users1.id = 3", s.handle_sql_part("{users}.id = 3", params, level, table_levels)
|
1149
|
+
|
1150
|
+
assert_equal "users1.id = ?", s.handle_sql_part(["{users}.id = ?", 101], params, level, table_levels)
|
1151
|
+
assert_equal "users2.id = ?", s.handle_sql_part(["{users}.id = ?", 102], params, level + 1, table_levels)
|
1152
|
+
assert_equal "users1.id = ?", s.handle_sql_part(["{users}.id = ?", 103], params, level, table_levels)
|
1153
|
+
|
1154
|
+
assert_equal "users1.id = ?", s.handle_sql_part(["{users}.id = ?", 101], params, level, table_levels)
|
1155
|
+
assert_equal "educators2.id = ?", s.handle_sql_part(["{educators}.id = ?", 102], params, level + 1, table_levels)
|
1156
|
+
assert_equal "users1.id = ?", s.handle_sql_part(["{users}.id = ?", 103], params, level, table_levels)
|
1157
|
+
assert_equal "educators1.id = ?", s.handle_sql_part(["{educators}.id = ?", 104], params, level, table_levels)
|
1158
|
+
end
|
1159
|
+
|
1035
1160
|
end
|
1036
1161
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pggraphql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Zimmek
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|