Class: Seabright::Collection
- Inherits:
-
Array
- Object
- Array
- Seabright::Collection
- Includes:
- CachedScripts
- Defined in:
- lib/redis_object/collection.rb
Constant Summary collapse
- NilPattern =
'nilpattern:'
Class Method Summary collapse
Instance Method Summary collapse
- #<<(obj) ⇒ Object
- #[](k) ⇒ Object
- #class_const ⇒ Object
- #cleanup! ⇒ Object
- #clear! ⇒ Object
- #convert_regex_to_lua(reg) ⇒ Object
- #delete(obj) ⇒ Object
- #each ⇒ Object
- #find(k) ⇒ Object
- #first ⇒ Object
- #index_key(idx) ⇒ Object
- #indexed(idx, num = -1,, reverse = false) ⇒ Object
-
#initialize(name, owner) ⇒ Collection
constructor
A new instance of Collection.
- #inject_key(key, list) ⇒ Object
- #item_key(k) ⇒ Object
- #key ⇒ Object
- #keys_by_index(idx, num = -1,, reverse = false) ⇒ Object
- #last ⇒ Object
- #latest ⇒ Object
- #map(&block) ⇒ Object
- #match(pkt, use_or = false) ⇒ Object
- #objects ⇒ Object
- #push(obj) ⇒ Object
-
#real_at(key) ⇒ Object
def match(pkt) Enumerator.new do |y| each do |i| if pkt.all? {|hk,va| i.get(hk)==va } y << i end end end end.
- #remove! ⇒ Object
- #select(&block) ⇒ Object
- #store ⇒ Object
- #temp_key ⇒ Object
Methods included from CachedScripts
Constructor Details
#initialize(name, owner) ⇒ Collection
Returns a new instance of Collection.
206 207 208 209 |
# File 'lib/redis_object/collection.rb', line 206 def initialize(name,owner) @name = name.to_s @owner = owner end |
Class Method Details
.class_const_for(name) ⇒ Object
586 587 588 |
# File 'lib/redis_object/collection.rb', line 586 def class_const_for(name) Object.const_get(name.to_s.classify.to_sym) rescue RedisObject end |
.load(name, owner) ⇒ Object
580 581 582 583 584 |
# File 'lib/redis_object/collection.rb', line 580 def load(name,owner) out = new(name,owner) out.replace class_const_for(name).store.zrange(out.key,0,-1) out end |
Instance Method Details
#<<(obj) ⇒ Object
556 557 558 559 560 |
# File 'lib/redis_object/collection.rb', line 556 def <<(obj) k = obj.class == String ? obj : obj.hkey store.zadd(key,store.zcount(key,"-inf", "+inf"),k) super(k) end |
#[](k) ⇒ Object
272 273 274 |
# File 'lib/redis_object/collection.rb', line 272 def [](k) find k end |
#class_const ⇒ Object
566 567 568 |
# File 'lib/redis_object/collection.rb', line 566 def class_const self.class.class_const_for(@name) end |
#cleanup! ⇒ Object
518 519 520 521 522 523 524 525 526 527 528 529 |
# File 'lib/redis_object/collection.rb', line 518 def cleanup! each_index do |key| unless a = class_const.find_by_key(at(key)) Log.debug "Deleting #{key} because not #{a.inspect}" delete at(key) end end if size < 1 Log.debug "Deleting collection #{@name} because empty" remove! end end |
#clear! ⇒ Object
552 553 554 |
# File 'lib/redis_object/collection.rb', line 552 def clear! store.zrem(key,self.join(" ")) end |
#convert_regex_to_lua(reg) ⇒ Object
471 472 473 |
# File 'lib/redis_object/collection.rb', line 471 def convert_regex_to_lua(reg) "#{reg.casefold? ? "i" : ""}pattern:#{reg.source.gsub("\\","")}" end |
#delete(obj) ⇒ Object
546 547 548 549 550 |
# File 'lib/redis_object/collection.rb', line 546 def delete(obj) k = obj.class == String ? obj : obj.hkey store.zrem(key,k) super(k) end |
#each ⇒ Object
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 |
# File 'lib/redis_object/collection.rb', line 501 def each out = Enumerator.new do |y| each_index do |key| if a = class_const.find_by_key(at(key)) y << a end end end if block_given? out.each do |a| yield a end else out end end |
#find(k) ⇒ Object
261 262 263 264 265 266 267 268 269 270 |
# File 'lib/redis_object/collection.rb', line 261 def find(k) if k.is_a? String return real_at(item_key(k)) elsif k.is_a? Hash return match(k) elsif k.is_a? Integer return real_at(at(k)) end return nil end |
#first ⇒ Object
493 494 495 |
# File 'lib/redis_object/collection.rb', line 493 def first class_const.find_by_key(super) end |
#index_key(idx) ⇒ Object
253 254 255 |
# File 'lib/redis_object/collection.rb', line 253 def index_key(idx) class_const.index_key(idx) end |
#indexed(idx, num = -1,, reverse = false) ⇒ Object
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
# File 'lib/redis_object/collection.rb', line 219 def indexed(idx,num=-1,reverse=false) keys = keys_by_index(idx,num,reverse) out = ListEnumerator.new(keys) do |y| keys.each do |member| if a = class_const.find_by_key(member) y << a end end end if block_given? out.each do |itm| yield itm end else out end end |
#inject_key(key, list) ⇒ Object
458 459 460 461 462 463 464 465 466 467 468 469 |
# File 'lib/redis_object/collection.rb', line 458 def inject_key(key,list) out = [] list.each do |i| if i == list.first out << i else out << key out << i end end out end |
#item_key(k) ⇒ Object
257 258 259 |
# File 'lib/redis_object/collection.rb', line 257 def item_key(k) "#{class_const}:#{k}_h" end |
#key ⇒ Object
574 575 576 |
# File 'lib/redis_object/collection.rb', line 574 def key "#{@owner ? "#{@owner.key}:" : ""}COLLECTION:#{@name}" end |
#keys_by_index(idx, num = -1,, reverse = false) ⇒ Object
244 245 246 247 248 249 250 251 |
# File 'lib/redis_object/collection.rb', line 244 def keys_by_index(idx,num=-1,reverse=false) keys = run_script(reverse ? :RevScript : :FwdScript, [temp_key, index_key(idx), key, num]) ListEnumerator.new(keys) do |y| keys.each do |member| y << member end end end |
#last ⇒ Object
497 498 499 |
# File 'lib/redis_object/collection.rb', line 497 def last class_const.find_by_key(super) end |
#latest ⇒ Object
215 216 217 |
# File 'lib/redis_object/collection.rb', line 215 def latest indexed(:created_at,5,true).first || first end |
#map(&block) ⇒ Object
531 532 533 |
# File 'lib/redis_object/collection.rb', line 531 def map(&block) each.map(&block) end |
#match(pkt, use_or = false) ⇒ Object
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 |
# File 'lib/redis_object/collection.rb', line 429 def match(pkt, use_or=false) if use_or mtchr = :ColOrMatcher else mtchr = pkt.keys.count > 1 ? :ColMultiMatcher : :ColMatcher end pkt = pkt.flatten.reduce([]) do |i,v| x = case v when Regexp convert_regex_to_lua(v) when Array raise ArgumentError.new("An array can only be used with the find_or method") unless use_or inject_key(i.last, v) when NilClass NilPattern else v.to_s end i << x i end kys = run_script(mtchr,self,pkt.flatten) ListEnumerator.new(kys) do |y| kys.each do |k| y << class_const.find_by_key(k) end end end |
#objects ⇒ Object
489 490 491 |
# File 'lib/redis_object/collection.rb', line 489 def objects each.to_a end |
#push(obj) ⇒ Object
562 563 564 |
# File 'lib/redis_object/collection.rb', line 562 def push(obj) self << obj end |
#real_at(key) ⇒ Object
def match(pkt) Enumerator.new do |y| each do |i| if pkt.all? {|hk,va| i.get(hk)==va } y << i end end end end
485 486 487 |
# File 'lib/redis_object/collection.rb', line 485 def real_at(key) class_const.find_by_key(key) end |
#remove! ⇒ Object
211 212 213 |
# File 'lib/redis_object/collection.rb', line 211 def remove! @owner.remove_collection! @name end |
#select(&block) ⇒ Object
535 536 537 538 539 540 541 542 543 544 |
# File 'lib/redis_object/collection.rb', line 535 def select(&block) return nil unless block_given? Enumerator.new do |y| each_index do |key| if (a = class_const.find_by_key(at(key))) && block.call(a) y << a end end end end |
#store ⇒ Object
570 571 572 |
# File 'lib/redis_object/collection.rb', line 570 def store class_const.store end |
#temp_key ⇒ Object
237 238 239 |
# File 'lib/redis_object/collection.rb', line 237 def temp_key "#{key}::zintersect_temp::#{RedisObject.new_id(4)}" end |