active_record_query_fixer 0.0.13 → 0.0.14
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/active_record_query_fixer.rb +30 -27
- data/lib/active_record_query_fixer/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: d5997cfbf763c93ff62479b46f02fa52c769723be216b7c2f60e57847e90a41e
|
4
|
+
data.tar.gz: d7fc6189ee2f6ad8c8af6244ab1f9e1e8ab8f67b9ba5142f3465460efcf589cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 942395bf5a468635a435503793793c80e914b2b37036033b0ab7fd9fc714a6c8e16d46be0167088ad9eaf4b308cc0c1274db45b4668ec2aa96e45808e55d4215
|
7
|
+
data.tar.gz: 155a52f9bcc3720b1bff57fae6ccafe5167b3ae9b515fedb5e257a109e702f2f5227a7813b743aad256389e45fd4d6e475ec08e8d32611def21cabecf396727d
|
@@ -3,14 +3,17 @@ require "dig_bang"
|
|
3
3
|
class ActiveRecordQueryFixer
|
4
4
|
autoload :RelationExtentions, "#{__dir__}/active_record_query_fixer/relation_extentions"
|
5
5
|
|
6
|
-
attr_reader :query
|
6
|
+
attr_reader :count_select, :query
|
7
|
+
|
8
|
+
delegate :connection, to: :query
|
9
|
+
delegate :quote_column_name, :quote_table_name, to: :connection
|
7
10
|
|
8
11
|
def self.fix(query)
|
9
12
|
new(query: query).fix.query
|
10
13
|
end
|
11
14
|
|
12
|
-
def initialize(
|
13
|
-
@query =
|
15
|
+
def initialize(query:)
|
16
|
+
@query = query
|
14
17
|
@count_select = 0
|
15
18
|
end
|
16
19
|
|
@@ -23,55 +26,57 @@ class ActiveRecordQueryFixer
|
|
23
26
|
self
|
24
27
|
end
|
25
28
|
|
26
|
-
def fix_select_group
|
29
|
+
def fix_select_group # rubocop:disable Metrics/AbcSize
|
27
30
|
select_targets.each do |select_target|
|
28
|
-
fields = select_target.
|
31
|
+
fields = select_target.res_target.val.column_ref.fields
|
29
32
|
next if !fields || fields.length != 2
|
30
33
|
|
31
|
-
table = fields[0].
|
32
|
-
column = fields[1].
|
34
|
+
table = fields[0].string.str
|
35
|
+
column = fields[1].string&.str
|
33
36
|
|
34
37
|
if column
|
35
38
|
# A table and a column has been selected - make sure to group by that
|
36
|
-
@query = query.group("#{table}.#{column}")
|
37
|
-
elsif fields[1].
|
39
|
+
@query = query.group("#{quote_table_name(table)}.#{quote_column_name(column)}")
|
40
|
+
elsif fields[1].a_star
|
38
41
|
# A table and a star has been selected - assume the primary key is called "id" and group by that
|
39
|
-
@query = query.group("#{table}
|
42
|
+
@query = query.group("#{quote_table_name(table)}.#{quote_column_name("id")}")
|
40
43
|
end
|
41
44
|
end
|
42
45
|
|
43
46
|
self
|
44
47
|
end
|
45
48
|
|
46
|
-
def fix_order_group
|
49
|
+
def fix_order_group # rubocop:disable Metrics/AbcSize
|
47
50
|
@query = query.group(query.model.arel_table[query.model.primary_key])
|
48
51
|
|
49
52
|
sort_targets.each do |sort_target|
|
50
|
-
fields = sort_target.
|
53
|
+
fields = sort_target.sort_by.node.column_ref&.fields
|
54
|
+
|
51
55
|
next if !fields || fields.length != 2
|
52
56
|
|
53
|
-
table = fields.
|
54
|
-
column = fields.
|
57
|
+
table = fields[0].string.str
|
58
|
+
column = fields[1].string.str
|
55
59
|
|
56
|
-
@query = query.group("#{table}.#{column}") if table && column
|
60
|
+
@query = query.group("#{quote_table_name(table)}.#{quote_column_name(column)}") if table && column
|
57
61
|
end
|
58
62
|
|
59
63
|
self
|
60
64
|
end
|
61
65
|
|
62
|
-
def fix_order_select_distinct
|
66
|
+
def fix_order_select_distinct # rubocop:disable Metrics/AbcSize
|
63
67
|
select_appends = []
|
64
68
|
|
65
69
|
sort_targets.each do |sort_target|
|
66
|
-
fields = sort_target.
|
70
|
+
fields = sort_target.sort_by.node.column_ref.fields
|
67
71
|
next if !fields || fields.length != 2
|
68
72
|
|
69
|
-
table = fields.
|
70
|
-
column = fields.
|
73
|
+
table = fields[0].string.str
|
74
|
+
column = fields[1].string.str
|
71
75
|
|
72
76
|
next if !table || !column
|
73
77
|
|
74
|
-
select_appends << "#{table}.#{column} AS active_record_query_fixer_#{
|
78
|
+
select_appends << "#{quote_table_name(table)}.#{quote_column_name(column)} AS active_record_query_fixer_#{count_select}"
|
79
|
+
|
75
80
|
@count_select += 1
|
76
81
|
end
|
77
82
|
|
@@ -89,7 +94,7 @@ class ActiveRecordQueryFixer
|
|
89
94
|
@query = query.group(query.model.arel_table[query.model.primary_key])
|
90
95
|
|
91
96
|
query.values[:references].each do |reference|
|
92
|
-
@query = query.group("#{reference}
|
97
|
+
@query = query.group("#{quote_table_name(reference)}.#{quote_column_name("id")}")
|
93
98
|
end
|
94
99
|
|
95
100
|
self
|
@@ -128,7 +133,7 @@ private
|
|
128
133
|
end
|
129
134
|
|
130
135
|
def select_table_wildcard_sql
|
131
|
-
@select_table_wildcard_sql ||= "#{query.table_name}.*"
|
136
|
+
@select_table_wildcard_sql ||= "#{quote_table_name(query.table_name)}.*"
|
132
137
|
end
|
133
138
|
|
134
139
|
def table_wildcard_prepended?
|
@@ -136,17 +141,15 @@ private
|
|
136
141
|
end
|
137
142
|
|
138
143
|
def select_statement
|
139
|
-
@select_statement ||= parsed_query.tree.
|
144
|
+
@select_statement ||= parsed_query.tree.stmts.fetch(0).stmt.select_stmt
|
140
145
|
end
|
141
146
|
|
142
147
|
def select_targets
|
143
|
-
@select_targets ||= select_statement.
|
148
|
+
@select_targets ||= select_statement.target_list
|
144
149
|
end
|
145
150
|
|
146
151
|
def sort_targets
|
147
|
-
|
148
|
-
|
149
|
-
@sort_targets ||= parsed_query.tree.dig!(0, "RawStmt", "stmt", "SelectStmt", "sortClause")
|
152
|
+
@sort_targets ||= select_statement.sort_clause
|
150
153
|
end
|
151
154
|
end
|
152
155
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record_query_fixer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kaspernj
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dig_bang
|