Class: Promoted::Ruby::Client::Pager

Inherits:
Object
  • Object
show all
Defined in:
lib/promoted/ruby/client/pager.rb

Instance Method Summary collapse

Instance Method Details

#_sanitize_offsets(retrieval_insertion_offset, paging) ⇒ Object



21
22
23
24
25
26
# File 'lib/promoted/ruby/client/pager.rb', line 21

def _sanitize_offsets(retrieval_insertion_offset, paging)
  offset = [0, paging[:offset]].max
  retrieval_insertion_offset = [0, retrieval_insertion_offset].max
  index = [0, offset - retrieval_insertion_offset].max
  return [offset, retrieval_insertion_offset, index]
end

#_validate_paging(insertions, retrieval_insertion_offset, offset, index) ⇒ Object



28
29
30
31
32
33
34
35
# File 'lib/promoted/ruby/client/pager.rb', line 28

def _validate_paging(insertions, retrieval_insertion_offset, offset, index)
  if offset < retrieval_insertion_offset
    raise InvalidPagingError.new("Invalid page offset (retrieval_insertion_offset #{retrieval_insertion_offset}, offset #{offset})", [])
  end
  if index >= insertions.length
    raise InvalidPagingError.new("Invalid page offset (insertion size #{insertions.length}, index #{index})", [])
  end
end

#apply_paging(insertions, retrieval_insertion_offset, paging = nil) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/promoted/ruby/client/pager.rb', line 37

def apply_paging(insertions, retrieval_insertion_offset, paging = nil)
  if !paging
    paging = {
      :offset => 0,
      :size => insertions.length
    }
  end

  offset, retrieval_insertion_offset, index = _sanitize_offsets(retrieval_insertion_offset, paging)

  begin
    _validate_paging(insertions, retrieval_insertion_offset, offset, index)
  rescue InvalidPagingError => err
    # This is invalid input, stop it before it goes to the server.
    return err.default_insertions_page
  end

  size = paging[:size]
  if size <= 0
    size = insertions.length
  end

  final_insertion_size = [size, insertions.length - index].min
  insertion_page = Array.new(final_insertion_size)
  0.upto(final_insertion_size - 1) {|i|
    request_insertion = insertions[index]
    # Pager returns response insertions.  Create a copy and fill in some of the fields.
    response_insertion = Hash[]
    response_insertion[:content_id] = request_insertion[:content_id]
    response_insertion[:insertion_id] = request_insertion[:insertion_id]
    # TODO - implement retrieval_start.
    response_insertion[:position] = offset
    insertion_page[i] = response_insertion
    index = index + 1
    offset = offset + 1
  }

  return insertion_page
end

#validate_paging(insertions, retrieval_insertion_offset, paging) ⇒ Object



14
15
16
17
18
19
# File 'lib/promoted/ruby/client/pager.rb', line 14

def validate_paging(insertions, retrieval_insertion_offset, paging)
  if paging && paging[:offset]
    offset, retrieval_insertion_offset, index = _sanitize_offsets(retrieval_insertion_offset, paging)
    _validate_paging(insertions, retrieval_insertion_offset, offset, index)
  end
end