Class: Familia::UnsortedSet
- Includes:
- DataType::CollectionBase
- Defined in:
- lib/familia/data_type/types/unsorted_set.rb
Overview
Familia::UnsortedSet
Instance Attribute Summary collapse
-
#features_enabled ⇒ Object
included
from Features
readonly
Returns the value of attribute features_enabled.
- #logical_database(val = nil) ⇒ Object included from DataType::ClassMethods
-
#parent ⇒ Object
included
from DataType::ClassMethods
Returns the value of attribute parent.
-
#prefix ⇒ Object
included
from DataType::ClassMethods
Returns the value of attribute prefix.
-
#suffix ⇒ Object
included
from DataType::ClassMethods
Returns the value of attribute suffix.
-
#uri(val = nil) ⇒ Object
included
from DataType::ClassMethods
Returns the value of attribute uri.
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
- #<<(v) ⇒ Object
- #add(*values) ⇒ Object (also: #add_element)
- #collectraw ⇒ Object
-
#difference(*other_sets) ⇒ Array
(also: #diff)
Returns the difference of this set minus one or more other sets.
-
#diffstore(destination, *other_sets) ⇒ Integer
(also: #difference_store)
Stores the difference of this set minus other sets into a destination key.
-
#each(matching: nil, batch_size: 100) {|member| ... } ⇒ Enumerator, self
Iterates over members of the set.
- #eachraw ⇒ Object
- #eachraw_with_index ⇒ Object
-
#element_count ⇒ Integer
(also: #size, #length, #count)
Returns the number of elements in the unsorted set.
- #empty? ⇒ Boolean
-
#intercard(*other_sets, limit: 0) ⇒ Integer
(also: #intersection_cardinality)
Returns the cardinality of the intersection without retrieving members.
-
#intersection(*other_sets) ⇒ Array
(also: #inter)
Returns the intersection of this set with one or more other sets.
-
#interstore(destination, *other_sets) ⇒ Integer
(also: #intersection_store)
Stores the intersection of this set with other sets into a destination key.
- #member?(val) ⇒ Boolean (also: #include?)
-
#member_any?(*values) ⇒ Array<Boolean>
(also: #members?)
Checks membership for multiple values at once.
- #members ⇒ Object (also: #all, #to_a)
- #membersraw ⇒ Object
- #move(dstkey, val) ⇒ Object
- #pop ⇒ Object
-
#remove_element(value) ⇒ Integer
(also: #remove)
Removes a member from the set.
-
#sample(count = 1) ⇒ Array
(also: #random)
Get one or more random members from the set.
-
#sampleraw(count = 1) ⇒ Array
(also: #randomraw)
Get one or more random members from the set without deserialization.
-
#scan(cursor = 0, match: nil, count: nil) ⇒ Array<Integer, Array>
Iterates over set members using cursor-based iteration.
- #selectraw ⇒ Object
-
#union(*other_sets) ⇒ Array
Returns the union of this set with one or more other sets.
-
#unionstore(destination, *other_sets) ⇒ Integer
(also: #union_store)
Stores the union of this set with other sets into a destination key.
Methods included from DataType::CollectionBase
#collection_type?, #each_record
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, #persist, #rename, #renamenx, #type
Methods included from DataType::Connection
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_enabled ⇒ Object (readonly) Originally defined in module Features
Returns the value of attribute features_enabled.
#logical_database(val = nil) ⇒ Object Originally defined in module DataType::ClassMethods
#parent ⇒ Object Originally defined in module DataType::ClassMethods
Returns the value of attribute parent.
#prefix ⇒ Object Originally defined in module DataType::ClassMethods
Returns the value of attribute prefix.
#suffix ⇒ Object 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
#<<(v) ⇒ Object
36 37 38 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 36 def <<(v) add v end |
#add(*values) ⇒ Object Also known as: add_element
This method executes a Redis SADD 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.
27 28 29 30 31 32 33 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 27 def add *values warn_if_dirty! serialized = values.flatten.compact.map { |v| serialize_value(v) } dbclient.sadd?(dbkey, serialized) unless serialized.empty? update_expiration self end |
#collectraw ⇒ Object
96 97 98 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 96 def collectraw(&) membersraw.collect(&) end |
#difference(*other_sets) ⇒ Array Also known as: diff
Returns the difference of this set minus one or more other sets.
142 143 144 145 146 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 142 def difference(*other_sets) keys = extract_keys(other_sets) elements = dbclient.sdiff(dbkey, *keys) deserialize_values(*elements) end |
#diffstore(destination, *other_sets) ⇒ Integer Also known as: difference_store
Stores the difference of this set minus other sets into a destination key.
217 218 219 220 221 222 223 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 217 def diffstore(destination, *other_sets) dest_key = extract_key(destination) keys = extract_keys(other_sets) result = dbclient.sdiffstore(dest_key, dbkey, *keys) update_expiration result end |
#each(matching: nil, batch_size: 100) {|member| ... } ⇒ Enumerator, self
Pattern matches raw Redis storage (JSON-encoded). To filter on deserialized values, use Enumerable#select instead.
Iterates over members of the set.
Uses SSCAN for memory-efficient iteration. Optionally filters by member pattern using Redis MATCH.
74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 74 def each(matching: nil, batch_size: 100, &block) return to_enum(:each, matching: matching, batch_size: batch_size) unless block cursor = 0 loop do new_cursor, elements = scan(cursor, match: matching, count: batch_size) elements.each(&block) cursor = new_cursor break if cursor.zero? end self end |
#eachraw ⇒ Object
88 89 90 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 88 def eachraw(&) membersraw.each(&) end |
#eachraw_with_index ⇒ Object
92 93 94 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 92 def eachraw_with_index(&) membersraw.each_with_index(&) end |
#element_count ⇒ Integer Also known as: size, length, count
Returns the number of elements in the unsorted set
13 14 15 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 13 def element_count dbclient.scard dbkey end |
#empty? ⇒ Boolean
20 21 22 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 20 def empty? element_count.zero? end |
#intercard(*other_sets, limit: 0) ⇒ Integer Also known as: intersection_cardinality
Returns the cardinality of the intersection without retrieving members. More memory-efficient than intersection when only the count is needed.
178 179 180 181 182 183 184 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 178 def intercard(*other_sets, limit: 0) keys = extract_keys(other_sets) all_keys = [dbkey, *keys] args = [:sintercard, all_keys.size, *all_keys] args.push('LIMIT', limit) if limit.positive? dbclient.call(*args) end |
#intersection(*other_sets) ⇒ Array Also known as: inter
Returns the intersection of this set with one or more other sets.
123 124 125 126 127 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 123 def intersection(*other_sets) keys = extract_keys(other_sets) elements = dbclient.sinter(dbkey, *keys) deserialize_values(*elements) end |
#interstore(destination, *other_sets) ⇒ Integer Also known as: intersection_store
Stores the intersection of this set with other sets into a destination key.
191 192 193 194 195 196 197 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 191 def interstore(destination, *other_sets) dest_key = extract_key(destination) keys = extract_keys(other_sets) result = dbclient.sinterstore(dest_key, dbkey, *keys) update_expiration result end |
#member?(val) ⇒ Boolean Also known as: include?
104 105 106 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 104 def member?(val) dbclient.sismember dbkey, serialize_value(val) end |
#member_any?(*values) ⇒ Array<Boolean> Also known as: members?
Checks membership for multiple values at once.
152 153 154 155 156 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 152 def member_any?(*values) values = values.flatten serialized = values.map { |v| serialize_value(v) } dbclient.smismember(dbkey, serialized) end |
#members ⇒ Object Also known as: all, to_a
40 41 42 43 44 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 40 def members echo :members, Familia.pretty_stack(limit: 1) if Familia.debug elements = membersraw deserialize_values(*elements) end |
#membersraw ⇒ Object
48 49 50 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 48 def membersraw dbclient.smembers(dbkey) end |
#move(dstkey, val) ⇒ Object
233 234 235 236 237 238 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 233 def move(dstkey, val) warn_if_dirty! ret = dbclient.smove dbkey, dstkey, serialize_value(val) update_expiration ret end |
#pop ⇒ Object
226 227 228 229 230 231 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 226 def pop warn_if_dirty! ret = deserialize_value(dbclient.spop(dbkey)) update_expiration ret end |
#remove_element(value) ⇒ Integer Also known as: remove
Removes a member from the set
112 113 114 115 116 117 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 112 def remove_element(value) warn_if_dirty! ret = dbclient.srem dbkey, serialize_value(value) update_expiration ret end |
#sample(count = 1) ⇒ Array Also known as: random
Get one or more random members from the set
243 244 245 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 243 def sample(count = 1) deserialize_values(*sampleraw(count)) end |
#sampleraw(count = 1) ⇒ Array Also known as: randomraw
Get one or more random members from the set without deserialization
251 252 253 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 251 def sampleraw(count = 1) dbclient.srandmember(dbkey, count) || [] end |
#scan(cursor = 0, match: nil, count: nil) ⇒ Array<Integer, Array>
Iterates over set members using cursor-based iteration.
164 165 166 167 168 169 170 171 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 164 def scan(cursor = 0, match: nil, count: nil) opts = {} opts[:match] = match if match opts[:count] = count if count new_cursor, elements = dbclient.sscan(dbkey, cursor, **opts) [new_cursor.to_i, deserialize_values(*elements)] end |
#selectraw ⇒ Object
100 101 102 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 100 def selectraw(&) membersraw.select(&) end |
#union(*other_sets) ⇒ Array
Returns the union of this set with one or more other sets.
133 134 135 136 137 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 133 def union(*other_sets) keys = extract_keys(other_sets) elements = dbclient.sunion(dbkey, *keys) deserialize_values(*elements) end |
#unionstore(destination, *other_sets) ⇒ Integer Also known as: union_store
Stores the union of this set with other sets into a destination key.
204 205 206 207 208 209 210 |
# File 'lib/familia/data_type/types/unsorted_set.rb', line 204 def unionstore(destination, *other_sets) dest_key = extract_key(destination) keys = extract_keys(other_sets) result = dbclient.sunionstore(dest_key, dbkey, *keys) update_expiration result end |