lib/dm-sqlserver-adapter/adapter.rb in dm-sqlserver-adapter-1.0.2 vs lib/dm-sqlserver-adapter/adapter.rb in dm-sqlserver-adapter-1.1.0.rc1

- old
+ new

@@ -45,35 +45,41 @@ columns_statement = columns_statement(fields, qualify) from_statement = " FROM #{quote_name(query.model.storage_name(name))}" where_statement = " WHERE #{conditions_statement}" unless conditions_statement.blank? join_statement = join_statement(query, bind_values, qualify) - order_statement = order_statement(order_by, qualify) - no_group_by = group_by ? group_by.empty? : true - no_order_by = order_by ? order_by.empty? : true + use_group_by = group_by && group_by.any? + use_order_by = order_by && order_by.any? + if use_order_by + order_statement = order_statement(order_by, qualify) + elsif use_limit_offset_subquery + order_by = query.model.key.map { |property| DataMapper::Query::Direction.new(property) } + order_statement = order_statement(order_by, qualify) + end + if use_limit_offset_subquery # If using qualifiers, we must qualify elements outside the subquery # with 'RowResults' -- this is a different scope to the subquery. # Otherwise, we hit upon "multi-part identifier cannot be bound" # error from SQL Server. statement = "SELECT #{columns_statement(fields, 'RowResults')}" - statement << " FROM ( SELECT Row_Number() OVER (ORDER BY #{order_statement}) AS RowID," + statement << " FROM (SELECT ROW_NUMBER() OVER (ORDER BY #{order_statement}) AS RowId," statement << " #{columns_statement}" statement << from_statement statement << join_statement if qualify statement << where_statement if where_statement statement << ") AS RowResults" statement << " WHERE RowId > #{offset} AND RowId <= #{offset + limit}" - statement << " GROUP BY #{columns_statement(group_by, 'RowResults')}" unless no_group_by - statement << " ORDER BY #{order_statement(order_by, 'RowResults')}" unless no_order_by + statement << " GROUP BY #{columns_statement(group_by, 'RowResults')}" if use_group_by + statement << " ORDER BY #{order_statement(order_by, 'RowResults')}" if use_order_by else statement = "SELECT #{columns_statement}" statement << from_statement statement << join_statement if qualify statement << where_statement if where_statement - statement << " GROUP BY #{columns_statement(group_by, qualify)}" unless no_group_by - statement << " ORDER BY #{order_statement}" unless no_order_by + statement << " GROUP BY #{columns_statement(group_by, qualify)}" if use_group_by + statement << " ORDER BY #{order_statement}" if use_order_by end add_limit_offset!(statement, limit, offset, bind_values) unless use_limit_offset_subquery return statement, bind_values