Merge: src/model/model_index: model index uses BKTree
authorJean Privat <jean@pryen.org>
Mon, 13 Aug 2018 19:25:30 +0000 (15:25 -0400)
committerJean Privat <jean@pryen.org>
Mon, 13 Aug 2018 19:25:30 +0000 (15:25 -0400)
This PR makes ModelIndex use a BKTree (#2718) to speed up Nitweb name similarity search queries on large code corpora.

Levenstein names comparison with 300k+ entities took a bit long (up to 10s for Nitweb with `contrib` and `src` for some queries). The use of BKTree speeds things up and brings those queries under 0.1s.

Pull-Request: #2724
Reviewed-by: Jean Privat <jean@pryen.org>

1  2 
lib/core/collection/union_find.nit

@@@ -13,7 -13,7 +13,7 @@@ module union_fin
  
  import hash_collection
  
- # Data structure to keeps track of elements partitioned into disjoint subsets
+ # Data structure to keep track of elements partitioned into disjoint subsets
  #
  #     var s = new DisjointSet[Int]
  #     s.add(1)
  #     s.union(1,2)
  #     assert s.in_same_subset(1,2)
  #
- # `in_same_subset` is transitive, reflexive and symetric
+ # `in_same_subset` is transitive, reflexive and symmetric
  #
  #     s.add(3)
  #     assert not s.in_same_subset(1,3)
  #     s.union(3,2)
  #     assert s.in_same_subset(1,3)
  #
- # Unkike theorical Disjoint-set data structures, the underling implementation is opaque
- # that makes the traditionnal `find` method unavailable for clients.
+ # Unlike theoretical Disjoint-set data structures, the underling implementation is opaque
+ # making the traditional `find` method unavailable for clients.
  # The methods `in_same_subset`, `to_partitions`, and their variations are offered instead.
  class DisjointSet[E]
        super SimpleCollection[E]
        end
  
        # Are all elements of `es` in the same subset?
 +      #
        #     var s = new DisjointSet[Int]
        #     s.add_all([1,2,3,4,5,6])
        #     s.union_all([1,2,3])
                return to_subpartition(self)
        end
  
-       # Construct a partitionning on `es`, a subset of elements
+       # Construct a partitioning on `es`, a subset of elements
        #
        #     var s = new DisjointSet[Int]
        #     s.add_all([1,2,3,4,5,6])
@@@ -237,7 -236,7 +237,7 @@@ private class DisjointSetNod
        # If parent == self then the node is a root
        var parent: DisjointSetNode = self
  
-       # The rank to no desequilibrate the structure.
+       # The rank to keep the structure balanced.
        # The term rank is used instead of depth since
        # path compression is used, see `DisjointSet::nfind`
        var rank = 0