Sha256: db847847f6eeaab4eb127d7d2a1363847c0dad0f293615f25f927bc627d82f50

Contents?: true

Size: 966 Bytes

Versions: 5

Compression:

Stored size: 966 Bytes

Contents

module Alf
  module Engine
    #
    # Filters tuples from `left` that match or do not match tuples from `right`.
    #
    class Semi::Hash < Cog

      # @return [Enumerable] The left operand
      attr_reader :left

      # @return [Enumerable] The right operand
      attr_reader :right

      # @return [Boolean] Match (true) or not match (false)?
      attr_reader :predicate

      # Creates a Semi::Hash instance
      def initialize(left, right, predicate)
        @left = left
        @right = right
        @predicate = predicate
      end

      # (see Cog#each)
      def each
        index = nil
        left.each do |left_tuple|
          index ||= Materialize::Hash.new(right, lambda{|t|
            AttrList.new(left_tuple.keys & t.keys)
          }).prepare
          if index[left_tuple, true].empty? != predicate
            yield left_tuple 
          end
        end
      end

    end # class Semi::Hash
  end # module Engine
end # module Alf

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
alf-0.12.2 lib/alf-engine/alf/engine/semi/hash.rb
alf-0.12.1 lib/alf-engine/alf/engine/semi/hash.rb
alf-0.12.0 lib/alf-engine/alf/engine/semi/hash.rb
alf-0.11.1 lib/alf-engine/alf/engine/semi/hash.rb
alf-0.11.0 lib/alf-engine/alf/engine/semi/hash.rb