class BELParser::Completion::WildcardMatchParameterCompleter

Constants

L

Public Instance Methods

complete(string_literal, caret_position, options = {}) click to toggle source
# File lib/bel_parser/completion.rb, line 806
def complete(string_literal, caret_position, options = {})
  return [] if string_literal.length < 3

  query =
    case
    when caret_position == string_literal.length
      "#{string_literal}*"
    when caret_position == 0
      "*#{string_literal}"
    else
      ante = string_literal.slice(0...caret_position)
      post = string_literal.slice(caret_position..-1)
      "#{ante}*#{post}"
    end

  # find namespace URI if prefix was provided
  prefix = options[:prefix]
  if prefix
    specified_prefix  = prefix.to_s.upcase
    matched_namespace = @namespaces[specified_prefix]
    uri               = matched_namespace ? matched_namespace.uri : nil
  else
    uri = nil
  end

  @search
    .search(query, :namespace_concept, uri, nil, size: 100)
    .sort { |match1, match2|
      L.distance(string_literal.downcase, match1.pref_label.downcase) <=>
      L.distance(string_literal.downcase, match2.pref_label.downcase)
    }
    .map { |match|
      match_namespace = @namespaces.values.find { |ns| ns.uri == match.scheme_uri }
      if match_namespace
        [match_namespace.keyword, match.pref_label]
      else
        nil
      end
    }
    .compact
    .take(20)
    .sort_by { |(_, v)| v }
    .uniq
    .map     { |(ns, v)|
      ns_value, value_ast = map_value(ns, v)

      [
        ns_value,
        argument(
          parameter(
            prefix(
              identifier(
                ns)),
            value_ast))
      ]
    }
end