Class: Almicube::Ranking::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/almicube/ranking/base.rb

Direct Known Subclasses

DataRanking, SubRanking

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Base

Returns a new instance of Base.



7
8
9
10
11
12
13
14
15
16
17
# File 'lib/almicube/ranking/base.rb', line 7

def initialize(options={})
  self.selector = options[:selector]
  self.aggregator = options[:aggregator] || Aggregator::SumAggregator.new
  self.bundler = options[:bundler]
  @prefix = options[:prefix]
  @suffix = options[:suffix]
  @date = options[:date] || Date.today
  @class_name = options[:class_name]
  @class_name = @class_name.constantize if @class_name.is_a? String
  @per_page = options[:per_page] || 10
end

Instance Attribute Details

#aggregatorObject

Returns the value of attribute aggregator.



4
5
6
# File 'lib/almicube/ranking/base.rb', line 4

def aggregator
  @aggregator
end

#bundlerObject

Returns the value of attribute bundler.



4
5
6
# File 'lib/almicube/ranking/base.rb', line 4

def bundler
  @bundler
end

#class_nameObject (readonly)

Returns the value of attribute class_name.



4
5
6
# File 'lib/almicube/ranking/base.rb', line 4

def class_name
  @class_name
end

#dateObject (readonly)

Returns the value of attribute date.



4
5
6
# File 'lib/almicube/ranking/base.rb', line 4

def date
  @date
end

#per_pageObject

Returns the value of attribute per_page.



5
6
7
# File 'lib/almicube/ranking/base.rb', line 5

def per_page
  @per_page
end

#selectorObject

Returns the value of attribute selector.



4
5
6
# File 'lib/almicube/ranking/base.rb', line 4

def selector
  @selector
end

Instance Method Details

#aggregate(options = {}) ⇒ Object



68
69
70
71
72
73
# File 'lib/almicube/ranking/base.rb', line 68

def aggregate(options = {})
  aggregate! options
  true
rescue Exception => e
  false
end

#aggregate!(options = {}) ⇒ Object



62
63
64
65
66
# File 'lib/almicube/ranking/base.rb', line 62

def aggregate!(options = {})
  cogs.each { |cog| cog.before_aggregate }
  @aggregator.aggregate self
  cogs.each { |cog| cog.after_aggregate }
end

#bundled_keysObject



23
24
25
# File 'lib/almicube/ranking/base.rb', line 23

def bundled_keys
  bundler.keys || []
end

#cogsObject



54
55
56
57
58
59
60
# File 'lib/almicube/ranking/base.rb', line 54

def cogs
  cogs = []
  cogs << @selector unless @selector.nil?
  cogs << @aggregator unless @aggregator.nil?
  cogs << @bundler unless @bundler.nil?
  cogs
end

#connectionObject



27
28
29
# File 'lib/almicube/ranking/base.rb', line 27

def connection
  Almicube::Config.config.connection
end

#data?Boolean

Returns:

  • (Boolean)


75
76
77
# File 'lib/almicube/ranking/base.rb', line 75

def data?
  false
end

#incr(item, score = 1) ⇒ Object



87
88
89
# File 'lib/almicube/ranking/base.rb', line 87

def incr(item, score = 1)
  connection.zincrby key, score, item.to_param
end

#page(page = 1) ⇒ Object



31
32
33
34
35
36
37
# File 'lib/almicube/ranking/base.rb', line 31

def page(page=1)
  page = [1, page.to_i].max
  revrange = connection.zrevrange(key, (page - 1) * per_page, page * per_page - 1)
  records = class_name.where("id IN (?)", revrange)
  records.each { |record| record.current_ranking = self }
  revrange.inject([]) { |l, v| l << records.detect { |r| r.to_param == v } }
end

#rank(item) ⇒ Object



83
84
85
# File 'lib/almicube/ranking/base.rb', line 83

def rank(item)
  connection.zrevrank(key, item.to_param) + 1
end

#recordsObject



19
20
21
# File 'lib/almicube/ranking/base.rb', line 19

def records
  selector.records
end

#score(item) ⇒ Object



79
80
81
# File 'lib/almicube/ranking/base.rb', line 79

def score(item)
  ( connection.zscore key, item.to_param ) || @options.fetch(:default_score, 0)
end