Class: FMCache::Engine

Inherits:
Object
  • Object
show all
Defined in:
lib/fmcache/engine.rb

Constant Summary collapse

DEFAULT_TTL =

7 days

7 * 24 * 3600

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client:, fm_parser:, ttl: DEFAULT_TTL, notifier: nil, json_serializer: nil) ⇒ Engine



6
7
8
9
10
11
12
13
# File 'lib/fmcache/engine.rb', line 6

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

#clientObject (readonly)

Returns the value of attribute client.



15
16
17
# File 'lib/fmcache/engine.rb', line 15

def client
  @client
end

#decoderObject (readonly)

Returns the value of attribute decoder.



15
16
17
# File 'lib/fmcache/engine.rb', line 15

def decoder
  @decoder
end

#encoderObject (readonly)

Returns the value of attribute encoder.



15
16
17
# File 'lib/fmcache/engine.rb', line 15

def encoder
  @encoder
end

#fm_parserObject (readonly)

Returns the value of attribute fm_parser.



15
16
17
# File 'lib/fmcache/engine.rb', line 15

def fm_parser
  @fm_parser
end

Instance Method Details

#delete(ids:) ⇒ Object



69
70
71
72
# File 'lib/fmcache/engine.rb', line 69

def delete(ids:)
  ids = ids.map(&:to_i)
  client.del(keys: Helper.to_keys(ids))
end

#fetch(ids:, field_mask:) {|ids,| ... } ⇒ <Hash>

Yield Parameters:

  • ids, (<Integer>, FieldMaskParser::Node)

    field_mask

Yield Returns:

  • (<Hash>)


44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/fmcache/engine.rb', line 44

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_values.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)

  # NOTE: Delete invalid data as read repair
  client.hdel(
    keys:   Helper.to_keys(i_i.ids),
    fields: Helper.to_fields(i_i.field_mask),
  )

  Helper.sort(values + v + i_v, ids)
end

#read(ids:, field_mask:) ⇒ <Hash>, IncompleteInfo



29
30
31
32
33
34
35
36
37
# File 'lib/fmcache/engine.rb', line 29

def read(ids:, field_mask:)
  ids = ids.map(&:to_i)
  normalize!(field_mask)

  keys   = Helper.to_keys(ids)
  fields = Helper.to_fields(field_mask).map(&:to_s)
  h = client.get(keys: keys, fields: fields)
  decode(merge(@jsonizer.dejsonize(h), ids), field_mask)
end

#write(values:, field_mask:) ⇒ Boolean



20
21
22
23
24
# File 'lib/fmcache/engine.rb', line 20

def write(values:, field_mask:)
  normalize!(field_mask)
  h = encode(values, field_mask)
  client.set(values: @jsonizer.jsonize(h), ttl: @ttl)
end