querybuilder 1.1.4 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +12 -0
- data/lib/query_builder/info.rb +2 -2
- data/lib/query_builder/processor.rb +11 -7
- data/lib/query_builder/query.rb +49 -35
- data/querybuilder.gemspec +2 -2
- data/test/querybuilder/basic.yml +6 -6
- data/test/querybuilder/custom.yml +2 -2
- data/test/querybuilder/filters.yml +4 -4
- data/test/querybuilder/having.yml +1 -1
- data/test/querybuilder/joins.yml +7 -7
- data/test/querybuilder/mixed.yml +3 -3
- data/test/querybuilder_test.rb +1 -1
- metadata +4 -4
data/History.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
== 1.2.1 2013-03-11
|
2
|
+
|
3
|
+
* Major enhancement
|
4
|
+
* "add_table" takes a block to configure join clause.
|
5
|
+
* Fixed count queries with group and having clauses.
|
6
|
+
|
7
|
+
== 1.2.0 2012-10-10
|
8
|
+
|
9
|
+
* Major enhancement
|
10
|
+
* All relations now use INNER JOIN with ON clause instead of using the WHERE filter. Custom processors *MUST*
|
11
|
+
be changed to use the new add_table with :inner join type instead of using where filters.
|
12
|
+
|
1
13
|
== 1.1.4 2012-10-07
|
2
14
|
|
3
15
|
* Major enhancement
|
data/lib/query_builder/info.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module QueryBuilder
|
2
|
-
VERSION = '1.1
|
3
|
-
end
|
2
|
+
VERSION = '1.2.1'
|
3
|
+
end
|
@@ -792,13 +792,15 @@ module QueryBuilder
|
|
792
792
|
|
793
793
|
# Add a new table and apply scoping when needed
|
794
794
|
def add_table(use_name, table_name = nil, type = nil, &block)
|
795
|
+
if use_name == main_table && first?
|
796
|
+
# we are now using final table
|
797
|
+
context[:table_alias] = use_name
|
798
|
+
avoid_alias = true
|
799
|
+
else
|
800
|
+
avoid_alias = false
|
801
|
+
end
|
802
|
+
|
795
803
|
if use_name == main_table
|
796
|
-
if first?
|
797
|
-
# we are now using final table
|
798
|
-
context[:table_alias] = use_name
|
799
|
-
avoid_alias = true
|
800
|
-
end
|
801
|
-
|
802
804
|
if context[:scope_type] == :join
|
803
805
|
context[:scope_type] = nil
|
804
806
|
# pre scope
|
@@ -806,12 +808,14 @@ module QueryBuilder
|
|
806
808
|
@query.add_table(main_table, main_table, avoid_alias)
|
807
809
|
apply_scope(context[:scope])
|
808
810
|
end
|
811
|
+
|
809
812
|
@query.add_table(use_name, table_name, avoid_alias, type, &block)
|
810
813
|
elsif context[:scope_type] == :filter
|
811
814
|
context[:scope_type] = nil
|
812
815
|
# post scope
|
813
|
-
@query.add_table(use_name, table_name, avoid_alias)
|
816
|
+
tbl = @query.add_table(use_name, table_name, avoid_alias, &block)
|
814
817
|
apply_scope(context[:scope] || default_scope(context))
|
818
|
+
tbl
|
815
819
|
else
|
816
820
|
# scope already applied / skip
|
817
821
|
@query.add_table(use_name, table_name, avoid_alias, type, &block)
|
data/lib/query_builder/query.rb
CHANGED
@@ -3,7 +3,7 @@ require 'active_record'
|
|
3
3
|
module QueryBuilder
|
4
4
|
class Query
|
5
5
|
SELECT_WITH_TYPE_REGEX = /^(.*):(.*)$/
|
6
|
-
attr_accessor :processor_class, :distinct, :select, :tables, :table_alias, :where,
|
6
|
+
attr_accessor :processor_class, :distinct, :select, :tables, :table_alias, :unique_alias, :where,
|
7
7
|
:limit, :offset, :page_size, :order, :group, :error, :attributes_alias,
|
8
8
|
:pagination_key, :main_class, :context, :key_value_tables, :having, :types
|
9
9
|
|
@@ -16,8 +16,9 @@ module QueryBuilder
|
|
16
16
|
def initialize(processor_class)
|
17
17
|
@processor_class = processor_class
|
18
18
|
@tables = []
|
19
|
-
@table_alias
|
20
|
-
@
|
19
|
+
@table_alias = {}
|
20
|
+
@unique_alias = {}
|
21
|
+
@join_tables = {}
|
21
22
|
@needed_join_tables = {}
|
22
23
|
@attributes_alias = {}
|
23
24
|
# Custom select foo as bar:time or 'types:' field in custom query.
|
@@ -131,12 +132,12 @@ module QueryBuilder
|
|
131
132
|
key_table = (key_tables[use_name] ||= {})
|
132
133
|
if alias_table = key_table[key]
|
133
134
|
# done, the index_table has been used for the given key in the current context
|
135
|
+
alias_table
|
134
136
|
else
|
135
137
|
# insert the new table
|
136
|
-
|
137
|
-
|
138
|
+
# Let caller configure the filter with &block.
|
139
|
+
key_table[key] = add_table(use_name + "_#{key}", index_table, false, :left, &block)
|
138
140
|
end
|
139
|
-
alias_table
|
140
141
|
end
|
141
142
|
|
142
143
|
def add_select(field, fname)
|
@@ -177,7 +178,7 @@ module QueryBuilder
|
|
177
178
|
# Duplicate query, avoiding sharing some arrays and hash
|
178
179
|
def dup
|
179
180
|
other = super
|
180
|
-
%w{tables table_alias where tables key_value_tables}.each do |k|
|
181
|
+
%w{tables table_alias unique_alias where tables key_value_tables}.each do |k|
|
181
182
|
other.send("#{k}=", other.send(k).dup)
|
182
183
|
end
|
183
184
|
other
|
@@ -223,56 +224,63 @@ module QueryBuilder
|
|
223
224
|
def quote_column_name(name)
|
224
225
|
connection.quote_column_name(name)
|
225
226
|
end
|
226
|
-
|
227
|
-
def has_table?(use_name)
|
228
|
-
!@table_alias[use_name].nil?
|
229
|
-
end
|
230
|
-
|
231
|
-
|
227
|
+
|
232
228
|
private
|
233
|
-
# Make sure each used table gets a unique name
|
234
|
-
# But if 'avoid_alias' is true and it is the first call for this table, return the
|
235
|
-
# table without an alias.
|
229
|
+
# Make sure each used table gets a unique name
|
236
230
|
def get_alias(use_name, table_name = nil, avoid_alias = true)
|
237
231
|
table_name ||= use_name
|
238
|
-
|
239
|
-
|
232
|
+
|
233
|
+
base = use_name[0..1]
|
234
|
+
list = (@unique_alias[base] ||= [])
|
235
|
+
list2 = @table_alias[use_name] ||= []
|
236
|
+
if avoid_alias && !@tables.include?(table_name)
|
240
237
|
alias_name = use_name
|
241
238
|
elsif @tables.include?(use_name)
|
242
239
|
# links, li1, li2, li3
|
243
|
-
alias_name = "#{
|
240
|
+
alias_name = "#{base}#{list.size}"
|
244
241
|
else
|
245
242
|
# ob1, obj2, objects
|
246
|
-
alias_name = "#{
|
243
|
+
alias_name = "#{base}#{list.size + 1}"
|
247
244
|
end
|
248
245
|
|
249
|
-
|
246
|
+
# We add to both because @table_alias[use_name] is used in table(use_name)
|
247
|
+
# and @table_alias[use_name]
|
248
|
+
list << alias_name
|
249
|
+
list2 << alias_name
|
250
250
|
alias_name
|
251
251
|
end
|
252
252
|
|
253
253
|
def add_alias_to_tables(table_name, alias_name, type = nil, &block)
|
254
|
+
if block_given?
|
255
|
+
on_clause = "#{block.call(alias_name)}"
|
256
|
+
end
|
257
|
+
|
254
258
|
if type
|
255
259
|
key = "#{table_name}=#{type}=#{alias_name}"
|
256
|
-
|
257
260
|
@needed_join_tables[key] ||= begin
|
258
|
-
|
259
|
-
if alias_name && alias_name != table_name
|
260
|
-
clause << " AS #{alias_name}"
|
261
|
-
end
|
262
|
-
if block_given?
|
263
|
-
clause << " ON #{block.call(alias_name || table_name)}"
|
264
|
-
end
|
261
|
+
table_name = "#{type.to_s.upcase} JOIN #{table_name}"
|
265
262
|
joins = (@join_tables[main_table] ||= [])
|
266
|
-
|
263
|
+
on_clause = on_clause ? " ON #{on_clause}" : ''
|
264
|
+
joins << (alias_name ? "#{table_name} AS #{alias_name}#{on_clause}" : "#{table_name}#{on_clause}")
|
267
265
|
end
|
268
|
-
return
|
266
|
+
return alias_name
|
267
|
+
end
|
268
|
+
|
269
|
+
if on_clause && @tables.empty?
|
270
|
+
# NO JOIN
|
271
|
+
@where << on_clause
|
272
|
+
on_clause = ''
|
273
|
+
elsif on_clause
|
274
|
+
on_clause = " ON #{on_clause}"
|
269
275
|
end
|
270
276
|
|
271
277
|
if alias_name != table_name
|
272
|
-
@tables << "#{table_name} AS #{alias_name}"
|
278
|
+
@tables << "#{table_name} AS #{alias_name}#{on_clause}"
|
273
279
|
else
|
274
|
-
@tables << table_name
|
280
|
+
@tables << "#{table_name}#{on_clause}"
|
275
281
|
end
|
282
|
+
|
283
|
+
alias_name
|
276
284
|
end
|
277
285
|
|
278
286
|
def build_statement(type = :find)
|
@@ -314,7 +322,7 @@ module QueryBuilder
|
|
314
322
|
end
|
315
323
|
end
|
316
324
|
|
317
|
-
"SELECT#{distinct} #{(@select || ["#{main_table}.*"]).join(',')} FROM #{table_list.flatten.sort.join('
|
325
|
+
"SELECT#{distinct} #{(@select || ["#{main_table}.*"]).join(',')} FROM #{table_list.flatten.sort.join(' JOIN ')}" + (@where == [] ? '' : " WHERE #{filter}") + group.to_s + @having.to_s + @order.to_s + @limit.to_s + @offset.to_s
|
318
326
|
end
|
319
327
|
|
320
328
|
def count_statement
|
@@ -338,7 +346,13 @@ module QueryBuilder
|
|
338
346
|
count_on = "COUNT(*)"
|
339
347
|
end
|
340
348
|
|
341
|
-
"SELECT #{count_on} FROM #{table_list.flatten.sort.join('
|
349
|
+
sql = "SELECT #{count_on} FROM #{table_list.flatten.sort.join(' JOIN ')}" + (@where == [] ? '' : " WHERE #{filter}")
|
350
|
+
if @having then
|
351
|
+
# We need the group clause in case the query uses MIN or MAX.
|
352
|
+
sql = "SELECT COUNT(*) FROM (#{sql}#{@group}#{@having}) AS BASE"
|
353
|
+
end
|
354
|
+
|
355
|
+
sql
|
342
356
|
end
|
343
357
|
|
344
358
|
def get_connection
|
data/querybuilder.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{querybuilder}
|
8
|
-
s.version = "1.1
|
8
|
+
s.version = "1.2.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Gaspard Bucher"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2013-03-11}
|
13
13
|
s.description = %q{QueryBuilder is an interpreter for the "pseudo sql" language. This language
|
14
14
|
can be used for two purposes:
|
15
15
|
|
data/test/querybuilder/basic.yml
CHANGED
@@ -16,8 +16,8 @@ objects_in_site:
|
|
16
16
|
|
17
17
|
recipients:
|
18
18
|
sxp: '[:query, [:relation, "recipients"]]'
|
19
|
-
res: "[%Q{SELECT objects.* FROM links
|
20
|
-
sql: "SELECT objects.* FROM links
|
19
|
+
res: "[%Q{SELECT objects.* FROM links JOIN objects WHERE objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ?}, id]"
|
20
|
+
sql: "SELECT objects.* FROM links JOIN objects WHERE objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = 123"
|
21
21
|
|
22
22
|
letters_in_project:
|
23
23
|
sxp: '[:query, [:scope, [:relation, "letters"], "project"]]'
|
@@ -33,7 +33,7 @@ order_single_table:
|
|
33
33
|
|
34
34
|
order_many_tables:
|
35
35
|
src: "recipients order by name"
|
36
|
-
res: "[%Q{SELECT objects.* FROM links
|
36
|
+
res: "[%Q{SELECT objects.* FROM links JOIN objects WHERE objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ? ORDER BY objects.name}, id]"
|
37
37
|
|
38
38
|
order_many_params:
|
39
39
|
src: "objects in project order by name, id desc"
|
@@ -70,12 +70,12 @@ paginate:
|
|
70
70
|
recipients_or_objects:
|
71
71
|
src: recipients or objects
|
72
72
|
sxp: '[:query, [:clause_or, [:relation, "recipients"], [:relation, "objects"]]]'
|
73
|
-
res: "[%Q{SELECT objects.* FROM links
|
73
|
+
res: "[%Q{SELECT objects.* FROM links JOIN objects WHERE ((objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ?) OR (objects.parent_id = ? AND links.id = 0)) GROUP BY objects.id}, id, id]"
|
74
74
|
|
75
75
|
recipients_or_objects_or_letters:
|
76
76
|
src: recipients or objects or letters
|
77
|
-
res: "[%Q{SELECT objects.* FROM links
|
78
|
-
res: "[%Q{SELECT objects.* FROM links
|
77
|
+
res: "[%Q{SELECT objects.* FROM links JOIN objects WHERE ((objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ?) OR (links.id = 0 AND objects.parent_id = ?) OR (links.id = 0 AND objects.kpath LIKE 'NNL%' AND objects.parent_id = ?)) GROUP BY objects.id}, id, id, id]"
|
78
|
+
res: "[%Q{SELECT objects.* FROM links JOIN objects WHERE ((objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ?) OR (objects.parent_id = ? AND links.id = 0) OR (objects.kpath LIKE 'NNL%' AND objects.parent_id = ? AND links.id = 0)) GROUP BY objects.id}, id, id, id]"
|
79
79
|
|
80
80
|
or_clause_with_filter:
|
81
81
|
src: "(recipients where name = 'foo') or objects"
|
@@ -41,13 +41,13 @@ it_should_not_use_the_first_table_as_main:
|
|
41
41
|
context:
|
42
42
|
custom_query_group: test
|
43
43
|
src: "two_table where x = '4' and name like 'b%'"
|
44
|
-
res: "%Q{SELECT x AS x,IF(table_one.y,table_one.y,table_two.z) AS y,table_two.name FROM table_one
|
44
|
+
res: "%Q{SELECT x AS x,IF(table_one.y,table_one.y,table_two.z) AS y,table_two.name FROM table_one JOIN table_two WHERE (x) = '4' AND table_one.name LIKE 'b%'}"
|
45
45
|
|
46
46
|
it_should_use_main_table_as_main:
|
47
47
|
context:
|
48
48
|
custom_query_group: test
|
49
49
|
src: "two_table_main where name = '4'"
|
50
|
-
res: "%Q{SELECT x FROM foo
|
50
|
+
res: "%Q{SELECT x FROM foo JOIN table_one JOIN table_two WHERE foo.name = '4'}"
|
51
51
|
|
52
52
|
it_should_limit_the_entries:
|
53
53
|
context:
|
@@ -15,15 +15,15 @@ not_equal_alt:
|
|
15
15
|
|
16
16
|
recipients_where_kpath:
|
17
17
|
src: "recipients where kpath like 'NRCC%'"
|
18
|
-
res: "[%Q{SELECT objects.* FROM links
|
18
|
+
res: "[%Q{SELECT objects.* FROM links JOIN objects WHERE objects.kpath LIKE 'NRCC%' AND objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ?}, id]"
|
19
19
|
|
20
20
|
hand_made_class_filter:
|
21
21
|
src: "recipients where kpath like 'NRCC%'"
|
22
|
-
res: "[%Q{SELECT objects.* FROM links
|
22
|
+
res: "[%Q{SELECT objects.* FROM links JOIN objects WHERE objects.kpath LIKE 'NRCC%' AND objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ?}, id]"
|
23
23
|
|
24
24
|
better_class_filter:
|
25
25
|
src: "recipients where class = 'Client'"
|
26
|
-
res: "[%Q{SELECT objects.* FROM links
|
26
|
+
res: "[%Q{SELECT objects.* FROM links JOIN objects WHERE objects.kpath LIKE ? AND objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ?}, \"NRCC%\", id]"
|
27
27
|
|
28
28
|
like_filter_with_scope:
|
29
29
|
src: "letters where name like 'a%' in site"
|
@@ -41,7 +41,7 @@ letters_group_by_name:
|
|
41
41
|
|
42
42
|
recipients_group_by_name:
|
43
43
|
sxp: '[:query, [:group, [:relation, "recipients"], [:field, "name"]]]'
|
44
|
-
res: "[%Q{SELECT objects.* FROM links
|
44
|
+
res: "[%Q{SELECT objects.* FROM links JOIN objects WHERE objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ? GROUP BY objects.name}, id]"
|
45
45
|
|
46
46
|
custom_query_having:
|
47
47
|
context:
|
@@ -5,4 +5,4 @@ simple:
|
|
5
5
|
|
6
6
|
having_order:
|
7
7
|
src: "recipients from letters select amount.sum as tot_amount group by id having tot_amount > 2000"
|
8
|
-
res: "[%Q{SELECT objects.*,SUM(ob1.amount) AS \"tot_amount\" FROM links
|
8
|
+
res: "[%Q{SELECT objects.*,SUM(ob1.amount) AS \"tot_amount\" FROM links JOIN objects JOIN objects AS ob1 WHERE objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ob1.id AND ob1.kpath LIKE 'NNL%' AND ob1.parent_id = ? GROUP BY objects.id HAVING \"tot_amount\" > 2000}, id]"
|
data/test/querybuilder/joins.yml
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
|
2
2
|
icons_from_recipients:
|
3
3
|
sxp: '[:query, [:from, [:relation, "icons"], [:relation, "recipients"]]]'
|
4
|
-
res: "[%Q{SELECT objects.* FROM links
|
4
|
+
res: "[%Q{SELECT objects.* FROM links JOIN links AS li1 JOIN objects JOIN objects AS ob1 WHERE objects.id = li1.source_id AND li1.relation_id = 5 AND li1.target_id = ob1.id AND ob1.id = links.target_id AND links.relation_id = 4 AND links.source_id = ? GROUP BY objects.id}, id]"
|
5
5
|
|
6
6
|
icons_from_recipients_from_letters:
|
7
7
|
sxp: '[:query, [:from, [:from, [:relation, "icons"], [:relation, "recipients"]], [:relation, "letters"]]]'
|
8
8
|
|
9
9
|
letters_from_recipients:
|
10
|
-
res: "[%Q{SELECT objects.* FROM links
|
10
|
+
res: "[%Q{SELECT objects.* FROM links JOIN objects JOIN objects AS ob1 WHERE objects.kpath LIKE 'NNL%' AND objects.parent_id = ob1.id AND ob1.id = links.target_id AND links.relation_id = 4 AND links.source_id = ? GROUP BY objects.id}, id]"
|
11
11
|
|
12
12
|
objects_from_recipients:
|
13
|
-
res: "[%Q{SELECT objects.* FROM links
|
13
|
+
res: "[%Q{SELECT objects.* FROM links JOIN objects JOIN objects AS ob1 WHERE objects.parent_id = ob1.id AND ob1.id = links.target_id AND links.relation_id = 4 AND links.source_id = ? GROUP BY objects.id}, id]"
|
14
14
|
|
15
15
|
parent_from_parent:
|
16
16
|
sxp: '[:query, [:from, [:relation, "parent"], [:relation, "parent"]]]'
|
17
|
-
res: "[%Q{SELECT objects.* FROM objects
|
17
|
+
res: "[%Q{SELECT objects.* FROM objects JOIN objects AS ob1 WHERE objects.id = ob1.parent_id AND ob1.id = ? GROUP BY objects.id}, parent_id]"
|
18
18
|
|
19
19
|
children_from_objects_in_project:
|
20
|
-
res: "[%Q{SELECT objects.* FROM objects
|
20
|
+
res: "[%Q{SELECT objects.* FROM objects JOIN objects AS ob1 WHERE objects.parent_id = ob1.id AND ob1.project_id = ? GROUP BY objects.id}, project_id]"
|
21
21
|
|
22
22
|
tags:
|
23
23
|
sxp: '[:query, [:relation, "tags"]]'
|
@@ -34,9 +34,9 @@ complex_from_with_scopes_and_typed_scope:
|
|
34
34
|
|
35
35
|
letters_in_project_from_letters:
|
36
36
|
sxp: '[:query, [:from, [:scope, [:relation, "letters"], "project"], [:relation, "letters"]]]'
|
37
|
-
res: "[%Q{SELECT objects.* FROM objects
|
37
|
+
res: "[%Q{SELECT objects.* FROM objects JOIN objects AS ob1 WHERE objects.kpath LIKE 'NNL%' AND objects.project_id = ob1.id AND ob1.kpath LIKE 'NNL%' AND ob1.parent_id = ? GROUP BY objects.id}, id]"
|
38
38
|
|
39
39
|
letters_in_project_from_letters_group_by:
|
40
40
|
src: "letters in project from letters group by name,id"
|
41
41
|
sxp: '[:query, [:group, [:from, [:scope, [:relation, "letters"], "project"], [:relation, "letters"]], [:field, "name"], [:field, "id"]]]'
|
42
|
-
res: "[%Q{SELECT objects.* FROM objects
|
42
|
+
res: "[%Q{SELECT objects.* FROM objects JOIN objects AS ob1 WHERE objects.kpath LIKE 'NNL%' AND objects.project_id = ob1.id AND ob1.kpath LIKE 'NNL%' AND ob1.parent_id = ? GROUP BY objects.name, objects.id}, id]"
|
data/test/querybuilder/mixed.yml
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
users_from_objects:
|
2
2
|
sxp: '[:query, [:from, [:relation, "users"], [:relation, "objects"]]]'
|
3
|
-
res: "TestUser: [%Q{SELECT users.* FROM objects AS ob1
|
3
|
+
res: "TestUser: [%Q{SELECT users.* FROM objects AS ob1 JOIN users WHERE users.node_id = ob1.id AND ob1.parent_id = ? GROUP BY users.id ORDER BY users.name ASC, users.first_name ASC}, id]"
|
4
4
|
|
5
5
|
users_where_name_from_objects:
|
6
6
|
src: "users where name eq 'bob' from objects"
|
7
|
-
res: "TestUser: [%Q{SELECT users.* FROM objects AS ob1
|
7
|
+
res: "TestUser: [%Q{SELECT users.* FROM objects AS ob1 JOIN users WHERE users.name = 'bob' AND users.node_id = ob1.id AND ob1.parent_id = ? GROUP BY users.id ORDER BY users.name ASC, users.first_name ASC}, id]"
|
8
8
|
|
9
9
|
objects_from_users_from_objects:
|
10
10
|
src: "objects from users where name = 'foo' from objects where event_at > REF_DATE order by event_at asc"
|
11
|
-
res: "[%Q{SELECT objects.* FROM objects
|
11
|
+
res: "[%Q{SELECT objects.* FROM objects JOIN objects AS ob1 JOIN users AS us1 WHERE objects.id = us1.node_id AND us1.name = 'foo' AND us1.node_id = ob1.id AND ob1.event_at > now() AND ob1.parent_id = ? GROUP BY objects.id ORDER BY objects.event_at ASC}, id]"
|
12
12
|
|
13
13
|
users:
|
14
14
|
res: "TestUser: [%Q{SELECT users.* FROM users WHERE users.node_id = ? ORDER BY users.name ASC, users.first_name ASC}, id]"
|
data/test/querybuilder_test.rb
CHANGED
@@ -39,7 +39,7 @@ class DummyQueryBuilder < Test::Unit::TestCase
|
|
39
39
|
end
|
40
40
|
|
41
41
|
should 'not overwrite defaults before last' do
|
42
|
-
assert_equal '%Q{SELECT objects.* FROM objects
|
42
|
+
assert_equal '%Q{SELECT objects.* FROM objects JOIN objects AS ob1 WHERE objects.parent_id = ob1.id GROUP BY objects.id}', subject.new('objects from objects', :default => {:scope => 'site'}).query.to_s
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: querybuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 2
|
8
9
|
- 1
|
9
|
-
|
10
|
-
version: 1.1.4
|
10
|
+
version: 1.2.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Gaspard Bucher
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2013-03-11 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|