Skip to content

Commit aa10c8f

Browse files
committed
[Rails3] Sync abstract adapter directory structure - SchemaStatements
1 parent 5f6ee71 commit aa10c8f

File tree

6 files changed

+441
-423
lines changed

6 files changed

+441
-423
lines changed

RAILS3_NOTES

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,45 @@ this project root. From here you can start testing, but it is best practice to u
2020
338 examples, 64 failures, 3 pending
2121

2222
* Review/remove our long winded add_limit_offset!
23-
With supporting add_lock! & add_limit_offset_for_association_limiting!
24-
23+
Supporting:
24+
- add_lock!
25+
- add_limit_offset_for_association_limiting!
26+
- sql_for_association_limiting?
27+
- change_order_direction
28+
29+
* Find out if this is needed anywhere.
30+
31+
def add_order_by_for_association_limiting!(sql, options)
32+
# Disertation http://gist.github.com/24073
33+
# Information http://weblogs.sqlteam.com/jeffs/archive/2007/12/13/select-distinct-order-by-error.aspx
34+
return sql if options[:order].blank?
35+
columns = sql.match(/SELECT\s+DISTINCT(.*?)FROM/)[1].strip
36+
sql.sub!(/SELECT\s+DISTINCT/,'SELECT')
37+
sql << "GROUP BY #{columns} ORDER BY #{order_to_min_set(options[:order])}"
38+
end
39+
40+
def orders_and_dirs_set(order)
41+
orders = order.sub('ORDER BY','').split(',').map(&:strip).reject(&:blank?)
42+
orders_dirs = orders.map do |ord|
43+
dir = nil
44+
ord.sub!(/\b(asc|desc)$/i) do |match|
45+
if match
46+
dir = match.upcase.strip
47+
''
48+
end
49+
end
50+
[ord.strip, dir]
51+
end
52+
end
53+
54+
def order_to_min_set(order)
55+
orders_dirs = orders_and_dirs_set(order)
56+
orders_dirs.map do |o,d|
57+
"MIN(#{o}) #{d}".strip
58+
end.join(', ')
59+
end
2560

2661
= Adapter Todo
27-
62+
2863
* Move all sqlserver_adapter/core_ext files to sqlserver/core_ext
2964

activerecord-sqlserver-adapter.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Gem::Specification.new do |s|
2424
"lib/active_record/connection_adapters/sqlserver_adapter/core_ext/odbc.rb",
2525
"lib/active_record/connection_adapters/sqlserver/database_limits.rb",
2626
"lib/active_record/connection_adapters/sqlserver/database_statements.rb",
27+
"lib/active_record/connection_adapters/sqlserver/schema_statements.rb",
2728
"lib/active_record/connection_adapters/sqlserver/quoting.rb" ]
2829
s.test_files = [
2930
"test/cases/aaaa_create_tables_test_sqlserver.rb",

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,6 @@ def zip_fields_and_rows(fields, rows)
200200
end
201201
end
202202

203-
def info_schema_query
204-
log_info_schema_queries ? yield : ActiveRecord::Base.silence{ yield }
205-
end
206-
207203
def do_execute(sql,name=nil)
208204
log(sql, name || 'EXECUTE') do
209205
with_auto_reconnect { raw_connection_do(sql) }
@@ -294,7 +290,14 @@ def add_lock!(sql, options)
294290
sql.gsub! %r|LEFT OUTER JOIN\s+(.*?)\s+ON|im, "LEFT OUTER JOIN \\1 #{lock_type} ON"
295291
sql.gsub! %r{FROM\s([\w\[\]\.]+)}im, "FROM \\1 #{lock_type}"
296292
end
297-
293+
294+
def sql_for_association_limiting?(sql)
295+
if md = sql.match(/^\s*SELECT(.*)FROM.*GROUP BY.*ORDER BY.*/im)
296+
select_froms = md[1].split(',')
297+
select_froms.size == 1 && !select_froms.first.include?('*')
298+
end
299+
end
300+
298301
def add_limit_offset_for_association_limiting!(sql, options)
299302
sql.replace %|
300303
SET NOCOUNT ON
@@ -310,6 +313,16 @@ def add_limit_offset_for_association_limiting!(sql, options)
310313
|.gsub(/[ \t\r\n]+/,' ')
311314
end
312315

316+
def change_order_direction(order)
317+
order.split(",").collect {|fragment|
318+
case fragment
319+
when /\bDESC\b/i then fragment.gsub(/\bDESC\b/i, "ASC")
320+
when /\bASC\b/i then fragment.gsub(/\bASC\b/i, "DESC")
321+
else String.new(fragment).split(',').join(' DESC,') + ' DESC'
322+
end
323+
}.join(",")
324+
end
325+
313326
end
314327
end
315328
end

0 commit comments

Comments
 (0)