Class: Synthra::Generator::Uniqueness

Inherits:
Object
  • Object
show all
Defined in:
lib/synthra/generator/uniqueness.rb

Overview

Tracks unique values for uniqueness constraints

Instance Method Summary collapse

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

#clearvoid

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

Parameters:

  • field (String)

    field name



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

Parameters:

  • field (String)

    field name

Returns:

  • (Integer)


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

Parameters:

  • field (String)

    field name

Yields:

  • block that generates a value

Returns:

  • (Object)

    unique value

Raises:



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

Parameters:

  • field (String)

    field name

  • value (Object)

    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

Parameters:

  • field (String)

    field name

  • value (Object)

    value to check

Returns:

  • (Boolean)


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

Parameters:

  • field (String)

    field name

Returns:

  • (Set)


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