From 51527a0384e3dd682ffc592d5e603e0f914c9fad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petteri=20R=C3=A4ty?= Date: Thu, 6 Dec 2012 15:06:20 +0200 Subject: [PATCH] One network trip for the deletion strategy Make the deletion strategy faster by sending all the delete commands over the network in one go. In an application with 57 models this made cleaning an empty database 50% faster on average with PostgreSQL 9.1. --- .../active_record/deletion.rb | 53 ++----------------- 1 file changed, 5 insertions(+), 48 deletions(-) diff --git a/lib/database_cleaner/active_record/deletion.rb b/lib/database_cleaner/active_record/deletion.rb index 2eebdea..58e609a 100644 --- a/lib/database_cleaner/active_record/deletion.rb +++ b/lib/database_cleaner/active_record/deletion.rb @@ -3,51 +3,6 @@ require 'active_record/connection_adapters/abstract_adapter' require "database_cleaner/generic/truncation" require 'database_cleaner/active_record/base' require 'database_cleaner/active_record/truncation' -# This file may seem to have duplication with that of truncation, but by keeping them separate -# we avoiding loading this code when it is not being used (which is the common case). - -module ActiveRecord - module ConnectionAdapters - - class MysqlAdapter < MYSQL_ADAPTER_PARENT - def delete_table(table_name) - execute("DELETE FROM #{quote_table_name(table_name)};") - end - end - - class Mysql2Adapter < MYSQL2_ADAPTER_PARENT - def delete_table(table_name) - execute("DELETE FROM #{quote_table_name(table_name)};") - end - end - - class JdbcAdapter < AbstractAdapter - def delete_table(table_name) - execute("DELETE FROM #{quote_table_name(table_name)};") - end - end - - class PostgreSQLAdapter < POSTGRE_ADAPTER_PARENT - def delete_table(table_name) - execute("DELETE FROM #{quote_table_name(table_name)};") - end - end - - class SQLServerAdapter < AbstractAdapter - def delete_table(table_name) - execute("DELETE FROM #{quote_table_name(table_name)};") - end - end - - class OracleEnhancedAdapter < AbstractAdapter - def delete_table(table_name) - execute("DELETE FROM #{quote_table_name(table_name)}") - end - end - - end -end - module DatabaseCleaner::ActiveRecord class Deletion < Truncation @@ -55,9 +10,11 @@ module DatabaseCleaner::ActiveRecord def clean connection = connection_class.connection connection.disable_referential_integrity do - tables_to_truncate(connection).each do |table_name| - connection.delete_table table_name - end + sql = tables_to_truncate(connection).map do |table_name| + "DELETE FROM #{connection.quote_table_name(table_name)}" + end.join(";") + + connection.execute sql end end