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 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
@@ -1,3 +1,3 @@
1
1
  module QueryBuilder
2
- VERSION = '1.1.4'
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)
@@ -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
- @join_tables = {}
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
- add_table(use_name, index_table, false, :left, &block)
137
- alias_table = key_table[key] = table(use_name)
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. By default, this uses an alias
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
- list = (@table_alias[use_name] ||= [])
239
- if avoid_alias && !list.include?(use_name)
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 = "#{use_name[0..1]}#{list.size}"
240
+ alias_name = "#{base}#{list.size}"
244
241
  else
245
242
  # ob1, obj2, objects
246
- alias_name = "#{use_name[0..1]}#{list.size + 1}"
243
+ alias_name = "#{base}#{list.size + 1}"
247
244
  end
248
245
 
249
- list << alias_name
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
- clause = "#{type.to_s.upcase} JOIN #{table_name}"
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
- joins << clause
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(',')}" + (@where == [] ? '' : " WHERE #{filter}") + group.to_s + @having.to_s + @order.to_s + @limit.to_s + @offset.to_s
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(',')}" + (@where == [] ? '' : " WHERE #{filter}")
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.4"
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{2012-10-10}
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
 
@@ -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,objects WHERE objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ?}, id]"
20
- sql: "SELECT objects.* FROM links,objects WHERE objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = 123"
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,objects WHERE objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ? ORDER BY objects.name}, id]"
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,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]"
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,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,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]"
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,table_two WHERE (x) = '4' AND table_one.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 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,table_one,table_two WHERE foo.name = '4'}"
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,objects WHERE objects.kpath LIKE 'NRCC%' AND objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ?}, id]"
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,objects WHERE objects.kpath LIKE 'NRCC%' AND objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ?}, id]"
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,objects WHERE objects.kpath LIKE ? AND objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ?}, \"NRCC%\", id]"
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,objects WHERE objects.id = links.target_id AND links.relation_id = 4 AND links.source_id = ? GROUP BY objects.name}, id]"
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,objects,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]"
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]"
@@ -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,links AS li1,objects,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]"
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,objects,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]"
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,objects,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]"
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,objects AS ob1 WHERE objects.id = ob1.parent_id AND ob1.id = ? GROUP BY objects.id}, parent_id]"
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,objects AS ob1 WHERE objects.parent_id = ob1.id AND ob1.project_id = ? GROUP BY objects.id}, project_id]"
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,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]"
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,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]"
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]"
@@ -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,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]"
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,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]"
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,objects AS ob1,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]"
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]"
@@ -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,objects AS ob1 WHERE objects.parent_id = ob1.id GROUP BY objects.id}', subject.new('objects from objects', :default => {:scope => 'site'}).query.to_s
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: 27
4
+ hash: 29
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
+ - 2
8
9
  - 1
9
- - 4
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: 2012-10-10 00:00:00 +02:00
18
+ date: 2013-03-11 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency