1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
module Entry = Db.Entry
type query =
{ name : string list
; type_paths : Type_distance.t option
}
let of_query { Query_parser.name; typ } =
let type_paths =
match typ with
| `typ t -> Some (Type_distance.paths_of_type t)
| _ -> None
in
{ name; type_paths }
let type_distance query_type entry =
match query_type, Entry.Kind.get_type entry.Entry.kind with
| Some query_paths, Some entry_type ->
Some (Type_distance.v ~query_paths ~entry:entry_type)
| Some _, None -> Some 1000
| _ -> None
let score query entry =
let name_matches = Name_cost.best_matches query.name entry.Db.Entry.name in
let type_cost =
match type_distance query.type_paths entry with
| Some cost -> cost
| None -> 0
in
5 * (name_matches + type_cost)
|