Sha256: d6c67b52b04fc19f54e0b5fdf46b8443e3ff74fbc7cdaba571b45d40e9367abc

Contents?: true

Size: 1.73 KB

Versions: 14

Compression:

Stored size: 1.73 KB

Contents

# frozen_string_literal: true

module PgEventstore
  module Web
    module Paginator
      class StreamIdsCollection < BaseCollection
        # @return [Integer]
        PER_PAGE = 10

        # @return [Array<Hash<String => String>>]
        def collection
          @_collection ||=
            begin
              sql_builder =
                SQLBuilder.new.select('stream_id').from('events').
                  where('context = ? and stream_name = ?', options[:context], options[:stream_name]).
                  where('stream_id like ?', "#{options[:query]}%")
              sql_builder.where("stream_id #{direction_operator} ?", starting_id) if starting_id
              sql_builder.group('stream_id').limit(per_page).order("stream_id #{order}")
              connection.with do |conn|
                conn.exec_params(*sql_builder.to_exec_params)
              end.to_a
            end
        end

        # @return [String, nil]
        def next_page_starting_id
          return unless collection.size == per_page

          starting_id = collection.first['stream_id']
          sql_builder =
            SQLBuilder.new.select('stream_id').from('events').
              where("stream_id #{direction_operator} ?", starting_id).where('stream_id like ?', "#{options[:query]}%").
              where('context = ? and stream_name = ?', options[:context], options[:stream_name]).
              group('stream_id').limit(1).offset(per_page).order("stream_id #{order}")

          connection.with do |conn|
            conn.exec_params(*sql_builder.to_exec_params)
          end.to_a.dig(0, 'stream_id')
        end

        private

        # @return [String]
        def direction_operator
          order == :asc ? '>=' : '<='
        end
      end
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
pg_eventstore-1.9.0 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.8.0 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.7.0 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.6.0 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.5.0 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.4.0 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.3.4 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.3.3 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.3.2 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.3.1 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.3.0 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.2.0 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.1.5 lib/pg_eventstore/web/paginator/stream_ids_collection.rb
pg_eventstore-1.1.4 lib/pg_eventstore/web/paginator/stream_ids_collection.rb