Class: Familia::ListKey

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

Instance Attribute Summary collapse

Attributes included from Settings

#current_key_version, #default_expiration, #delim, #encryption_keys, #encryption_personalization, #logical_database, #prefix, #schema_path, #schema_validator, #schemas, #strict_write_order, #suffix, #transaction_mode

Instance Method Summary collapse

Methods included from Features::Autoloader

autoload_files, included, normalize_to_config_name

Methods included from DataType::Serialization

#deserialize_value, #deserialize_values, #deserialize_values_with_nil, #serialize_value

Methods included from DataType::DatabaseCommands

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

Methods included from DataType::Connection

#dbclient, #dbkey, #direct_access, #uri

Methods included from Connection::Behavior

#connect, #create_dbclient, #multi, #normalize_uri, #pipeline, #pipelined, #transaction, #uri=, #url, #url=

Methods included from Settings

#configure, #default_suffix, #pipelined_mode, #pipelined_mode=

Methods included from Base

add_feature, #as_json, #expired?, #expires?, find_feature, #generate_id, #to_json, #to_s, #ttl, #update_expiration, #uuid

Constructor Details

This class inherits a constructor from Familia::DataType

Instance Attribute Details

#features_enabledObject (readonly) Originally defined in module Features

Returns the value of attribute features_enabled.

#logical_database(val = nil) ⇒ Object Originally defined in module DataType::ClassMethods

#parentObject Originally defined in module DataType::ClassMethods

Returns the value of attribute parent.

#prefixObject Originally defined in module DataType::ClassMethods

Returns the value of attribute prefix.

#suffixObject Originally defined in module DataType::ClassMethods

Returns the value of attribute suffix.

#uri(val = nil) ⇒ Object Originally defined in module DataType::ClassMethods

Returns the value of attribute uri.

Instance Method Details

#<<(val) ⇒ Object Also known as: add_element, add



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

def <<(val)
  push(val)
end

#[](idx, count = nil) ⇒ Object Also known as: slice



66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/familia/data_type/types/listkey.rb', line 66

def [](idx, count = nil)
  if idx.is_a? Range
    range idx.first, idx.last
  elsif count
    case count <=> 0
    when 1  then range(idx, idx + count - 1)
    when 0  then []
    when -1 then nil
    end
  else
    at idx
  end
end

#at(idx) ⇒ Object



151
152
153
# File 'lib/familia/data_type/types/listkey.rb', line 151

def at(idx)
  deserialize_value dbclient.lindex(dbkey, idx)
end

#collectObject



135
136
137
# File 'lib/familia/data_type/types/listkey.rb', line 135

def collect(&)
  range.collect(&)
end

#collectrawObject



143
144
145
# File 'lib/familia/data_type/types/listkey.rb', line 143

def collectraw(&)
  rangeraw.collect(&)
end

#eachObject



119
120
121
# File 'lib/familia/data_type/types/listkey.rb', line 119

def each(&)
  range.each(&)
end

#each_with_indexObject



123
124
125
# File 'lib/familia/data_type/types/listkey.rb', line 123

def each_with_index(&)
  range.each_with_index(&)
end

#eachrawObject



127
128
129
# File 'lib/familia/data_type/types/listkey.rb', line 127

def eachraw(&)
  rangeraw.each(&)
end

#eachraw_with_indexObject



131
132
133
# File 'lib/familia/data_type/types/listkey.rb', line 131

def eachraw_with_index(&)
  rangeraw.each_with_index(&)
end

#element_countInteger Also known as: size, length, count

Returns the number of elements in the list

Returns:

  • (Integer)

    number of elements



9
10
11
# File 'lib/familia/data_type/types/listkey.rb', line 9

def element_count
  dbclient.llen dbkey
end

#empty?Boolean

Returns:

  • (Boolean)


16
17
18
# File 'lib/familia/data_type/types/listkey.rb', line 16

def empty?
  element_count.zero?
end

#firstObject



155
156
157
# File 'lib/familia/data_type/types/listkey.rb', line 155

def first
  at 0
end

#lastObject



