module Starscope::Queryable

Public Instance Methods

query(tables, value, filters = {}) click to toggle source
# File lib/starscope/queryable.rb, line 5
def query(tables, value, filters = {})
  tables = [tables] if tables.is_a?(Symbol)
  tables.each { |t| raise Starscope::DB::NoTableError, "Table '#{t}' not found" unless @tables[t] }
  input = Enumerator.new do |y|
    tables.each do |t|
      @tables[t].each do |elem|
        y << elem
      end
    end
  end

  run_query(value, input, filters)
end

Private Instance Methods

filter(record, filters) click to toggle source
# File lib/starscope/queryable.rb, line 35
def filter(record, filters)
  filters.all? do |key, filter|
    target = record[key] || (@meta[:files][record[:file]] || {})[key]
    target && filter.match(target.to_s)
  end
end
match(record, query) click to toggle source
# File lib/starscope/queryable.rb, line 42
def match(record, query)
  name = record[:name].map(&:to_s).join('::')

  query.match(name)
end
run_query(query, input, filters) click to toggle source
# File lib/starscope/queryable.rb, line 21
def run_query(query, input, filters)
  query = Starscope::Matcher.new(query)
  filters.each { |k, v| filters[k] = Starscope::Matcher.new(v) }

  results = input.select { |x| filter(x, filters) }.group_by { |x| match(x, query) }

  Starscope::Matcher::MATCH_TYPES.each do |type|
    next if results[type].nil? || results[type].empty?
    return results[type]
  end

  []
end