arel_toolkit 0.2.0 → 0.3.0

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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/.travis.yml +8 -0
  4. data/CHANGELOG.md +56 -7
  5. data/Gemfile.lock +54 -1
  6. data/Guardfile +19 -12
  7. data/README.md +56 -2
  8. data/Rakefile +8 -0
  9. data/arel_toolkit.gemspec +6 -0
  10. data/bin/console +1 -0
  11. data/lib/arel/extensions/assignment.rb +22 -0
  12. data/lib/arel/extensions/at_time_zone.rb +30 -0
  13. data/lib/arel/extensions/contained_within_equals.rb +10 -0
  14. data/lib/arel/extensions/contains.rb +2 -2
  15. data/lib/arel/extensions/contains_equals.rb +10 -0
  16. data/lib/arel/extensions/delete_manager.rb +9 -0
  17. data/lib/arel/extensions/delete_statement.rb +7 -0
  18. data/lib/arel/extensions/distinct_from.rb +3 -16
  19. data/lib/arel/extensions/equality.rb +2 -4
  20. data/lib/arel/extensions/extract_from.rb +32 -0
  21. data/lib/arel/extensions/insert_manager.rb +5 -0
  22. data/lib/arel/extensions/insert_statement.rb +10 -3
  23. data/lib/arel/extensions/json_get_field.rb +10 -0
  24. data/lib/arel/extensions/json_get_object.rb +10 -0
  25. data/lib/arel/extensions/json_path_get_field.rb +10 -0
  26. data/lib/arel/extensions/json_path_get_object.rb +10 -0
  27. data/lib/arel/extensions/jsonb_all_key_exists.rb +10 -0
  28. data/lib/arel/extensions/jsonb_any_key_exists.rb +10 -0
  29. data/lib/arel/extensions/jsonb_key_exists.rb +10 -0
  30. data/lib/arel/extensions/named_argument.rb +29 -0
  31. data/lib/arel/extensions/not_distinct_from.rb +3 -16
  32. data/lib/arel/extensions/not_equal.rb +2 -4
  33. data/lib/arel/extensions/overlap.rb +1 -1
  34. data/lib/arel/extensions/overlaps.rb +40 -0
  35. data/lib/arel/extensions/overlay.rb +44 -0
  36. data/lib/arel/extensions/position.rb +32 -0
  37. data/lib/arel/extensions/select_manager.rb +9 -0
  38. data/lib/arel/extensions/substring.rb +38 -0
  39. data/lib/arel/extensions/transaction.rb +50 -0
  40. data/lib/arel/extensions/trim.rb +36 -0
  41. data/lib/arel/extensions/type_cast.rb +4 -0
  42. data/lib/arel/{sql_to_arel → extensions}/unbound_column_reference.rb +1 -1
  43. data/lib/arel/extensions/update_manager.rb +9 -0
  44. data/lib/arel/extensions/update_statement.rb +8 -0
  45. data/lib/arel/extensions/variable_set.rb +46 -0
  46. data/lib/arel/extensions/variable_show.rb +31 -0
  47. data/lib/arel/extensions.rb +26 -0
  48. data/lib/arel/middleware/chain.rb +97 -0
  49. data/lib/arel/middleware/postgresql_adapter.rb +26 -0
  50. data/lib/arel/middleware/railtie.rb +11 -0
  51. data/lib/arel/middleware.rb +23 -0
  52. data/lib/arel/sql_formatter.rb +59 -0
  53. data/lib/arel/sql_to_arel/error.rb +6 -0
  54. data/lib/arel/sql_to_arel/pg_query_visitor/frame_options.rb +112 -0
  55. data/lib/arel/sql_to_arel/pg_query_visitor.rb +271 -52
  56. data/lib/arel/sql_to_arel/result.rb +17 -0
  57. data/lib/arel/sql_to_arel.rb +4 -3
  58. data/lib/arel_toolkit/version.rb +1 -1
  59. data/lib/arel_toolkit.rb +2 -0
  60. metadata +120 -4
  61. data/lib/arel/sql_to_arel/frame_options.rb +0 -110
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arel_toolkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - maarten
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-05-30 00:00:00.000000000 Z
11
+ date: 2019-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: arel
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 9.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 5.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 5.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: pg
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.1.4
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.1.4
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: pg_query
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +80,34 @@ dependencies:
52
80
  - - "~>"
