arel_toolkit 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +29 -0
- data/.gitignore +5 -0
- data/.rubocop.yml +34 -0
- data/.ruby-version +1 -1
- data/.travis.yml +16 -2
- data/CHANGELOG.md +10 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +94 -1
- data/Guardfile +42 -0
- data/README.md +23 -4
- data/Rakefile +3 -3
- data/arel_toolkit.gemspec +32 -15
- data/bin/console +4 -7
- data/lib/arel/extensions.rb +71 -0
- data/lib/arel/extensions/absolute.rb +10 -0
- data/lib/arel/extensions/all.rb +23 -0
- data/lib/arel/extensions/any.rb +23 -0
- data/lib/arel/extensions/array.rb +29 -0
- data/lib/arel/extensions/array_subselect.rb +23 -0
- data/lib/arel/extensions/between_symmetric.rb +23 -0
- data/lib/arel/extensions/bit_string.rb +27 -0
- data/lib/arel/extensions/bitwise_xor.rb +10 -0
- data/lib/arel/extensions/coalesce.rb +9 -0
- data/lib/arel/extensions/conflict.rb +47 -0
- data/lib/arel/extensions/contained_by.rb +10 -0
- data/lib/arel/extensions/contains.rb +10 -0
- data/lib/arel/extensions/cross_join.rb +21 -0
- data/lib/arel/extensions/cube_root.rb +10 -0
- data/lib/arel/extensions/current_catalog.rb +20 -0
- data/lib/arel/extensions/current_date.rb +20 -0
- data/lib/arel/extensions/current_of_expression.rb +29 -0
- data/lib/arel/extensions/current_role.rb +20 -0
- data/lib/arel/extensions/current_schema.rb +20 -0
- data/lib/arel/extensions/current_time.rb +22 -0
- data/lib/arel/extensions/current_timestamp.rb +22 -0
- data/lib/arel/extensions/current_user.rb +20 -0
- data/lib/arel/extensions/default_values.rb +21 -0
- data/lib/arel/extensions/delete_statement.rb +49 -0
- data/lib/arel/extensions/distinct_from.rb +22 -0
- data/lib/arel/extensions/equality.rb +30 -0
- data/lib/arel/extensions/except_all.rb +21 -0
- data/lib/arel/extensions/exponentiation.rb +10 -0
- data/lib/arel/extensions/factorial.rb +33 -0
- data/lib/arel/extensions/function.rb +68 -0
- data/lib/arel/extensions/generate_series.rb +9 -0
- data/lib/arel/extensions/greatest.rb +9 -0
- data/lib/arel/extensions/indirection.rb +32 -0
- data/lib/arel/extensions/infer.rb +35 -0
- data/lib/arel/extensions/insert_statement.rb +69 -0
- data/lib/arel/extensions/intersect_all.rb +21 -0
- data/lib/arel/extensions/lateral.rb +34 -0
- data/lib/arel/extensions/least.rb +9 -0
- data/lib/arel/extensions/local_time.rb +22 -0
- data/lib/arel/extensions/local_timestamp.rb +22 -0
- data/lib/arel/extensions/modulo.rb +10 -0
- data/lib/arel/extensions/named_function.rb +15 -0
- data/lib/arel/extensions/natural_join.rb +21 -0
- data/lib/arel/extensions/not_between.rb +22 -0
- data/lib/arel/extensions/not_between_symmetric.rb +23 -0
- data/lib/arel/extensions/not_distinct_from.rb +22 -0
- data/lib/arel/extensions/not_equal.rb +30 -0
- data/lib/arel/extensions/not_similar.rb +29 -0
- data/lib/arel/extensions/null_if.rb +24 -0
- data/lib/arel/extensions/ordering.rb +47 -0
- data/lib/arel/extensions/overlap.rb +10 -0
- data/lib/arel/extensions/range_function.rb +23 -0
- data/lib/arel/extensions/rank.rb +9 -0
- data/lib/arel/extensions/row.rb +30 -0
- data/lib/arel/extensions/select_statement.rb +26 -0
- data/lib/arel/extensions/session_user.rb +20 -0
- data/lib/arel/extensions/set_to_default.rb +21 -0
- data/lib/arel/extensions/similar.rb +32 -0
- data/lib/arel/extensions/square_root.rb +10 -0
- data/lib/arel/extensions/table.rb +49 -0
- data/lib/arel/extensions/time_with_precision.rb +13 -0
- data/lib/arel/extensions/type_cast.rb +30 -0
- data/lib/arel/extensions/unknown.rb +20 -0
- data/lib/arel/extensions/update_statement.rb +63 -0
- data/lib/arel/extensions/user.rb +20 -0
- data/lib/arel/extensions/with_ordinality.rb +22 -0
- data/lib/arel/sql_to_arel.rb +8 -0
- data/lib/arel/sql_to_arel/frame_options.rb +110 -0
- data/lib/arel/sql_to_arel/pg_query_visitor.rb +1005 -0
- data/lib/arel/sql_to_arel/unbound_column_reference.rb +5 -0
- data/lib/arel_toolkit.rb +4 -3
- data/lib/arel_toolkit/version.rb +1 -1
- metadata +250 -4
@@ -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,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,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,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
|