From 47718c68c11475d3a3877c737d58e4fd6e6846f0 Mon Sep 17 00:00:00 2001 From: Derek Kraan Date: Thu, 26 Oct 2017 13:45:31 +0200 Subject: [PATCH 1/2] Add `create_records` to speed things up quite a bit --- lib/sequent/core/base_event_handler.rb | 2 +- .../core/record_sessions/active_record_session.rb | 15 +++++++++++++++ .../core/record_sessions/replay_events_session.rb | 4 ++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/sequent/core/base_event_handler.rb b/lib/sequent/core/base_event_handler.rb index b99b9fdd..95afceeb 100644 --- a/lib/sequent/core/base_event_handler.rb +++ b/lib/sequent/core/base_event_handler.rb @@ -42,7 +42,7 @@ def initialize(record_session = Sequent::Core::RecordSessions::ActiveRecordSessi @record_session = record_session end - def_delegators :@record_session, :update_record, :create_record, :create_or_update_record, :get_record!, :get_record, + def_delegators :@record_session, :update_record, :create_record, :create_records, :create_or_update_record, :get_record!, :get_record, :delete_all_records, :update_all_records, :do_with_records, :do_with_record, :delete_record, :find_records, :last_record, :execute diff --git a/lib/sequent/core/record_sessions/active_record_session.rb b/lib/sequent/core/record_sessions/active_record_session.rb index 7abc6537..79dab68e 100644 --- a/lib/sequent/core/record_sessions/active_record_session.rb +++ b/lib/sequent/core/record_sessions/active_record_session.rb @@ -33,6 +33,21 @@ def create_record(record_class, values) record end + def create_records(record_class, array_of_value_hashes) + table = Arel::Table.new(record_class.table_name) + + query = array_of_value_hashes.map do |values| + insert_manager = Arel::InsertManager.new(ActiveRecord::Base) + insert_manager.into(table) + insert_manager.insert(values.map do |key, value| + [table[key], value] + end) + insert_manager.to_sql + end.join(";") + + execute(query) + end + def create_or_update_record(record_class, values, created_at = Time.now) record = get_record(record_class, values) unless record diff --git a/lib/sequent/core/record_sessions/replay_events_session.rb b/lib/sequent/core/record_sessions/replay_events_session.rb index b2b15343..f92f5c75 100644 --- a/lib/sequent/core/record_sessions/replay_events_session.rb +++ b/lib/sequent/core/record_sessions/replay_events_session.rb @@ -198,6 +198,10 @@ def hash record end + def create_records(record_class, array_of_value_hashes) + array_of_value_hashes.each { |values| create_record(record_class, values) } + end + def create_or_update_record(record_class, values, created_at = Time.now) record = get_record(record_class, values) unless record From 33fc2e4a6dad22b1c9ce2bbedca9a6e2cc5eabb4 Mon Sep 17 00:00:00 2001 From: Derek Kraan Date: Mon, 30 Oct 2017 13:24:20 +0100 Subject: [PATCH 2/2] Add a spec to test `create_records` --- .../core/record_sessions/replay_events_session_spec.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/lib/sequent/core/record_sessions/replay_events_session_spec.rb b/spec/lib/sequent/core/record_sessions/replay_events_session_spec.rb index 19b08a0e..5b1ca6f9 100644 --- a/spec/lib/sequent/core/record_sessions/replay_events_session_spec.rb +++ b/spec/lib/sequent/core/record_sessions/replay_events_session_spec.rb @@ -54,6 +54,14 @@ def initialize end end + it 'can save multiple objects at once' do + session.create_records(Sequent::Core::EventRecord, [{id: 1}, {id: 2}]) + object = session.get_record!(record_class, {id: 1}) + expect(object.id).to eq 1 + object = session.get_record!(record_class, {id: 2}) + expect(object.id).to eq 2 + end + context 'with an object' do before :each do session.create_record(Sequent::Core::EventRecord, {id: 1})