53
81
  - !ruby/object:Gem::Version
54
82
  version: '2.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: dpl
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.10.11
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.10.11
97
+ - !ruby/object:Gem::Dependency
98
+ name: github_changelog_generator
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.14.3
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.14.3
55
111
  - !ruby/object:Gem::Dependency
56
112
  name: rake
57
113
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +136,20 @@ dependencies:
80
136
  - - "~>"
81
137
  - !ruby/object:Gem::Version
82
138
  version: '3.8'
139
+ - !ruby/object:Gem::Dependency
140
+ name: database_cleaner
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 1.7.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 1.7.0
83
153
  - !ruby/object:Gem::Dependency
84
154
  name: simplecov
85
155
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +220,20 @@ dependencies:
150
220
  - - "~>"
151
221
  - !ruby/object:Gem::Version
152
222
  version: '4.7'
223
+ - !ruby/object:Gem::Dependency
224
+ name: guard-rubocop
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: 1.3.0
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: 1.3.0
153
237
  - !ruby/object:Gem::Dependency
154
238
  name: pry
155
239
  requirement: !ruby/object:Gem::Requirement
@@ -253,13 +337,17 @@ files:
253
337
  - lib/arel/extensions/any.rb
254
338
  - lib/arel/extensions/array.rb
255
339
  - lib/arel/extensions/array_subselect.rb
340
+ - lib/arel/extensions/assignment.rb
341
+ - lib/arel/extensions/at_time_zone.rb
256
342
  - lib/arel/extensions/between_symmetric.rb
257
343
  - lib/arel/extensions/bit_string.rb
258
344
  - lib/arel/extensions/bitwise_xor.rb
259
345
  - lib/arel/extensions/coalesce.rb
260
346
  - lib/arel/extensions/conflict.rb
261
347
  - lib/arel/extensions/contained_by.rb
348
+ - lib/arel/extensions/contained_within_equals.rb
262
349
  - lib/arel/extensions/contains.rb
350
+ - lib/arel/extensions/contains_equals.rb
263
351
  - lib/arel/extensions/cross_join.rb
264
352
  - lib/arel/extensions/cube_root.rb
265
353
  - lib/arel/extensions/current_catalog.rb
@@ -271,24 +359,35 @@ files:
271
359
  - lib/arel/extensions/current_timestamp.rb
272
360
  - lib/arel/extensions/current_user.rb
273
361
  - lib/arel/extensions/default_values.rb
362
+ - lib/arel/extensions/delete_manager.rb
274
363
  - lib/arel/extensions/delete_statement.rb
275
364
  - lib/arel/extensions/distinct_from.rb
276
365
  - lib/arel/extensions/equality.rb
277
366
  - lib/arel/extensions/except_all.rb
278
367
  - lib/arel/extensions/exponentiation.rb
368
+ - lib/arel/extensions/extract_from.rb
279
369
  - lib/arel/extensions/factorial.rb
280
370
  - lib/arel/extensions/function.rb
281
371
  - lib/arel/extensions/generate_series.rb
282
372
  - lib/arel/extensions/greatest.rb
283
373
  - lib/arel/extensions/indirection.rb
284
374
  - lib/arel/extensions/infer.rb
375
+ - lib/arel/extensions/insert_manager.rb
285
376
  - lib/arel/extensions/insert_statement.rb
286
377
  - lib/arel/extensions/intersect_all.rb
378
+ - lib/arel/extensions/json_get_field.rb
379
+ - lib/arel/extensions/json_get_object.rb
380
+ - lib/arel/extensions/json_path_get_field.rb
381
+ - lib/arel/extensions/json_path_get_object.rb
382
+ - lib/arel/extensions/jsonb_all_key_exists.rb
383
+ - lib/arel/extensions/jsonb_any_key_exists.rb
384
+ - lib/arel/extensions/jsonb_key_exists.rb
287
385
  - lib/arel/extensions/lateral.rb
