Browse Source

[ruby/roda] Use batch update for Roda on postgres (#9126)

Petrik de Heus 1 year ago
parent
commit
635f0686cc
2 changed files with 23 additions and 6 deletions
  1. 15 0
      frameworks/Ruby/roda-sequel/boot.rb
  2. 8 6
      frameworks/Ruby/roda-sequel/hello_world.rb

+ 15 - 0
frameworks/Ruby/roda-sequel/boot.rb

@@ -73,6 +73,21 @@ DB = connect ENV.fetch("DBTYPE").to_sym
 # Define ORM models
 # Define ORM models
 class World < Sequel.Model(:World)
 class World < Sequel.Model(:World)
   def_column_alias(:randomnumber, :randomNumber) if DB.database_type == :mysql
   def_column_alias(:randomnumber, :randomNumber) if DB.database_type == :mysql
+
+  def self.batch_update(worlds)
+    if DB.database_type == :mysql
+      worlds.map(&:save_changes)
+    else
+      ids = []
+      sql = String.new("UPDATE world SET randomnumber = CASE id ")
+      worlds.each do |world|
+        sql << "when #{world.id} then #{world.randomnumber} "
+        ids << world.id
+      end
+      sql << "ELSE randomnumber END WHERE id IN ( #{ids.join(',')})"
+      DB.run(sql)
+    end
+  end
 end
 end
 
 
 class Fortune < Sequel.Model(:Fortune)
 class Fortune < Sequel.Model(:Fortune)

+ 8 - 6
frameworks/Ruby/roda-sequel/hello_world.rb

@@ -58,17 +58,19 @@ class HelloWorld < Roda
     # Test type 5: Database updates
     # Test type 5: Database updates
     r.is "updates" do
     r.is "updates" do
       response[CONTENT_TYPE] = JSON_TYPE
       response[CONTENT_TYPE] = JSON_TYPE
-      worlds =
-        DB.synchronize do
+      worlds = []
+      DB.synchronize do
+        worlds =
           ALL_IDS.sample(bounded_queries).map do |id|
           ALL_IDS.sample(bounded_queries).map do |id|
             world = World.with_pk(id)
             world = World.with_pk(id)
             new_value = rand1
             new_value = rand1
             new_value = rand1 while new_value == world.randomnumber
             new_value = rand1 while new_value == world.randomnumber
-            world.update(randomnumber: new_value)
-            world.values
+            world.randomnumber = new_value
+            world
           end
           end
-        end
-      worlds.to_json
+        World.batch_update(worlds)
+      end
+      worlds.map(&:values).to_json
     end
     end
 
 
     # Test type 6: Plaintext
     # Test type 6: Plaintext