Class: Familia::HashKey

Inherits:
DataType show all
Defined in:
lib/familia/data_type/types/hashkey.rb

Instance Attribute Summary

Attributes inherited from DataType

#dump_method, #keystring, #load_method, #opts, #parent

Attributes included from Features

#features_enabled

Instance Method Summary collapse

Methods inherited from DataType

#class?, #dbclient, #dbkey, #initialize, #logical_database, #parent?, #parent_class?, #parent_instance?, #uri

Methods included from Features

#feature

Methods included from DataType::ClassMethods

#has_relations?, #inherited, #logical_database, #register, #uri, #valid_keys_only

Methods included from DataType::Serialization

#deserialize_value, #deserialize_values, #deserialize_values_with_nil, #serialize_value

Methods included from DataType::Commands

#current_expiration, #delete!, #echo, #exists?, #expire, #expireat, #move, #persist, #rename, #renamenx, #type

Methods included from Base

add_feature, #generate_id, #to_s, #update_expiration, #uuid

Constructor Details

This class inherits a constructor from Familia::DataType

Instance Method Details

#[](field) ⇒ Object Also known as: get



33
34
35
# File 'lib/familia/data_type/types/hashkey.rb', line 33

def [](field)
  deserialize_value dbclient.hget(dbkey, field.to_s)
end

#[]=(field, val) ⇒ Object Also known as: put, store

+return+ [Integer] Returns 1 if the field is new and added, 0 if the field already existed and the value was updated.



18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/familia/data_type/types/hashkey.rb', line 18

def []=(field, val)
  ret = dbclient.hset dbkey, field.to_s, serialize_value(val)
  update_expiration
  ret
rescue TypeError => e
  Familia.le "[hset]= #{e.message}"
  Familia.ld "[hset]= #{dbkey} #{field}=#{val}" if Familia.debug
  echo :hset, caller(1..1).first if Familia.debug # logs via echo to the db and back
  klass = val.class
  msg = "Cannot store #{field} => #{val.inspect} (#{klass}) in #{dbkey}"
  raise e.class, msg
end

#decrement(field, by = 1) ⇒ Object Also known as: decr, decrby



103
104
105
# File 'lib/familia/data_type/types/hashkey.rb', line 103

def decrement(field, by = 1)
  increment field, -by
end

#empty?Boolean

Returns:

  • (Boolean)


12
13
14
# File 'lib/familia/data_type/types/hashkey.rb', line 12

def empty?
  field_count.zero?
end

#fetch(field, default = nil) ⇒ Object



38
39
40
41
42
43
44
45
46
47
# File 'lib/familia/data_type/types/hashkey.rb', line 38

def fetch(field, default = nil)
  ret = self[field.to_s]
  if ret.nil?
    raise IndexError, "No such index for: #{field}" if default.nil?

    default
  else
    ret
  end
end

#field_countInteger Also known as: size

Returns the number of fields in the hash

Returns:

  • (Integer)

    number of fields



7
8
9
# File 'lib/familia/data_type/types/hashkey.rb', line 7

def field_count
  dbclient.hlen dbkey
end

#hgetallObject Also known as: all



57
58
59
60
61
# File 'lib/familia/data_type/types/hashkey.rb', line 57

def hgetall
  dbclient.hgetall(dbkey).each_with_object({}) do |(k, v), ret|
    ret[k] = deserialize_value v
  end
end

#hsetnx(field, val) ⇒ Integer

Sets field in the hash stored at key to value, only if field does not yet exist. If field already exists, this operation has no effect.

Parameters:

  • field (String)

    The field name

  • val (Object)

    The value to set

Returns:

  • (Integer)

    1 if field is a new field and value was set, 0 if field already exists



69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/familia/data_type/types/hashkey.rb', line 69

def hsetnx(field, val)
  ret = dbclient.hsetnx dbkey, field.to_s, serialize_value(val)
  update_expiration if ret == 1
  ret
