pggraphql 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|