159
160
161
# File 'lib/familia/data_type/types/listkey.rb', line 159

def last
  at(-1)
end

#member?(value) ⇒ Boolean

Returns:

  • (Boolean)


81
82
83
# File 'lib/familia/data_type/types/listkey.rb', line 81

def member?(value)
  !dbclient.lpos(dbkey, serialize_value(value)).nil?
end

#members(count = -1)) ⇒ Object Also known as: all, to_a



106
107
108
109
110
# File 'lib/familia/data_type/types/listkey.rb', line 106

def members(count = -1)
  echo :members, Familia.pretty_stack(limit: 1) if Familia.debug
  count -= 1 if count.positive?
  range 0, count
end

#membersraw(count = -1)) ⇒ Object



114
115
116
117
# File 'lib/familia/data_type/types/listkey.rb', line 114

def membersraw(count = -1)
  count -= 1 if count.positive?
  rangeraw 0, count
end

#popObject



52
53
54
55
56
57
# File 'lib/familia/data_type/types/listkey.rb', line 52

def pop
  warn_if_dirty!
  ret = deserialize_value dbclient.rpop(dbkey)
  update_expiration
  ret
end

#push(*values) ⇒ Object Also known as: append

Note:

This method executes a Redis RPUSH immediately, unlike scalar field setters which are deferred until save. If the parent object has unsaved scalar field changes, consider calling save first to avoid split-brain state.



23
24
25
26
27
28
29
30
# File 'lib/familia/data_type/types/listkey.rb', line 23

def push *values
  warn_if_dirty!
  echo :push, Familia.pretty_stack(limit: 1) if Familia.debug
  values.flatten.compact.each { |v| dbclient.rpush dbkey, serialize_value(v) }
  dbclient.ltrim dbkey, -@opts[:maxlength], -1 if @opts[:maxlength]
  update_expiration
  self
end

#range(sidx = 0, eidx = -1)) ⇒ Object



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

def range(sidx = 0, eidx = -1)
  elements = rangeraw sidx, eidx
  deserialize_values(*elements)
end

#rangeraw(sidx = 0, eidx = -1)) ⇒ Object



102
103
104
# File 'lib/familia/data_type/types/listkey.rb', line 102

def rangeraw(sidx = 0, eidx = -1)
  dbclient.lrange(dbkey, sidx, eidx)
end

#remove_element(value, count = 0) ⇒ Integer Also known as: remove

Removes elements equal to value from the list

Parameters:

  • value

    The value to remove

  • count (Integer) (defaults to: 0)

    Number of elements to remove (0 means all)

Returns:

  • (Integer)

    The number of removed elements



89
90
91
92
93
94
# File 'lib/familia/data_type/types/listkey.rb', line 89

def remove_element(value, count = 0)
  warn_if_dirty!
  ret = dbclient.lrem dbkey, count, serialize_value(value)
  update_expiration
  ret
end

#selectObject



139
140
141
# File 'lib/familia/data_type/types/listkey.rb', line 139

def select(&)
  range.select(&)
end

#selectrawObject



147
148
149
# File 'lib/familia/data_type/types/listkey.rb', line 147

def selectraw(&)
  rangeraw.select(&)
end

#shiftObject



59
60
61
62
63
64
# File 'lib/familia/data_type/types/listkey.rb', line 59

def shift
  warn_if_dirty!
  ret = deserialize_value dbclient.lpop(dbkey)
  update_expiration
  ret
end

#unshift(*values) ⇒ Object Also known as: prepend

Note:

This method executes a Redis LPUSH immediately, unlike scalar field setters which are deferred until save. If the parent object has unsaved scalar field changes, consider calling save first to avoid split-brain state.



42
43
44
45
46
47
48
49
# File 'lib/familia/data_type/types/listkey.rb', line 42

def unshift *values
  warn_if_dirty!
  values.flatten.compact.each { |v| dbclient.lpush dbkey, serialize_value(v) }
  # TODO: test maxlength
  dbclient.ltrim dbkey, 0, @opts[:maxlength] - 1 if @opts[:maxlength]
  update_expiration
  self
end