]> source.dussan.org Git - sonarqube.git/blob
c54bba77ee144092234ac35103ff7facfc64645d
[sonarqube.git] /
1 module Arel
2   module SqlCompiler
3     class MsSQLCompiler < GenericCompiler
4       def select_sql
5         projections = @relation.projections
6         offset = relation.skipped
7         limit = relation.taken
8         if Count === projections.first && projections.size == 1 &&
9           (relation.taken.present? || relation.wheres.present?) && relation.joins(self).blank?
10           subquery = [
11             "SELECT * FROM #{relation.from_clauses}", build_clauses
12           ].join ' '
13           @engine.connection.add_limit_offset!(subquery, :limit => limit, :offset => offset) if offset || limit
14           query = "SELECT COUNT(*) AS count_id FROM (#{subquery}) AS subquery"
15         else
16           query = [
17             "SELECT     #{relation.select_clauses.join(', ')}",
18             "FROM       #{relation.from_clauses}",
19             build_clauses
20           ].compact.join ' '
21           @engine.connection.add_limit_offset!(query, :limit => limit, :offset => offset) if offset || limit
22         end
23         query
24       end
25
26       def build_clauses
27         joins   = relation.joins(self)
28         wheres  = relation.where_clauses
29         groups  = relation.group_clauses
30         havings = relation.having_clauses
31         orders  = relation.order_clauses
32
33         clauses = [ "",
34           joins,
35           ("WHERE     #{wheres.join(' AND ')}" unless wheres.empty?),
36           ("GROUP BY  #{groups.join(', ')}" unless groups.empty?),
37           ("HAVING    #{havings.join(' AND ')}" unless havings.empty?),
38           ("ORDER BY  #{orders.join(', ')}" unless orders.empty?)
39         ].compact.join ' '
40
41         clauses << " #{locked}" unless locked.blank?
42         clauses unless clauses.blank?
43       end
44     end
45   end
46 end