@@ -97,58 +97,57 @@ export function smartQueries(
9797 }
9898 }
9999
100- return getQueriesMaybeTyping ( terms ) . concat (
101- fuzzyMatchingDistance > 0
102- ? getQueriesMaybeTyping ( terms , fuzzyMatchingDistance )
103- : [ ] ,
104- getQueriesMaybeTyping ( extraTerms ) ,
105- fuzzyMatchingDistance > 0
106- ? getQueriesMaybeTyping ( extraTerms , fuzzyMatchingDistance )
107- : [ ]
100+ const distance = Math . max ( 0 , fuzzyMatchingDistance ) ;
101+ return getDistanceMatrix ( terms , distance ) . concat (
102+ getDistanceMatrix ( extraTerms , distance )
108103 ) ;
109104}
110105
111106function getQueriesMaybeTyping (
112107 terms : SmartTerm [ ] ,
113- editDistance ? : number
108+ editDistance : number
114109) : SmartQuery [ ] {
115- return termsToQueries ( terms , false , editDistance ) . concat (
110+ return termsToQueries ( terms , editDistance ) . concat (
116111 termsToQueries (
117112 // Ignore terms whose last token already has a trailing wildcard,
118113 // or the last token is not `maybeTyping`.
119114 terms . filter ( ( term ) => {
120115 const token = term [ term . length - 1 ] ;
121116 return ! token . trailing && token . maybeTyping ;
122117 } ) ,
123- true ,
124- editDistance
118+ editDistance ,
119+ true
125120 )
126121 ) ;
127122}
128123
129124function termsToQueries (
130125 terms : SmartTerm [ ] ,
131- maybeTyping ?: boolean ,
132- editDistance ?: number
126+ editDistance : number ,
127+ maybeTyping ?: boolean
133128) : SmartQuery [ ] {
134129 return terms . flatMap ( ( term ) => {
135130 const query = {
136131 tokens : term . map ( ( item ) => item . value ) ,
137- term : term . map ( ( item ) => ( {
138- value : item . value ,
139- presence : lunr . Query . presence . REQUIRED ,
132+ term : term . map ( ( item ) => {
140133 // The last token of a term maybe incomplete while user is typing.
141134 // So append more queries with trailing wildcard added.
142- wildcard : (
143- maybeTyping ? item . trailing || item . maybeTyping : item . trailing
144- )
145- ? lunr . Query . wildcard . TRAILING
146- : lunr . Query . wildcard . NONE ,
147- editDistance :
148- editDistance && item . value . length > editDistance
135+ const trailing = maybeTyping
136+ ? item . trailing || item . maybeTyping
137+ : item . trailing ;
138+ const distance =
139+ editDistance > 0 && item . value . length > editDistance
149140 ? editDistance
150- : undefined ,
151- } ) ) ,
141+ : undefined ;
142+ return {
143+ value : item . value ,
144+ presence : lunr . Query . presence . REQUIRED ,
145+ wildcard : trailing
146+ ? lunr . Query . wildcard . TRAILING
147+ : lunr . Query . wildcard . NONE ,
148+ editDistance : distance ,
149+ } ;
150+ } ) ,
152151 } ;
153152
154153 // Ignore queries that all terms ignored edit distance due to too short tokens.
@@ -159,3 +158,9 @@ function termsToQueries(
159158 return query ;
160159 } ) ;
161160}
161+
162+ function getDistanceMatrix ( terms : SmartTerm [ ] , distance : number ) {
163+ return Array . from ( { length : distance + 1 } , ( _ , i ) =>
164+ getQueriesMaybeTyping ( terms , i )
165+ ) . flat ( ) ;
166+ }
0 commit comments