class Airspace::Reader

This is the main class that knows how to fetch and interpret the dataset. It is optimized for chunking/paging and allows you to only pull back specific pages (if desired.)

Attributes

client[R]
data[R]
key[R]
metadata[R]
serializer[R]

Public Class Methods

find_by_id(client, id, options: {}) click to toggle source
# File lib/airspace/reader.rb, line 20
def find_by_id(client, id, options: {})
  key        = ::Airspace::Key.new(id, prefix: options[:prefix])
  serializer = options[:serializer] || ::Airspace::Serializer.new
  hash       = fetch_and_transform(client, key, serializer)
  return nil unless hash

  metadata_args = hash[METADATA_KEY].map { |k, v| [k.to_sym, v] }.to_h

  new(
    client,
    data: hash[DATA_KEY],
    key: key,
    metadata: ::Airspace::Metadata.new(metadata_args),
    serializer: serializer
  )
end
new(client, data:, key:, metadata:, serializer:) click to toggle source
# File lib/airspace/reader.rb, line 58
def initialize(client, data:, key:, metadata:, serializer:)
  @client     = client
  @key        = key
  @data       = data
  @metadata   = metadata
  @serializer = serializer

  freeze
end

Private Class Methods

fetch_and_transform(client, key, serializer) click to toggle source
# File lib/airspace/reader.rb, line 39
def fetch_and_transform(client, key, serializer)
  hash = ::Airspace::Store.new(client).retrieve(key)
  return nil unless hash

  {}.tap do |h|
    h[DATA_KEY] = serializer.deserialize_data(hash[DATA_KEY])
    h[METADATA_KEY] = JSON.parse(hash[METADATA_KEY])
  end
end

Public Instance Methods

delete() click to toggle source
# File lib/airspace/reader.rb, line 86
def delete
  store.delete(key, page_count)
end
page(number) click to toggle source
# File lib/airspace/reader.rb, line 76
def page(number)
  return [] unless within_bounds?(number)

  page_index  = number - 1
  location    = chunker.locate(page_index)
  chunk       = store.chunk(key, location.chunk_index)

  chunk[location.page_index].map { |r| serializer.deserialize_row(r) }
end
pages() click to toggle source
# File lib/airspace/reader.rb, line 68
def pages
  return [] unless page_count.positive?

  store.chunks(key, chunk_count).map do |chunk|
    chunk.map { |r| serializer.deserialize_row(r) }
  end
end

Private Instance Methods

store() click to toggle source
# File lib/airspace/reader.rb, line 96
def store
  ::Airspace::Store.new(client)
end
within_bounds?(number) click to toggle source
# File lib/airspace/reader.rb, line 92
def within_bounds?(number)
  page_count.positive? && number.positive? && number <= page_count
end