Skip to content

feature: batch mapper #1854

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion ruby_event_store/lib/ruby_event_store.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
require_relative "ruby_event_store/mappers/transformation/stringify_metadata_keys"
require_relative "ruby_event_store/mappers/transformation/symbolize_metadata_keys"
require_relative "ruby_event_store/mappers/transformation/preserve_types"
require_relative "ruby_event_store/mappers/batch_mapping"
require_relative "ruby_event_store/mappers/pipeline"
require_relative "ruby_event_store/mappers/pipeline_mapper"
require_relative "ruby_event_store/mappers/default"
Expand All @@ -46,4 +47,4 @@
require_relative "ruby_event_store/instrumented_repository"
require_relative "ruby_event_store/instrumented_dispatcher"
require_relative "ruby_event_store/instrumented_subscriptions"
require_relative "ruby_event_store/event_type_resolver"
require_relative "ruby_event_store/event_type_resolver"
11 changes: 11 additions & 0 deletions ruby_event_store/lib/ruby_event_store/mappers/batch_mapping.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# frozen_string_literal: true

module RubyEventStore
module Mappers
module BatchMapping
def map_records_to_events(records)
records.map { |record| record_to_event(record) }
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
module RubyEventStore
module Mappers
class InstrumentedMapper
include BatchMapping

def initialize(mapper, instrumentation)
@mapper = mapper
@instrumentation = instrumentation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
module RubyEventStore
module Mappers
class PipelineMapper
include BatchMapping

def initialize(pipeline)
@pipeline = pipeline
end
Expand Down
14 changes: 13 additions & 1 deletion ruby_event_store/lib/ruby_event_store/specification_reader.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ class SpecificationReader
def initialize(repository, mapper)
@repository = repository
@mapper = mapper
@batch_mapper = mapper.respond_to?(:map_records_to_events)
if !@batch_mapper
warn "Your custom mapper does not support batch reading. This behaviour will be deprecated in future releases. You can include RubyEventStore::Mappers::BatchMapping to your mapper to make it compatible."
end
end

# @api private
Expand All @@ -20,7 +24,15 @@ def one(specification_result)
# @api private
# @private
def each(specification_result)
repository.read(specification_result).each { |batch| yield batch.map { |record| mapper.record_to_event(record) } }
if @batch_mapper
repository.read(specification_result).each { |batch|
yield mapper.map_records_to_events(batch)
}
else
repository.read(specification_result).each { |batch|
yield batch.map { |record| mapper.record_to_event(record) }
}
end
end

# @api private
Expand Down
52 changes: 52 additions & 0 deletions ruby_event_store/spec/specification_reader_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@

# frozen_string_literal: true

require "spec_helper"
require "ruby_event_store/spec/event_repository_lint"

module RubyEventStore
::RSpec.describe SpecificationReader do
mk_repository = -> { InMemoryRepository.new }

let(:repository) {
mk_repository.call.tap do |repo|
repo.append_to_stream(
[SRecord.new(event_id: "fbce0b3d-40e3-4d1d-90a1-901f1ded5a4a")],
Stream.new("other"),
ExpectedVersion.none
)
end
}
let(:mapper_klass) {
Class.new(Mappers::Default) do
attr_reader :invoked_map_records_to_events

def map_records_to_events(...)
@invoked_map_records_to_events = true
super(...)
end
end
}

specify "reading invokes the mapper in batches" do
mapper = mapper_klass.new
specification = Specification.new(
SpecificationReader.new(repository, mapper)
)
specification.to_a
expect(mapper.invoked_map_records_to_events).to eq(true)
end

specify "specification can still handle non batch compatible mappers" do
mapper_klass.undef_method(:map_records_to_events)
mapper = mapper_klass.new
expect(Warning).to receive(:warn).with("Your custom mapper does not support batch reading. This behaviour will be deprecated in future releases. You can include RubyEventStore::Mappers::BatchMapping to your mapper to make it compatible.\n", { category: nil }).once

specification = Specification.new(
SpecificationReader.new(repository, mapper)
)
specification.to_a
expect(mapper.invoked_map_records_to_events).to_not eq(true)
end
end
end
Loading