Class: Synthra::Generator::Uniqueness
- Inherits:
-
Object
- Object
- Synthra::Generator::Uniqueness
- Defined in:
- lib/synthra/generator/uniqueness.rb
Overview
Tracks unique values for uniqueness constraints
Instance Method Summary collapse
-
#clear ⇒ void
Clear all tracked values.
-
#clear_field(field) ⇒ void
Clear values for a specific field.
-
#count_for(field) ⇒ Integer
Number of unique values tracked for a field.
-
#generate_unique(field) { ... } ⇒ Object
Generate a unique value.
-
#initialize(max_retries: nil, schema_name: nil) ⇒ Uniqueness
constructor
A new instance of Uniqueness.
-
#track(field, value) ⇒ void
Track a generated value.
-
#unique?(field, value) ⇒ Boolean
Check if a value is unique for a field.
-
#values_for(field) ⇒ Set
Get all tracked values for a field.
Constructor Details
#initialize(max_retries: nil, schema_name: nil) ⇒ Uniqueness
Returns a new instance of Uniqueness.
8 9 10 11 12 13 |
# File 'lib/synthra/generator/uniqueness.rb', line 8 def initialize(max_retries: nil, schema_name: nil) @max_retries = max_retries || Synthra.configuration.max_unique_retries @schema_name = schema_name @values = Hash.new { |h, k| h[k] = Set.new } @mutex = Mutex.new end |
Instance Method Details
#clear ⇒ void
This method returns an undefined value.
Clear all tracked values
74 75 76 77 78 |
# File 'lib/synthra/generator/uniqueness.rb', line 74 def clear @mutex.synchronize do @values.clear end end |
#clear_field(field) ⇒ void
This method returns an undefined value.
Clear values for a specific field
86 87 88 89 90 |
# File 'lib/synthra/generator/uniqueness.rb', line 86 def clear_field(field) @mutex.synchronize do @values.delete(field.to_s) end end |
#count_for(field) ⇒ Integer
Number of unique values tracked for a field
110 111 112 113 114 |
# File 'lib/synthra/generator/uniqueness.rb', line 110 def count_for(field) @mutex.synchronize do @values[field.to_s].size end end |
#generate_unique(field) { ... } ⇒ Object
Generate a unique value
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/synthra/generator/uniqueness.rb', line 49 def generate_unique(field) last_values = [] @max_retries.times do value = yield if unique?(field, value) track(field, value) return value end last_values << value last_values.shift if last_values.length > 10 end raise UniquenessError.new( field: field, attempts: @max_retries, last_values: last_values, schema_name: @schema_name ) end |
#track(field, value) ⇒ void
This method returns an undefined value.
Track a generated value
22 23 24 25 26 |
# File 'lib/synthra/generator/uniqueness.rb', line 22 def track(field, value) @mutex.synchronize do @values[field.to_s].add(value) end end |
#unique?(field, value) ⇒ Boolean
Check if a value is unique for a field
35 36 37 38 39 |
# File 'lib/synthra/generator/uniqueness.rb', line 35 def unique?(field, value) @mutex.synchronize do !@values[field.to_s].include?(value) end end |
#values_for(field) ⇒ Set
Get all tracked values for a field
98 99 100 101 102 |
# File 'lib/synthra/generator/uniqueness.rb', line 98 def values_for(field) @mutex.synchronize do @values[field.to_s].dup end end |