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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 65e7eaaf4c7e9673a17103bc2b07a3055d31880b
4
- data.tar.gz: b57b7de320273a0a05ad873c7aba85182414aabf
3
+ metadata.gz: 99fb888e996dd5a6d047dfe87d4b486aa5bdc1ba
4
+ data.tar.gz: c213c7424178a7f0471e7992d47cdb81712b343a
5
5
  SHA512:
6
- metadata.gz: 446888a65b6a5476b435285f3f7a64171ac32542e9188eec0e75abf252654d09f30e35c6aeca10c4dce5f3ed9ee2c47327bda12220491618734020318992f89b
7
- data.tar.gz: 50e1392dde0d8e6a5f2fb2de57615dad7b884ccbaee093e5abde11ea77ee5278e8db931e13e9504d0c9ae1d318d64a6617fdd164b57e683d0c47c0cafae6302f
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{|param| params << param}
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) + ") as \"#{field_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
- column_expr = if field_def[:expr]
124
- handle_sql_part(field_def[:expr].call(column_name), params, level, table_levels)
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
- handle_sql_part("#{column_name}", params, level, table_levels)
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
@@ -1,3 +1,3 @@
1
1
  module Pggraphql
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -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.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-03 00:00:00.000000000 Z
11
+ date: 2015-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json