Module: Familia::DataType::Serialization
- Included in:
- Familia::DataType
- Defined in:
- lib/familia/data_type/serialization.rb
Instance Method Summary collapse
-
#deserialize_value(val) ⇒ Object?
Deserializes a single value from the database.
-
#deserialize_values(*values) ⇒ Array<Object>
Deserializes multiple values from Valkey/Redis, removing nil values.
-
#deserialize_values_with_nil(*values) ⇒ Array<Object, nil>
Deserializes multiple values from Valkey/Redis, preserving nil values.
-
#serialize_value(val, strict_values: true) ⇒ String?
Serializes a value for storage in the database.
Instance Method Details
#deserialize_value(val) ⇒ Object?
If no class option is specified, the original value is returned unchanged.
Deserializes a single value from the database.
NOTE: Currently only the DataType class uses this method. Horreum fields are a newer addition and don't support the full range of deserialization options that DataType supports. It uses serialize_value for serialization since everything becomes a string in Valkey.
121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/familia/data_type/serialization.rb', line 121 def deserialize_value(val) # Handle Redis::Future objects during transactions first return val if val.is_a?(Redis::Future) return @opts[:default] if val.nil? return val unless @opts[:class] ret = deserialize_values val ret&.first # return the object or nil end |
#deserialize_values(*values) ⇒ Array<Object>
Deserializes multiple values from Valkey/Redis, removing nil values.
61 62 63 64 65 66 67 |
# File 'lib/familia/data_type/serialization.rb', line 61 def deserialize_values(*values) # Avoid using compact! here. Using compact! as the last expression in the # method can unintentionally return nil if no changes are made, which is # not desirable. Instead, use compact to ensure the method returns the # expected value. deserialize_values_with_nil(*values).compact end |
#deserialize_values_with_nil(*values) ⇒ Array<Object, nil>
This method attempts to deserialize each value using the specified class's load method. If deserialization fails for a value, it's replaced with nil.
Deserializes multiple values from Valkey/Redis, preserving nil values.
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/familia/data_type/serialization.rb', line 81 def deserialize_values_with_nil(*values) Familia.debug "deserialize_values: (#{@opts}) #{values}" return [] if values.empty? return values.flatten unless @opts[:class] unless @opts[:class].respond_to?(load_method) raise Familia::Problem, "No such method: #{@opts[:class]}##{load_method}" end values.collect! do |obj| next if obj.nil? val = @opts[:class].send load_method, obj Familia.debug "[#{self.class}#deserialize_values] nil returned for #{@opts[:class]}##{name}" if val.nil? val rescue StandardError => e Familia.info val Familia.info "Parse error for #{dbkey} (#{load_method}): #{e.}" Familia.info e.backtrace nil end values end |
#serialize_value(val, strict_values: true) ⇒ String?
When a class option is specified, it uses Familia.identifier_extractor to extract the identifier from objects. Otherwise, it extracts identifiers from Familia::Base instances or class names.
Serializes a value for storage in the database.
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/familia/data_type/serialization.rb', line 30 def serialize_value(val, strict_values: true) prepared = nil Familia.trace :TOREDIS, nil, "#{val}<#{val.class}|#{opts[:class]}>" if Familia.debug? if opts[:class] prepared = Familia.identifier_extractor(opts[:class]) Familia.debug " from opts[class] <#{opts[:class]}>: #{prepared || '<nil>'}" end if prepared.nil? # Enforce strict values when no class option is specified prepared = Familia.identifier_extractor(val) Familia.debug " from <#{val.class}> => <#{prepared.class}>" end if Familia.debug? Familia.trace :TOREDIS, nil, "#{val}<#{val.class}|#{opts[:class]}> => #{prepared}<#{prepared.class}>" end Familia.warn "[#{self.class}#serialize_value] nil returned for #{opts[:class]}##{name}" if prepared.nil? prepared end |