1+ use crate :: impls:: fuzzy:: FuzzyMatchModel ;
12use crate :: impls:: server:: FileOpenContext ;
23use crate :: impls:: util:: new_tokio_thread;
34use crate :: ui:: { AppContainer , Content , Tab , Top } ;
@@ -6,11 +7,10 @@ use java_asm::smali::SmaliNode;
67use java_asm:: { AsmErr , StrRef } ;
78use log:: { error, info} ;
89use std:: fs;
9- use std:: fs:: { File } ;
10- use std:: ops:: Deref ;
10+ use std:: fs:: File ;
11+ use std:: ops:: { Deref , DerefMut } ;
1112use std:: sync:: Arc ;
1213use std:: time:: Instant ;
13- use trie_rs:: { Trie , TrieBuilder } ;
1414use zip:: result:: ZipError ;
1515
1616impl AsmServer {
@@ -23,7 +23,7 @@ impl AsmServer {
2323 } ,
2424 accessor : Default :: default ( ) ,
2525 classes : Default :: default ( ) ,
26- trie : Default :: default ( ) ,
26+ fuzzy : Default :: default ( ) ,
2727 }
2828 }
2929
@@ -37,24 +37,20 @@ impl AsmServer {
3737 & self . classes
3838 }
3939
40- pub fn get_trie ( & self ) -> & ArcVarOpt < Trie < u8 > > {
41- let mut current = self . trie . lock ( ) ;
42- if current. is_some ( ) { return & self . trie ; }
40+ fn get_or_create_fuzzy ( & self , input : StrRef ) -> & ArcVarOpt < FuzzyMatchModel > {
41+ let mut current = self . fuzzy . lock ( ) ;
42+ if current. is_some ( ) { return & self . fuzzy ; }
4343 let load_start = Instant :: now ( ) ;
4444 let classes_locked = self . get_classes ( ) . lock ( ) ;
45- let Some ( classes) = classes_locked. deref ( ) else { return & self . trie ; } ;
46- let mut trie_builder = TrieBuilder :: new ( ) ;
47- for class in classes. iter ( ) {
48- trie_builder. push ( class. to_string ( ) ) ;
49- } ;
50- let trie = trie_builder. build ( ) ;
51- current. replace ( trie) ;
45+ let Some ( classes) = classes_locked. deref ( ) else { return & self . fuzzy ; } ;
46+ let fuzzy = FuzzyMatchModel :: new ( input, classes, 30 ) ;
47+ current. replace ( fuzzy) ;
5248 let load_end = Instant :: now ( ) ;
5349 info ! (
5450 "trie loaded in {}ms" ,
5551 load_end. duration_since( load_start) . as_millis( )
5652 ) ;
57- & self . trie
53+ & self . fuzzy
5854 }
5955
6056 pub fn smart_open ( server : ServerMut , path : & str , render_target : AppContainer ) {
@@ -127,10 +123,11 @@ impl AsmServer {
127123
128124 pub fn search ( & self , top : & mut Top ) {
129125 let Some ( query) = & top. file_path else { return ; } ;
130- let trie_locked = self . get_trie ( ) . lock ( ) ;
131- let Some ( trie) = trie_locked. deref ( ) else { return ; } ;
132- let results: Vec < String > = trie. predictive_search ( query) . take ( 20 ) . collect ( ) ;
133- top. search_result = results. into_iter ( ) . map ( StrRef :: from) . collect ( ) ;
126+ let query: StrRef = query. as_str ( ) . into ( ) ;
127+ let mut fuzzy_locked = self . get_or_create_fuzzy ( query. clone ( ) ) . lock ( ) ;
128+ let Some ( fuzzy) = fuzzy_locked. deref_mut ( ) else { return ; } ;
129+ let results: Vec < StrRef > = fuzzy. search_with_new_input ( query) ;
130+ top. search_result = results;
134131 }
135132}
136133
0 commit comments