rescue TypeError => e
  Familia.le "[hsetnx] #{e.message}"
  Familia.ld "[hsetnx] #{dbkey} #{field}=#{val}" if Familia.debug
  echo :hsetnx, caller(1..1).first if Familia.debug # logs via echo to the db and back
  klass = val.class
  msg = "Cannot store #{field} => #{val.inspect} (#{klass}) in #{dbkey}"
  raise e.class, msg
end

#increment(field, by = 1) ⇒ Object Also known as: incr, incrby



97
98
99
# File 'lib/familia/data_type/types/hashkey.rb', line 97

def increment(field, by = 1)
  dbclient.hincrby(dbkey, field.to_s, by).to_i
end

#key?(field) ⇒ Boolean Also known as: has_key?, include?, member?

Returns:

  • (Boolean)


82
83
84
# File 'lib/familia/data_type/types/hashkey.rb', line 82

def key?(field)
  dbclient.hexists dbkey, field.to_s
end

#keysObject



49
50
51
# File 'lib/familia/data_type/types/hashkey.rb', line 49

def keys
  dbclient.hkeys dbkey
end

#refreshself

The friendly neighborhood refresh method!

This method is like refresh! but with better manners - it returns self so you can chain it with other methods. It’s perfect for when you want to refresh your hash and immediately do something with it.

Examples:

Refresh and chain

my_hash.refresh.keys  # Refresh and get all keys
my_hash.refresh['field']  # Refresh and get a specific field

Returns:

  • (self)

    Returns the refreshed hash, ready for more adventures!

Raises:

See Also:



177
178
179
180
# File 'lib/familia/data_type/types/hashkey.rb', line 177

def refresh
  refresh!
  self
end

#refresh!void

Note:

This operation is atomic - it either succeeds completely or fails safely. Any unsaved changes to the hash will be overwritten.

This method returns an undefined value.

The Great Database Refresh-o-matic 3000 for HashKey!

This method performs a complete refresh of the hash’s state from Redis. It’s like giving your hash a memory transfusion - out with the old state, in with the fresh data straight from Redis!

Examples:

Basic usage

my_hash.refresh!  # ZAP! Fresh data loaded

With error handling

begin
  my_hash.refresh!
rescue Familia::KeyNotFoundError
  puts "Oops! Our hash seems to have vanished into the Database void!"
end

Raises:



150
151
152
153
154
155
156
157
158
159
# File 'lib/familia/data_type/types/hashkey.rb', line 150

def refresh!
  Familia.trace :REFRESH, dbclient, uri, caller(1..1) if Familia.debug?
  raise Familia::KeyNotFoundError, dbkey unless dbclient.exists(dbkey)

  fields = hgetall
  Familia.ld "[refresh!] #{self.class} #{dbkey} #{fields.keys}"

  # For HashKey, we update by merging the fresh data
  update(fields)
end

#remove_field(field) ⇒ Integer Also known as: remove

Removes a field from the hash

Parameters:

  • field (String)

    The field to remove

Returns:

  • (Integer)

    The number of fields that were removed (0 or 1)



92
93
94
# File 'lib/familia/data_type/types/hashkey.rb', line 92

def remove_field(field)
  dbclient.hdel dbkey, field.to_s
end

#update(hsh = {}) ⇒ Object Also known as: merge!

Raises:

  • (ArgumentError)


109
110
111
112
113
114
115
116
117
# File 'lib/familia/data_type/types/hashkey.rb', line 109

def update(hsh = {})
  raise ArgumentError, 'Argument to bulk_set must be a hash' unless hsh.is_a?(Hash)

  data = hsh.inject([]) { |ret, pair| ret << [pair[0], serialize_value(pair[1])] }.flatten

  ret = dbclient.hmset(dbkey, *data)
  update_expiration
  ret
end

#valuesObject



53
54
55
# File 'lib/familia/data_type/types/hashkey.rb', line 53

def values
  dbclient.hvals(dbkey).map { |v| deserialize_value v }
end

#values_at(*fields) ⇒ Object



120
121
122
123
124
# File 'lib/familia/data_type/types/hashkey.rb', line 120

def values_at *fields
  string_fields = fields.flatten.compact.map(&:to_s)
  elements = dbclient.hmget(dbkey, *string_fields)
  deserialize_values(*elements)
end