1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-09-29 23:10:52 +00:00

Full-text search: Add expand_options; clean up other options

This commit is contained in:
gnosygnu 2017-03-24 21:54:02 -04:00
parent 688f276552
commit 0b762933b2
7 changed files with 76 additions and 50 deletions

View File

@ -23,11 +23,12 @@ public class Xofulltext_args_qry {
public Xofulltext_cache_mgr cache_mgr; public Xofulltext_cache_mgr cache_mgr;
public Xofulltext_args_wiki[] wikis_ary; public Xofulltext_args_wiki[] wikis_ary;
public boolean expand_snips;
public boolean show_all_snips;
public boolean expand_options;
public boolean case_match; public boolean case_match;
public boolean auto_wildcard_bgn; public boolean auto_wildcard_bgn;
public boolean auto_wildcard_end; public boolean auto_wildcard_end;
public boolean expand_matches_section;
public boolean show_all_matches;
private boolean canceled; private boolean canceled;
public byte[] Qry_key(byte[] wiki, byte[] ns_ids) { public byte[] Qry_key(byte[] wiki, byte[] ns_ids) {
@ -58,11 +59,13 @@ public class Xofulltext_args_qry {
Set_prop(wiki_args, wikis_len, args, "limits"); Set_prop(wiki_args, wikis_len, args, "limits");
rv.page_guid = args.Get_as_str("page_guid"); rv.page_guid = args.Get_as_str("page_guid");
rv.expand_snips = args.Get_as_bool_or("expand_snips", false);
rv.show_all_snips = args.Get_as_bool_or("show_all_snips", false);
rv.expand_options = args.Get_as_bool_or("expand_options", false);
rv.case_match = args.Get_as_bool_or("case_match", false); rv.case_match = args.Get_as_bool_or("case_match", false);
rv.auto_wildcard_bgn = args.Get_as_bool_or("auto_wildcard_bgn", false); rv.auto_wildcard_bgn = args.Get_as_bool_or("auto_wildcard_bgn", false);
rv.auto_wildcard_end = args.Get_as_bool_or("auto_wildcard_end", false); rv.auto_wildcard_end = args.Get_as_bool_or("auto_wildcard_end", false);
rv.expand_matches_section = args.Get_as_bool_or("expand_matches_section", false);
rv.show_all_matches = args.Get_as_bool_or("show_all_matches", false);
return rv; return rv;
} }
private static void Set_prop(Xofulltext_args_wiki[] wikis, int wikis_len, Json_nde args, String key) { private static void Set_prop(Xofulltext_args_wiki[] wikis, int wikis_len, Json_nde args, String key) {

View File

@ -60,13 +60,13 @@ public class Xofulltext_searcher__brute implements Xofulltext_searcher {
// do highlight // do highlight
if (found <= wiki_args.len) { if (found <= wiki_args.len) {
cbk_highlight.Init(ui, args.qry_id, wiki, page_id, ttl.Full_db(), args.show_all_matches); cbk_highlight.Init(ui, args.qry_id, wiki, page_id, ttl.Full_db(), args.show_all_snips);
ui.Send_page_add(new Xofulltext_searcher_page ui.Send_page_add(new Xofulltext_searcher_page
( args.qry_id ( args.qry_id
, wiki_domain , wiki_domain
, page_id , page_id
, ttl.Full_db() , ttl.Full_db()
, args.expand_matches_section , args.expand_snips
)); ));
finder.Match(text_mcase, 0, text_mcase.length, cbk_highlight); finder.Match(text_mcase, 0, text_mcase.length, cbk_highlight);
} }

View File

@ -74,7 +74,7 @@ class Xofulltext_highlighter_mgr implements Gfo_invk {
int page_id = item.page_id; int page_id = item.page_id;
Gflucene_highlighter_item[] lines = highlighter_mgr.Exec(searcher_data, item); Gflucene_highlighter_item[] lines = highlighter_mgr.Exec(searcher_data, item);
for (Gflucene_highlighter_item line : lines) { for (Gflucene_highlighter_item line : lines) {
ui.Send_line_add(true, searcher_args.show_all_matches, searcher_args.qry_id, wiki.Domain_bry(), page_id, line.num, Bry_.new_u8(line.text)); ui.Send_line_add(true, searcher_args.show_all_snips, searcher_args.qry_id, wiki.Domain_bry(), page_id, line.num, Bry_.new_u8(line.text));
} }
} }
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {

View File

@ -75,7 +75,7 @@ public class Xofulltext_searcher__lucene implements Xofulltext_searcher {
if (!wiki_args.ns_hash.Has(doc_data.ns_id)) continue; if (!wiki_args.ns_hash.Has(doc_data.ns_id)) continue;
// call page doc_data // call page doc_data
Xofulltext_searcher_page page = new Xofulltext_searcher_page(args.qry_id, wiki.Domain_bry(), doc_data.page_id, doc_data.page_full_db, args.expand_matches_section); Xofulltext_searcher_page page = new Xofulltext_searcher_page(args.qry_id, wiki.Domain_bry(), doc_data.page_id, doc_data.page_full_db, args.expand_snips);
ui.Send_page_add(page); ui.Send_page_add(page);
full_list.Add(doc_data.page_id, doc_data); full_list.Add(doc_data.page_id, doc_data);

View File

@ -19,7 +19,6 @@ import gplx.dbs.*;
import gplx.xowa.specials.*; import gplx.langs.mustaches.*; import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.tags.*; import gplx.xowa.specials.*; import gplx.langs.mustaches.*; import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.tags.*;
import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.*;
class Xofulltext_searcher_html extends Xow_special_wtr__base implements Mustache_doc_itm { class Xofulltext_searcher_html extends Xow_special_wtr__base implements Mustache_doc_itm {
private final boolean case_match, auto_wildcard_bgn, auto_wildcard_end, expand_matches_section, show_all_matches;
private final Hash_adp props = Hash_adp_.New(); private final Hash_adp props = Hash_adp_.New();
public Xofulltext_searcher_html(Xocfg_mgr cfg_mgr, Gfo_qarg_mgr url_args, Xow_wiki wiki, Guid_adp page_guid) { public Xofulltext_searcher_html(Xocfg_mgr cfg_mgr, Gfo_qarg_mgr url_args, Xow_wiki wiki, Guid_adp page_guid) {
String search_text = url_args.Read_str_or("search", ""); String search_text = url_args.Read_str_or("search", "");
@ -27,22 +26,34 @@ class Xofulltext_searcher_html extends Xow_special_wtr__base implements Mustache
props.Add("qarg_search", search_text); props.Add("qarg_search", search_text);
props.Add("page_guid", page_guid.To_str()); props.Add("page_guid", page_guid.To_str());
props.Add("cur_wiki", wiki.Domain_str()); props.Add("cur_wiki", wiki.Domain_str());
props_Add(cfg_mgr, url_args, "wikis" , wiki.Domain_str()); props_Add_str(cfg_mgr, url_args, "wikis" , wiki.Domain_str(), false);
props_Add(cfg_mgr, url_args, "ns_ids", "0"); props_Add_str(cfg_mgr, url_args, "ns_ids", "0");
props_Add(cfg_mgr, url_args, "limits", "100"); props_Add_str(cfg_mgr, url_args, "limits", "100");
props_Add(cfg_mgr, url_args, "offsets", "0"); props_Add_str(cfg_mgr, url_args, "offsets", "0");
this.case_match = cfg_mgr.Get_bool_app_or("xowa.addon.search.fulltext.special.case_match", false); props_Add_bool(cfg_mgr, url_args, "expand_snips");
this.auto_wildcard_bgn = cfg_mgr.Get_bool_app_or("xowa.addon.search.fulltext.special.auto_wildcard_bgn", false); props_Add_bool(cfg_mgr, url_args, "show_all_snips");
this.auto_wildcard_end = cfg_mgr.Get_bool_app_or("xowa.addon.search.fulltext.special.auto_wildcard_end", false); props_Add_bool(cfg_mgr, url_args, "expand_options");
this.expand_matches_section = cfg_mgr.Get_bool_app_or("xowa.addon.search.fulltext.special.expand_matches_section", false); props_Add_bool(cfg_mgr, url_args, "case_match");
this.show_all_matches = cfg_mgr.Get_bool_app_or("xowa.addon.search.fulltext.special.show_all_matches", false); props_Add_bool(cfg_mgr, url_args, "auto_wildcard_bgn");
props_Add_bool(cfg_mgr, url_args, "auto_wildcard_end");
} }
private void props_Add(Xocfg_mgr cfg_mgr, Gfo_qarg_mgr url_args, String key, String dflt_val) { private void props_Add_str(Xocfg_mgr cfg_mgr, Gfo_qarg_mgr url_args, String key, String else_val) {
String cfg_key = "xowa.addon.search.fulltext.special.dflt_" + key; props_Add_str(cfg_mgr, url_args, key, else_val, true);
String cfg_val = cfg_mgr.Get_str_app_or(cfg_key, dflt_val); }
props.Add("dflt_" + key, cfg_val); private void props_Add_str(Xocfg_mgr cfg_mgr, Gfo_qarg_mgr url_args, String key, String else_val, boolean use_cfg) {
props.Add("qarg_" + key, url_args.Read_str_or(key, cfg_val)); String dflt_val = else_val;
if (use_cfg) {
String cfg_key = "xowa.addon.search.fulltext.special." + key;
dflt_val = cfg_mgr.Get_str_app_or(cfg_key, else_val);
}
props.Add("dflt_" + key, dflt_val);
props.Add("qarg_" + key, url_args.Read_str_or(key, dflt_val));
}
private void props_Add_bool(Xocfg_mgr cfg_mgr, Gfo_qarg_mgr url_args, String key) {
String cfg_key = "xowa.addon.search.fulltext.special." + key;
boolean cfg_val = cfg_mgr.Get_bool_app_or(cfg_key, false);
props.Add(key, cfg_val);
} }
@Override protected Io_url Get_addon_dir(Xoa_app app) {return Addon_dir(app);} @Override protected Io_url Get_addon_dir(Xoa_app app) {return Addon_dir(app);}
@Override protected Io_url Get_mustache_fil(Io_url addon_dir) {return addon_dir.GenSubFil_nest("bin", "xofulltext_searcher.main.template.html");} @Override protected Io_url Get_mustache_fil(Io_url addon_dir) {return addon_dir.GenSubFil_nest("bin", "xofulltext_searcher.main.template.html");}
@ -80,12 +91,13 @@ class Xofulltext_searcher_html extends Xow_special_wtr__base implements Mustache
} }
} }
public Mustache_doc_itm[] Mustache__subs(String key) { public Mustache_doc_itm[] Mustache__subs(String key) {
if (String_.Eq(key, "case_match")) return Mustache_doc_itm_.Ary__bool(case_match); Object val_obj = props.Get_by(key);
else if (String_.Eq(key, "auto_wildcard_bgn")) return Mustache_doc_itm_.Ary__bool(auto_wildcard_bgn); if (val_obj == null) {
else if (String_.Eq(key, "auto_wildcard_end")) return Mustache_doc_itm_.Ary__bool(auto_wildcard_end); return Mustache_doc_itm_.Ary__empty;
else if (String_.Eq(key, "expand_matches_section")) return Mustache_doc_itm_.Ary__bool(expand_matches_section); }
else if (String_.Eq(key, "show_all_matches")) return Mustache_doc_itm_.Ary__bool(show_all_matches); else {
return Mustache_doc_itm_.Ary__empty; return Mustache_doc_itm_.Ary__bool((boolean)val_obj);
}
} }
public static Io_url Addon_dir(Xoa_app app) { public static Io_url Addon_dir(Xoa_app app) {
return app.Fsys_mgr().Http_root().GenSubDir_nest("bin", "any", "xowa", "addon", "wiki", "fulltext", "searcher"); return app.Fsys_mgr().Http_root().GenSubDir_nest("bin", "any", "xowa", "addon", "wiki", "fulltext", "searcher");

View File

@ -25,18 +25,20 @@ public class Xofulltext_searcher_bridge implements Bridge_cmd_itm {
byte proc_id = proc_hash.Get_as_byte_or(data.Get_as_bry_or(Bridge_cmd_mgr.Msg__proc, null), Byte_ascii.Max_7_bit); byte proc_id = proc_hash.Get_as_byte_or(data.Get_as_bry_or(Bridge_cmd_mgr.Msg__proc, null), Byte_ascii.Max_7_bit);
Json_nde args = data.Get_kv(Bridge_cmd_mgr.Msg__args).Val_as_nde(); Json_nde args = data.Get_kv(Bridge_cmd_mgr.Msg__args).Val_as_nde();
switch (proc_id) { switch (proc_id) {
case Proc__search: svc.Search(args); break; case Proc__search_run: svc.Search_run(args); break;
case Proc__cancel: svc.Cancel(args); break; case Proc__search_cxl: svc.Search_cxl(args); break;
case Proc__options_save: svc.Options_save(args); break;
case Proc__get_lines_rest: svc.Get_lines_rest(args); break; case Proc__get_lines_rest: svc.Get_lines_rest(args); break;
default: throw Err_.new_unhandled_default(proc_id); default: throw Err_.new_unhandled_default(proc_id);
} }
return ""; return "";
} }
private static final byte Proc__search = 0, Proc__cancel = 1, Proc__get_lines_rest = 2; private static final byte Proc__search_run = 0, Proc__search_cxl = 1, Proc__options_save = 2, Proc__get_lines_rest = 3;
private static final Hash_adp_bry proc_hash = Hash_adp_bry.cs() private static final Hash_adp_bry proc_hash = Hash_adp_bry.cs()
.Add_str_byte("search" , Proc__search) .Add_str_byte("search_run" , Proc__search_run)
.Add_str_byte("cancel" , Proc__cancel) .Add_str_byte("search_cxl" , Proc__search_cxl)
.Add_str_byte("options_save" , Proc__options_save)
.Add_str_byte("get_lines_rest" , Proc__get_lines_rest) .Add_str_byte("get_lines_rest" , Proc__get_lines_rest)
; ;

View File

@ -33,8 +33,8 @@ class Xofulltext_searcher_svc implements Gfo_invk {
public Xofulltext_searcher_svc(Xoa_app app) { public Xofulltext_searcher_svc(Xoa_app app) {
this.app = app; this.app = app;
} }
public void Cancel(Json_nde args) {this.Cancel(args.Get_as_str("page_guid"));} public void Search_cxl(Json_nde args) {this.Search_cxl(args.Get_as_str("page_guid"));}
private void Cancel(String page_guid) { private void Search_cxl(String page_guid) {
Xofulltext_args_qry prv_args = (Xofulltext_args_qry)wkr_hash.Get_by(page_guid); Xofulltext_args_qry prv_args = (Xofulltext_args_qry)wkr_hash.Get_by(page_guid);
if (prv_args != null) { if (prv_args != null) {
prv_args.Cancel(); prv_args.Cancel();
@ -43,29 +43,38 @@ class Xofulltext_searcher_svc implements Gfo_invk {
} }
} }
} }
public void Search(Json_nde args) { public void Options_save(Json_nde args) {
Xocfg_mgr cfg_mgr = app.Cfg();
cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.expand_options", args.Get_as_bool_or("expand_options", false));
if (cfg_mgr.Get_bool_app_or("xowa.addon.search.fulltext.options.autosave_enabled", true)) {
cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.expand_snips", args.Get_as_bool_or("expand_snips", false));
cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.show_all_snips", args.Get_as_bool_or("show_all_snips", false));
}
}
public void Search_run(Json_nde args) {
// get search_args // get search_args
Xofulltext_args_qry search_args = Xofulltext_args_qry.New_by_json(args); Xofulltext_args_qry search_args = Xofulltext_args_qry.New_by_json(args);
search_args.cache_mgr = this.Cache_mgr(); search_args.cache_mgr = this.Cache_mgr();
// cancel any existing searches // cancel any existing searches
this.Cancel(search_args.page_guid); this.Search_cxl(search_args.page_guid);
Compress_cache(wkr_hash); Compress_cache(wkr_hash);
synchronized (wkr_hash) { synchronized (wkr_hash) {
wkr_hash.Add(search_args.page_guid, search_args); wkr_hash.Add(search_args.page_guid, search_args);
} }
// autosave any changes if enabled // autosave any changes if enabled
Xocfg_mgr cfg_mgr = app.Cfg(); // Xocfg_mgr cfg_mgr = app.Cfg();
if (cfg_mgr.Get_bool_app_or("xowa.addon.search.fulltext.options.autosave_enabled", true)) { // if (cfg_mgr.Get_bool_app_or("xowa.addon.search.fulltext.options.autosave_enabled", true)) {
cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.case_match", search_args.case_match); // cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.expand_snips", search_args.expand_snips);
cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.auto_wildcard_bgn", search_args.auto_wildcard_bgn); // cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.show_all_snips", search_args.show_all_snips);
cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.auto_wildcard_end", search_args.auto_wildcard_end); // cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.expand_options", search_args.expand_options);
cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.expand_matches_section", search_args.expand_matches_section); // cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.case_match", search_args.case_match);
cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.show_all_matches", search_args.show_all_matches); // cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.auto_wildcard_bgn", search_args.auto_wildcard_bgn);
// cfg_mgr.Set_int_app ("xowa.addon.search.fulltext.special.max_pages_per_wiki", search_args.max_pages_per_wiki); // cfg_mgr.Set_bool_app("xowa.addon.search.fulltext.special.auto_wildcard_end", search_args.auto_wildcard_end);
// cfg_mgr.Set_bry_app ("xowa.addon.search.fulltext.special.namespaces", search_args.namespaces); //// cfg_mgr.Set_int_app ("xowa.addon.search.fulltext.special.max_pages_per_wiki", search_args.max_pages_per_wiki);
} //// cfg_mgr.Set_bry_app ("xowa.addon.search.fulltext.special.namespaces", search_args.namespaces);
// }
// launch thread // launch thread
gplx.core.threads.Thread_adp_.Start_by_val("search", Cancelable_.Never, this, Invk__search, search_args); gplx.core.threads.Thread_adp_.Start_by_val("search", Cancelable_.Never, this, Invk__search, search_args);
@ -129,13 +138,13 @@ class Xofulltext_searcher_svc implements Gfo_invk {
for (int i = bgn; i < end; i++) { for (int i = bgn; i < end; i++) {
if (i >= max) return false; // more pages requested than available if (i >= max) return false; // more pages requested than available
Xofulltext_cache_page page = (Xofulltext_cache_page)qry.Pages().Get_at(i); Xofulltext_cache_page page = (Xofulltext_cache_page)qry.Pages().Get_at(i);
ui.Send_page_add(new Xofulltext_searcher_page(qry_id, wiki.Domain_bry(), page.Page_id(), page.Page_ttl(), args.expand_matches_section)); ui.Send_page_add(new Xofulltext_searcher_page(qry_id, wiki.Domain_bry(), page.Page_id(), page.Page_ttl(), args.expand_snips));
// loop lines // loop lines
int lines_len = page.Lines().Len(); int lines_len = page.Lines().Len();
for (int j = 0; j < lines_len; j++) { for (int j = 0; j < lines_len; j++) {
Xofulltext_cache_line line = (Xofulltext_cache_line)page.Lines().Get_at(j); Xofulltext_cache_line line = (Xofulltext_cache_line)page.Lines().Get_at(j);
ui.Send_line_add(false, args.show_all_matches, qry_id, wiki.Domain_bry(), page.Page_id(), line.Line_seq(), line.Line_html()); ui.Send_line_add(false, args.show_all_snips, qry_id, wiki.Domain_bry(), page.Page_id(), line.Line_seq(), line.Line_html());
} }
} }
return true; return true;