Class: DecisionAgent::ABTesting::Storage::MemoryAdapter

Inherits:
Adapter
  • Object
show all
Includes:
MonitorMixin
Defined in:
lib/decision_agent/ab_testing/storage/memory_adapter.rb

Overview

In-memory storage adapter for A/B tests Useful for testing and development

Instance Method Summary collapse

Constructor Details

#initializeMemoryAdapter

Returns a new instance of MemoryAdapter.



13
14
15
16
17
18
19
# File 'lib/decision_agent/ab_testing/storage/memory_adapter.rb', line 13

def initialize
  super
  @tests = {}
  @assignments = {}
  @test_id_counter = 0
  @assignment_id_counter = 0
end

Instance Method Details

#assignment_countObject



112
113
114
# File 'lib/decision_agent/ab_testing/storage/memory_adapter.rb', line 112

def assignment_count
  synchronize { @assignments.size }
end

#clear!Object

Additional helper methods



99
100
101
102
103
104
105
106
# File 'lib/decision_agent/ab_testing/storage/memory_adapter.rb', line 99

def clear!
  synchronize do
    @tests.clear
    @assignments.clear
    @test_id_counter = 0
    @assignment_id_counter = 0
  end
end

#delete_test(test_id) ⇒ Object



90
91
92
93
94
95
96
# File 'lib/decision_agent/ab_testing/storage/memory_adapter.rb', line 90

def delete_test(test_id)
  synchronize do
    @tests.delete(test_id.to_i)
    @assignments.delete_if { |_id, a| a[:ab_test_id] == test_id }
    true
  end
end

#get_assignments(test_id) ⇒ Object



83
84
85
86
87
88
# File 'lib/decision_agent/ab_testing/storage/memory_adapter.rb', line 83

def get_assignments(test_id)
  synchronize do
    assignments = @assignments.values.select { |a| a[:ab_test_id] == test_id }
    assignments.map { |a| ABTestAssignment.new(**a) }
  end
end

#get_test(test_id) ⇒ Object



31
32
33
34
35
36
# File 'lib/decision_agent/ab_testing/storage/memory_adapter.rb', line 31

def get_test(test_id)
  synchronize do
    test_data = @tests[test_id.to_i]
    test_data ? ABTest.new(**test_data) : nil
  end
end

#list_tests(status: nil, limit: nil) ⇒ Object



50
51
52
53
54
55
56
57
58
59
# File 'lib/decision_agent/ab_testing/storage/memory_adapter.rb', line 50

def list_tests(status: nil, limit: nil)
  synchronize do
    tests = @tests.values

    tests = tests.select { |t| t[:status] == status } if status
    tests = tests.last(limit) if limit

    tests.map { |t| ABTest.new(**t) }
  end
end

#save_assignment(assignment) ⇒ Object



61
62
63
64
65
66
67
68
69
# File 'lib/decision_agent/ab_testing/storage/memory_adapter.rb', line 61

def save_assignment(assignment)
  synchronize do
    @assignment_id_counter += 1
    assignment_data = assignment.to_h.merge(id: @assignment_id_counter)
    @assignments[@assignment_id_counter] = assignment_data

    ABTestAssignment.new(**assignment_data)
  end
end

#save_test(test) ⇒ Object



21
22
23
24
25
26
27
28
29
# File 'lib/decision_agent/ab_testing/storage/memory_adapter.rb', line 21

def save_test(test)
  synchronize do
    @test_id_counter += 1
    test_data = test.to_h.merge(id: @test_id_counter)
    @tests[@test_id_counter] = test_data

    ABTest.new(**test_data)
  end
end

#test_countObject



108
109
110
# File 'lib/decision_agent/ab_testing/storage/memory_adapter.rb', line 108

def test_count
  synchronize { @tests.size }
end

#update_assignment(assignment_id, attributes) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
# File 'lib/decision_agent/ab_testing/storage/memory_adapter.rb', line 71

def update_assignment(assignment_id, attributes)
  synchronize do
    assignment_data = @assignments[assignment_id.to_i]
    raise "Assignment not found: #{assignment_id}" unless assignment_data

    assignment_data.merge!(attributes)
    @assignments[assignment_id.to_i] = assignment_data

    ABTestAssignment.new(**assignment_data)
  end
end

#update_test(test_id, attributes) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/decision_agent/ab_testing/storage/memory_adapter.rb', line 38

def update_test(test_id, attributes)
  synchronize do
    test_data = @tests[test_id.to_i]
    raise TestNotFoundError, "Test not found: #{test_id}" unless test_data

    test_data.merge!(attributes)
    @tests[test_id.to_i] = test_data

    ABTest.new(**test_data)
  end
end