class RubyEventStore::Specification

Used for building and executing the query specification.

Constants

DEFAULT_BATCH_SIZE

Attributes

reader[R]
result[R]

Public Class Methods

new(reader, result = SpecificationResult.new) click to toggle source

@api private @private

# File lib/ruby_event_store/specification.rb, line 10
def initialize(reader, result = SpecificationResult.new)
  @reader = reader
  @result = result
end

Public Instance Methods

as_at() click to toggle source

Sets the order of time sorting using transaction time {railseventstore.org/docs/read/ Find out more}

@return [Specification]

# File lib/ruby_event_store/specification.rb, line 125
def as_at
  Specification.new(reader, result.dup { |r| r.time_sort_by = :as_at })
end
as_of() click to toggle source

Sets the order of time sorting using validity time {railseventstore.org/docs/read/ Find out more}

@return [Specification]

# File lib/ruby_event_store/specification.rb, line 133
def as_of
  Specification.new(reader, result.dup { |r| r.time_sort_by = :as_of })
end
backward() click to toggle source

Sets the order of reading events to descending (backward from the start). {railseventstore.org/docs/read/ Find out more}.

@return [Specification]

# File lib/ruby_event_store/specification.rb, line 149
def backward
  Specification.new(reader, result.dup { |r| r.direction = :backward })
end
between(time_range) click to toggle source

Limits the query to events within given time range. {railseventstore.org/docs/read/ Find out more}.

@param time_range [Range] @return [Specification]

# File lib/ruby_event_store/specification.rb, line 113
def between(time_range)
  if time_range.exclude_end?
    newer_than_or_equal(time_range.first).older_than(time_range.last)
  else
    newer_than_or_equal(time_range.first).older_than_or_equal(time_range.last)
  end
end
count() click to toggle source

Calculates the size of result set based on the specification build up to this point. {railseventstore.org/docs/read/ Find out more}.

@return [Integer] Number of events to read

# File lib/ruby_event_store/specification.rb, line 212
def count
  reader.count(result)
end
each() { |event| ... } click to toggle source

Executes the query based on the specification built up to this point. Yields events read from the store if block given. Otherwise, returns enumerable collection. {railseventstore.org/docs/read/ Find out more}.

@yield [Event] event @return [Enumerator, nil] Enumerator is returned when block not given

# File lib/ruby_event_store/specification.rb, line 181
def each
  return to_enum unless block_given?

  each_batch { |batch| batch.each { |event| yield event } }
end
each_batch() { |batch| ... } click to toggle source

Executes the query based on the specification built up to this point. Yields each batch of records that was retrieved from the store. {railseventstore.org/docs/read/ Find out more}.

@yield [Array<Event>] batch of events @return [Enumerator, nil] Enumerator is returned when block not given

# File lib/ruby_event_store/specification.rb, line 169
def each_batch
  return to_enum(:each_batch) unless block_given?

  reader.each(in_batches(result.batch_size).result) { |batch| yield batch }
end
event(event_id) click to toggle source

Reads single event from repository. Returns the event with specified id or nil if event is not found in specified collection of events. {railseventstore.org/docs/read/ Find out more}.

@return [Event, nil]

# File lib/ruby_event_store/specification.rb, line 308
def event(event_id)
  reader.one(read_first.with_id([event_id]).result)
end
event!(event_id) click to toggle source

Reads single existing event from repository. Returns the event with specified id or raises [EventNotFound] error if event is not found in specified collection of events. {railseventstore.org/docs/read/ Find out more}.

@return [Event]

# File lib/ruby_event_store/specification.rb, line 318
def event!(event_id)
  event(event_id) or raise EventNotFound.new(event_id)
end
events(event_ids) click to toggle source

Reads all events of given ids from repository. Yields each event (found by id in specified collection of events) read from the store if block given. Otherwise, returns enumerable collection. {railseventstore.org/docs/read/ Find out more}.

@yield [Event] event @return [Enumerator] Enumerator is returned when block not given

# File lib/ruby_event_store/specification.rb, line 329
def events(event_ids)
  with_id(event_ids).each
end
first() click to toggle source

Executes the query based on the specification built up to this point. Returns the first event in specified collection of events. {railseventstore.org/docs/read/ Find out more}.

@return [Event, nil]

# File lib/ruby_event_store/specification.rb, line 270
def first
  reader.one(read_first.result)
end
forward() click to toggle source

Sets the order of reading events to ascending (forward from the start). {railseventstore.org/docs/read/ Find out more}.

@return [Specification]

# File lib/ruby_event_store/specification.rb, line 141
def forward
  Specification.new(reader, result.dup { |r| r.direction = :forward })
end
from(start) click to toggle source

Limits the query to events before or after another event. {railseventstore.org/docs/read/ Find out more}.

@param start [String] id of event to start reading from. @return [Specification]

# File lib/ruby_event_store/specification.rb, line 29
def from(start)
  raise InvalidPageStart if start.nil? || start.empty?
  Specification.new(reader, result.dup { |r| r.start = start })
end
in_batches(batch_size = DEFAULT_BATCH_SIZE) click to toggle source

Specifies that events should be obtained in batches. {railseventstore.org/docs/read/ Find out more}.

Looping through a collection of events from the store can be inefficient since it will try to instantiate all the events at once.

In that case, batch processing methods allow you to work with the records in batches, thereby greatly reducing memory consumption.

@param batch_size [Integer] number of events to read in a single batch @return [Specification]

# File lib/ruby_event_store/specification.rb, line 238
def in_batches(batch_size = DEFAULT_BATCH_SIZE)
  Specification.new(
    reader,
    result.dup do |r|
      r.read_as = :batch
      r.batch_size = batch_size
    end
  )
