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