288
386
  - lib/arel/extensions/least.rb
289
387
  - lib/arel/extensions/local_time.rb
290
388
  - lib/arel/extensions/local_timestamp.rb
291
389
  - lib/arel/extensions/modulo.rb
390
+ - lib/arel/extensions/named_argument.rb
292
391
  - lib/arel/extensions/named_function.rb
293
392
  - lib/arel/extensions/natural_join.rb
294
393
  - lib/arel/extensions/not_between.rb
@@ -299,25 +398,42 @@ files:
299
398
  - lib/arel/extensions/null_if.rb
300
399
  - lib/arel/extensions/ordering.rb
301
400
  - lib/arel/extensions/overlap.rb
401
+ - lib/arel/extensions/overlaps.rb
402
+ - lib/arel/extensions/overlay.rb
403
+ - lib/arel/extensions/position.rb
302
404
  - lib/arel/extensions/range_function.rb
303
405
  - lib/arel/extensions/rank.rb
304
406
  - lib/arel/extensions/row.rb
407
+ - lib/arel/extensions/select_manager.rb
305
408
  - lib/arel/extensions/select_statement.rb
306
409
  - lib/arel/extensions/session_user.rb
307
410
  - lib/arel/extensions/set_to_default.rb
308
411
  - lib/arel/extensions/similar.rb
309
412
  - lib/arel/extensions/square_root.rb
413
+ - lib/arel/extensions/substring.rb
310
414
  - lib/arel/extensions/table.rb
311
415
  - lib/arel/extensions/time_with_precision.rb
416
+ - lib/arel/extensions/transaction.rb
417
+ - lib/arel/extensions/trim.rb
312
418
  - lib/arel/extensions/type_cast.rb
419
+ - lib/arel/extensions/unbound_column_reference.rb
313
420
  - lib/arel/extensions/unknown.rb
421
+ - lib/arel/extensions/update_manager.rb
314
422
  - lib/arel/extensions/update_statement.rb
315
423
  - lib/arel/extensions/user.rb
424
+ - lib/arel/extensions/variable_set.rb
425
+ - lib/arel/extensions/variable_show.rb
316
426
  - lib/arel/extensions/with_ordinality.rb
427
+ - lib/arel/middleware.rb
428
+ - lib/arel/middleware/chain.rb
429
+ - lib/arel/middleware/postgresql_adapter.rb
430
+ - lib/arel/middleware/railtie.rb
431
+ - lib/arel/sql_formatter.rb
317
432
  - lib/arel/sql_to_arel.rb
318
- - lib/arel/sql_to_arel/frame_options.rb
433
+ - lib/arel/sql_to_arel/error.rb
319
434
  - lib/arel/sql_to_arel/pg_query_visitor.rb
320
- - lib/arel/sql_to_arel/unbound_column_reference.rb
435
+ - lib/arel/sql_to_arel/pg_query_visitor/frame_options.rb
436
+ - lib/arel/sql_to_arel/result.rb
321
437
  - lib/arel_toolkit.rb
322
438
  - lib/arel_toolkit/version.rb
323
439
  homepage: https://github.com/mvgijssel/arel_toolkit