end
Also aliased as: in_batches_of
in_batches_of(batch_size = DEFAULT_BATCH_SIZE)
Alias for: in_batches
last() click to toggle source

Executes the query based on the specification built up to this point. Returns the last event in specified collection of events. {railseventstore.org/docs/read/ Find out more}.

@return [Event, nil]

# File lib/ruby_event_store/specification.rb, line 279
def last
  reader.one(read_last.result)
end
limit(count) click to toggle source

Limits the query to specified number of events. {railseventstore.org/docs/read/ Find out more}.

@param count [Integer] maximal number of events to retrieve @return [Specification]

# File lib/ruby_event_store/specification.rb, line 158
def limit(count)
  raise InvalidPageSize unless count && count > 0
  Specification.new(reader, result.dup { |r| r.count = count })
end
map(&block) click to toggle source

Executes the query based on the specification built up to this point and maps the result using provided block. {railseventstore.org/docs/read/ Find out more}.

@return [Array] of mapped result

# File lib/ruby_event_store/specification.rb, line 192
def map(&block)
  raise ArgumentError.new("Block must be given") unless block_given?
  each.map(&block)
end
newer_than(time) click to toggle source

Limits the query to events that occurred after given time. {railseventstore.org/docs/read/ Find out more}.

@param time [Time] @return [Specification]

# File lib/ruby_event_store/specification.rb, line 81
def newer_than(time)
  raise ArgumentError unless time.respond_to?(:to_time)
  Specification.new(
    reader,
    result.dup do |r|
      r.newer_than_or_equal = nil
      r.newer_than = time
    end
  )
end
newer_than_or_equal(time) click to toggle source

Limits the query to events that occurred on or after given time. {railseventstore.org/docs/read/ Find out more}.

@param time [Time] @return [Specification]

# File lib/ruby_event_store/specification.rb, line 97
def newer_than_or_equal(time)
  raise ArgumentError unless time.respond_to?(:to_time)
  Specification.new(
    reader,
    result.dup do |r|
      r.newer_than_or_equal = time
      r.newer_than = nil
    end
  )
end
of_type(*types) click to toggle source

Limits the query to certain event type(s). {railseventstore.org/docs/read/ Find out more}.

@types [Class, Array(Class)] types of event to look for. @return [Specification]

# File lib/ruby_event_store/specification.rb, line 288
def of_type(*types)
  Specification.new(reader, result.dup { |r| r.with_types = types.flatten })
end
Also aliased as: of_types
of_types(*types)
Alias for: of_type
older_than(time) click to toggle source

Limits the query to events that occurred before given time. {railseventstore.org/docs/read/ Find out more}.

@param time [Time] @return [Specification]

# File lib/ruby_event_store/specification.rb, line 49
def older_than(time)
  raise ArgumentError unless time.respond_to?(:to_time)
  Specification.new(
    reader,
    result.dup do |r|
      r.older_than = time
      r.older_than_or_equal = nil
    end
  )
end
older_than_or_equal(time) click to toggle source

Limits the query to events that occurred on or before given time. {railseventstore.org/docs/read/ Find out more}.

@param time [Time] @return [Specification]

# File lib/ruby_event_store/specification.rb, line 65
def older_than_or_equal(time)
  raise ArgumentError unless time.respond_to?(:to_time)
  Specification.new(
    reader,
    result.dup do |r|
      r.older_than = nil
      r.older_than_or_equal = time
    end
  )
end
read_first() click to toggle source

Specifies that only first event should be read. {railseventstore.org/docs/read/ Find out more}.

@return [Specification]

# File lib/ruby_event_store/specification.rb, line 253
def read_first
  Specification.new(reader, result.dup { |r| r.read_as = :first })
end
read_last() click to toggle source

Specifies that only last event should be read. {railseventstore.org/docs/read/ Find out more}.

@return [Specification]

# File lib/ruby_event_store/specification.rb, line 261
def read_last
  Specification.new(reader, result.dup { |r| r.read_as = :last })
end
reduce(accumulator = nil, &block) click to toggle source

Reduces the results of the query based on the specification built up to this point result using provided block. {railseventstore.org/docs/read/ Find out more}.

@param accumulator starting state for reduce operation @return reduce result as defined by block given

# File lib/ruby_event_store/specification.rb, line 203
def reduce(accumulator = nil, &block)
  raise ArgumentError.new("Block must be given") unless block_given?
  each.reduce(accumulator, &block)
end
stream(stream_name) click to toggle source

Limits the query to certain stream. {railseventstore.org/docs/read/ Find out more}.

@param stream_name [String] name of the stream to get events from @return [Specification]

# File lib/ruby_event_store/specification.rb, line 20
def stream(stream_name)
  Specification.new(reader, result.dup { |r| r.stream = Stream.new(stream_name) })
end
to(stop) click to toggle source

Limits the query to events before or after another event. {railseventstore.org/docs/read/ Find out more}.

@param stop [String] id of event to start reading from. @return [Specification]

# File lib/ruby_event_store/specification.rb, line 39
def to(stop)
  raise InvalidPageStop if stop.nil? || stop.empty?
  Specification.new(reader, result.dup { |r| r.stop = stop })
end
to_a() click to toggle source

Executes the query based on the specification built up to this point. Returns array of domain events. {railseventstore.org/docs/read/ Find out more}.

@return [Array<Event>]

# File lib/ruby_event_store/specification.rb, line 221
def to_a
  each.to_a
end
with_id(event_ids) click to toggle source

Limits the query to certain events by given even ids. {railseventstore.org/docs/read/ Find out more}.

@param event_ids [Array(String)] ids of event to look for. @return [Specification]

# File lib/ruby_event_store/specification.rb, line 298
def with_id(event_ids)
  Specification.new(reader, result.dup { |r| r.with_ids = event_ids })
end