pggraphql 0.1.2 → 0.1.3
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/version.rb +1 -1
- data/lib/pggraphql.rb +41 -13
- data/test/test_pggraphql.rb +155 -0
- 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: 40388c39022da2118d8ffe8774012034c35e29c5
|
4
|
+
data.tar.gz: efba25021710edfe95ab788e60fde4013df55736
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44b8bec7c4351cfa93d23c5b161b3131d1c3125e477f90db0185337831e3cca0dfe5dc3fad44c38facdd8f9f2b58912391ebd043ca2f3245a29f713bc22943a7
|
7
|
+
data.tar.gz: f725f47496545cf7c63889a145c50e53d5d14d7c260b30fb948f4886824d33e9e24e67427c814ae181f568dc95080dac80b3095144ecf9d08eefde33925c1336
|
data/lib/pggraphql/version.rb
CHANGED
data/lib/pggraphql.rb
CHANGED
@@ -104,7 +104,7 @@ module PgGraphQl
|
|
104
104
|
|
105
105
|
requested_fields = {id: nil} # always add :id field
|
106
106
|
requested_fields = requested_fields.merge(type: nil) unless type.subtypes.empty? # always add :subtype
|
107
|
-
requested_fields = requested_fields.merge(e[1])
|
107
|
+
requested_fields = requested_fields.merge(e[1].reject{|f| f.to_s =~ /^\$/})
|
108
108
|
|
109
109
|
columns = requested_fields.map do |f|
|
110
110
|
nested_link_name = f[0]
|
@@ -169,6 +169,30 @@ module PgGraphQl
|
|
169
169
|
is_many = (link && link.many?) || (level == 1 && ids.is_a?(Array)) || (level == 1 && !ids && type.null_pk == :array)
|
170
170
|
order_by = link.try(:order_by) || type.try(:order_by)
|
171
171
|
|
172
|
+
table_query = if type.table_query
|
173
|
+
sql_part = type.table_query.is_a?(Proc) ? type.table_query.call(e[1]) : type.table_query
|
174
|
+
"(" + handle_sql_part(sql_part, params, level, table_levels).to_s + ")"
|
175
|
+
else
|
176
|
+
type.table.to_s
|
177
|
+
end
|
178
|
+
|
179
|
+
subtypes = type.subtypes.map do |f|
|
180
|
+
subtype = f[1]
|
181
|
+
fk = subtype.fk.is_a?(Proc) ? subtype.fk.call(level) : subtype.fk
|
182
|
+
|
183
|
+
fk = "{#{subtype.name}}.id = {#{type.table}}.id and {#{type.table}}.type = '#{subtype.name}'" if fk == :subtype
|
184
|
+
|
185
|
+
subtype_table_query = if subtype.table_query
|
186
|
+
"(" + handle_sql_part(subtype.table_query, params, level, table_levels).to_s + ")"
|
187
|
+
else
|
188
|
+
subtype.table.to_s
|
189
|
+
end
|
190
|
+
|
191
|
+
subtype_as = handle_sql_part("{#{subtype.name}}", params, level, table_levels)
|
192
|
+
|
193
|
+
"left join #{subtype_table_query} as #{subtype_as} on (#{handle_sql_part(fk, params, level, table_levels)})"
|
194
|
+
end
|
195
|
+
|
172
196
|
wheres = []
|
173
197
|
|
174
198
|
raise "missing :id for root type #{type.name.inspect}" if !ids && level == 1 && !type.null_pk
|
@@ -204,20 +228,22 @@ module PgGraphQl
|
|
204
228
|
sql += "coalesce(json_agg(" if is_many
|
205
229
|
sql += "x.*"
|
206
230
|
sql += "), '[]'::json)" if is_many
|
207
|
-
sql += ") from (select #{columns} from #{
|
231
|
+
sql += ") from (select #{columns} from #{table_query} as #{table_as}"
|
208
232
|
|
209
|
-
unless type.subtypes.empty?
|
210
|
-
sql += "\n" + type.subtypes.map do |f|
|
211
|
-
subtype = f[1]
|
212
|
-
fk = subtype.fk.is_a?(Proc) ? subtype.fk.call(level) : subtype.fk
|
213
233
|
|
214
|
-
|
215
|
-
subtype_as = handle_sql_part("{#{subtype.name}}", params, level, table_levels)
|
234
|
+
sql += "\n" + subtypes.join("\n") unless subtypes.empty?
|
216
235
|
|
217
|
-
|
218
|
-
|
219
|
-
|
236
|
+
# unless type.subtypes.empty?
|
237
|
+
# sql += "\n" + type.subtypes.map do |f|
|
238
|
+
# subtype = f[1]
|
239
|
+
# fk = subtype.fk.is_a?(Proc) ? subtype.fk.call(level) : subtype.fk
|
240
|
+
|
241
|
+
# fk = "{#{subtype.name}}.id = {#{type.table}}.id and {#{type.table}}.type = '#{subtype.name}'" if fk == :subtype
|
242
|
+
# subtype_as = handle_sql_part("{#{subtype.name}}", params, level, table_levels)
|
220
243
|
|
244
|
+
# "left join #{subtype.table} as #{subtype_as} on (#{handle_sql_part(fk, params, level, table_levels)})"
|
245
|
+
# end.join("\n")
|
246
|
+
# end
|
221
247
|
|
222
248
|
sql += " where #{wheres.join(' and ')}" unless wheres.empty?
|
223
249
|
sql += " order by #{handle_sql_part(order_by, params, level, table_levels)}" if order_by
|
@@ -240,12 +266,13 @@ module PgGraphQl
|
|
240
266
|
end
|
241
267
|
|
242
268
|
class Type
|
243
|
-
attr_accessor :name, :table, :links, :order_by, :filter, :subtypes, :pk, :null_pk
|
269
|
+
attr_accessor :name, :table, :table_query, :links, :order_by, :filter, :subtypes, :pk, :null_pk
|
244
270
|
attr_reader :schema, :mappings, :fields
|
245
271
|
def initialize(schema, name)
|
246
272
|
@schema = schema
|
247
273
|
@name = name
|
248
274
|
@table = name.to_s.pluralize.to_sym
|
275
|
+
@table_query = nil
|
249
276
|
@fields = []
|
250
277
|
@filter = nil
|
251
278
|
@order_by = nil
|
@@ -315,13 +342,14 @@ module PgGraphQl
|
|
315
342
|
end
|
316
343
|
|
317
344
|
class SubType
|
318
|
-
attr_accessor :name, :table, :fk
|
345
|
+
attr_accessor :name, :table, :fk, :table_query
|
319
346
|
attr_reader :type
|
320
347
|
def initialize(type, name)
|
321
348
|
@type = type
|
322
349
|
@name = name
|
323
350
|
@table = nil
|
324
351
|
@fk = nil
|
352
|
+
@table_query = nil
|
325
353
|
end
|
326
354
|
def has_one(name, opts={})
|
327
355
|
@type.has_one(:"#{@name}__#{name}", {type: name}.merge(opts))
|
data/test/test_pggraphql.rb
CHANGED
@@ -160,6 +160,101 @@ module PgGraphQl
|
|
160
160
|
|
161
161
|
end
|
162
162
|
|
163
|
+
def test_simple_igore_dollar_fields
|
164
|
+
res = to_sql({user: {id: 1, email: nil, :"$custom" => nil}}) do |s|
|
165
|
+
s.root :user
|
166
|
+
s.type :user, fields: [:email]
|
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
|
+
users1.email as email
|
174
|
+
from users as users1
|
175
|
+
where users1.id = ? limit 1) x) as value
|
176
|
+
SQL
|
177
|
+
), token(res[:sql])
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_simple_table_query
|
181
|
+
res = to_sql({user: {id: 1, email: nil}}) do |s|
|
182
|
+
s.root :user
|
183
|
+
s.type :user, fields: [:email] do |t|
|
184
|
+
t.table_query = "select 1 as id, 'my@domain' as email"
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
assert_equal token(<<-SQL
|
189
|
+
select 'user'::text as key,
|
190
|
+
(select to_json(x.*)
|
191
|
+
from (select users1.id,
|
192
|
+
users1.email as email
|
193
|
+
from (select 1 as id, 'my@domain' as email) as users1
|
194
|
+
where users1.id = ? limit 1) x) as value
|
195
|
+
SQL
|
196
|
+
), token(res[:sql])
|
197
|
+
|
198
|
+
# ----
|
199
|
+
|
200
|
+
res = to_sql({user: {id: 1, email: nil}}) do |s|
|
201
|
+
s.root :user
|
202
|
+
s.type :user, fields: [:email] do |t|
|
203
|
+
t.table_query = "select 1 as id, 'my@domain' as email where {users}.id > 0"
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
assert_equal token(<<-SQL
|
208
|
+
select 'user'::text as key,
|
209
|
+
(select to_json(x.*)
|
210
|
+
from (select users1.id,
|
211
|
+
users1.email as email
|
212
|
+
from (select 1 as id, 'my@domain' as email where users1.id > 0) as users1
|
213
|
+
where users1.id = ? limit 1) x) as value
|
214
|
+
SQL
|
215
|
+
), token(res[:sql])
|
216
|
+
|
217
|
+
# ----
|
218
|
+
|
219
|
+
res = to_sql({user: {id: 1, email: nil}}) do |s|
|
220
|
+
s.root :user
|
221
|
+
s.type :user, fields: [:email] do |t|
|
222
|
+
t.table_query = ->(query){ "select 1 as id, 'my@domain' as email" }
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
assert_equal token(<<-SQL
|
227
|
+
select 'user'::text as key,
|
228
|
+
(select to_json(x.*)
|
229
|
+
from (select users1.id,
|
230
|
+
users1.email as email
|
231
|
+
from (select 1 as id, 'my@domain' as email) as users1
|
232
|
+
where users1.id = ? limit 1) x) as value
|
233
|
+
SQL
|
234
|
+
), token(res[:sql])
|
235
|
+
end
|
236
|
+
|
237
|
+
def test_simple_table_query_with_params
|
238
|
+
res = to_sql({user: {id: 1, email: nil}}) do |s|
|
239
|
+
s.root :user
|
240
|
+
s.type :user, fields: [:email] do |t|
|
241
|
+
t.table_query = ["select ? as id, 'my@domain' as email", 99]
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
assert_equal token(<<-SQL
|
246
|
+
select 'user'::text as key,
|
247
|
+
(select to_json(x.*)
|
248
|
+
from (select users1.id,
|
249
|
+
users1.email as email
|
250
|
+
from (select ? as id, 'my@domain' as email) as users1
|
251
|
+
where users1.id = ? limit 1) x) as value
|
252
|
+
SQL
|
253
|
+
), token(res[:sql])
|
254
|
+
|
255
|
+
assert_equal [99, 1], res[:params]
|
256
|
+
end
|
257
|
+
|
163
258
|
def test_guard_field
|
164
259
|
res = to_sql({user: {id: 1, email: nil}}) do |s|
|
165
260
|
s.root :user
|
@@ -655,6 +750,66 @@ module PgGraphQl
|
|
655
750
|
|
656
751
|
end
|
657
752
|
|
753
|
+
def test_inherit_with_table_query
|
754
|
+
res = to_sql({
|
755
|
+
products: {
|
756
|
+
id: 1,
|
757
|
+
clickout__destination_url: nil
|
758
|
+
}
|
759
|
+
}) do |s|
|
760
|
+
s.root :product
|
761
|
+
s.type :product, null_pk: :array, fields: [:clickout__destination_url] do |t|
|
762
|
+
t.subtype :clickout, table: :product_clickouts do |st|
|
763
|
+
st.table_query = <<-SQL
|
764
|
+
select 1 as id, 'someurl' as destination_url
|
765
|
+
SQL
|
766
|
+
end
|
767
|
+
end
|
768
|
+
end
|
769
|
+
|
770
|
+
assert_equal token(<<-SQL
|
771
|
+
select 'products'::text as key,
|
772
|
+
(select to_json(x.*)
|
773
|
+
from (select products1.id,
|
774
|
+
products1.type as type,
|
775
|
+
clickout1.destination_url as clickout__destination_url
|
776
|
+
from products as products1
|
777
|
+
left join (select 1 as id, 'someurl' as destination_url) as clickout1 on (clickout1.id = products1.id
|
778
|
+
and products1.type = 'clickout') where products1.id = ? limit 1) x) as value
|
779
|
+
SQL
|
780
|
+
), token(res[:sql])
|
781
|
+
assert_equal [1], res[:params]
|
782
|
+
|
783
|
+
# ----
|
784
|
+
|
785
|
+
res = to_sql({
|
786
|
+
products: {
|
787
|
+
id: 1,
|
788
|
+
clickout__destination_url: nil
|
789
|
+
}
|
790
|
+
}) do |s|
|
791
|
+
s.root :product
|
792
|
+
s.type :product, null_pk: :array, fields: [:clickout__destination_url] do |t|
|
793
|
+
t.subtype :clickout, table: :product_clickouts do |st|
|
794
|
+
st.table_query = ["select 1 as id, ? as destination_url", "someurl"]
|
795
|
+
end
|
796
|
+
end
|
797
|
+
end
|
798
|
+
|
799
|
+
assert_equal token(<<-SQL
|
800
|
+
select 'products'::text as key,
|
801
|
+
(select to_json(x.*)
|
802
|
+
from (select products1.id,
|
803
|
+
products1.type as type,
|
804
|
+
clickout1.destination_url as clickout__destination_url
|
805
|
+
from products as products1
|
806
|
+
left join (select 1 as id, ? as destination_url) as clickout1 on (clickout1.id = products1.id
|
807
|
+
and products1.type = 'clickout') where products1.id = ? limit 1) x) as value
|
808
|
+
SQL
|
809
|
+
), token(res[:sql])
|
810
|
+
assert_equal ["someurl", 1], res[:params]
|
811
|
+
end
|
812
|
+
|
658
813
|
#####################
|
659
814
|
# one
|
660
815
|
#####################
|
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.3
|
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-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|