aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorPraveen Devarao <praveen@falcon>2010-02-25 12:49:19 +0530
committerEmilio Tagua <miloops@gmail.com>2010-02-25 10:59:03 -0300
commit4525b1ff89a84ba9be70942a3e90c913c162a839 (patch)
treefb47dc1cebb5d8554c9ad60899e8b94e30f4420e /lib
parentdebd111a39a683592873e7af2d277233b6ec14d2 (diff)
downloadrails-4525b1ff89a84ba9be70942a3e90c913c162a839.tar.gz
rails-4525b1ff89a84ba9be70942a3e90c913c162a839.tar.bz2
rails-4525b1ff89a84ba9be70942a3e90c913c162a839.zip
Moved adding of limit on deletion and adding of limit on update conditions to GenericCompiler, to provide flexibility to handle db specifics
Signed-off-by: Emilio Tagua <miloops@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/arel/engines/sql/compilers/ibm_db_compiler.rb62
-rw-r--r--lib/arel/engines/sql/relations/compiler.rb7
-rw-r--r--lib/arel/engines/sql/relations/writes.rb6
3 files changed, 70 insertions, 5 deletions
diff --git a/lib/arel/engines/sql/compilers/ibm_db_compiler.rb b/lib/arel/engines/sql/compilers/ibm_db_compiler.rb
new file mode 100644
index 0000000000..e6be73d6a1
--- /dev/null
+++ b/lib/arel/engines/sql/compilers/ibm_db_compiler.rb
@@ -0,0 +1,62 @@
+# +-----------------------------------------------------------------------+
+# | |
+# | Copyright (c) 2010 IBM Corporation |
+# | |
+# | Permission is hereby granted, free of charge, to any person obtaining |
+# | a copy of this software and associated documentation files (the |
+# | "Software"), to deal in the Software without restriction, including |
+# | without limitation the rights to use, copy, modify, merge, publish, |
+# | distribute, sublicense, and/or sell copies of the Software, and to |
+# | permit persons to whom the Software is furnished to do so, subject to |
+# | the following conditions: |
+# | |
+# | The above copyright notice and this permission notice shall be |
+# | included in all copies or substantial portions of the Software. |
+# | |
+# | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
+# | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
+# | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.|
+# | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR |
+# | ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
+# | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
+# | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
+# | |
+# +-----------------------------------------------------------------------+
+
+#
+# Author: Praveen Devarao <praveendrl@in.ibm.com>
+#
+
+module Arel
+ module SqlCompiler
+ class IBM_DBCompiler < GenericCompiler
+
+ def select_sql
+ query = build_query \
+ "SELECT #{select_clauses.join(', ')}",
+ "FROM #{from_clauses}",
+ (joins(self) unless joins(self).blank? ),
+ ("WHERE #{where_clauses.join(" AND ")}" unless wheres.blank? ),
+ ("GROUP BY #{group_clauses.join(', ')}" unless groupings.blank? ),
+ ("HAVING #{having_clauses.join(', ')}" unless havings.blank? ),
+ ("ORDER BY #{order_clauses.join(', ')}" unless orders.blank? )
+ engine.add_limit_offset!(query,{:limit=>taken,:offset=>skipped}) unless taken.blank?
+ query << "#{locked}" unless locked.blank?
+ query
+ end
+
+ def limited_update_conditions(conditions, taken)
+ quoted_primary_key = engine.quote_table_name(primary_key)
+ update_conditions = "WHERE #{quoted_primary_key} IN (SELECT #{quoted_primary_key} FROM #{engine.connection.quote_table_name table.name} #{conditions} " #Note: - ')' not added, limit segment is to be appended
+ engine.add_limit_offset!(update_conditions,{:limit=>taken,:offset=>nil})
+ update_conditions << ")" # Close the sql segment
+ update_conditions
+ end
+
+ def add_limit_on_delete(taken)
+ "" # Limiting the number of rows to be deleted is not supported by IBM_DB
+ end
+
+ end
+ end
+end
diff --git a/lib/arel/engines/sql/relations/compiler.rb b/lib/arel/engines/sql/relations/compiler.rb
index c974e43b88..597ed88683 100644
--- a/lib/arel/engines/sql/relations/compiler.rb
+++ b/lib/arel/engines/sql/relations/compiler.rb
@@ -21,11 +21,16 @@ module Arel
("#{locked}" unless locked.blank?)
end
- def limited_update_conditions(conditions)
+ def limited_update_conditions(conditions, taken)
+ conditions << " LIMIT #{taken}"
quoted_primary_key = engine.quote_table_name(primary_key)
"WHERE #{quoted_primary_key} IN (SELECT #{quoted_primary_key} FROM #{engine.connection.quote_table_name table.name} #{conditions})"
end
+ def add_limit_on_delete(taken)
+ "LIMIT #{taken}"
+ end
+
def supports_insert_with_returning?
false
end
diff --git a/lib/arel/engines/sql/relations/writes.rb b/lib/arel/engines/sql/relations/writes.rb
index 0a6250a3b9..54eaee9ead 100644
--- a/lib/arel/engines/sql/relations/writes.rb
+++ b/lib/arel/engines/sql/relations/writes.rb
@@ -5,7 +5,7 @@ module Arel
"DELETE",
"FROM #{table_sql}",
("WHERE #{wheres.collect(&:to_sql).join(' AND ')}" unless wheres.blank? ),
- ("LIMIT #{taken}" unless taken.blank? )
+ (compiler.add_limit_on_delete(taken) unless taken.blank? )
end
end
@@ -68,9 +68,7 @@ module Arel
conditions << " ORDER BY #{order_clauses.join(', ')}" unless orders.blank?
unless taken.blank?
- conditions << " LIMIT #{taken}"
-
- conditions = compiler.limited_update_conditions(conditions)
+ conditions = compiler.limited_update_conditions(conditions,taken)
end
conditions