Module: Seabright::ObjectBase::ClassMethods

Defined in:
lib/redis_object/base.rb

Constant Summary collapse

NilPattern =
'nilpattern:'

Instance Method Summary collapse

Instance Method Details

#_new_id_sym(cls = self.name) ⇒ Object



560
561
562
# File 'lib/redis_object/base.rb', line 560

def _new_id_sym(cls=self.name)
  (cls || self.name).foreign_key.to_sym
end

#_old_id_sym(cls = self.name) ⇒ Object



575
576
577
# File 'lib/redis_object/base.rb', line 575

def _old_id_sym(cls=self.name)
  "#{(cls || self.name).split('::').last.downcase}_id".to_sym
end

#allObject



247
248
249
250
251
252
253
254
255
256
257
258
259
# File 'lib/redis_object/base.rb', line 247

def all
  kys = store.smembers(plname)
  ListEnumerator.new(kys) do |y|
    kys.each do |member|
      if a = find_by_key(hkey(member))
        y << a
      else
        Log.debug "[#{name}] Object listed but not found: #{member}"
        store.srem(plname,member)
      end
    end
  end
end

#cnameObject



239
240
241
# File 'lib/redis_object/base.rb', line 239

def cname
  name
end

#convert_old_id_syms!Object



564
565
566
567
568
569
570
571
572
573
# File 'lib/redis_object/base.rb', line 564

def convert_old_id_syms!
  ol = _old_id_sym
  nw = id_sym
  each do |obj|
    if obj.is_set?(ol)
      obj.set(nw,get(ol))
      obj.unset(ol)
    end
  end
end

#convert_regex_to_lua(reg) ⇒ Object



476
477
478
# File 'lib/redis_object/base.rb', line 476

def convert_regex_to_lua(reg)
  "#{reg.casefold? ? "i" : ""}pattern:#{reg.source.gsub("\\","")}"
end

#create(ident = {}) ⇒ Object



510
511
512
513
514
# File 'lib/redis_object/base.rb', line 510

def create(ident={})
  obj = new(ident)
  obj.save
  obj
end

#dbnumObject



528
529
530
# File 'lib/redis_object/base.rb', line 528

def dbnum
  @dbnum ||= 0
end

#deep_const_get(const, base = nil) ⇒ Object



539
540
541
542
543
544
545
546
547
# File 'lib/redis_object/base.rb', line 539

def deep_const_get(const,base=nil)
  if Symbol === const
    const = const.to_s
  else
    const = const.to_str.dup
  end
  base ||= const.sub!(/^::/, '') ? Object : self
  const.split(/::/).inject(base) { |mod, name| mod.const_get(name) }
end

#describeObject



579
580
581
582
583
584
585
# File 'lib/redis_object/base.rb', line 579

def describe
  all_keys.inject({}) do |acc,(k,v)|
    acc[k.to_sym] ||= [:string, 0]
    acc[k.to_sym][1] += 1
    acc
  end
end

#eachObject



275
276
277
278
279
# File 'lib/redis_object/base.rb', line 275

def each
  all.each do |o|
    yield o
  end
end

#exists?(k) ⇒ Boolean

Returns:

  • (Boolean)


506
507
508
# File 'lib/redis_object/base.rb', line 506

def exists?(k)
  store.exists(self.hkey(k)) || store.exists(self.reserve_key(k))
end

#find(ident) ⇒ Object



498
499
500
# File 'lib/redis_object/base.rb', line 498

def find(ident)
  grab(ident)
end

#find_by_key(k) ⇒ Object



532
533
534
535
536
537
# File 'lib/redis_object/base.rb', line 532

def find_by_key(k)
  if store.exists(k) && (cls = store.hget(k,:class))
    return deep_const_get(cls.to_sym,Object).new(store.hget(k,id_sym(cls)))
  end
  nil
end

#firstObject



267
268
269
270
271
272
273
# File 'lib/redis_object/base.rb', line 267

def first
  if m = store.smembers(plname)
   self.grab(m.first)
  else
    nil
  end
end

#generate_idObject



220
221
222
223
224
225
226
227
228
229
# File 'lib/redis_object/base.rb', line 220

def generate_id
  v = new_id
  while exists?(v) do
    Log.verbose "[RedisObject] Collision at id: #{v}"
    v = new_id
  end
  Log.verbose "[RedisObject] Reserving key: #{v}"
  reserve(v)
  v
end

#grab(ident) ⇒ Object



480
481
482
483
484
485
486
487
488
# File 'lib/redis_object/base.rb', line 480

def grab(ident)
  case ident
  when String, Symbol
    return store.exists(self.hkey(ident.to_s)) ? self.new(ident.to_s) : nil
  when Hash
    return match(ident)
  end
  nil
end

#id_sym(cls = nil) ⇒ Object



556
557
558
# File 'lib/redis_object/base.rb', line 556

def id_sym(cls=nil)
  _old_id_sym(cls)
end

#inject_key(key, list) ⇒ Object



463
464
465
466
467
468
469
470
471
472
473
474
# File 'lib/redis_object/base.rb', line 463

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

#match(pkt, use_or = false) ⇒ Object



434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
# File 'lib/redis_object/base.rb', line 434

def match(pkt, use_or=false)
  if use_or
    mtchr = :OrMatcher
  else
    mtchr = pkt.keys.count > 1 ? :MultiMatcher : :Matcher
  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,[plname],pkt.flatten)
  ListEnumerator.new(kys) do |y|
    kys.each do |k|
      y << find(k)
    end
  end
end

#new_id(complexity = 8) ⇒ Object



235
236
237
# File 'lib/redis_object/base.rb', line 235

def new_id(complexity = 8)
  rand(36**complexity).to_s(36)
end

#or_find(ident) ⇒ Object



502
503
504
# File 'lib/redis_object/base.rb', line 502

def or_find(ident)
  or_grab(ident)
end

#or_grab(ident) ⇒ Object



490
491
492
493
494
495
496
# File 'lib/redis_object/base.rb', line 490

def or_grab(ident)
  case ident
  when Hash
    return match(ident, true)
  end
  nil
end

#plnameObject



243
244
245
# File 'lib/redis_object/base.rb', line 243

def plname
  cname.pluralize
end

#recollect!Object



261
262
263
264
265
# File 'lib/redis_object/base.rb', line 261

def recollect!
  store.keys("#{name}:*_h").each do |ky|
    store.sadd(plname,ky.gsub(/_h$/,''))
  end
end

#reserve(k) ⇒ Object



231
232
233
# File 'lib/redis_object/base.rb', line 231

def reserve(k)
  store.set(reserve_key(k),Time.now.to_s)
end

#save_allObject



549
550
551
552
553
554
# File 'lib/redis_object/base.rb', line 549

def save_all
  all.each do |obj|
    obj.save
  end
  true
end

#use_dbnum(db = 0) ⇒ Object

def dump out = [] each do |obj| out << obj.dump end out.join(“n”) end



524
525
526
# File 'lib/redis_object/base.rb', line 524

def use_dbnum(db=0)
  @dbnum = db
end