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