pggraphql 0.0.3 → 0.0.4
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 +45 -6
- data/test/test_pggraphql.rb +68 -3
- 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: fdf0b9b66504b4787e8ec3e6928426228b531d61
|
4
|
+
data.tar.gz: c1435f3aaa8d96b2e8d420494d378072a6cded71
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d3b0514e72ca3c1dbdc2f92902c1b67537192c0970d82e950b8137b7a115eb2dc03ae13b4159041a890a028849d9df303bd9b7128658ab6b4a61c789ba934e2
|
7
|
+
data.tar.gz: 7f9dc9e43010a5cf019ba8567077b2751e8de9d22dbe16beb4e21afd0f547cf3df8a881a9b9caff547a9ca651e8078abf42811804331ec9527f43b81fc929a8f
|
data/lib/pggraphql/version.rb
CHANGED
data/lib/pggraphql.rb
CHANGED
@@ -30,15 +30,22 @@ module PgGraphQl
|
|
30
30
|
type = link ? link.type : self.types[e[0].to_s.singularize.to_sym]
|
31
31
|
ids = e[1][:id]
|
32
32
|
|
33
|
+
# puts "#{e[0].inspect}, #{link_name.inspect} ... type: #{type.inspect}"
|
34
|
+
|
33
35
|
raise "missing :fk on link #{link.name.inspect}" if link && !link.fk
|
34
36
|
|
35
37
|
columns = e[1].map do |f|
|
36
|
-
|
38
|
+
nested_link_name = f[0]
|
39
|
+
field_name = f[0]
|
40
|
+
|
41
|
+
raise "unknown field #{field_name.inspect} on type #{type.name.inspect}" if !f[1].is_a?(Hash) && !type.fields.include?(field_name)
|
42
|
+
raise "unknown link #{field_name.inspect} on type #{type.name.inspect}" if f[1].is_a?(Hash) && !type.links.include?(field_name)
|
37
43
|
|
38
|
-
|
39
|
-
raise "unknown link #{column_name.inspect} on type #{type.name.inspect}" if f[1].is_a?(Hash) && !type.links.include?(column_name)
|
44
|
+
column_name = field_name.to_s.index("__") ? field_name.to_s.gsub(/__/, ".").to_sym : field_name
|
40
45
|
|
41
|
-
|
46
|
+
column_expr = type.mappings[field_name] || column_name
|
47
|
+
|
48
|
+
(f[1].is_a?(Hash) ? "(" + to_sql([f].to_h, level + 1, type, nested_link_name) + ") as #{field_name}" : ((column_name == field_name && column_name == column_expr) ? column_name.to_s : "#{column_expr} as #{field_name}"))
|
42
49
|
end.join(",")
|
43
50
|
|
44
51
|
is_many = (link && link.many?) || !ids || ids.is_a?(Array)
|
@@ -66,6 +73,16 @@ module PgGraphQl
|
|
66
73
|
sql += "x.*"
|
67
74
|
sql += "), '[]'::json)" if is_many
|
68
75
|
sql += ") from (select #{columns} from #{type.table}"
|
76
|
+
|
77
|
+
|
78
|
+
unless type.subtypes.empty?
|
79
|
+
sql += "\n" + type.subtypes.map do |f|
|
80
|
+
subtype = f[1]
|
81
|
+
"left join #{subtype.table} as #{subtype.name} on (#{subtype.fk})"
|
82
|
+
end.join("\n")
|
83
|
+
end
|
84
|
+
|
85
|
+
|
69
86
|
sql += " where #{wheres.join(' and ')}" unless wheres.empty?
|
70
87
|
sql += " order by #{order_by}" if order_by
|
71
88
|
sql += " limit 1" if !is_many
|
@@ -85,8 +102,8 @@ module PgGraphQl
|
|
85
102
|
end
|
86
103
|
|
87
104
|
class Type
|
88
|
-
attr_accessor :name, :table, :filter, :links, :order_by, :fields
|
89
|
-
attr_reader :schema
|
105
|
+
attr_accessor :name, :table, :filter, :links, :order_by, :fields, :subtypes
|
106
|
+
attr_reader :schema, :mappings
|
90
107
|
def initialize(schema, name)
|
91
108
|
@schema = schema
|
92
109
|
@name = name
|
@@ -95,6 +112,11 @@ module PgGraphQl
|
|
95
112
|
@filter = nil
|
96
113
|
@order_by = nil
|
97
114
|
@links = {}
|
115
|
+
@subtypes = {}
|
116
|
+
@mappings = {}
|
117
|
+
end
|
118
|
+
def map(field, column_expr)
|
119
|
+
@mappings[field] = column_expr
|
98
120
|
end
|
99
121
|
def one(name, opts={})
|
100
122
|
create_link(name, false, opts)
|
@@ -102,6 +124,13 @@ module PgGraphQl
|
|
102
124
|
def many(name, opts={})
|
103
125
|
create_link(name, true, opts)
|
104
126
|
end
|
127
|
+
def subtype(name, opts={})
|
128
|
+
subtype = @subtypes[name] = SubType.new(self, name)
|
129
|
+
opts.each_pair do |key, val|
|
130
|
+
subtype.send(:"#{key}=", val)
|
131
|
+
end
|
132
|
+
subtype
|
133
|
+
end
|
105
134
|
def create_link(name, many, opts)
|
106
135
|
link = @links[name] = Link.new(self, name, many)
|
107
136
|
opts.each_pair do |key, val|
|
@@ -111,6 +140,16 @@ module PgGraphQl
|
|
111
140
|
end
|
112
141
|
end
|
113
142
|
|
143
|
+
class SubType
|
144
|
+
attr_accessor :name, :table, :fk
|
145
|
+
def initialize(type, name)
|
146
|
+
@type = type
|
147
|
+
@name = name
|
148
|
+
@table = nil
|
149
|
+
@fk = nil
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
114
153
|
class Link
|
115
154
|
attr_accessor :name, :filter, :fk, :order_by
|
116
155
|
def initialize(owner, name, many)
|
data/test/test_pggraphql.rb
CHANGED
@@ -125,9 +125,74 @@ module PgGraphQl
|
|
125
125
|
), token(res)
|
126
126
|
end
|
127
127
|
|
128
|
-
|
129
|
-
#
|
130
|
-
|
128
|
+
#####################
|
129
|
+
# inherit
|
130
|
+
#####################
|
131
|
+
|
132
|
+
def test_inherit
|
133
|
+
res = to_sql({
|
134
|
+
products: {
|
135
|
+
id: [],
|
136
|
+
type: nil,
|
137
|
+
clickout__destination_url: nil,
|
138
|
+
download__download_url: nil,
|
139
|
+
download__users: {
|
140
|
+
id: "id",
|
141
|
+
orders: {
|
142
|
+
id: "id"
|
143
|
+
}
|
144
|
+
}
|
145
|
+
}
|
146
|
+
}) do |s|
|
147
|
+
s.root :product
|
148
|
+
|
149
|
+
s.type :user, fields: [:id, :email] do |t|
|
150
|
+
t.many :orders, fk: "user_id = users.id"
|
151
|
+
end
|
152
|
+
|
153
|
+
s.type :order
|
154
|
+
|
155
|
+
s.type :product, fields: [:id, :type, :clickout__destination_url, :download__download_url] do |t|
|
156
|
+
|
157
|
+
t.map :id, "products.id"
|
158
|
+
|
159
|
+
t.subtype :download, table: :product_downloads, fk: "download.id = products.id and products.type = 'download'"
|
160
|
+
t.subtype :clickout, table: :product_clickouts, fk: "clickout.id = products.id and products.type = 'clickout'"
|
161
|
+
|
162
|
+
t.many :download__users, type: :user, fk: "id = download.id"
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
assert_equal token(<<-SQL
|
168
|
+
select 'products'::text as key,
|
169
|
+
(select to_json(coalesce(json_agg(x.*), '[]'::json))
|
170
|
+
from (select products.id as id,
|
171
|
+
type,
|
172
|
+
clickout.destination_url as clickout__destination_url,
|
173
|
+
download.download_url as download__download_url,
|
174
|
+
(select to_json(coalesce(json_agg(x.*), '[]'::json))
|
175
|
+
from (select id,
|
176
|
+
(select to_json(coalesce(json_agg(x.*), '[]'::json))
|
177
|
+
from (select id
|
178
|
+
from orders
|
179
|
+
where (user_id = users.id)) x) as orders
|
180
|
+
from users
|
181
|
+
where (id = download.id)) x) as download__users
|
182
|
+
from products
|
183
|
+
left join product_downloads as download on (download.id = products.id
|
184
|
+
and products.type = 'download')
|
185
|
+
left join product_clickouts as clickout on (clickout.id = products.id
|
186
|
+
and products.type = 'clickout')) x) as value
|
187
|
+
SQL
|
188
|
+
), token(res)
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
|
193
|
+
#####################
|
194
|
+
# one
|
195
|
+
#####################
|
131
196
|
|
132
197
|
|
133
198
|
def test_link_one
|
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.0.
|
4
|
+
version: 0.0.4
|
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-03-
|
11
|
+
date: 2015-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|