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