Module: Factbase::Term::Aggregates

Included in:
Factbase::Term
Defined in:
lib/factbase/terms/aggregates.rb

Overview

Aggregating terms.

Author

Yegor Bugayenko ([email protected])

Copyright

Copyright © 2024 Yegor Bugayenko

License

MIT

Instance Method Summary collapse

Instance Method Details

#agg(fact, maps) ⇒ Object



78
79
80
81
82
83
84
85
86
# File 'lib/factbase/terms/aggregates.rb', line 78

def agg(fact, maps)
  assert_args(2)
  selector = @operands[0]
  raise "A term expected, but '#{selector}' provided" unless selector.is_a?(Factbase::Term)
  term = @operands[1]
  raise "A term expected, but '#{term}' provided" unless term.is_a?(Factbase::Term)
  subset = Factbase::Query.new(maps, Mutex.new, selector.to_s).each(fact).to_a
  term.evaluate(nil, subset)
end

#best(maps) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/factbase/terms/aggregates.rb', line 95

def best(maps)
  k = @operands[0]
  raise "A symbol expected, but #{k} provided" unless k.is_a?(Symbol)
  best = nil
  maps.each do |m|
    vv = m[k.to_s]
    next if vv.nil?
    vv = [vv] unless vv.is_a?(Array)
    vv.each do |v|
      best = v if best.nil? || yield(v, best)
    end
  end
  best
end

#count(_fact, maps) ⇒ Object



41
42
43
# File 'lib/factbase/terms/aggregates.rb', line 41

def count(_fact, maps)
  maps.size
end

#empty(fact, maps) ⇒ Object



88
89
90
91
92
93
# File 'lib/factbase/terms/aggregates.rb', line 88

def empty(fact, maps)
  assert_args(1)
  term = @operands[0]
  raise "A term expected, but '#{term}' provided" unless term.is_a?(Factbase::Term)
  Factbase::Query.new(maps, Mutex.new, term.to_s).each(fact).to_a.empty?
end

#first(_fact, maps) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/factbase/terms/aggregates.rb', line 54

def first(_fact, maps)
  assert_args(1)
  k = @operands[0]
  raise "A symbol expected, but #{k} provided" unless k.is_a?(Symbol)
  first = maps[0]
  return nil if first.nil?
  first[k.to_s]
end

#max(_fact, maps) ⇒ Object



36
37
38
39
# File 'lib/factbase/terms/aggregates.rb', line 36

def max(_fact, maps)
  assert_args(1)
  best(maps) { |v, b| v > b }
end

#min(_fact, maps) ⇒ Object



31
32
33
34
# File 'lib/factbase/terms/aggregates.rb', line 31

def min(_fact, maps)
  assert_args(1)
  best(maps) { |v, b| v < b }
end

#nth(_fact, maps) ⇒ Object



45
46
47
48
49
50
51
52
# File 'lib/factbase/terms/aggregates.rb', line 45

def nth(_fact, maps)
  assert_args(2)
  pos = @operands[0]
  raise "An integer expected, but #{pos} provided" unless pos.is_a?(Integer)
  k = @operands[1]
  raise "A symbol expected, but #{k} provided" unless k.is_a?(Symbol)
  maps[pos][k.to_s]
end

#sum(_fact, maps) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/factbase/terms/aggregates.rb', line 63

def sum(_fact, maps)
  k = @operands[0]
  raise "A symbol expected, but '#{k}' provided" unless k.is_a?(Symbol)
  sum = 0
  maps.each do |m|
    vv = m[k.to_s]
    next if vv.nil?
    vv = [vv] unless vv.is_a?(Array)
    vv.each do |v|
      sum += v
    end
  end
  sum
end