query_optimizer 0.1.3 → 0.1.4
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/README.md +2 -2
- data/README.rdoc +220 -6
- data/lib/query_optimizer/version.rb +1 -1
- data/lib/query_optimizer.rb +20 -9
- data/query_optimizer.gemspec +2 -2
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44b32ac494ec80e6312efc98513f669dffbc1c55
|
4
|
+
data.tar.gz: 67212322656adebcdfa0844d9a67af76b0e49732
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8525bdf459d7fa634a5d8364e659261b126811b63c783dd67fe7b2ee2bcf3adce82361a88652a9bd5a859d1a22f78246febc82048bed06cbc853a66df2d687e
|
7
|
+
data.tar.gz: f6149a7af5461d70027a6a8c6f4a94d8a7ecfe6cdc04ee19645ee4af8f55525005b4c0c4eb24aae7a79cfb27c29d99503b4aac28a5a9c9c50a6dfe936a92432f
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# QueryOptimizer
|
2
2
|
|
3
|
-
This is rails gem which will minimize query for
|
4
|
-
Minimize query by query_optimizer just pass your
|
3
|
+
This is rails gem which will minimize query for one-to-one, one-to-many database relationships.
|
4
|
+
Minimize query by query_optimizer just pass your table name as Post.optimize_query(:comments)
|
5
5
|
|
6
6
|
## Installation
|
7
7
|
|
data/README.rdoc
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
== FEATURES:
|
8
8
|
|
9
|
-
query_optimizer is the best gem for optimizing query in rails for has_many and belongs_to relationship two tables.
|
9
|
+
query_optimizer is the best gem for optimizing query in rails for has_many or has_one and belongs_to relationship two tables.
|
10
10
|
In rails If you want all posts and its related comments in a single query than you can't get it
|
11
11
|
as Post.incldes(:comments) or Post.joins(:comments) will return only posts array and Comment.incldes(:posts) will return only comments array
|
12
12
|
For fetching each post comment you have to fire query from view as below output of post.comments in each with index loop.
|
@@ -29,16 +29,230 @@ For fetching each post comment you have to fire query from view as below output
|
|
29
29
|
Rendered posts/index.html.erb within layouts/application (31.7ms)
|
30
30
|
|
31
31
|
== DESCRIPTION:
|
32
|
-
so to minimize query you can use query_optimizer you can just pass your
|
32
|
+
so to minimize query you can use query_optimizer you can just pass your table name as Post.optimize_query(:comments)
|
33
33
|
|
34
34
|
require 'query_optimizer'
|
35
|
-
|
35
|
+
Post.optimize_query(:comments)
|
36
36
|
|
37
|
-
(1.1ms) SELECT posts.id AS posts_id,posts.name AS posts_name,posts.description AS posts_description,posts.created_at AS posts_created_at,posts.updated_at AS posts_updated_at,comments.id AS comments_id,comments.name AS comments_name,comments.description AS comments_description,comments.post_id AS comments_post_id,comments.created_at AS comments_created_at,comments.updated_at AS comments_updated_at FROM posts,
|
37
|
+
(1.1ms) SELECT posts.id AS posts_id,posts.name AS posts_name,posts.description AS posts_description,posts.created_at AS posts_created_at,posts.updated_at AS posts_updated_at,posts.author_id AS posts_author_id,comments.id AS comments_id,comments.name AS comments_name,comments.description AS comments_description,comments.post_id AS comments_post_id,comments.created_at AS comments_created_at,comments.updated_at AS comments_updated_at FROM posts,comments where posts.id=comments.post_id
|
38
38
|
|
39
|
-
=> [{"posts_id"=>
|
39
|
+
=> [{"posts_id"=>46,
|
40
|
+
"posts_name"=>"posts3",
|
41
|
+
"posts_description"=>"description3",
|
42
|
+
"posts_created_at"=>2015-02-01 10:41:14 UTC,
|
43
|
+
"posts_updated_at"=>2015-02-01 10:41:14 UTC,
|
44
|
+
"posts_author_id"=>2,
|
45
|
+
"comments_id"=>7,
|
46
|
+
"comments_name"=>"comment4",
|
47
|
+
"comments_description"=>"desc4",
|
48
|
+
"comments_post_id"=>46,
|
49
|
+
"comments_created_at"=>2015-10-10 16:51:32 UTC,
|
50
|
+
"comments_updated_at"=>2015-10-10 16:51:32 UTC},
|
51
|
+
{"posts_id"=>45,
|
52
|
+
"posts_name"=>"posts2",
|
53
|
+
"posts_description"=>"descriptio2",
|
54
|
+
"posts_created_at"=>2015-02-01 10:40:05 UTC,
|
55
|
+
"posts_updated_at"=>2015-02-01 10:40:05 UTC,
|
56
|
+
"posts_author_id"=>1,
|
57
|
+
"comments_id"=>5,
|
58
|
+
"comments_name"=>"comment2",
|
59
|
+
"comments_description"=>"desc2",
|
60
|
+
"comments_post_id"=>45,
|
61
|
+
"comments_created_at"=>2015-10-10 16:49:19 UTC,
|
62
|
+
"comments_updated_at"=>2015-10-10 16:49:19 UTC},
|
63
|
+
{"posts_id"=>44,
|
64
|
+
"posts_name"=>"postst1",
|
65
|
+
"posts_description"=>"description1",
|
66
|
+
"posts_created_at"=>2015-02-01 10:40:05 UTC,
|
67
|
+
"posts_updated_at"=>2015-02-01 10:40:05 UTC,
|
68
|
+
"posts_author_id"=>1,
|
69
|
+
"comments_id"=>6,
|
70
|
+
"comments_name"=>"comment3",
|
71
|
+
"comments_description"=>"desc3",
|
72
|
+
"comments_post_id"=>44,
|
73
|
+
"comments_created_at"=>2015-10-10 16:51:26 UTC,
|
74
|
+
"comments_updated_at"=>2015-10-10 16:51:26 UTC},
|
75
|
+
{"posts_id"=>44,
|
76
|
+
"posts_name"=>"postst1",
|
77
|
+
"posts_description"=>"description1",
|
78
|
+
"posts_created_at"=>2015-02-01 10:40:05 UTC,
|
79
|
+
"posts_updated_at"=>2015-02-01 10:40:05 UTC,
|
80
|
+
"posts_author_id"=>1,
|
81
|
+
"comments_id"=>4,
|
82
|
+
"comments_name"=>"comment1",
|
83
|
+
"comments_description"=>"desc1",
|
84
|
+
"comments_post_id"=>44,
|
85
|
+
"comments_created_at"=>2015-10-10 16:49:12 UTC,
|
86
|
+
"comments_updated_at"=>2015-10-10 16:49:12 UTC}]
|
87
|
+
|
88
|
+
It will return posts and its related comments in a single array.
|
89
|
+
|
90
|
+
It also works for multiple tables.If you want common data from posts,comments,replies table than you can use it as below
|
91
|
+
|
92
|
+
Post.optimize_query(:comments,:replies)
|
93
|
+
|
94
|
+
(1.2ms) SELECT posts.id AS posts_id,posts.name AS posts_name,posts.description AS posts_description,posts.created_at AS posts_created_at,posts.updated_at AS posts_updated_at,posts.author_id AS posts_author_id,comments.id AS comments_id,comments.name AS comments_name,comments.description AS comments_description,comments.post_id AS comments_post_id,comments.created_at AS comments_created_at,comments.updated_at AS comments_updated_at,replies.id AS replies_id,replies.description AS replies_description,replies.comment_id AS replies_comment_id,replies.created_at AS replies_created_at,replies.updated_at AS replies_updated_at FROM posts,comments,replies where posts.id=comments.post_id AND comments.id=replies.comment_id
|
95
|
+
|
96
|
+
=> [{"posts_id"=>46,
|
97
|
+
"posts_name"=>"posts3",
|
98
|
+
"posts_description"=>"description3",
|
99
|
+
"posts_created_at"=>2015-02-01 10:41:14 UTC,
|
100
|
+
"posts_updated_at"=>2015-02-01 10:41:14 UTC,
|
101
|
+
"posts_author_id"=>2,
|
102
|
+
"comments_id"=>7,
|
103
|
+
"comments_name"=>"comment4",
|
104
|
+
"comments_description"=>"desc4",
|
105
|
+
"comments_post_id"=>46,
|
106
|
+
"comments_created_at"=>2015-10-10 16:51:32 UTC,
|
107
|
+
"comments_updated_at"=>2015-10-10 16:51:32 UTC,
|
108
|
+
"replies_id"=>4,
|
109
|
+
"replies_description"=>"reply for author 2",
|
110
|
+
"replies_comment_id"=>7,
|
111
|
+
"replies_created_at"=>2015-12-19 19:05:46 UTC,
|
112
|
+
"replies_updated_at"=>2015-12-19 19:05:46 UTC},
|
113
|
+
{"posts_id"=>45,
|
114
|
+
"posts_name"=>"posts2",
|
115
|
+
"posts_description"=>"descriptio2",
|
116
|
+
"posts_created_at"=>2015-02-01 10:40:05 UTC,
|
117
|
+
"posts_updated_at"=>2015-02-01 10:40:05 UTC,
|
118
|
+
"posts_author_id"=>1,
|
119
|
+
"comments_id"=>5,
|
120
|
+
"comments_name"=>"comment2",
|
121
|
+
"comments_description"=>"desc2",
|
122
|
+
"comments_post_id"=>45,
|
123
|
+
"comments_created_at"=>2015-10-10 16:49:19 UTC,
|
124
|
+
"comments_updated_at"=>2015-10-10 16:49:19 UTC,
|
125
|
+
"replies_id"=>3,
|
126
|
+
"replies_description"=>"reply333",
|
127
|
+
"replies_comment_id"=>5,
|
128
|
+
"replies_created_at"=>2015-12-19 16:52:30 UTC,
|
129
|
+
"replies_updated_at"=>2015-12-19 16:52:30 UTC},
|
130
|
+
{"posts_id"=>44,
|
131
|
+
"posts_name"=>"postst1",
|
132
|
+
"posts_description"=>"description1",
|
133
|
+
"posts_created_at"=>2015-02-01 10:40:05 UTC,
|
134
|
+
"posts_updated_at"=>2015-02-01 10:40:05 UTC,
|
135
|
+
"posts_author_id"=>1,
|
136
|
+
"comments_id"=>4,
|
137
|
+
"comments_name"=>"comment1",
|
138
|
+
"comments_description"=>"desc1",
|
139
|
+
"comments_post_id"=>44,
|
140
|
+
"comments_created_at"=>2015-10-10 16:49:12 UTC,
|
141
|
+
"comments_updated_at"=>2015-10-10 16:49:12 UTC,
|
142
|
+
"replies_id"=>2,
|
143
|
+
"replies_description"=>"reply222",
|
144
|
+
"replies_comment_id"=>4,
|
145
|
+
"replies_created_at"=>2015-12-19 16:52:16 UTC,
|
146
|
+
"replies_updated_at"=>2015-12-19 16:52:16 UTC},
|
147
|
+
{"posts_id"=>44,
|
148
|
+
"posts_name"=>"postst1",
|
149
|
+
"posts_description"=>"description1",
|
150
|
+
"posts_created_at"=>2015-02-01 10:40:05 UTC,
|
151
|
+
"posts_updated_at"=>2015-02-01 10:40:05 UTC,
|
152
|
+
"posts_author_id"=>1,
|
153
|
+
"comments_id"=>4,
|
154
|
+
"comments_name"=>"comment1",
|
155
|
+
"comments_description"=>"desc1",
|
156
|
+
"comments_post_id"=>44,
|
157
|
+
"comments_created_at"=>2015-10-10 16:49:12 UTC,
|
158
|
+
"comments_updated_at"=>2015-10-10 16:49:12 UTC,
|
159
|
+
"replies_id"=>1,
|
160
|
+
"replies_description"=>"reply111111111",
|
161
|
+
"replies_comment_id"=>4,
|
162
|
+
"replies_created_at"=>2015-12-19 16:52:09 UTC,
|
163
|
+
"replies_updated_at"=>2015-12-19 16:52:09 UTC}]
|
164
|
+
|
165
|
+
Just pass multiple table name as arguments as below
|
166
|
+
|
167
|
+
Author.optimize_query(:posts,:comments,:replies)
|
168
|
+
|
169
|
+
(1.1ms) SELECT authors.id AS authors_id,authors.name AS authors_name,authors.created_at AS authors_created_at,authors.updated_at AS authors_updated_at,posts.id AS posts_id,posts.name AS posts_name,posts.description AS posts_description,posts.created_at AS posts_created_at,posts.updated_at AS posts_updated_at,posts.author_id AS posts_author_id,comments.id AS comments_id,comments.name AS comments_name,comments.description AS comments_description,comments.post_id AS comments_post_id,comments.created_at AS comments_created_at,comments.updated_at AS comments_updated_at,replies.id AS replies_id,replies.description AS replies_description,replies.comment_id AS replies_comment_id,replies.created_at AS replies_created_at,replies.updated_at AS replies_updated_at FROM authors,posts,comments,replies where authors.id=posts.author_id AND posts.id=comments.post_id AND comments.id=replies.comment_id
|
170
|
+
|
171
|
+
=> [{"authors_id"=>2,
|
172
|
+
"authors_name"=>"Author2",
|
173
|
+
"authors_created_at"=>2015-12-19 17:46:39 UTC,
|
174
|
+
"authors_updated_at"=>2015-12-19 17:46:39 UTC,
|
175
|
+
"posts_id"=>46,
|
176
|
+
"posts_name"=>"posts3",
|
177
|
+
"posts_description"=>"description3",
|
178
|
+
"posts_created_at"=>2015-02-01 10:41:14 UTC,
|
179
|
+
"posts_updated_at"=>2015-02-01 10:41:14 UTC,
|
180
|
+
"posts_author_id"=>2,
|
181
|
+
"comments_id"=>7,
|
182
|
+
"comments_name"=>"comment4",
|
183
|
+
"comments_description"=>"desc4",
|
184
|
+
"comments_post_id"=>46,
|
185
|
+
"comments_created_at"=>2015-10-10 16:51:32 UTC,
|
186
|
+
"comments_updated_at"=>2015-10-10 16:51:32 UTC,
|
187
|
+
"replies_id"=>4,
|
188
|
+
"replies_description"=>"reply for author 2",
|
189
|
+
"replies_comment_id"=>7,
|
190
|
+
"replies_created_at"=>2015-12-19 19:05:46 UTC,
|
191
|
+
"replies_updated_at"=>2015-12-19 19:05:46 UTC},
|
192
|
+
{"authors_id"=>1,
|
193
|
+
"authors_name"=>"Author1",
|
194
|
+
"authors_created_at"=>2015-12-19 17:46:32 UTC,
|
195
|
+
"authors_updated_at"=>2015-12-19 17:46:32 UTC,
|
196
|
+
"posts_id"=>45,
|
197
|
+
"posts_name"=>"posts2",
|
198
|
+
"posts_description"=>"descriptio2",
|
199
|
+
"posts_created_at"=>2015-02-01 10:40:05 UTC,
|
200
|
+
"posts_updated_at"=>2015-02-01 10:40:05 UTC,
|
201
|
+
"posts_author_id"=>1,
|
202
|
+
"comments_id"=>5,
|
203
|
+
"comments_name"=>"comment2",
|
204
|
+
"comments_description"=>"desc2",
|
205
|
+
"comments_post_id"=>45,
|
206
|
+
"comments_created_at"=>2015-10-10 16:49:19 UTC,
|
207
|
+
"comments_updated_at"=>2015-10-10 16:49:19 UTC,
|
208
|
+
"replies_id"=>3,
|
209
|
+
"replies_description"=>"reply333",
|
210
|
+
"replies_comment_id"=>5,
|
211
|
+
"replies_created_at"=>2015-12-19 16:52:30 UTC,
|
212
|
+
"replies_updated_at"=>2015-12-19 16:52:30 UTC},
|
213
|
+
{"authors_id"=>1,
|
214
|
+
"authors_name"=>"Author1",
|
215
|
+
"authors_created_at"=>2015-12-19 17:46:32 UTC,
|
216
|
+
"authors_updated_at"=>2015-12-19 17:46:32 UTC,
|
217
|
+
"posts_id"=>44,
|
218
|
+
"posts_name"=>"postst1",
|
219
|
+
"posts_description"=>"description1",
|
220
|
+
"posts_created_at"=>2015-02-01 10:40:05 UTC,
|
221
|
+
"posts_updated_at"=>2015-02-01 10:40:05 UTC,
|
222
|
+
"posts_author_id"=>1,
|
223
|
+
"comments_id"=>4,
|
224
|
+
"comments_name"=>"comment1",
|
225
|
+
"comments_description"=>"desc1",
|
226
|
+
"comments_post_id"=>44,
|
227
|
+
"comments_created_at"=>2015-10-10 16:49:12 UTC,
|
228
|
+
"comments_updated_at"=>2015-10-10 16:49:12 UTC,
|
229
|
+
"replies_id"=>2,
|
230
|
+
"replies_description"=>"reply222",
|
231
|
+
"replies_comment_id"=>4,
|
232
|
+
"replies_created_at"=>2015-12-19 16:52:16 UTC,
|
233
|
+
"replies_updated_at"=>2015-12-19 16:52:16 UTC},
|
234
|
+
{"authors_id"=>1,
|
235
|
+
"authors_name"=>"Author1",
|
236
|
+
"authors_created_at"=>2015-12-19 17:46:32 UTC,
|
237
|
+
"authors_updated_at"=>2015-12-19 17:46:32 UTC,
|
238
|
+
"posts_id"=>44,
|
239
|
+
"posts_name"=>"postst1",
|
240
|
+
"posts_description"=>"description1",
|
241
|
+
"posts_created_at"=>2015-02-01 10:40:05 UTC,
|
242
|
+
"posts_updated_at"=>2015-02-01 10:40:05 UTC,
|
243
|
+
"posts_author_id"=>1,
|
244
|
+
"comments_id"=>4,
|
245
|
+
"comments_name"=>"comment1",
|
246
|
+
"comments_description"=>"desc1",
|
247
|
+
"comments_post_id"=>44,
|
248
|
+
"comments_created_at"=>2015-10-10 16:49:12 UTC,
|
249
|
+
"comments_updated_at"=>2015-10-10 16:49:12 UTC,
|
250
|
+
"replies_id"=>1,
|
251
|
+
"replies_description"=>"reply111111111",
|
252
|
+
"replies_comment_id"=>4,
|
253
|
+
"replies_created_at"=>2015-12-19 16:52:09 UTC,
|
254
|
+
"replies_updated_at"=>2015-12-19 16:52:09 UTC}]
|
40
255
|
|
41
|
-
It will return posts and its related comments in a single array
|
42
256
|
|
43
257
|
== REQUIREMENTS:
|
44
258
|
|
data/lib/query_optimizer.rb
CHANGED
@@ -1,13 +1,24 @@
|
|
1
1
|
module QueryOptimizer
|
2
|
-
def self.
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
2
|
+
def self.included(base)
|
3
|
+
base.extend ClassMethods
|
4
|
+
end
|
5
|
+
module ClassMethods
|
6
|
+
def optimize_query(*args)
|
7
|
+
joins=[]
|
8
|
+
aliases = []
|
9
|
+
args.to_a.unshift(self.table_name.to_sym)
|
10
|
+
args.each_with_index do |table,index|
|
11
|
+
aliases << table.to_s.classify.constantize.column_names.map { |word| "#{table}.#{word} AS #{table}_#{word}" }.join(',')
|
12
|
+
next_value = args.to_a[index+1].nil? ? nil : args.to_a[index+1]
|
13
|
+
if args.count-2 == index
|
14
|
+
joins << "#{table}.id=#{next_value}.#{table.to_s.singularize}_id"
|
15
|
+
else
|
16
|
+
joins << "#{table}.id=#{next_value}.#{table.to_s.singularize}_id AND" if next_value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
tables = args.map{|p| p.to_s}.join(',')
|
20
|
+
return ActiveRecord::Base.connection.select_all("SELECT #{aliases.join(',')} FROM #{tables} where #{joins.join(' ')}").to_a.sort{ |x, y| y["#{args.first.to_s}_id"] <=> x["#{args.first.to_s}_id"] }
|
21
|
+
end
|
11
22
|
end
|
12
23
|
end
|
13
24
|
|
data/query_optimizer.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = QueryOptimizer::VERSION
|
9
9
|
spec.authors = ["Akshay"]
|
10
10
|
spec.email = ["akshay.goyal1008@gmail.com"]
|
11
|
-
spec.summary = %q{This is rails gem which will minimize query for
|
12
|
-
spec.description = %q{This is rails gem which will minimize query for
|
11
|
+
spec.summary = %q{This is rails gem which will minimize query for one-to-one, one-to-many database relationships.}
|
12
|
+
spec.description = %q{This is rails gem which will minimize query for one-to-one, one-to-many database relationships.}
|
13
13
|
spec.homepage = ""
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: query_optimizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Akshay
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,7 +38,8 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
|
-
description: This is rails gem which will minimize query for
|
41
|
+
description: This is rails gem which will minimize query for one-to-one, one-to-many
|
42
|
+
database relationships.
|
42
43
|
email:
|
43
44
|
- akshay.goyal1008@gmail.com
|
44
45
|
executables: []
|
@@ -79,5 +80,6 @@ rubyforge_project:
|
|
79
80
|
rubygems_version: 2.2.2
|
80
81
|
signing_key:
|
81
82
|
specification_version: 4
|
82
|
-
summary: This is rails gem which will minimize query for
|
83
|
+
summary: This is rails gem which will minimize query for one-to-one, one-to-many database
|
84
|
+
relationships.
|
83
85
|
test_files: []
|