querybuilder 1.1.4 → 1.2.1

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.
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