Class: CleverSequence

Inherits:
Object
  • Object
show all
Defined in:
lib/demo_mode/clever_sequence.rb,
lib/demo_mode/clever_sequence/postgres_backend.rb,
lib/demo_mode/clever_sequence/in_memory_backend.rb,
lib/demo_mode/clever_sequence/lower_bound_finder.rb

Defined Under Namespace

Modules: InMemoryBackend, PostgresBackend Classes: LowerBoundFinder

Constant Summary collapse

DEFAULT_BLOCK =
->(i) { i }

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attribute, &block) ⇒ CleverSequence

Returns a new instance of CleverSequence.



56
57
58
59
# File 'lib/demo_mode/clever_sequence.rb', line 56

def initialize(attribute, &block)
  @attribute = attribute.to_s
  @block = block || DEFAULT_BLOCK
end

Instance Attribute Details

#attributeObject (readonly)

Returns the value of attribute attribute.



54
55
56
# File 'lib/demo_mode/clever_sequence.rb', line 54

def attribute
  @attribute
end

#blockObject (readonly)

Returns the value of attribute block.



54
55
56
# File 'lib/demo_mode/clever_sequence.rb', line 54

def block
  @block
end

#klassObject (readonly)

Returns the value of attribute klass.



54
55
56
# File 'lib/demo_mode/clever_sequence.rb', line 54

def klass
  @klass
end

Class Method Details

.backendObject



20
21
22
# File 'lib/demo_mode/clever_sequence.rb', line 20

def backend
  use_database_sequences? ? PostgresBackend : InMemoryBackend
end

.last(klass, name) ⇒ Object



43
44
45
# File 'lib/demo_mode/clever_sequence.rb', line 43

def last(klass, name)
  lookup(klass, name)&.last
end

.next(klass, name) ⇒ Object



39
40
41
# File 'lib/demo_mode/clever_sequence.rb', line 39

def next(klass, name)
  lookup(klass, name)&.next
end

.reset!Object



24
25
26
27
# File 'lib/demo_mode/clever_sequence.rb', line 24

def reset!
  backend.reset!
  sequences.each_value(&:reset!)
end

.snapshot_last_valuesObject



35
36
37
# File 'lib/demo_mode/clever_sequence.rb', line 35

def snapshot_last_values
  sequences.transform_values { |seq| seq.send(:last_value) }.compact
end

.with_sequence_adjustmentObject



29
30
31
32
33
# File 'lib/demo_mode/clever_sequence.rb', line 29

def with_sequence_adjustment(&)
  last_values = snapshot_last_values
  reset!
  backend.with_sequence_adjustment(last_values:, &)
end

Instance Method Details

#lastObject



77
78
79
# File 'lib/demo_mode/clever_sequence.rb', line 77

def last
  block.call(last_value || (klass ? self.class.backend.starting_value(klass, attribute, block) : 0))
end

#nextObject



67
68
69
70
71
72
73
74
75
# File 'lib/demo_mode/clever_sequence.rb', line 67

def next
  value = if klass
    self.class.backend.nextval(klass, attribute, block)
  else
    (last_value || 0) + 1
  end
  self.last_value = value
  last
end

#reset!Object



81
82
83
# File 'lib/demo_mode/clever_sequence.rb', line 81

def reset!
  clear_last_value
end

#with_class(klass) ⇒ Object



61
62
63
64
65
# File 'lib/demo_mode/clever_sequence.rb', line 61

def with_class(klass)
  sequences[[klass.name, attribute.to_s]] = self if klass && !@klass
  @klass ||= klass
  self
end