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
- #agg(fact, maps) ⇒ Object
- #best(maps) ⇒ Object
- #count(_fact, maps) ⇒ Object
- #empty(fact, maps) ⇒ Object
- #first(_fact, maps) ⇒ Object
- #max(_fact, maps) ⇒ Object
- #min(_fact, maps) ⇒ Object
- #nth(_fact, maps) ⇒ Object
- #sum(_fact, maps) ⇒ Object
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 |