arel_toolkit 0.1.0 → 0.2.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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +29 -0
  3. data/.gitignore +5 -0
  4. data/.rubocop.yml +34 -0
  5. data/.ruby-version +1 -1
  6. data/.travis.yml +16 -2
  7. data/CHANGELOG.md +10 -0
  8. data/Gemfile +1 -1
  9. data/Gemfile.lock +94 -1
  10. data/Guardfile +42 -0
  11. data/README.md +23 -4
  12. data/Rakefile +3 -3
  13. data/arel_toolkit.gemspec +32 -15
  14. data/bin/console +4 -7
  15. data/lib/arel/extensions.rb +71 -0
  16. data/lib/arel/extensions/absolute.rb +10 -0
  17. data/lib/arel/extensions/all.rb +23 -0
  18. data/lib/arel/extensions/any.rb +23 -0
  19. data/lib/arel/extensions/array.rb +29 -0
  20. data/lib/arel/extensions/array_subselect.rb +23 -0
  21. data/lib/arel/extensions/between_symmetric.rb +23 -0
  22. data/lib/arel/extensions/bit_string.rb +27 -0
  23. data/lib/arel/extensions/bitwise_xor.rb +10 -0
  24. data/lib/arel/extensions/coalesce.rb +9 -0
  25. data/lib/arel/extensions/conflict.rb +47 -0
  26. data/lib/arel/extensions/contained_by.rb +10 -0
  27. data/lib/arel/extensions/contains.rb +10 -0
  28. data/lib/arel/extensions/cross_join.rb +21 -0
  29. data/lib/arel/extensions/cube_root.rb +10 -0
  30. data/lib/arel/extensions/current_catalog.rb +20 -0
  31. data/lib/arel/extensions/current_date.rb +20 -0
  32. data/lib/arel/extensions/current_of_expression.rb +29 -0
  33. data/lib/arel/extensions/current_role.rb +20 -0
  34. data/lib/arel/extensions/current_schema.rb +20 -0
  35. data/lib/arel/extensions/current_time.rb +22 -0
  36. data/lib/arel/extensions/current_timestamp.rb +22 -0
  37. data/lib/arel/extensions/current_user.rb +20 -0
  38. data/lib/arel/extensions/default_values.rb +21 -0
  39. data/lib/arel/extensions/delete_statement.rb +49 -0
  40. data/lib/arel/extensions/distinct_from.rb +22 -0
  41. data/lib/arel/extensions/equality.rb +30 -0
  42. data/lib/arel/extensions/except_all.rb +21 -0
  43. data/lib/arel/extensions/exponentiation.rb +10 -0
  44. data/lib/arel/extensions/factorial.rb +33 -0
  45. data/lib/arel/extensions/function.rb +68 -0
  46. data/lib/arel/extensions/generate_series.rb +9 -0
  47. data/lib/arel/extensions/greatest.rb +9 -0
  48. data/lib/arel/extensions/indirection.rb +32 -0
  49. data/lib/arel/extensions/infer.rb +35 -0
  50. data/lib/arel/extensions/insert_statement.rb +69 -0
  51. data/lib/arel/extensions/intersect_all.rb +21 -0
  52. data/lib/arel/extensions/lateral.rb +34 -0
  53. data/lib/arel/extensions/least.rb +9 -0
  54. data/lib/arel/extensions/local_time.rb +22 -0
  55. data/lib/arel/extensions/local_timestamp.rb +22 -0
  56. data/lib/arel/extensions/modulo.rb +10 -0
  57. data/lib/arel/extensions/named_function.rb +15 -0
  58. data/lib/arel/extensions/natural_join.rb +21 -0
  59. data/lib/arel/extensions/not_between.rb +22 -0
  60. data/lib/arel/extensions/not_between_symmetric.rb +23 -0
  61. data/lib/arel/extensions/not_distinct_from.rb +22 -0
  62. data/lib/arel/extensions/not_equal.rb +30 -0
  63. data/lib/arel/extensions/not_similar.rb +29 -0
  64. data/lib/arel/extensions/null_if.rb +24 -0
  65. data/lib/arel/extensions/ordering.rb +47 -0
  66. data/lib/arel/extensions/overlap.rb +10 -0
  67. data/lib/arel/extensions/range_function.rb +23 -0
  68. data/lib/arel/extensions/rank.rb +9 -0
  69. data/lib/arel/extensions/row.rb +30 -0
  70. data/lib/arel/extensions/select_statement.rb +26 -0
  71. data/lib/arel/extensions/session_user.rb +20 -0
  72. data/lib/arel/extensions/set_to_default.rb +21 -0
  73. data/lib/arel/extensions/similar.rb +32 -0
  74. data/lib/arel/extensions/square_root.rb +10 -0
  75. data/lib/arel/extensions/table.rb +49 -0
  76. data/lib/arel/extensions/time_with_precision.rb +13 -0
  77. data/lib/arel/extensions/type_cast.rb +30 -0
  78. data/lib/arel/extensions/unknown.rb +20 -0
  79. data/lib/arel/extensions/update_statement.rb +63 -0
  80. data/lib/arel/extensions/user.rb +20 -0
  81. data/lib/arel/extensions/with_ordinality.rb +22 -0
  82. data/lib/arel/sql_to_arel.rb +8 -0
  83. data/lib/arel/sql_to_arel/frame_options.rb +110 -0
  84. data/lib/arel/sql_to_arel/pg_query_visitor.rb +1005 -0
  85. data/lib/arel/sql_to_arel/unbound_column_reference.rb +5 -0
  86. data/lib/arel_toolkit.rb +4 -3
  87. data/lib/arel_toolkit/version.rb +1 -1
  88. metadata +250 -4
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.4/functions-math.html
4
+ class Absolute < Arel::Nodes::UnaryOperation
5
+ def initialize(operand)
6
+ super('@', operand)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,23 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ # Postgres: https://www.postgresql.org/docs/8.1/sql-select.html
7
+ class All < Arel::Nodes::Unary
8
+ end
9
+ end
10
+
11
+ module Visitors
12
+ class ToSql
13
+ def visit_Arel_Nodes_All(o, collector)
14
+ collector << 'ALL('
15
+ visit o.expr, collector
16
+ collector << ')'
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ # rubocop:enable Naming/MethodName
23
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,23 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ # Postgres: https://www.postgresql.org/docs/9.1/functions-comparisons.html
7
+ class Any < Arel::Nodes::Unary
8
+ end
9
+ end
10
+
11
+ module Visitors
12
+ class ToSql
13
+ def visit_Arel_Nodes_Any(o, collector)
14
+ collector << 'ANY('
15
+ visit o.expr, collector
16
+ collector << ')'
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ # rubocop:enable Naming/MethodName
23
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,29 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ class Array < Arel::Nodes::Node
7
+ attr_reader :items
8
+
9
+ def initialize(items)
10
+ super()
11
+
12
+ @items = items
13
+ end
14
+ end
15
+ end
16
+
17
+ module Visitors
18
+ class ToSql
19
+ def visit_Arel_Nodes_Array(o, collector)
20
+ collector << 'ARRAY['
21
+ inject_join(o.items, collector, ', ')
22
+ collector << ']'
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ # rubocop:enable Naming/MethodName
29
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,23 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ # Postgres: https://www.postgresql.org/docs/9.1/functions-comparisons.html
7
+ class ArraySubselect < Arel::Nodes::Unary
8
+ end
9
+ end
10
+
11
+ module Visitors
12
+ class ToSql
13
+ def visit_Arel_Nodes_ArraySubselect(o, collector)
14
+ collector << 'ARRAY('
15
+ visit o.expr, collector
16
+ collector << ')'
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ # rubocop:enable Naming/MethodName
23
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,23 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ # Postgres: https://www.postgresql.org/docs/9.1/functions-comparison.html
7
+ class BetweenSymmetric < Arel::Nodes::Between
8
+ end
9
+ end
10
+
11
+ module Visitors
12
+ class ToSql
13
+ def visit_Arel_Nodes_BetweenSymmetric(o, collector)
14
+ collector = visit o.left, collector
15
+ collector << ' BETWEEN SYMMETRIC '
16
+ visit o.right, collector
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ # rubocop:enable Naming/MethodName
23
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,27 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ class BitString < Arel::Nodes::Node
7
+ attr_reader :str
8
+
9
+ def initialize(str)
10
+ super()
11
+
12
+ @str = str
13
+ end
14
+ end
15
+ end
16
+
17
+ module Visitors
18
+ class ToSql
19
+ def visit_Arel_Nodes_BitString(o, collector)
20
+ collector << "B'#{o.str[1..-1]}'"
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ # rubocop:enable Naming/MethodName
27
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://github.com/mvgijssel/arel_toolkit/issues/45
4
+ class BitwiseXor < InfixOperation
5
+ def initialize(left, right)
6
+ super('#', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module Arel
2
+ module Nodes
3
+ class Coalesce < Arel::Nodes::NamedFunction
4
+ def initialize(args)
5
+ super 'COALESCE', args
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,47 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ # https://www.postgresql.org/docs/9.5/sql-insert.html
7
+ class Conflict < Arel::Nodes::Node
8
+ attr_accessor :action
9
+ attr_accessor :infer
10
+ attr_accessor :values
11
+ attr_accessor :wheres
12
+ end
13
+ end
14
+
15
+ module Visitors
16
+ class ToSql
17
+ # rubocop:disable Metrics/AbcSize
18
+ def visit_Arel_Nodes_Conflict(o, collector)
19
+ collector << ' ON CONFLICT '
20
+
21
+ visit(o.infer, collector) if o.infer
22
+
23
+ case o.action
24
+ when 1
25
+ collector << 'DO NOTHING'
26
+ when 2
27
+ collector << 'DO UPDATE SET '
28
+ else
29
+ raise "Unknown conflict clause `#{action}`"
30
+ end
31
+
32
+ o.values.any? && (inject_join o.values, collector, ', ')
33
+
34
+ if o.wheres.any?
35
+ collector << ' WHERE '
36
+ collector = inject_join o.wheres, collector, ' AND '
37
+ end
38
+
39
+ collector
40
+ end
41
+ # rubocop:enable Metrics/AbcSize
42
+ end
43
+ end
44
+ end
45
+
46
+ # rubocop:enable Naming/MethodName
47
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.1/functions-array.html
4
+ class ContainedBy < InfixOperation
5
+ def initialize(left, right)
6
+ super('<@', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.1/functions-array.html
4
+ class Contains < InfixOperation
5
+ def initialize(left, right)
6
+ super('@>', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ class CrossJoin < Arel::Nodes::Join
7
+ end
8
+ end
9
+
10
+ module Visitors
11
+ class ToSql
12
+ def visit_Arel_Nodes_CrossJoin(o, collector)
13
+ collector << 'CROSS JOIN '
14
+ visit o.left, collector
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ # rubocop:enable Naming/MethodName
21
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.4/functions-math.html
4
+ class CubeRoot < Arel::Nodes::UnaryOperation
5
+ def initialize(operand)
6
+ super('||/', operand)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,20 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ class CurrentCatalog < Arel::Nodes::Node
7
+ end
8
+ end
9
+
10
+ module Visitors
11
+ class ToSql
12
+ def visit_Arel_Nodes_CurrentCatalog(_o, collector)
13
+ collector << 'current_catalog'
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ # rubocop:enable Naming/MethodName
20
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,20 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ class CurrentDate < Arel::Nodes::Node
7
+ end
8
+ end
9
+
10
+ module Visitors
11
+ class ToSql
12
+ def visit_Arel_Nodes_CurrentDate(_o, collector)
13
+ collector << 'current_date'
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ # rubocop:enable Naming/MethodName
20
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,29 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ # https://www.postgresql.org/docs/10/sql-update.html
7
+ class CurrentOfExpression < Arel::Nodes::Node
8
+ attr_accessor :cursor_name
9
+
10
+ def initialize(cursor_name)
11
+ super()
12
+
13
+ @cursor_name = cursor_name
14
+ end
15
+ end
16
+ end
17
+
18
+ module Visitors
19
+ class ToSql
20
+ def visit_Arel_Nodes_CurrentOfExpression(o, collector)
21
+ collector << 'CURRENT OF '
22
+ collector << o.cursor_name
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ # rubocop:enable Naming/MethodName
29
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,20 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ class CurrentRole < Arel::Nodes::Node
7
+ end
8
+ end
9
+
10
+ module Visitors
11
+ class ToSql
12
+ def visit_Arel_Nodes_CurrentRole(_o, collector)
13
+ collector << 'current_role'
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ # rubocop:enable Naming/MethodName
20
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,20 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ class CurrentSchema < Arel::Nodes::Node
7
+ end
8
+ end
9
+
10
+ module Visitors
11
+ class ToSql
12
+ def visit_Arel_Nodes_CurrentSchema(_o, collector)
13
+ collector << 'current_schema'
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ # rubocop:enable Naming/MethodName
20
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,22 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ class CurrentTime < TimeWithPrecision
7
+ end
8
+ end
9
+
10
+ module Visitors
11
+ class ToSql
12
+ def visit_Arel_Nodes_CurrentTime(o, collector)
13
+ collector << 'current_time'
14
+ collector << "(#{o.precision.to_i})" if o.precision
15
+ collector
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ # rubocop:enable Naming/MethodName
22
+ # rubocop:enable Naming/UncommunicativeMethodParamName