class MemDB::Index::PatternMatch

Attributes

bucket[R]
idx[R]

Public Class Methods

new(idx:, bucket: MemDB::Bucket) click to toggle source
# File lib/mem_db/index/pattern_match.rb, line 30
def initialize(idx:, bucket: MemDB::Bucket)
  @idx = idx
  @bucket = bucket
end

Public Instance Methods

add(obj, value) click to toggle source
# File lib/mem_db/index/pattern_match.rb, line 35
def add(obj, value)
  obj.idx_value(@idx).each do |pattern|
    type = pattern[0]
    sequence = pattern[1]
    index =
      case type
      when :enum
        enums
      when :prefix
        prefixes
      when :suffix
        suffixes
      when :substring
        substrings
      end

    obj[self] = sequence
    index.add(obj, value)
    obj.delete(self)
  end
end
query(query, out: MemDB::Out.new) click to toggle source
# File lib/mem_db/index/pattern_match.rb, line 57
def query(query, out: MemDB::Out.new)
  query.idx_value(@idx).each do |q|
    query[self] = q

    @enums&.query(query, out: out)
    @suffixes&.query(query, out: out)
    @prefixes&.query(query, out: out)
    @substrings&.query(query, out: out)

    query.delete(self)
  end

  out
end

Private Instance Methods

enums() click to toggle source
# File lib/mem_db/index/pattern_match.rb, line 74
def enums
  @enums ||= MemDB::Index::Enum.new(
    idx: MemDB::Idx::Itself.new(self),
    bucket: @bucket
  )
end
prefixes() click to toggle source
# File lib/mem_db/index/pattern_match.rb, line 81
def prefixes
  @prefixes ||= MemDB::Index::PrefixTree.new(
    idx: MemDB::Idx::Bytes.new(self),
    bucket: @bucket
  )
end
substrings() click to toggle source
# File lib/mem_db/index/pattern_match.rb, line 95
def substrings
  @substrings ||= MemDB::Index::SequenceMatch.new(
    # reverse somehow make it faster
    idx: MemDB::Idx::Reverse.new(MemDB::Idx::Bytes.new(self)),
    bucket: @bucket
  )
end
suffixes() click to toggle source
# File lib/mem_db/index/pattern_match.rb, line 88
def suffixes
  @suffixes ||= MemDB::Index::PrefixTree.new(
    idx: MemDB::Idx::Reverse.new(MemDB::Idx::Bytes.new(self)),
    bucket: @bucket
  )
end