aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel/visitors
diff options
context:
space:
mode:
Diffstat (limited to 'lib/arel/visitors')
-rw-r--r--lib/arel/visitors/to_sql.rb4
-rw-r--r--lib/arel/visitors/update_sql.rb26
2 files changed, 29 insertions, 1 deletions
diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb
index d6a9a3697f..710b6143ec 100644
--- a/lib/arel/visitors/to_sql.rb
+++ b/lib/arel/visitors/to_sql.rb
@@ -25,7 +25,9 @@ module Arel
[
"UPDATE #{visit o.relation}",
("SET #{o.values.map { |value| visit value }.join ', '}" unless o.values.empty?),
- ("WHERE #{o.wheres.map { |x| visit x }.join ' AND '}" unless o.wheres.empty?)
+ ("WHERE #{o.wheres.map { |x| visit x }.join ' AND '}" unless o.wheres.empty?),
+ ("ORDER BY #{o.orders.map { |x| visit x }.join(', ')}" unless o.orders.empty?),
+ ("LIMIT #{o.limit}" if o.limit),
].compact.join ' '
end
diff --git a/lib/arel/visitors/update_sql.rb b/lib/arel/visitors/update_sql.rb
new file mode 100644
index 0000000000..02196a0fb0
--- /dev/null
+++ b/lib/arel/visitors/update_sql.rb
@@ -0,0 +1,26 @@
+module Arel
+ module Visitors
+ module UpdateSql
+ def visit_Arel_Nodes_UpdateStatement o
+ if o.orders.empty? && o.limit.nil?
+ wheres = o.wheres
+ else
+ stmt = Nodes::SelectStatement.new
+ core = stmt.cores.first
+ core.froms = o.relation
+ core.projections = [o.relation.primary_key]
+ stmt.limit = o.limit
+ stmt.orders = o.orders
+
+ wheres = [Nodes::In.new(o.relation.primary_key, [stmt])]
+ end
+
+ [
+ "UPDATE #{visit o.relation}",
+ ("SET #{o.values.map { |value| visit value }.join ', '}" unless o.values.empty?),
+ ("WHERE #{wheres.map { |x| visit x }.join ' AND '}" unless wheres.empty?)
+ ].compact.join ' '
+ end
+ end
+ end
+end