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 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