Class: Caoutsearch::Search::Value

Inherits:
Object
  • Object
show all
Defined in:
lib/caoutsearch/search/value.rb

Constant Summary collapse

INTEGER_TYPE_LIMITS =
{
  "long" => bytes_size_to_integer_range(64),
  "integer" => bytes_size_to_integer_range(32),
  "short" => bytes_size_to_integer_range(16),
  "byte" => bytes_size_to_integer_range(8)
}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(original_value, type, null_values: nil, transform: nil, sanitize: false) ⇒ Value

Returns a new instance of Value.



8
9
10
11
12
13
14
15
# File 'lib/caoutsearch/search/value.rb', line 8

def initialize(original_value, type, null_values: nil, transform: nil, sanitize: false)
  @original_value = original_value
  @type = type
  @null_values = Array.wrap(null_values)
  @sanitize_value = sanitize
  @transform_proc = transform
  @transform_proc = transform.to_proc if transform.is_a?(Symbol)
end

Instance Attribute Details

#null_valuesObject (readonly)

Returns the value of attribute null_values.



6
7
8
# File 'lib/caoutsearch/search/value.rb', line 6

def null_values
  @null_values
end

#original_valueObject (readonly)

Returns the value of attribute original_value.



6
7
8
# File 'lib/caoutsearch/search/value.rb', line 6

def original_value
  @original_value
end

#overflow_strategyObject (readonly)

Returns the value of attribute overflow_strategy.



6
7
8
# File 'lib/caoutsearch/search/value.rb', line 6

def overflow_strategy
  @overflow_strategy
end

#transform_procObject (readonly)

Returns the value of attribute transform_proc.



6
7
8
# File 'lib/caoutsearch/search/value.rb', line 6

def transform_proc
  @transform_proc
end

#typeObject (readonly)

Returns the value of attribute type.



6
7
8
# File 'lib/caoutsearch/search/value.rb', line 6

def type
  @type
end

Class Method Details

.bytes_size_to_integer_range(bytes_size) ⇒ Object



60
61
62
63
# File 'lib/caoutsearch/search/value.rb', line 60

def self.bytes_size_to_integer_range(bytes_size)
  limit = 2**(bytes_size - 1)
  -limit..(limit - 1)
end

Instance Method Details

#cast_value(value) ⇒ Object



31
32
33
# File 'lib/caoutsearch/search/value.rb', line 31

def cast_value(value)
  Caoutsearch::Search::TypeCast.cast(type, value)
end

#check_value_overflow(value) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/caoutsearch/search/value.rb', line 43

def check_value_overflow(value)
  if value.is_a?(Array)
    value.map { |v| check_value_overflow(v) }
  elsif value.nil?
    value
  else
    range = INTEGER_TYPE_LIMITS[type.to_s]

    if range
      raise Caoutsearch::Search::ValueOverflow.new(:lower, value, range.first) if value < range.first
      raise Caoutsearch::Search::ValueOverflow.new(:upper, value, range.last) if range && value > range.last
    end

    value
  end
end

#reduce_value(value) ⇒ Object



101
102
103
104
105
106
107
108
# File 'lib/caoutsearch/search/value.rb', line 101

def reduce_value(value)
  if value.is_a?(Array) && value.size == 1
    value[0]

  else
    value
  end
end

#replace_null_values(value) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
# File 'lib/caoutsearch/search/value.rb', line 89

def replace_null_values(value)
  if value.is_a?(Array)
    value.map { |v| replace_null_values(v) }

  elsif null_values.include?(value)
    nil

  else
    value
  end
end

#sanitize_value(value) ⇒ Object



35
36
37
# File 'lib/caoutsearch/search/value.rb', line 35

def sanitize_value(value)
  Caoutsearch::Search::Sanitizer.sanitize(value)
end

#sanitize_value?Boolean

Returns:

  • (Boolean)


39
40
41
# File 'lib/caoutsearch/search/value.rb', line 39

def sanitize_value?
  !!@sanitize_value
end

#strip_value(value) ⇒ Object



84
85
86
87
# File 'lib/caoutsearch/search/value.rb', line 84

def strip_value(value)
  value = value.strip if value.is_a?(String)
  value
end

#transform_value(value) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
# File 'lib/caoutsearch/search/value.rb', line 72

def transform_value(value)
  if value.is_a?(Array)
    value.flat_map { |v| transform_value(v) }

  elsif transform_proc.respond_to?(:call)
    transform_proc.call(value)

  else
    value
  end
end

#valueObject



17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/caoutsearch/search/value.rb', line 17

def value
  unless defined?(@value)
    @value = transform_value(original_value)
    @value = cast_value(@value)
    @value = check_value_overflow(@value)
    @value = strip_value(@value)
    @value = sanitize_value(@value) if sanitize_value?
    @value = replace_null_values(@value)
    @value = reduce_value(@value)
  end

  @value
end