Skip to content

Commit 5aba5ea

Browse files
committed
[Rails3] Major fixes to the compiler for eager loading and general joins to work for windowed relations.
1 parent 84432b4 commit 5aba5ea

File tree

1 file changed

+26
-10
lines changed

1 file changed

+26
-10
lines changed

lib/arel/engines/sql/compilers/sqlserver_compiler.rb

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,21 @@ def single_distinct_select?
3737
relation.select_clauses.size == 1 && relation.select_clauses.first.include?('DISTINCT')
3838
end
3939

40+
def all_select_clauses_aliased?
41+
relation.select_clauses.all? do |sc|
42+
sc.split(',').all? { |c| c.include?(' AS ') }
43+
end
44+
end
45+
4046
def select_sql_without_skipped(windowed=false)
47+
selects = relation.select_clauses
4148
joins = relation.joins(self)
4249
wheres = relation.where_clauses
4350
groups = relation.group_clauses
4451
havings = relation.having_clauses
4552
orders = relation.order_clauses
46-
select_clause = windowed ? relation.select_clauses.map{ |sc| bare_select_clause(sc) }.join(', ') :
47-
"SELECT #{taken_clause if taken_only?}#{relation.select_clauses.join(', ')}"
53+
select_clause = windowed ? selects.map{ |sc| select_clause_without_expression(sc) }.join(', ') :
54+
"SELECT #{taken_clause if taken_only?}#{selects.join(', ')}"
4855
build_query(
4956
select_clause,
5057
"FROM #{relation.from_clauses}",
@@ -74,10 +81,12 @@ def rowtable_select_clauses
7481
sc.sub! table_name_from_select_clause(sc), '_rnt'
7582
sc.strip!
7683
end)
77-
elsif relation.join?
78-
84+
elsif relation.join? && all_select_clauses_aliased?
85+
relation.select_clauses.map do |sc|
86+
sc.split(',').map { |c| c.split(' AS ').last.strip }.join(', ')
87+
end
7988
else
80-
relation.select_clauses.map do |sc|
89+
relation.select_clauses.map do |sc|
8190
sc.gsub /\[#{relation.table.name}\]\./, '[_rnt].'
8291
end
8392
end
@@ -110,19 +119,26 @@ def pk_for_table(table_name)
110119
engine.connection.primary_key(table_name)
111120
end
112121

113-
def bare_select_clause(sc)
114-
i = sc.strip.rindex(' ')
115-
i ? sc.from(i).strip : sc
122+
def select_clause_without_expression(sc)
123+
sc.split(',').map do |c|
124+
c.strip!
125+
c.sub!(/^(COUNT|SUM|MAX|MIN|AVG)\s*(\((.*)\))?/,'\3')
126+
c.sub!(/^DISTINCT\s*/,'')
127+
c.sub!(/TOP\s*\(\d+\)\s*/i,'')
128+
c.strip
129+
end.join(', ')
116130
end
117131

118132
def table_name_from_select_clause(sc)
119-
parts = bare_select_clause(sc).split('.')
133+
parts = select_clause_without_expression(sc).split('.')
120134
tn = parts.third ? parts.second : (parts.second ? parts.first : nil)
121135
tn ? tn.tr('[]','') : nil
122136
end
123137

124138
def table_names_from_select_clauses
125-
relation.select_clauses.map{ |sc| table_name_from_select_clause(sc) }.compact.uniq
139+
relation.select_clauses.map do |sc|
140+
sc.split(',').map { table_name_from_select_clause(sc) }
141+
end.flatten.compact.uniq
126142
end
127143

128144
end

0 commit comments

Comments
 (0)