@@ -1,110 +0,0 @@
1
- module Arel
2
- module SqlToArel
3
- class FrameOptions
4
- class << self
5
- def arel(frame_options, start_offset, end_offset)
6
- frame_option_names = calculate_frame_option_names(frame_options)
7
- return unless frame_option_names.include?('FRAMEOPTION_NONDEFAULT')
8
-
9
- range_klass = if frame_option_names.include?('FRAMEOPTION_RANGE')
10
- Arel::Nodes::Range
11
- else
12
- Arel::Nodes::Rows
13
- end
14
-
15
- start_node = calculate_frame_node(
16
- 'FRAMEOPTION_START_',
17
- frame_option_names,
18
- start_offset,
19
- )
20
- end_node = calculate_frame_node(
21
- 'FRAMEOPTION_END_',
22
- frame_option_names,
23
- end_offset,
24
- )
25
-
26
- if frame_option_names.include?('FRAMEOPTION_BETWEEN')
27
- Arel::Nodes::Between.new(
28
- range_klass.new,
29
- Arel::Nodes::And.new([start_node, end_node]),
30
- )
31
- else
32
- range_klass.new start_node
33
- end
34
- end
35
-
36
- private
37
-
38
- # always NONDEFAULT
39
- # RANGE or ROWS
40
- # mandatory BETWEEN
41
- # RANGE only unbounded
42
- # ROWS all
43
- # https://github.com/postgres/postgres/blob/REL_10_1/src/include/nodes/parsenodes.h
44
- FRAMEOPTIONS = {
45
- 'FRAMEOPTION_NONDEFAULT' => 0x00001,
46
- 'FRAMEOPTION_RANGE' => 0x00002,
47
- 'FRAMEOPTION_ROWS' => 0x00004,
48
- 'FRAMEOPTION_BETWEEN' => 0x00008,
49
- 'FRAMEOPTION_START_UNBOUNDED_PRECEDING' => 0x00010,
50
- 'FRAMEOPTION_END_UNBOUNDED_PRECEDING' => 0x00020,
51
- 'FRAMEOPTION_START_UNBOUNDED_FOLLOWING' => 0x00040,
52
- 'FRAMEOPTION_END_UNBOUNDED_FOLLOWING' => 0x00080,
53
- 'FRAMEOPTION_START_CURRENT_ROW' => 0x00100,
54
- 'FRAMEOPTION_END_CURRENT_ROW' => 0x00200,
55
- 'FRAMEOPTION_START_VALUE_PRECEDING' => 0x00400,
56
- 'FRAMEOPTION_END_VALUE_PRECEDING' => 0x00800,
57
- 'FRAMEOPTION_START_VALUE_FOLLOWING' => 0x01000,
58
- 'FRAMEOPTION_END_VALUE_FOLLOWING' => 0x02000
59
- }.freeze
60
-
61
- def biggest_detractable_number(number, candidates)
62
- high_to_low_candidates = candidates.sort { |a, b| b <=> a }
63
- high_to_low_candidates.find do |candidate|
64
- number - candidate >= 0
65
- end
66
- end
67
-
68
- def calculate_frame_option_names(frame_options, names = [])
69
- return names if frame_options.zero?
70
-
71
- number = biggest_detractable_number(frame_options, FRAMEOPTIONS.values)
72
- name = FRAMEOPTIONS.key(number)
73
- calculate_frame_option_names(
74
- frame_options - number, names + [name]
75
- )
76
- end
77
-
78
- def calculate_frame_node(pattern, frame_option_names, offset)
79
- node_name = frame_option_names.select { |n| n.start_with?(pattern) }
80
- raise "Don't know how to handle multiple nodes" if node_name.length > 1
81
-
82
- node_name = node_name.first.gsub(/FRAMEOPTION_(START|END)_/, '')
83
- name_to_node(node_name, offset)
84
- end
85
-
86
- def name_to_node(node_name, offset)
87
- case node_name
88
- when 'UNBOUNDED_PRECEDING'
89
- Arel::Nodes::Preceding.new
90
-
91
- when 'UNBOUNDED_FOLLOWING'
92
- Arel::Nodes::Following.new
93
-
94
- when 'CURRENT_ROW'
95
- Arel::Nodes::CurrentRow.new
96
-
97
- when 'VALUE_PRECEDING'
98
- Arel::Nodes::Preceding.new offset
99
-
100
- when 'VALUE_FOLLOWING'
101
- Arel::Nodes::Following.new offset
102
-
103
- else
104
- raise "Unknown start / end frame node `#{node_name}`"
105
- end
106
- end
107
- end
108
- end
109
- end
110
- end