pghero 2.8.0 → 2.8.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of pghero might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/pghero/methods/suggested_indexes.rb +99 -26
- data/lib/pghero/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b4a596a016b5c33a99013818181ef967c26dcec092ee787b6629eac091ad121
|
4
|
+
data.tar.gz: 63fc2a949a62828a4537e54fb087c5a5b143bc88ab2753b4d777d4f793fb34ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: beda0eb3c89c9a3928b9d998e7e9ae8858adda77873c9dc0d03836498a765c219815c6441b814d3b23da78f02f759d71737eb51236135cfb72c6372358043c37
|
7
|
+
data.tar.gz: 020de38d5b406ede495f44ad16ce6a5bde8ebb59c49027af4dc49afb88cf768bc20f3c064fe72070f2739eb2979d2b95d0f7cdbdd106851252e6c81f646d3e82
|
data/CHANGELOG.md
CHANGED
@@ -201,36 +201,69 @@ module PgHero
|
|
201
201
|
rescue PgQuery::ParseError
|
202
202
|
return {error: "Parse error"}
|
203
203
|
end
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
204
|
+
|
205
|
+
if PgQuery::VERSION.to_i >= 2
|
206
|
+
return {error: "Unknown structure"} unless tree.stmts.size == 1
|
207
|
+
|
208
|
+
tree = tree.stmts.first.stmt
|
209
|
+
|
210
|
+
table = parse_table_v2(tree) rescue nil
|
211
|
+
unless table
|
212
|
+
error =
|
213
|
+
case tree.node
|
214
|
+
when :insert_stmt
|
215
|
+
"INSERT statement"
|
216
|
+
when :variable_set_stmt
|
217
|
+
"SET statement"
|
218
|
+
when :select_stmt
|
219
|
+
if (tree.select_stmt.from_clause.first.join_expr rescue false)
|
220
|
+
"JOIN not supported yet"
|
221
|
+
end
|
222
222
|
end
|
223
|
-
|
224
|
-
|
225
|
-
|
223
|
+
return {error: error || "Unknown structure"}
|
224
|
+
end
|
225
|
+
|
226
|
+
select = tree[tree.node.to_s]
|
227
|
+
where = (select.where_clause ? parse_where_v2(select.where_clause) : []) rescue nil
|
228
|
+
return {error: "Unknown structure"} unless where
|
229
|
+
|
230
|
+
sort = (select.sort_clause ? parse_sort_v2(select.sort_clause) : []) rescue []
|
231
|
+
|
232
|
+
{table: table, where: where, sort: sort}
|
233
|
+
else
|
234
|
+
# TODO remove support for pg_query < 2 in PgHero 3.0
|
235
|
+
|
236
|
+
return {error: "Unknown structure"} unless tree.size == 1
|
237
|
+
|
238
|
+
tree = tree.first
|
239
|
+
|
240
|
+
# pg_query 1.0.0
|
241
|
+
tree = tree["RawStmt"]["stmt"] if tree["RawStmt"]
|
242
|
+
|
243
|
+
table = parse_table(tree) rescue nil
|
244
|
+
unless table
|
245
|
+
error =
|
246
|
+
case tree.keys.first
|
247
|
+
when "InsertStmt"
|
248
|
+
"INSERT statement"
|
249
|
+
when "VariableSetStmt"
|
250
|
+
"SET statement"
|
251
|
+
when "SelectStmt"
|
252
|
+
if (tree["SelectStmt"]["fromClause"].first["JoinExpr"] rescue false)
|
253
|
+
"JOIN not supported yet"
|
254
|
+
end
|
255
|
+
end
|
256
|
+
return {error: error || "Unknown structure"}
|
257
|
+
end
|
226
258
|
|
227
|
-
|
228
|
-
|
229
|
-
|
259
|
+
select = tree.values.first
|
260
|
+
where = (select["whereClause"] ? parse_where(select["whereClause"]) : []) rescue nil
|
261
|
+
return {error: "Unknown structure"} unless where
|
230
262
|
|
231
|
-
|
263
|
+
sort = (select["sortClause"] ? parse_sort(select["sortClause"]) : []) rescue []
|
232
264
|
|
233
|
-
|
265
|
+
{table: table, where: where, sort: sort}
|
266
|
+
end
|
234
267
|
end
|
235
268
|
|
236
269
|
# TODO better row estimation
|
@@ -267,6 +300,17 @@ module PgHero
|
|
267
300
|
end
|
268
301
|
end
|
269
302
|
|
303
|
+
def parse_table_v2(tree)
|
304
|
+
case tree.node
|
305
|
+
when :select_stmt
|
306
|
+
tree.select_stmt.from_clause.first.range_var.relname
|
307
|
+
when :delete_stmt
|
308
|
+
tree.delete_stmt.relation.relname
|
309
|
+
when :update_stmt
|
310
|
+
tree.update_stmt.relation.relname
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
270
314
|
def parse_table(tree)
|
271
315
|
case tree.keys.first
|
272
316
|
when "SelectStmt"
|
@@ -278,6 +322,26 @@ module PgHero
|
|
278
322
|
end
|
279
323
|
end
|
280
324
|
|
325
|
+
# TODO capture values
|
326
|
+
def parse_where_v2(tree)
|
327
|
+
aexpr = tree.a_expr
|
328
|
+
|
329
|
+
if tree.bool_expr
|
330
|
+
if tree.bool_expr.boolop == :AND_EXPR
|
331
|
+
tree.bool_expr.args.flat_map { |v| parse_where_v2(v) }
|
332
|
+
else
|
333
|
+
raise "Not Implemented"
|
334
|
+
end
|
335
|
+
elsif aexpr && ["=", "<>", ">", ">=", "<", "<=", "~~", "~~*", "BETWEEN"].include?(aexpr.name.first.string.str)
|
336
|
+
[{column: aexpr.lexpr.column_ref.fields.last.string.str, op: aexpr.name.first.string.str}]
|
337
|
+
elsif tree.null_test
|
338
|
+
op = tree.null_test.nulltesttype == :IS_NOT_NULL ? "not_null" : "null"
|
339
|
+
[{column: tree.null_test.arg.column_ref.fields.last.string.str, op: op}]
|
340
|
+
else
|
341
|
+
raise "Not Implemented"
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
281
345
|
# TODO capture values
|
282
346
|
def parse_where(tree)
|
283
347
|
aexpr = tree["A_Expr"]
|
@@ -298,6 +362,15 @@ module PgHero
|
|
298
362
|
end
|
299
363
|
end
|
300
364
|
|
365
|
+
def parse_sort_v2(sort_clause)
|
366
|
+
sort_clause.map do |v|
|
367
|
+
{
|
368
|
+
column: v.sort_by.node.column_ref.fields.last.string.str,
|
369
|
+
direction: v.sort_by.sortby_dir == :SORTBY_DESC ? "desc" : "asc"
|
370
|
+
}
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
301
374
|
def parse_sort(sort_clause)
|
302
375
|
sort_clause.map do |v|
|
303
376
|
{
|
data/lib/pghero/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pghero
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.8.
|
4
|
+
version: 2.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03-
|
11
|
+
date: 2021-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|