Class: FMCache::Engine
- Inherits:
-
Object
- Object
- FMCache::Engine
- Defined in:
- lib/fmcache/engine.rb
Constant Summary collapse
- DEFAULT_TTL =
7 days
7 * 24 * 3600
Instance Attribute Summary collapse
-
#client ⇒ Object
readonly
Returns the value of attribute client.
-
#decoder ⇒ Object
readonly
Returns the value of attribute decoder.
-
#encoder ⇒ Object
readonly
Returns the value of attribute encoder.
-
#fm_parser ⇒ Object
readonly
Returns the value of attribute fm_parser.
Instance Method Summary collapse
- #delete(ids:) ⇒ Object
- #fetch(ids:, field_mask:) {|ids,| ... } ⇒ <Hash>
-
#initialize(client:, fm_parser:, ttl: DEFAULT_TTL, notifier: nil, json_serializer: nil) ⇒ Engine
constructor
A new instance of Engine.
- #read(ids:, field_mask:) ⇒ <Hash>, IncompleteInfo
- #write(values:, field_mask:) ⇒ Boolean
Constructor Details
#initialize(client:, fm_parser:, ttl: DEFAULT_TTL, notifier: nil, json_serializer: nil) ⇒ Engine
Returns a new instance of Engine.
10 11 12 13 14 15 16 17 |
# File 'lib/fmcache/engine.rb', line 10 def initialize(client:, fm_parser:, ttl: DEFAULT_TTL, notifier: nil, json_serializer: nil) @client = Client.new(client, notifier) @fm_parser = wrap(fm_parser) @ttl = ttl @encoder = Encoder.new @decoder = Decoder.new(@fm_parser) @jsonizer = Jsonizer.new(json_serializer) end |
Instance Attribute Details
#client ⇒ Object (readonly)
Returns the value of attribute client.
19 20 21 |
# File 'lib/fmcache/engine.rb', line 19 def client @client end |
#decoder ⇒ Object (readonly)
Returns the value of attribute decoder.
19 20 21 |
# File 'lib/fmcache/engine.rb', line 19 def decoder @decoder end |
#encoder ⇒ Object (readonly)
Returns the value of attribute encoder.
19 20 21 |
# File 'lib/fmcache/engine.rb', line 19 def encoder @encoder end |
#fm_parser ⇒ Object (readonly)
Returns the value of attribute fm_parser.
19 20 21 |
# File 'lib/fmcache/engine.rb', line 19 def fm_parser @fm_parser end |
Instance Method Details
#delete(ids:) ⇒ Object
82 83 84 85 |
# File 'lib/fmcache/engine.rb', line 82 def delete(ids:) ids = ids.map(&:to_i) client.del(keys: Helper.to_keys(ids)) end |
#fetch(ids:, field_mask:) {|ids,| ... } ⇒ <Hash>
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/fmcache/engine.rb', line 53 def fetch(ids:, field_mask:, &block) ids = ids.map(&:to_i) normalize!(field_mask) values, incomplete_values, incomplete_info = read(ids: ids, field_mask: field_mask) return values if incomplete_info.ids.size == 0 # NOTE: get new data d = block.call(incomplete_info.ids, incomplete_info.field_mask) write(values: d, field_mask: incomplete_info.field_mask) older = encode(incomplete_values, field_mask) newer = encode(d, incomplete_info.field_mask) v, i_v, i_i = decode(older.deep_merge(newer), field_mask) if i_i.ids.size == 0 r = values + v + i_v else # NOTE: Fallback to block.call with full field_mask d2 = block.call(i_i.ids, field_mask) write(values: d2, field_mask: field_mask) r = values + d2 end Helper.sort(r, ids) end |
#read(ids:, field_mask:) ⇒ <Hash>, IncompleteInfo
33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/fmcache/engine.rb', line 33 def read(ids:, field_mask:) ids = ids.map(&:to_i) normalize!(field_mask) keys = Helper.to_keys(ids) fields = Helper.to_fields(field_mask) h = client.get(keys: keys, fields: fields) with_id, with_no_id = split(h) v, i_v, i_i = decode(@jsonizer.dejsonize(with_id), field_mask) with_no_id_list = Helper.to_ids(with_no_id.keys) return v, i_v, merge(i_i, with_no_id_list, field_mask) end |
#write(values:, field_mask:) ⇒ Boolean
24 25 26 27 28 |
# File 'lib/fmcache/engine.rb', line 24 def write(values:, field_mask:) normalize!(field_mask) h = encode(values, field_mask) client.set(values: @jsonizer.jsonize(h), ttl: @ttl) end |