Skip to content

Commit 2750d3a

Browse files
committed
support fuzzy search in egui
1 parent 941d3cb commit 2750d3a

3 files changed

Lines changed: 21 additions & 22 deletions

File tree

asm_server/src/impls/fuzzy.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ impl FuzzyMatchModel {
148148
let mut buf = Vec::new();
149149
let mut result: Vec<(&StrRef, u32)> = Vec::with_capacity(top_n);
150150

151-
let mut stop_idx = items_2_start_idx;
151+
// search things in items 1
152152
for item in items_1 {
153153
if result.len() >= top_n {
154154
break;
@@ -162,6 +162,8 @@ impl FuzzyMatchModel {
162162
result.push(single_result);
163163
}
164164

165+
// search things in items 2 which stored in `all_items` and starts from `items_2_start_idx`.
166+
let mut stop_idx = items_2_start_idx;
165167
for (idx, item) in all_items.iter().enumerate().skip(stop_idx) {
166168
if result.len() >= top_n {
167169
break;

asm_server/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use crate::impls::apk_load::ApkAccessor;
2+
use crate::impls::fuzzy::FuzzyMatchModel;
23
use enum_dispatch::enum_dispatch;
34
use java_asm::smali::SmaliNode;
45
use java_asm::{DescriptorRef, StrRef};
56
use parking_lot::Mutex;
67
use std::sync::Arc;
7-
use trie_rs::Trie;
88

99
pub mod server;
1010

@@ -18,7 +18,7 @@ pub struct AsmServer {
1818
// when in loading state, the accessor is None.
1919
pub accessor: AccessorMut,
2020
classes: ArcVarOpt<Vec<StrRef>>,
21-
trie: ArcVarOpt<Trie<u8>>,
21+
fuzzy: ArcVarOpt<FuzzyMatchModel>,
2222
}
2323

2424
pub type ArcVarOpt<T> = Arc<Mutex<Option<T>>>;

asm_server/src/server.rs

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::impls::fuzzy::FuzzyMatchModel;
12
use crate::impls::server::FileOpenContext;
23
use crate::impls::util::new_tokio_thread;
34
use crate::ui::{AppContainer, Content, Tab, Top};
@@ -6,11 +7,10 @@ use java_asm::smali::SmaliNode;
67
use java_asm::{AsmErr, StrRef};
78
use log::{error, info};
89
use std::fs;
9-
use std::fs::{File};
10-
use std::ops::Deref;
10+
use std::fs::File;
11+
use std::ops::{Deref, DerefMut};
1112
use std::sync::Arc;
1213
use std::time::Instant;
13-
use trie_rs::{Trie, TrieBuilder};
1414
use zip::result::ZipError;
1515

1616
impl 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

Comments
 (0)