Sha256: f9aadd3cac29822018c2a855668443419edfd4b6c459bed35522c83592cbf9b7

Contents?: true

Size: 1.18 KB

Versions: 1

Compression:

Stored size: 1.18 KB

Contents

require 'crosscounter/util'

module Crosscounter
  module Compute
    @@values = {}
    @@tuples = {}

    def self.compute(enumerable, properties)
      enumerable.count do |object|
        properties.all? do |key, value|
          extracted = (object[key] || object[key.sub('_', '')])

          if extracted.kind_of?(Array)
            extracted.join("\t") =~ regexify(value)
          else
            extracted == value
          end
        end
      end
    end

    def self.compute_all(enumerable, rows, columns)
      enumerable.map! { |object| Crosscounter::Util.stringify_keys(object) }

      tuplize(rows).map do |tuple|
        initial = [tuple.last, compute(enumerable, tuple.first => tuple.last)]

        tuplize(columns).inject(initial) do |rows, column|
          rows << compute(enumerable,
                          tuple.first => tuple.last,
                          "_#{column.first}" => column.last)
        end
      end
    end

    def self.regexify(value)
      @@values[value] ||= /(\A|\t)#{value}(\Z|\t)/
    end

    def self.tuplize(hash)
      @@tuples[hash] ||= hash.flat_map do |tuple|
        tuple.last.map { |value| [tuple.first.to_s, value] }
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
crosscounter-0.2.0 lib/crosscounter/compute.rb