Class: Droonga::Reducer

Inherits:
Object
  • Object
show all
Defined in:
lib/droonga/reducer.rb

Constant Summary collapse

UNLIMITED =

XXX: We has ULIMITED defined lib/droonga/plugins/search/distributed_search_planner.rb. We should unify it.

-1

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(deal) ⇒ Reducer

Returns a new instance of Reducer.



41
42
43
# File 'lib/droonga/reducer.rb', line 41

def initialize(deal)
  @deal = deal # TODO: deal is good name?
end

Class Method Details

.apply_range(items, range) ⇒ Object

TODO: This is right location?



20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/droonga/reducer.rb', line 20

def apply_range(items, range)
  if items and items.is_a?(Array)
    offset = range["offset"] || 0
    unless offset.zero?
      items = items[offset..-1] || []
    end

    limit = range["limit"] || 0
    unless limit == UNLIMITED
      items = items[0...limit]
    end
  end
  items
end

Instance Method Details

#reduce(left_value, right_value) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/droonga/reducer.rb', line 45

def reduce(left_value, right_value)
  if left_value.nil? or right_value.nil?
    return right_value || left_value
  end

  reduced_value = nil

  case @deal["type"]
  when "and"
    reduced_value = (left_value and right_value)
  when "or"
    reduced_value = (left_value or right_value)
  when "sum"
    reduced_value = sum(left_value, right_value)
    reduced_value = self.class.apply_range(reduced_value,
                                           "limit" => @deal["limit"])
  when "recursive-sum"
    reduced_value = recursive_sum(left_value, right_value)
    reduced_value = self.class.apply_range(reduced_value,
                                           "limit" => @deal["limit"])
  when "average"
    reduced_value = (left_value.to_f + right_value.to_f) / 2
  when "sort"
    reduced_value = merge(left_value,
                          right_value,
                          :operators => @deal["operators"],
                          :key_column => @deal["key_column"])
    reduced_value = self.class.apply_range(reduced_value,
                                           "limit" => @deal["limit"])
  end

  reduced_value
end