Class: Google::Apis::Core::PagedResults

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/google/apis/core/base_service.rb

Overview

Helper class for enumerating over a result set requiring multiple fetches

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(service, max: nil, items: :items, cache: true, response_page_token: :next_page_token, &block) ⇒ PagedResults

Returns a new instance of PagedResults

Parameters:

  • service (BaseService)

    Current service instance

  • max (Fixnum)

    Maximum number of items to iterate over. Nil if no limit

  • cache (Boolean)

    True (default) if results should be cached so multiple iterations can be used.

  • items (Symbol)

    Name of the field in the result containing the items. Defaults to :items

[View source]

43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/google/apis/core/base_service.rb', line 43

def initialize(service, max: nil, items: :items, cache: true, response_page_token: :next_page_token, &block)
  @service = service
  @block = block
  @max = max
  @items_field = items
  @response_page_token_field = response_page_token
  if cache
    @result_cache = Hash.new do |h, k|
      h[k] = @block.call(k, @service)
    end
    @fetch_proc = Proc.new { |token| @result_cache[token] }
  else
    @fetch_proc = Proc.new { |token| @block.call(token, @service) }
  end
end

Instance Attribute Details

#last_resultObject (readonly)

Returns the value of attribute last_result


33
34
35
# File 'lib/google/apis/core/base_service.rb', line 33

def last_result
  @last_result
end

Instance Method Details

#eachObject

Iterates over result set, fetching additional pages as needed

[View source]

60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/google/apis/core/base_service.rb', line 60

def each
  page_token = nil
  item_count = 0
  loop do
    @last_result = @fetch_proc.call(page_token)
    items = @last_result.send(@items_field)
    if items.kind_of?(Array)
      for item in items
        item_count = item_count + 1
        break if @max && item_count > @max
        yield item
      end
    elsif items
      # yield singular non-nil items (for genomics API)
      yield items
    end
    break if @max && item_count >= @max
    next_page_token = @last_result.send(@response_page_token_field)
    break if next_page_token.nil? || next_page_token == page_token
    page_token = next_page_token
  end
end