simplify fuzzy matching path to a single query

This commit is contained in:
Ryan Fleury
2024-01-31 14:07:16 -08:00
parent 071ff82673
commit 41b853b874
5 changed files with 32 additions and 69 deletions
+5 -1
View File
@@ -1661,9 +1661,12 @@ rgba_from_hex_string_4f32(String8 hex_string)
//~ rjf: String Fuzzy Matching //~ rjf: String Fuzzy Matching
internal FuzzyMatchRangeList internal FuzzyMatchRangeList
fuzzy_match_find(Arena *arena, String8List needles, String8 haystack) fuzzy_match_find(Arena *arena, String8 needle, String8 haystack)
{ {
FuzzyMatchRangeList result = {0}; FuzzyMatchRangeList result = {0};
Temp scratch = scratch_begin(&arena, 1);
String8List needles = str8_split(scratch.arena, needle, (U8*)" ", 1, 0);
result.needle_part_count = needles.node_count;
for(String8Node *needle_n = needles.first; needle_n != 0; needle_n = needle_n->next) for(String8Node *needle_n = needles.first; needle_n != 0; needle_n = needle_n->next)
{ {
U64 find_pos = 0; U64 find_pos = 0;
@@ -1695,6 +1698,7 @@ fuzzy_match_find(Arena *arena, String8List needles, String8 haystack)
result.total_dim += dim_1u64(range); result.total_dim += dim_1u64(range);
} }
} }
scratch_end(scratch);
return result; return result;
} }
//////////////////////////////// ////////////////////////////////
+2 -1
View File
@@ -144,6 +144,7 @@ struct FuzzyMatchRangeList
FuzzyMatchRangeNode *first; FuzzyMatchRangeNode *first;
FuzzyMatchRangeNode *last; FuzzyMatchRangeNode *last;
U64 count; U64 count;
U64 needle_part_count;
U64 total_dim; U64 total_dim;
}; };
@@ -340,7 +341,7 @@ internal Vec4F32 rgba_from_hex_string_4f32(String8 hex_string);
//////////////////////////////// ////////////////////////////////
//~ rjf: String Fuzzy Matching //~ rjf: String Fuzzy Matching
internal FuzzyMatchRangeList fuzzy_match_find(Arena *arena, String8List needles, String8 haystack); internal FuzzyMatchRangeList fuzzy_match_find(Arena *arena, String8 needle, String8 haystack);
//////////////////////////////// ////////////////////////////////
//~ NOTE(allen): Serialization Helpers //~ NOTE(allen): Serialization Helpers
+2 -6
View File
@@ -1134,10 +1134,6 @@ dbgi_fuzzy_thread__entry_point(void *p)
} }
} }
//- rjf: form space-separated search needles
U8 splits[] = {' '};
String8List query_needles = str8_split(scratch.arena, query, splits, ArrayCount(splits), 0);
//- rjf: exe_path -> dbgi_parse, raddbg //- rjf: exe_path -> dbgi_parse, raddbg
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64);
RADDBG_Parsed *rdbg = &dbgi->rdbg; RADDBG_Parsed *rdbg = &dbgi->rdbg;
@@ -1153,8 +1149,8 @@ dbgi_fuzzy_thread__entry_point(void *p)
U8 *name_base = raddbg_string_from_idx(rdbg, procedure->name_string_idx, &name_size); U8 *name_base = raddbg_string_from_idx(rdbg, procedure->name_string_idx, &name_size);
String8 name = str8(name_base, name_size); String8 name = str8(name_base, name_size);
if(name.size == 0) { continue; } if(name.size == 0) { continue; }
FuzzyMatchRangeList matches = fuzzy_match_find(task_arena, query_needles, name); FuzzyMatchRangeList matches = fuzzy_match_find(task_arena, query, name);
if(matches.count == query_needles.node_count) if(matches.count == matches.needle_part_count)
{ {
DBGI_FuzzySearchItemChunk *chunk = items_list.last; DBGI_FuzzySearchItemChunk *chunk = items_list.last;
if(chunk == 0 || chunk->count >= chunk->cap) if(chunk == 0 || chunk->count >= chunk->cap)
+8 -15
View File
@@ -3776,13 +3776,6 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
U64 thread_rip_voff = df_voff_from_vaddr(module, thread_rip_vaddr); U64 thread_rip_voff = df_voff_from_vaddr(module, thread_rip_vaddr);
DF_Entity *binary = df_binary_file_from_module(module); DF_Entity *binary = df_binary_file_from_module(module);
//- rjf: unpack query words
String8List search_needles = {0};
{
U8 splits[] = {' '};
search_needles = str8_split(scratch.arena, query, splits, ArrayCount(splits), 0);
}
//- rjf: gather lister items //- rjf: gather lister items
DF_AutoCompListerItemChunkList item_list = {0}; DF_AutoCompListerItemChunkList item_list = {0};
{ {
@@ -3795,9 +3788,9 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
{ {
item.string = n->string; item.string = n->string;
item.kind_string = str8_lit("Local"); item.kind_string = str8_lit("Local");
item.matches = fuzzy_match_find(scratch.arena, search_needles, n->string); item.matches = fuzzy_match_find(scratch.arena, query, n->string);
} }
if(search_needles.node_count == 0 || item.matches.count != 0) if(query.size == 0 || item.matches.count != 0)
{ {
df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
@@ -3818,9 +3811,9 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
{ {
item.string = reg_names[idx]; item.string = reg_names[idx];
item.kind_string = str8_lit("Register"); item.kind_string = str8_lit("Register");
item.matches = fuzzy_match_find(scratch.arena, search_needles, reg_names[idx]); item.matches = fuzzy_match_find(scratch.arena, query, reg_names[idx]);
} }
if(search_needles.node_count == 0 || item.matches.count != 0) if(query.size == 0 || item.matches.count != 0)
{ {
df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
@@ -3834,9 +3827,9 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
{ {
item.string = alias_names[idx]; item.string = alias_names[idx];
item.kind_string = str8_lit("Reg. Alias"); item.kind_string = str8_lit("Reg. Alias");
item.matches = fuzzy_match_find(scratch.arena, search_needles, alias_names[idx]); item.matches = fuzzy_match_find(scratch.arena, query, alias_names[idx]);
} }
if(search_needles.node_count == 0 || item.matches.count != 0) if(query.size == 0 || item.matches.count != 0)
{ {
df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
@@ -3853,9 +3846,9 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
{ {
item.string = spec->info.string; item.string = spec->info.string;
item.kind_string = str8_lit("View Rule"); item.kind_string = str8_lit("View Rule");
item.matches = fuzzy_match_find(scratch.arena, search_needles, spec->info.string); item.matches = fuzzy_match_find(scratch.arena, query, spec->info.string);
} }
if(search_needles.node_count == 0 || item.matches.count != 0) if(query.size == 0 || item.matches.count != 0)
{ {
df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
+15 -46
View File
@@ -162,15 +162,6 @@ df_cmd_lister_item_list_from_needle(Arena *arena, String8 needle)
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
DF_CmdSpecList specs = df_push_cmd_spec_list(scratch.arena); DF_CmdSpecList specs = df_push_cmd_spec_list(scratch.arena);
DF_CmdListerItemList result = {0}; DF_CmdListerItemList result = {0};
//- rjf: get search needles
String8List search_needles = {0};
{
U8 splits[] = {' '};
search_needles = str8_split(scratch.arena, needle, splits, ArrayCount(splits), 0);
}
//- rjf: build filtered list of commands
for(DF_CmdSpecNode *n = specs.first; n != 0; n = n->next) for(DF_CmdSpecNode *n = specs.first; n != 0; n = n->next)
{ {
DF_CmdSpec *spec = n->spec; DF_CmdSpec *spec = n->spec;
@@ -179,13 +170,13 @@ df_cmd_lister_item_list_from_needle(Arena *arena, String8 needle)
String8 cmd_display_name = spec->info.display_name; String8 cmd_display_name = spec->info.display_name;
String8 cmd_desc = spec->info.description; String8 cmd_desc = spec->info.description;
String8 cmd_tags = spec->info.search_tags; String8 cmd_tags = spec->info.search_tags;
FuzzyMatchRangeList name_matches = fuzzy_match_find(arena, search_needles, cmd_display_name); FuzzyMatchRangeList name_matches = fuzzy_match_find(arena, needle, cmd_display_name);
FuzzyMatchRangeList desc_matches = fuzzy_match_find(arena, search_needles, cmd_desc); FuzzyMatchRangeList desc_matches = fuzzy_match_find(arena, needle, cmd_desc);
FuzzyMatchRangeList tags_matches = fuzzy_match_find(arena, search_needles, cmd_tags); FuzzyMatchRangeList tags_matches = fuzzy_match_find(arena, needle, cmd_tags);
if(name_matches.count == search_needles.node_count || if(name_matches.count == name_matches.needle_part_count ||
desc_matches.count == search_needles.node_count || desc_matches.count == name_matches.needle_part_count ||
tags_matches.count > 0 || tags_matches.count > 0 ||
search_needles.node_count == 0) name_matches.needle_part_count == 0)
{ {
DF_CmdListerItemNode *node = push_array(arena, DF_CmdListerItemNode, 1); DF_CmdListerItemNode *node = push_array(arena, DF_CmdListerItemNode, 1);
node->item.cmd_spec = spec; node->item.cmd_spec = spec;
@@ -199,7 +190,6 @@ df_cmd_lister_item_list_from_needle(Arena *arena, String8 needle)
} }
} }
} }
scratch_end(scratch); scratch_end(scratch);
return result; return result;
} }
@@ -247,10 +237,6 @@ df_process_info_list_from_query(Arena *arena, String8 query)
} }
} }
//- rjf: build needles
U8 splits[] = {' '};
String8List needles = str8_split(scratch.arena, query, splits, ArrayCount(splits), 0);;
//- rjf: build list //- rjf: build list
DF_ProcessInfoList list = {0}; DF_ProcessInfoList list = {0};
{ {
@@ -277,18 +263,18 @@ df_process_info_list_from_query(Arena *arena, String8 query)
// rjf: gather fuzzy matches // rjf: gather fuzzy matches
FuzzyMatchRangeList attached_match_ranges = {0}; FuzzyMatchRangeList attached_match_ranges = {0};
FuzzyMatchRangeList name_match_ranges = fuzzy_match_find(arena, needles, info.name); FuzzyMatchRangeList name_match_ranges = fuzzy_match_find(arena, query, info.name);
FuzzyMatchRangeList pid_match_ranges = fuzzy_match_find(arena, needles, push_str8f(scratch.arena, "%i", info.pid)); FuzzyMatchRangeList pid_match_ranges = fuzzy_match_find(arena, query, push_str8f(scratch.arena, "%i", info.pid));
if(is_attached) if(is_attached)
{ {
attached_match_ranges = fuzzy_match_find(arena, needles, str8_lit("[attached]")); attached_match_ranges = fuzzy_match_find(arena, query, str8_lit("[attached]"));
} }
// rjf: determine if this item is filtered out // rjf: determine if this item is filtered out
B32 matches_query = (query.size == 0 || B32 matches_query = (query.size == 0 ||
(attached_match_ranges.count >= needles.node_count) || (attached_match_ranges.count >= attached_match_ranges.needle_part_count) ||
(name_match_ranges.count >= needles.node_count) || (name_match_ranges.count >= name_match_ranges.needle_part_count) ||
(pid_match_ranges.count >= needles.node_count)); (pid_match_ranges.count >= pid_match_ranges.needle_part_count));
// rjf: push if unfiltered // rjf: push if unfiltered
if(matches_query) if(matches_query)
@@ -339,15 +325,6 @@ df_entity_lister_item_list_from_needle(Arena *arena, DF_EntityKind kind, DF_Enti
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
DF_EntityListerItemList result = {0}; DF_EntityListerItemList result = {0};
//- rjf: get search needles
String8List search_needles = {0};
{
U8 splits[] = {' '};
search_needles = str8_split(scratch.arena, needle, splits, ArrayCount(splits), 0);
}
//- rjf: build filtered list
DF_EntityList ent_list = df_query_cached_entity_list_with_kind(kind); DF_EntityList ent_list = df_query_cached_entity_list_with_kind(kind);
for(DF_EntityNode *n = ent_list.first; n != 0; n = n->next) for(DF_EntityNode *n = ent_list.first; n != 0; n = n->next)
{ {
@@ -355,7 +332,7 @@ df_entity_lister_item_list_from_needle(Arena *arena, DF_EntityKind kind, DF_Enti
if(!(entity->flags & omit_flags)) if(!(entity->flags & omit_flags))
{ {
String8 display_string = df_display_string_from_entity(scratch.arena, entity); String8 display_string = df_display_string_from_entity(scratch.arena, entity);
FuzzyMatchRangeList match_rngs = fuzzy_match_find(arena, search_needles, display_string); FuzzyMatchRangeList match_rngs = fuzzy_match_find(arena, needle, display_string);
if(match_rngs.count != 0 || needle.size == 0) if(match_rngs.count != 0 || needle.size == 0)
{ {
DF_EntityListerItemNode *item_n = push_array(arena, DF_EntityListerItemNode, 1); DF_EntityListerItemNode *item_n = push_array(arena, DF_EntityListerItemNode, 1);
@@ -366,7 +343,6 @@ df_entity_lister_item_list_from_needle(Arena *arena, DF_EntityKind kind, DF_Enti
} }
} }
} }
scratch_end(scratch); scratch_end(scratch);
return result; return result;
} }
@@ -2376,13 +2352,6 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem)
df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetCurrentPath)); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetCurrentPath));
} }
//- rjf: search => fuzzy needles
String8List search_needles = {0};
{
U8 splits[] = {' '};
search_needles = str8_split(scratch.arena, path_query.search, splits, ArrayCount(splits), 0);
}
//- rjf: get files, filtered //- rjf: get files, filtered
U64 new_file_count = 0; U64 new_file_count = 0;
DF_FileInfoNode *first_file = 0; DF_FileInfoNode *first_file = 0;
@@ -2391,8 +2360,8 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem)
OS_FileIter *it = os_file_iter_begin(scratch.arena, path_query.path, 0); OS_FileIter *it = os_file_iter_begin(scratch.arena, path_query.path, 0);
for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, it, &info);) for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, it, &info);)
{ {
FuzzyMatchRangeList match_ranges = fuzzy_match_find(fs->cached_files_arena, search_needles, info.name); FuzzyMatchRangeList match_ranges = fuzzy_match_find(fs->cached_files_arena, path_query.search, info.name);
B32 fits_search = (search_needles.node_count == 0 || match_ranges.count == search_needles.node_count); B32 fits_search = (path_query.search.size == 0 || match_ranges.count == match_ranges.needle_part_count);
B32 fits_dir_only = !!(info.props.flags & FilePropertyFlag_IsFolder) || !dir_selection; B32 fits_dir_only = !!(info.props.flags & FilePropertyFlag_IsFolder) || !dir_selection;
if(fits_search && fits_dir_only) if(fits_search && fits_dir_only)
{ {