Sha256: f1e5ffa41427a6a43bd3c84352abbf4dce3f95f97022ba84220d1196d45b44ea

Contents?: true

Size: 1.39 KB

Versions: 6

Compression:

Stored size: 1.39 KB

Contents

module OData4
  class Query
    module InBatches
      DEFAULT_BATCH_SIZE = 10

      # Process results in batches.
      #
      # When a block is given, yields `OData4::Query::Result`
      # objects of specified batch size to the block.
      #
      #   service['Products'].query.in_batches(of: 10) do |batch|
      #     batch.count # batch size (10 except for last batch)
      #     batch.is_a? OData4::Query::Result # true
      #   end
      #
      # Returns an Enumerator to process results individually.
      #
      #   service['Products'].query.in_batches.each do |entity|
      #     entity.is_a? OData4::Entity # true
      #   end
      #
      # @param of: [int] batch size
      # @return [Enumerator]
      def in_batches(of: DEFAULT_BATCH_SIZE, &block)
        per_page = of

        if block_given?
          each_batch(of, &block)
        else
          Enumerator.new do |result|
            each_batch(of) do |batch|
              batch.each { |entity| result << entity }
            end
          end
        end
      end

      private

      def each_batch(per_page, &block)
        page = 0

        loop do
          batch = get_paginated_entities(per_page, page)
          break if batch.empty?

          yield batch

          page += 1
        end
      end

      def get_paginated_entities(per_page, page)
        skip(per_page * page).limit(per_page).execute
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
odata4-0.9.1 lib/odata4/query/in_batches.rb
odata4-0.9.0 lib/odata4/query/in_batches.rb
odata4-0.8.2 lib/odata4/query/in_batches.rb
odata4-0.8.1 lib/odata4/query/in_batches.rb
odata4-0.8.0 lib/odata4/query/in_batches.rb
odata4-0.7.0 lib/odata4/query/in_batches.rb