Class: DataComApi::Responses::SearchBase

Inherits:
Base
  • Object
show all
Defined in:
lib/data-com-api/responses/search_base.rb

Overview

Abstract class

Direct Known Subclasses

SearchCompany, SearchContact

Constant Summary collapse

OFFSET_KEYS =
[:start_at_offset, :end_at_offset].freeze

Instance Method Summary collapse

Constructor Details

#initialize(api_client, received_options) ⇒ SearchBase

Options accept 2 special params: :start_at_offset and :end_at_offset which is where the records will be start being fetched from



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/data-com-api/responses/search_base.rb', line 12

def initialize(api_client, received_options)
  @start_at_offset = 0
  @end_at_offset   = nil

  unless received_options[OFFSET_KEYS[0]].nil?
    @start_at_offset = received_options[OFFSET_KEYS[0]].to_i
  end
  unless received_options[OFFSET_KEYS[1]].nil?
    @end_at_offset = received_options[OFFSET_KEYS[1]].to_i
  end

  @options = received_options.reject { |key| OFFSET_KEYS.include? key.to_sym }
  super(api_client)

  # Cache pagesize, MUST NOT change between requests
  @page_size = client.page_size
end

Instance Method Details

#allObject Also known as: to_a

Be careful, this will load all records in memory, check total_records before doing such a thing



63
64
65
66
67
68
69
# File 'lib/data-com-api/responses/search_base.rb', line 63

def all
  all_records = Array.new(self.real_size)

  self.each_with_index { |record, index| all_records[index] = record }

  all_records
end

#at_offset(offset) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
# File 'lib/data-com-api/responses/search_base.rb', line 49

def at_offset(offset)
  page_options = options.merge(
    offset:    offset,
    page_size: page_size
  )

  request = self.perform_request(page_options)
  calculate_size_from_request! request

  self.transform_request request
end

#each_with_indexObject Also known as: each



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/data-com-api/responses/search_base.rb', line 71

def each_with_index
  records_per_previous_page = page_size
  current_offset            = @start_at_offset
  total_records             = current_offset

  loop do
    break if current_offset > self.real_max_offset

    records = at_offset(current_offset)

    records.each_with_index do |record, index|
      yield(record, index + current_offset)
    end

    records_per_previous_page  = records.size
    current_offset            += page_size
    total_records             += records_per_previous_page

    if records_per_previous_page != page_size || total_records == self.size
      break
    end
  end
end

#max_sizeObject



41
42
43
# File 'lib/data-com-api/responses/search_base.rb', line 41

def max_size
  self.real_max_offset + page_size
end

#real_max_offsetObject



95
96
97
98
99
100
101
102
103
104
105
# File 'lib/data-com-api/responses/search_base.rb', line 95

def real_max_offset
  return @real_max_offset if @real_max_offset

  @real_max_offset = client.max_offset
  @real_max_offset = @real_max_offset - (@real_max_offset % page_size)
  unless @end_at_offset.nil? || @real_max_offset < @end_at_offset
    @real_max_offset = @end_at_offset
  end

  @real_max_offset
end

#real_sizeObject



45
46
47
# File 'lib/data-com-api/responses/search_base.rb', line 45

def real_size
  self.size > self.real_max_offset ? self.max_size : self.size
end

#sizeObject



30
31
32
33
34
35
36
37
38
39
# File 'lib/data-com-api/responses/search_base.rb', line 30

def size
  return @size if @size

  size_options = options.merge(
    offset:    0,
    page_size: client.size_only_page_size
  )
  
  calculate_size_from_request! self.perform_request(size_options)
end