"
, " 10"
@@ -56,14 +56,14 @@ class Xows_html_wkr_fxt {
return this;
}
public void Test_paging(boolean fwd, int paging_idx, String expd) {
- Xows_ui_qry qry = new Xows_ui_qry(Bry_.new_a7("A"), paging_idx, 100, Xosrh_rslt_itm_sorter.Tid_len_dsc, new Xows_ns_mgr(), true, new Xow_domain_itm[] {Xow_domain_itm_.parse(wiki.Domain_bry())});
- qry.Page_max_(2);
+ Srch_qry qry = new Srch_qry(Bry_.new_a7("A"), paging_idx, 100, new Xows_ns_mgr(), true, new Xow_domain_itm[] {Xow_domain_itm_.parse(wiki.Domain_bry())});
+ qry.page_max = 2;
html_mgr.Init_by_wiki(wiki, wiki.Lang().Num_mgr(), qry);
byte[] paging_link = html_mgr.Paging_link(fwd);
Tfds.Eq(expd, String_.new_a7(paging_link));
}
- public void Test_rows(Xows_db_row[] rows, String expd) {
- Xows_ui_rslt rslt = new Xows_ui_rslt();
+ public void Test_rows(Srch_rslt_itm[] rows, String expd) {
+ Srch_rslt_list rslt = new Srch_rslt_list();
Xows_html_row html_row = new Xows_html_row(wiki.App().Html__lnki_bldr());
html_row.Init(rslt);
for (int i = 0; i < rows.length; ++i)
@@ -71,8 +71,8 @@ class Xows_html_wkr_fxt {
html_row.Bfr_arg__add(tmp_bfr);
Tfds.Eq_str_lines(expd, tmp_bfr.To_str_and_clear());
}
- public Xows_db_row Make_row(int len, String ttl_str) {
+ public Srch_rslt_itm Make_row(int len, String ttl_str) {
byte[] ttl_bry = Bry_.new_u8(ttl_str);
- return new Xows_db_row(Bry_.new_a7("w"), wiki.Ttl_parse(ttl_bry), 1, len);
+ return new Srch_rslt_itm(Bry_.new_a7("w"), wiki.Ttl_parse(ttl_bry), 1, len);
}
}
diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java
index d1bca0b3d..474f91341 100644
--- a/400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java
+++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java
@@ -26,9 +26,9 @@ public class Xows_ns_mgr {
ns_all = ns_main = false;
}
public boolean Has(int ns_id) {
- return ns_all // all flag set
+ return ns_all // all flag set
|| ns_main && ns_id == Xow_ns_.Tid__main // main flag set
- || ns_hash.Has(tmp_ns_id.Val_(ns_id)) // check against ns_hash
+ || ns_hash.Has(tmp_ns_id.Val_(ns_id)) // check against ns_hash
;
}
public void Add_by_id(int ns_id) {
@@ -48,7 +48,7 @@ public class Xows_ns_mgr {
int ns_enabled = Bry_.To_int_or_neg1(val);
if (ns_enabled == 1) { // make sure set to 1; EX: ignore &ns0=0
int key_len = key.length;
- if (key_len == 3 && key[2] == Byte_ascii.Star) // translate ns* as ns_all
+ if (key_len == 3 && key[2] == Byte_ascii.Star) // translate ns* as ns_all
ns_all = true;
else {
int ns_id = Bry_.To_int_or(key, 2, key_len, Int_.Min_value);
diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java b/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java
index 243c78991..08fea7f6d 100644
--- a/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java
+++ b/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java
@@ -80,7 +80,7 @@ public class Xows_page__search implements Xows_page, GfoInvkAble, GfoEvObj {
}
page.Html_data().Html_restricted_n_();
page.Html_data().Xtn_search_text_(search_bry);
- Xows_ui_qry qry = new Xows_ui_qry(search_bry, args_mgr.Paging_idx(), search_api.Results_per_page(), args_mgr.Sort_tid(), args_mgr.Ns_mgr(), search_api.Async_db(), search_domain_ary);
+ Srch_qry qry = new Srch_qry(search_bry, args_mgr.Paging_idx(), search_api.Results_per_page(), args_mgr.Ns_mgr(), search_api.Async_db(), search_domain_ary);
search_mgr.Search(wiki, page, qry);
}
// page found; return it;
diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async__html.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async__html.java
index 50f7e5c11..01b17d270 100644
--- a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async__html.java
+++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async__html.java
@@ -17,27 +17,27 @@ along with this program. If not, see .
*/
package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*;
import gplx.langs.htmls.*; import gplx.xowa.files.gui.*;
-class Xows_ui_async__html implements Xows_ui_async {
+class Xows_ui_async__html implements Srch_rslt_lnr {
private final Xows_html_row html_row; private final Xog_js_wkr js_wkr;
- private final Xows_db_row[] rows; private final int rows_len;
+ private final Srch_rslt_itm[] rows; private final int rows_len;
private final Bry_bfr bfr = Bry_bfr.new_(255);
private final byte[] insert_new_key;
private final Cancelable cxl;
public Xows_ui_async__html(Cancelable cxl, Xows_html_row html_row, Xog_js_wkr js_wkr, int paging_len, byte[] wiki) {
this.cxl = cxl;
this.html_row = html_row; this.js_wkr = js_wkr;
- this.rows = new Xows_db_row[paging_len];
+ this.rows = new Srch_rslt_itm[paging_len];
this.rows_len = paging_len;
this.insert_new_key = Gen_insert_key(wiki);
}
- public void Add(Xows_db_row new_row) {
- Xows_db_row last_row = rows[rows_len - 1];
+ public void Notify_rslt_found(Srch_rslt_itm new_row) {
+ Srch_rslt_itm last_row = rows[rows_len - 1];
if (last_row != null) {
if (Compare(new_row, last_row) == CompareAble_.MoreOrSame) return; // new_row is < last_row; exit
}
int new_row_slot = Find_insert_slot(new_row); if (new_row_slot == -1) return;
- Xows_db_row insert_row = rows[new_row_slot];
- byte[] insert_key = insert_row == null ? insert_new_key : insert_row.Key();
+ Srch_rslt_itm insert_row = rows[new_row_slot];
+ byte[] insert_key = insert_row == null ? insert_new_key : insert_row.key;
Displace(new_row_slot, new_row);
html_row.Gen_html(bfr, new_row);
String html_tbl = bfr.To_str_and_clear();
@@ -45,25 +45,25 @@ class Xows_ui_async__html implements Xows_ui_async {
js_wkr.Html_elem_append_above(Gfh_utl.Encode_id_as_str(insert_key), html_tbl);
if (last_row != null) {
if (cxl.Canceled()) return;
- js_wkr.Html_elem_replace_html(Gfh_utl.Encode_id_as_str(last_row.Key()), "");
+ js_wkr.Html_elem_replace_html(Gfh_utl.Encode_id_as_str(last_row.key), "");
}
}
- private int Find_insert_slot(Xows_db_row new_row) {
+ private int Find_insert_slot(Srch_rslt_itm new_row) {
for (int i = 0; i < rows_len; ++i) {
- Xows_db_row cur_row = rows[i];
+ Srch_rslt_itm cur_row = rows[i];
if (cur_row == null) return i;
if (Compare(new_row, cur_row) == CompareAble_.Less) return i;
}
return -1;
}
- private void Displace(int new_row_slot, Xows_db_row new_row) {
+ private void Displace(int new_row_slot, Srch_rslt_itm new_row) {
for (int i = rows_len - 2; i >= new_row_slot; --i) {
rows[i + 1] = rows[i];
}
rows[new_row_slot] = new_row;
}
- private int Compare(Xows_db_row lhs, Xows_db_row rhs) {
- return -Int_.Compare(lhs.Page_len(), rhs.Page_len());
+ private int Compare(Srch_rslt_itm lhs, Srch_rslt_itm rhs) {
+ return -Int_.Compare(lhs.page_len, rhs.page_len);
}
public static byte[] Gen_insert_key(byte[] wiki) {return Bry_.Add(Bry_insert_key, wiki);}
private static final byte[] Bry_insert_key = Bry_.new_a7("xowa_insert_");
diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async_tst.java
index 86ee25688..78ddb0a17 100644
--- a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async_tst.java
+++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async_tst.java
@@ -42,14 +42,14 @@ class Xows_ui_async_fxt {
html_row.Fmtr().Fmt_("~{page_key}");
async = new Xows_ui_async__html(Cancelable_.Never, html_row, js_wkr, 5, Bry_enwiki);
}
- public Xows_db_row Make_rslt(int len, String ttl) {
+ public Srch_rslt_itm Make_rslt(int len, String ttl) {
byte[] ttl_bry = Bry_.new_a7(ttl);
- return new Xows_db_row(Bry_enwiki, wiki.Ttl_parse(ttl_bry), 1, len);
+ return new Srch_rslt_itm(Bry_enwiki, wiki.Ttl_parse(ttl_bry), 1, len);
}
public Object[] Make_args_append(String uid, String html) {return Object_.Ary(Xog_js_wkr__log.Proc_append_above, uid, html);}
public Object[] Make_args_replace(String uid) {return Object_.Ary(Xog_js_wkr__log.Proc_replace_html, uid, "");}
- public void Test_add(Xows_db_row row, Object[]... expd) {
- async.Add(row);
+ public void Test_add(Srch_rslt_itm row, Object[]... expd) {
+ async.Notify_rslt_found(row);
int expd_len = expd.length;
Tfds.Eq(expd_len, js_wkr.Log__len());
for (int i = 0; i < expd_len; ++i) {
diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_cmd.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_cmd.java
index 51dd963f3..20fdd22bd 100644
--- a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_cmd.java
+++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_cmd.java
@@ -18,21 +18,21 @@ along with this program. If not, see .
package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*;
import gplx.core.threads.*; import gplx.langs.htmls.*;
import gplx.xowa.wikis.*; import gplx.xowa.files.gui.*; import gplx.xowa.guis.views.*;
-class Xows_ui_cmd implements GfoInvkAble, Cancelable, Xog_tab_close_lnr {
- private final Xows_core mgr; private final Xows_ui_qry qry; private final Xows_ui_rslt rslt;
+class Xows_ui_cmd implements GfoInvkAble, Cancelable, Srch_rslt_lnr, Xog_tab_close_lnr {
+ private final Xows_core mgr; private final Srch_qry qry; private final Srch_rslt_list rslt;
private final Xow_wiki wiki; private final Xoae_page page; private final Xog_tab_close_mgr tab_close_mgr; private final Xog_js_wkr js_wkr;
- private final boolean async; private Xows_ui_async async_wkr;
- private Xows_db_cache cache;
- public Xows_ui_cmd(Xows_core mgr, Xows_ui_qry qry, Xow_wiki wiki, Xoae_page page, Xog_tab_close_mgr tab_close_mgr, Xog_js_wkr js_wkr, Xows_db_cache cache, Xows_ui_async async_wkr) {
+ private final boolean async; private Srch_rslt_lnr async_wkr;
+ private Srch_rslt_hash cache;
+ public Xows_ui_cmd(Xows_core mgr, Srch_qry qry, Xow_wiki wiki, Xoae_page page, Xog_tab_close_mgr tab_close_mgr, Xog_js_wkr js_wkr, Srch_rslt_hash cache, Srch_rslt_lnr async_wkr) {
this.mgr = mgr; this.qry = qry; this.wiki = wiki; this.page = page; this.tab_close_mgr = tab_close_mgr; this.js_wkr = js_wkr; this.async_wkr = async_wkr;
- this.async = wiki.App().Mode().Tid_is_gui() && qry.Async_db();
- this.rslt = new Xows_ui_rslt();
- this.key = Gfh_utl.Encode_id_as_bry(Bry_.Add(qry.Key(), Byte_ascii.Pipe_bry, wiki.Domain_bry()));
+ this.async = wiki.App().Mode().Tid_is_gui() && qry.async_db;
+ this.rslt = new Srch_rslt_list();
+ this.key = Gfh_utl.Encode_id_as_bry(Bry_.Add(qry.key, Byte_ascii.Pipe_bry, wiki.Domain_bry()));
this.cache = cache;
}
public byte[] Key() {return key;} private final byte[] key;
public Xow_wiki Wiki() {return wiki;}
- public Xows_ui_rslt Rslt() {return rslt;}
+ public Srch_rslt_list Rslt() {return rslt;}
public boolean Canceled() {return canceled;} private boolean canceled;
public void Cancel() {
Xoa_app_.Usr_dlg().Prog_many("", "", "search canceled: key=~{0}", key);
@@ -43,10 +43,10 @@ class Xows_ui_cmd implements GfoInvkAble, Cancelable, Xog_tab_close_lnr {
public boolean Search() {
this.cache = mgr.Get_cache_or_new(key);
boolean rv = false, fill_from_cache = true;
- if (!cache.Done() && (qry.Itms_end() > cache.Itms_end())) {
+ if (!cache.Done() && (qry.itms_end > cache.Itms_end())) {
if (async) {
fill_from_cache = false; // NOTE: do not retrieve cached results to page, else ui_async cmd will add out of order; DATE:2015-04-24
- if (async_wkr == null) async_wkr = new Xows_ui_async__html(this, new Xows_html_row(new gplx.xowa.htmls.core.htmls.utls.Xoh_lnki_bldr(wiki.App(), wiki.App().Html__href_wtr())), js_wkr, qry.Page_len(), wiki.Domain_bry());
+ if (async_wkr == null) async_wkr = new Xows_ui_async__html(this, new Xows_html_row(new gplx.xowa.htmls.core.htmls.utls.Xoh_lnki_bldr(wiki.App(), wiki.App().Html__href_wtr())), js_wkr, qry.page_len, wiki.Domain_bry());
Thread_adp_.invk_(gplx.xowa.apps.Xoa_thread_.Key_special_search_db, this, Invk_search_db).Start();
}
else
@@ -54,8 +54,8 @@ class Xows_ui_cmd implements GfoInvkAble, Cancelable, Xog_tab_close_lnr {
rv = true;
}
if (fill_from_cache) {
- cache.Get_between(rslt, qry.Itms_bgn(), qry.Itms_end());
- qry.Page_max_(cache.Count() / qry.Page_len());
+ cache.Get_between(rslt, qry.itms_bgn, qry.itms_end);
+ qry.page_max = cache.Count() / qry.page_len;
}
return rv;
}
@@ -65,16 +65,16 @@ class Xows_ui_cmd implements GfoInvkAble, Cancelable, Xog_tab_close_lnr {
while (!page.Html_data().Mode_wtxt_shown()) // NOTE:must check for wtxt_shown else async can happen first, and then be overwritten by wtxt; DATE:2015-04-26
Thread_adp_.Sleep(100);
// show any existing items in the cache on screen; new updates wil bump these off; SEE:NOTE:show_existing;DATE:2015-04-26
- int qry_itms_bgn = qry.Itms_bgn(), cache_count = cache.Count();
+ int qry_itms_bgn = qry.itms_bgn, cache_count = cache.Count();
for (int i = qry_itms_bgn; i < cache_count; ++i)
- async_wkr.Add(cache.Get_at(i));
+ async_wkr.Notify_rslt_found(cache.Get_at(i));
}
- new Xows_db_wkr().Search(this, this, qry, rslt, cache, wiki, wiki.Lang().Case_mgr());
+ new Srch_db_wkr().Search(this, this, cache, wiki, wiki.Lang().Case_mgr(), qry);
mgr.Search_end(this);
if (this.Canceled()) return; // NOTE: must check else throws SWT exception
this.Hide_cancel_btn();
if (cache.Done())
- qry.Page_max_(cache.Count() / qry.Page_len());
+ qry.page_max = cache.Count() / qry.page_len;
Xoa_app_.Usr_dlg().Prog_many("", "", "");
}
private void Hide_cancel_btn() {
@@ -83,9 +83,9 @@ class Xows_ui_cmd implements GfoInvkAble, Cancelable, Xog_tab_close_lnr {
private void Hide_cancel_btn_async() {
js_wkr.Html_atr_set("xowa_cancel_" + wiki.Domain_str(), "style", "display:none;");
}
- public void Add_rslt(Xows_db_row rslt) {
+ public void Notify_rslt_found(Srch_rslt_itm rslt) {
cache.Add(rslt);
- if (async) async_wkr.Add(rslt);
+ if (async) async_wkr.Notify_rslt_found(rslt);
}
public boolean When_close(Xog_tab_itm tab, Xoa_url url) {
if (url != Xoa_url.Null) { // not called by close_tab (Ctrl+W)
diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_qry.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_qry.java
deleted file mode 100644
index 9709c7c6d..000000000
--- a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_qry.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
-XOWA: the XOWA Offline Wiki Application
-Copyright (C) 2012 gnosygnu@gmail.com
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*;
-import gplx.xowa.wikis.domains.*;
-class Xows_ui_qry {
- private final List_adp cmd_list = List_adp_.new_();
- public Xows_ui_qry(byte[] search_raw, int page_idx, int page_len, byte sort_tid, Xows_ns_mgr ns_mgr, boolean async_db, Xow_domain_itm[] wiki_domains) {
- this.search_raw = search_raw; this.page_idx = page_idx; this.page_len = page_len; this.sort_tid = sort_tid; this.ns_mgr = ns_mgr; this.async_db = async_db; this.wiki_domains = wiki_domains;
- this.itms_bgn = page_idx * page_len;
- this.page_max = page_idx; // default page_max to page_idx; adjust later when all results are known
- this.key = Bry_.Add_w_dlm(Byte_ascii.Pipe, search_raw, ns_mgr.To_hash_key());
- this.special_link_base_href = Bry_.Add(Bry_.new_a7("Special:Search/"), search_raw, Bry_.new_a7("?fulltext=y"));
- }
- public byte[] Key() {return key;} private final byte[] key;
- public byte[] Search_raw() {return search_raw;} private final byte[] search_raw;
- public boolean Async_db() {return async_db;} private boolean async_db;
- public int Page_idx() {return page_idx;} private final int page_idx;
- public int Page_max() {return page_max;} private int page_max;
- public int Page_len() {return page_len;} private final int page_len;
- public int Itms_bgn() {return itms_bgn;} private final int itms_bgn;
- public int Itms_end() {return itms_bgn + page_len;}
- public byte Sort_tid() {return sort_tid;} private final byte sort_tid;
- public Xows_ns_mgr Ns_mgr() {return ns_mgr;} private final Xows_ns_mgr ns_mgr;
- public Xow_domain_itm[] Wiki_domains() {return wiki_domains;} private final Xow_domain_itm[] wiki_domains;
- public void Page_max_(int v) {this.page_max = v;}
- public int Cmds__len() {return cmd_list.Count();}
- public Xows_ui_cmd Cmds__get_at(int i) {return (Xows_ui_cmd)cmd_list.Get_at(i);}
- public void Cmds__add(Xows_ui_cmd cmd) {cmd_list.Add(cmd);}
- public byte[] Special_link_base_href() {return special_link_base_href;} private final byte[] special_link_base_href;
-}
diff --git a/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_node.java b/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_node.java
new file mode 100644
index 000000000..aa9a02dee
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_node.java
@@ -0,0 +1,73 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.specials.search.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*;
+import gplx.langs.regxs.*;
+public class Srch_crt_node {
+ private final Gfo_pattern raw_pattern;
+ public Srch_crt_node(int tid, byte[] raw, Srch_crt_node lhs, Srch_crt_node rhs) {
+ this.tid = tid; this.raw = raw; this.lhs = lhs; this.rhs = rhs;
+ this.raw_pattern = Bry_.Has(raw, Byte_ascii.Star) ? new Gfo_pattern(raw) : null;
+ }
+ public final int tid;
+ public final byte[] raw;
+ public final Srch_crt_node lhs;
+ public final Srch_crt_node rhs;
+
+ public boolean Matches(gplx.xowa.langs.cases.Xol_case_mgr case_mgr, byte[] ttl) {
+ byte[] ttl_lower = case_mgr.Case_build_lower(Xoa_ttl.Replace_unders(ttl));
+ byte[][] ttl_words = Bry_split_.Split(ttl_lower, Byte_ascii.Space, Bool_.Y);
+ return Matches(ttl_lower, ttl_words);
+ }
+ private boolean Matches(byte[] ttl_lower, byte[][] ttl_words) {
+ switch (tid) {
+ case Srch_crt_node.Tid_word: {
+ int len = ttl_words.length;
+ for (int i = 0; i < len; ++i) {
+ byte[] word = ttl_words[i];
+ if (raw_pattern == null) {
+ if (Bry_.Eq(word, raw)) return true;
+ }
+ else {
+ if (raw_pattern.Match(word)) return true;
+ }
+ }
+ return false;
+ }
+ case Srch_crt_node.Tid_word_quote: // note that raw does not have quotes; EX: "B*" -> B*
+ return Bry_find_.Find_fwd(ttl_lower, raw) != Bry_find_.Not_found;
+ case Srch_crt_node.Tid_not:
+ return !rhs.Matches(ttl_lower, ttl_words);
+ case Srch_crt_node.Tid_or:
+ return lhs.Matches(ttl_lower, ttl_words) || rhs.Matches(ttl_lower, ttl_words);
+ case Srch_crt_node.Tid_and:
+ return lhs.Matches(ttl_lower, ttl_words) && rhs.Matches(ttl_lower, ttl_words);
+ case Srch_crt_node.Tid_null: return false;
+ default: throw Err_.new_unhandled(tid);
+ }
+ }
+
+ public static final Srch_crt_node Null = new Srch_crt_node(Srch_crt_node.Tid_null, null, null, null);
+ public static final int
+ Tid_word = 0 // EX: 'A'
+ , Tid_and = 1 // EX: 'A B'
+ , Tid_or = 2 // EX: 'A OR B'
+ , Tid_not = 3 // EX: '-A'
+ , Tid_word_quote = 4 // EX: '"A B"'
+ , Tid_null = 5
+ ;
+}
diff --git a/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_parser.java b/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_parser.java
new file mode 100644
index 000000000..fa4deef3a
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_parser.java
@@ -0,0 +1,94 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.specials.search.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*;
+public class Srch_crt_parser {
+ private final Srch_parser_ctx parse_ctx = new Srch_parser_ctx(); private byte[] src;
+ public Srch_crt_node Parse(byte[] src) {
+ this.src = src;
+ Srch_crt_tkn[] tkns = new Srch_crt_scanner().Scan(src);
+ return Parse_itm_or(parse_ctx.Init(tkns));
+ }
+ private Srch_crt_node Parse_itm_or(Srch_parser_ctx parse_ctx) {
+ Srch_crt_node lhs = Parse_itm_and(parse_ctx);
+ while (parse_ctx.Cur_tid(Srch_crt_tkn.Tid_or)) {
+ parse_ctx.Move_next();
+ Srch_crt_node rhs = Parse_itm_and(parse_ctx);
+ lhs = New_join(Srch_crt_node.Tid_or, lhs, rhs);
+ }
+ return lhs;
+ }
+ private Srch_crt_node Parse_itm_and(Srch_parser_ctx parse_ctx) {
+ Srch_crt_node lhs = Parse_itm_not(parse_ctx);
+ while (parse_ctx.Cur_tid(Srch_crt_tkn.Tid_and)) {
+ parse_ctx.Move_next();
+ Srch_crt_node rhs = Parse_itm_not(parse_ctx);
+ lhs = New_join(Srch_crt_node.Tid_and, lhs, rhs);
+ }
+ return lhs;
+ }
+ private Srch_crt_node Parse_itm_not(Srch_parser_ctx parse_ctx) {
+ Srch_crt_node lhs = Parse_itm_leaf(parse_ctx);
+ while (parse_ctx.Cur_tid(Srch_crt_tkn.Tid_not)) {
+ parse_ctx.Move_next();
+ Srch_crt_node rhs = Parse_itm_leaf(parse_ctx);
+ lhs = New_join(Srch_crt_node.Tid_not, null, rhs);
+ }
+ return lhs;
+ }
+ private Srch_crt_node Parse_itm_leaf(Srch_parser_ctx parse_ctx) {
+ if (parse_ctx.Cur_tid(Srch_crt_tkn.Tid_paren_bgn)) {
+ parse_ctx.Move_next();
+ Srch_crt_node lhs = Parse_itm_or(parse_ctx);
+ if (parse_ctx.Cur_tid(Srch_crt_tkn.Tid_paren_end)) parse_ctx.Move_next(); // skip token
+ return lhs;
+ }
+ else if (parse_ctx.Cur_tid(Srch_crt_tkn.Tid_eos))
+ return Srch_crt_node.Null;
+ else {
+ Srch_crt_tkn word_tkn = parse_ctx.Move_next();
+ if (word_tkn.tid == Srch_crt_tkn.Tid_not) {
+ word_tkn = parse_ctx.Move_next();
+ if (word_tkn == null) return Srch_crt_node.Null; // occurs in "a -"
+ Srch_crt_node word_itm = New_word(word_tkn, src);
+ return New_join(Srch_crt_node.Tid_not, null, word_itm);
+ }
+ else
+ return New_word(word_tkn, src);
+ }
+ }
+ private static Srch_crt_node New_word(Srch_crt_tkn tkn, byte[] src) {
+ int tid = tkn.tid == Srch_crt_tkn.Tid_word ? Srch_crt_node.Tid_word : Srch_crt_node.Tid_word_quote;
+ return new Srch_crt_node(tid, tkn.val, null, null);
+ }
+ private static Srch_crt_node New_join(int tid, Srch_crt_node lhs, Srch_crt_node rhs) {return new Srch_crt_node(tid, null, lhs, rhs);}
+}
+class Srch_parser_ctx {
+ private Srch_crt_tkn[] ary; private int pos = 0; private int ary_len;
+ public Srch_parser_ctx Init(Srch_crt_tkn[] ary) {
+ this.ary = ary;
+ this.ary_len = ary.length;
+ this.pos = 0;
+ return this;
+ }
+ public boolean Cur_tid(byte tid) {return pos < ary_len ? tid == ary[pos].tid : tid == Srch_crt_tkn.Tid_eos;}
+ public Srch_crt_tkn Move_next() {
+ Srch_crt_tkn rv = null;
+ if (pos < ary_len) rv = ary[pos++];
+ return rv;
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_scanner.java b/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_scanner.java
similarity index 63%
rename from 400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_scanner.java
rename to 400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_scanner.java
index 128982d36..64409d79c 100644
--- a/400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_scanner.java
+++ b/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_scanner.java
@@ -15,12 +15,12 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
-package gplx.xowa.specials.search.parsers_old; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*;
+package gplx.xowa.specials.search.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*;
import gplx.core.primitives.*; import gplx.core.btries.*;
-class Xow_search_scanner {
+class Srch_crt_scanner {
private final List_adp tkns = List_adp_.new_(); private byte[] src; private int src_len, pos, txt_bgn;
private final Ordered_hash tmp_list = Ordered_hash_.New(); private final Bry_bfr tmp_bfr = Bry_bfr.new_();
- public Xow_search_tkn[] Scan(byte[] src) {
+ public Srch_crt_tkn[] Scan(byte[] src) {
this.src = src; this.src_len = src.length;
tkns.Clear(); pos = 0; txt_bgn = -1;
while (pos < src_len) {
@@ -35,27 +35,27 @@ class Xow_search_scanner {
byte cur_tid = ((Byte_obj_val)cur_obj).Val();
if (Cur_join_is_word(cur_tid, pos_end)) continue; // ignore words containing "and", "or"; EX: "random"; "for"
if (txt_bgn != -1) { // pending word; create
- Tkns_add_word(Xow_search_tkn.Tid_word, txt_bgn, pos);
+ Tkns_add_word(Srch_crt_tkn.Tid_word, txt_bgn, pos);
txt_bgn = -1;
}
switch (cur_tid) {
- case Xow_search_tkn.Tid_space: // discard spaces
+ case Srch_crt_tkn.Tid_space: // discard spaces
pos = Bry_find_.Find_fwd_while(src, pos, src_len, Byte_ascii.Space);
break;
- case Xow_search_tkn.Tid_quote: // find end quote and add as word
+ case Srch_crt_tkn.Tid_quote: // find end quote and add as word
int quote_bgn = pos + 1;
int quote_end = Bry_find_.Find_fwd(src, Byte_ascii.Quote, quote_bgn, src_len);
if (quote_end == Bry_find_.Not_found) throw Err_.new_wo_type("could not find end quote", "src", String_.new_u8(src));
- Tkns_add_word(Xow_search_tkn.Tid_word_quoted, quote_bgn, quote_end);
+ Tkns_add_word(Srch_crt_tkn.Tid_word_quoted, quote_bgn, quote_end);
pos = quote_end + 1; // +1 to place after quote
break;
- case Xow_search_tkn.Tid_not:
- Tkns_add_word(Xow_search_tkn.Tid_not, pos, pos_end);
+ case Srch_crt_tkn.Tid_not:
+ Tkns_add_word(Srch_crt_tkn.Tid_not, pos, pos_end);
pos = pos_end;
break;
- case Xow_search_tkn.Tid_paren_bgn: case Xow_search_tkn.Tid_paren_end:
- case Xow_search_tkn.Tid_and: case Xow_search_tkn.Tid_or:
- tkns.Add(new_tkn(cur_tid, pos, pos_end));
+ case Srch_crt_tkn.Tid_paren_bgn: case Srch_crt_tkn.Tid_paren_end:
+ case Srch_crt_tkn.Tid_and: case Srch_crt_tkn.Tid_or:
+ tkns.Add(new_tkn(cur_tid, src, pos, pos_end));
pos = pos_end;
break;
default: throw Err_.new_unhandled(cur_tid);
@@ -63,20 +63,20 @@ class Xow_search_scanner {
}
}
if (txt_bgn != -1) { // pending word; create
- Tkns_add_word(Xow_search_tkn.Tid_word, txt_bgn, pos);
+ Tkns_add_word(Srch_crt_tkn.Tid_word, txt_bgn, pos);
txt_bgn = -1;
}
- return (Xow_search_tkn[])tkns.To_ary_and_clear(Xow_search_tkn.class);
+ return (Srch_crt_tkn[])tkns.To_ary_and_clear(Srch_crt_tkn.class);
}
private boolean Cur_join_is_word(byte cur_tid, int pos_end) { // extra logic to handle and / or occuring in unquoted strings; EX: "random"; "for"
switch (cur_tid) {
default: return false; // only look at AND, OR, -
- case Xow_search_tkn.Tid_and: case Xow_search_tkn.Tid_or: case Xow_search_tkn.Tid_not:
+ case Srch_crt_tkn.Tid_and: case Srch_crt_tkn.Tid_or: case Srch_crt_tkn.Tid_not:
break;
}
boolean join_is_word = true;
if (txt_bgn == -1) { // no pending word;
- if (cur_tid == Xow_search_tkn.Tid_not) return false; // NOT is only operator if no pending tkn; EX: -abc -> NOT abc; a-b -> a-b
+ if (cur_tid == Srch_crt_tkn.Tid_not) return false; // NOT is only operator if no pending tkn; EX: -abc -> NOT abc; a-b -> a-b
byte nxt_b = pos_end < src_len ? src[pos_end] : Byte_ascii.Null;
Object nxt_obj = trie.Match_bgn_w_byte(nxt_b, src, pos_end, src_len);
if (nxt_obj == null) // next tkn is text; join must be word
@@ -84,11 +84,11 @@ class Xow_search_scanner {
else { // next tkn is tkn
byte nxt_tid = ((Byte_obj_val)nxt_obj).Val();
switch (nxt_tid) {
- case Xow_search_tkn.Tid_space: case Xow_search_tkn.Tid_quote:
- case Xow_search_tkn.Tid_paren_bgn: case Xow_search_tkn.Tid_paren_end:
+ case Srch_crt_tkn.Tid_space: case Srch_crt_tkn.Tid_quote:
+ case Srch_crt_tkn.Tid_paren_bgn: case Srch_crt_tkn.Tid_paren_end:
join_is_word = false; // next tkn is sym; and/or is not word; EX: a AND ; a AND"b"; a AND(b)
break;
- case Xow_search_tkn.Tid_not: case Xow_search_tkn.Tid_and: case Xow_search_tkn.Tid_or:
+ case Srch_crt_tkn.Tid_not: case Srch_crt_tkn.Tid_and: case Srch_crt_tkn.Tid_or:
join_is_word = true; // next tkn is and or not; and/or is word; EX: andor; oror; or-abc;
break;
default: throw Err_.new_unhandled(cur_tid);
@@ -104,18 +104,18 @@ class Xow_search_scanner {
return true;
}
if (txt_bgn != -1) {
- Tkns_add_word(Xow_search_tkn.Tid_word, txt_bgn, pos); // create word
+ Tkns_add_word(Srch_crt_tkn.Tid_word, txt_bgn, pos); // create word
txt_bgn = -1;
}
return false;
}
private void Tkns_add_word(byte tid, int src_bgn, int src_end) {
if (tkns.Count() > 0) { // at least 1 tkn; check for "auto-and"
- Xow_search_tkn last_tkn = (Xow_search_tkn)tkns.Get_at_last();
- if (last_tkn.Tid() == Xow_search_tkn.Tid_word) // previous tkn is word; auto "AND" words; EX: A B -> A AND B
- tkns.Add(Xow_search_tkn.new_bry(Xow_search_tkn.Tid_and, Bry_and));
+ Srch_crt_tkn last_tkn = (Srch_crt_tkn)tkns.Get_at_last();
+ if (last_tkn.tid == Srch_crt_tkn.Tid_word) // previous tkn is word; auto "AND" words; EX: A B -> A AND B
+ tkns.Add(new Srch_crt_tkn(Srch_crt_tkn.Tid_and, Bry_and));
}
- if (tid == Xow_search_tkn.Tid_word) { // if word has symbol, convert to quoted; EX: a-b should become "a-b"; otherwise searcher would search for a single word a-b
+ if (tid == Srch_crt_tkn.Tid_word) { // if word has symbol, convert to quoted; EX: a-b should become "a-b"; otherwise searcher would search for a single word a-b
byte[] cur_word = Bry_.Mid(src, src_bgn, src_end);
byte[][] words = gplx.xowa.bldrs.cmds.texts.Xob_search_base.Split_ttl_into_words(null, tmp_list, tmp_bfr, cur_word);
int words_len = words.length;
@@ -123,22 +123,22 @@ class Xow_search_scanner {
&& !Bry_.Eq(words[0], cur_word) // split word not same as raw
&& Bry_find_.Find_fwd(cur_word, Byte_ascii.Star) == -1 // no asterisk
) {
- tkns.Add(Xow_search_tkn.new_bry(tid, words[0]));
+ tkns.Add(new Srch_crt_tkn(tid, words[0]));
return;
}
if (words.length > 1) // multiple words; add as quoted-term; EX: "a-b"
- tid = Xow_search_tkn.Tid_word_quoted;
+ tid = Srch_crt_tkn.Tid_word_quoted;
}
- tkns.Add(new_tkn(tid, src_bgn, src_end));
+ tkns.Add(new_tkn(tid, src, src_bgn, src_end));
}
- private Xow_search_tkn new_tkn(byte tid, int val_bgn, int val_end) {return Xow_search_tkn.new_pos(tid, val_bgn, val_end);}
+ private Srch_crt_tkn new_tkn(byte tid, byte[] src, int val_bgn, int val_end) {return new Srch_crt_tkn(tid, Bry_.Mid(src, val_bgn, val_end));}
private static final byte[] Bry_and = Bry_.new_a7("AND");
private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7()// NOTE:ci.ascii:OR / AND only
- .Add_str_byte(" " , Xow_search_tkn.Tid_space)
- .Add_str_byte("\"" , Xow_search_tkn.Tid_quote)
- .Add_str_byte("-" , Xow_search_tkn.Tid_not)
- .Add_str_byte("(" , Xow_search_tkn.Tid_paren_bgn)
- .Add_str_byte(")" , Xow_search_tkn.Tid_paren_end)
- .Add_str_byte("or" , Xow_search_tkn.Tid_or)
- .Add_str_byte("and" , Xow_search_tkn.Tid_and);
+ .Add_str_byte(" " , Srch_crt_tkn.Tid_space)
+ .Add_str_byte("\"" , Srch_crt_tkn.Tid_quote)
+ .Add_str_byte("-" , Srch_crt_tkn.Tid_not)
+ .Add_str_byte("(" , Srch_crt_tkn.Tid_paren_bgn)
+ .Add_str_byte(")" , Srch_crt_tkn.Tid_paren_end)
+ .Add_str_byte("or" , Srch_crt_tkn.Tid_or)
+ .Add_str_byte("and" , Srch_crt_tkn.Tid_and);
}
diff --git a/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_tkn.java b/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_tkn.java
new file mode 100644
index 000000000..0e49d255b
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_tkn.java
@@ -0,0 +1,37 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.specials.search.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*;
+class Srch_crt_tkn {
+ public final byte tid;
+ public final byte[] val;
+ public Srch_crt_tkn(byte tid, byte[] val) {this.tid = tid; this.val = val;}
+
+ public static final byte
+ Tid_root = 1
+ , Tid_word = 2
+ , Tid_word_quoted = 3
+ , Tid_space = 4
+ , Tid_quote = 5
+ , Tid_not = 6
+ , Tid_paren_bgn = 7
+ , Tid_paren_end = 8
+ , Tid_or = 9
+ , Tid_and = 10
+ , Tid_eos = 11
+ ;
+}
diff --git a/400_xowa/src/gplx/xowa/specials/search/dbs/Srch_db_mgr.java b/400_xowa/src/gplx/xowa/specials/search/dbs/Srch_db_mgr.java
new file mode 100644
index 000000000..699fc8f47
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/specials/search/dbs/Srch_db_mgr.java
@@ -0,0 +1,80 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+//namespace gplx.xowa.specials.search.dbs {
+// using gplx.dbs; using gplx.xowa.wikis.data.tbls;
+// using gplx.xowa.langs.cases; using gplx.xowa.wikis.nss;
+// // workset_count
+// // workset_score_min
+// class Srch_db_mgr {
+// private Srch_word_tbl srch_word_tbl = new Srch_word_tbl(null, null);
+// private Srch_page_tbl srch_page_tbl = new Srch_page_tbl();
+// private Page_tbl page_tbl = new Page_tbl();
+// public void Search(Srch_request req) {
+// List_adp results = req.results;
+// int curr = results.Count();
+// int need = curr + req.req__count;
+// while (curr < need) {
+// // foreach (word)
+// srch_word_tbl.Get(req, null); // read words
+// srch_page_tbl.Get(req); // get pages for every words
+// // add to potential results; skip if failed and / not (but can't do quote)
+// page_tbl.Get(req); // get actual page and check for ns; quote; redirect
+// // repeat until matched
+// need = results.Count();
+// }
+// }
+// // get all pages in word_id set sorted by page_search_score
+// // stop if
+// // - no more pages; normal case
+// // - page_score < workset_score_min; case with many pages (1000 pages)
+//// private int Get_word_id_pages
+//// ( Cancelable cancelable, Xow_wiki wiki, Xol_case_mgr case_mgr
+//// , Srch_request req, Xows_ui_cmd cmd, Srch_qry qry, Srch_rslt_hash cache
+//// , Db_attach_rdr attach_rdr, String sql, Xowd_page_tbl page_tbl
+//// , Srch_word_row word, Srch_crt_node matcher, int rslts_wanted, int workset_score_min) {
+//// int rslts_found = 0;
+//// Xow_ns_mgr ns_mgr = wiki.Ns_mgr();
+//// Db_rdr rdr = attach_rdr.Exec_as_rdr(sql);
+//// try {
+//// while (rdr.Move_next()) {
+//// if (cancelable.Canceled()) return -1;
+//// word.Rslts_offset_add_1();
+//// int page_ns = rdr.Read_int(page_tbl.Fld_page_ns());
+//// if (!qry.Ns_mgr().Has(page_ns)) continue; // ignore: ns doesn't match
+//// byte[] page_ttl = rdr.Read_bry_by_str(page_tbl.Fld_page_title());
+//// // Io_mgr.Instance.AppendFilStr("C:\\temp.txt", String_.new_u8(word.Text()) + "|" + Int_.To_str(page_ns) + "|" + String_.new_u8(page_ttl) + "\n");
+//// byte[] page_ttl_lc = case_mgr.Case_build_lower(Xoa_ttl.Replace_unders(page_ttl));
+//// byte[][] page_ttl_words = Bry_split_.Split(page_ttl_lc, Byte_ascii.Space, Bool_.Y);
+//// if (!matcher.Matches(page_ttl_lc, page_ttl_words)) continue; // ignore: ttl doesn't match matcher
+//// int page_id = rdr.Read_int(page_tbl.Fld_page_id());
+//// int page_len = rdr.Read_int(page_tbl.Fld_page_len());
+//// int page_link_score = 0; //rdr.Read_int(page_tbl.Fld_page_link_score());
+//// Xow_ns ns = ns_mgr.Ids_get_or_null(page_ns);
+//// byte[] page_ttl_w_ns = ns.Gen_ttl(page_ttl);
+//// if (cache.Has(page_ttl_w_ns)) continue; // ignore: page already added by another word; EX: "A B"; word is "B", but "A B" already added by "A"
+//// Xoa_ttl ttl = wiki.Ttl_parse(page_ttl_w_ns);
+//// Srch_rslt_itm row = new Srch_rslt_itm(wiki.Domain_bry(), ttl, page_id, page_len);
+//// cmd.Add_rslt(row);
+//// if (++rslts_found == rslts_wanted) break; // stop: found enough results; DATE:2015-04-24
+//// }
+//// } finally {rdr.Rls();}
+//// if (rslts_found == 0) word.Rslts_done_y_(); // read through entire rdr and nothing found; mark word done
+//// return rslts_found;
+//// }
+// }
+//}
diff --git a/400_xowa/src/gplx/xowa/specials/search/dbs/Srch_word_row.java b/400_xowa/src/gplx/xowa/specials/search/dbs/Srch_word_row.java
new file mode 100644
index 000000000..dc702ce24
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/specials/search/dbs/Srch_word_row.java
@@ -0,0 +1,125 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+//namespace gplx.xowa.specials.search.dbs {
+// using gplx.dbs; using gplx.xowa.wikis.data.tbls;
+// // a
+// // a b
+// // a*
+// class Srch_word_tbl {
+// private final Db_conn conn;
+// private final Xowd_search_word_tbl tbl;
+// public Srch_word_tbl(Db_conn conn, Xowd_search_word_tbl tbl) {this.conn = conn; this.tbl = tbl;}
+// public void Get(Srch_request req, Srch_cache_word cache_word) {
+// // int req_count = req.req__count;
+// // conn.Stmt_select_order(tbl.Tbl_name(), String_.Ary(tbl.Fld_id(), tbl.Fld_w()));
+// // SELECT word_id, word_text FROM search_word WHERE word_text LIKE "~{word}%" AND word_text > '' ORDER BY word_page_score DESC OFFSET 0;
+// Db_qry qry = Db_qry_.select_()
+// .From_(tbl.Tbl_name())
+// .Cols_(tbl.Fld_id(), tbl.Fld_text(), tbl.Fld_page_count(), tbl.Fld_page_score_max())
+// .Where_(Db_crt_.New_like(tbl.Fld_text(), ""))
+// .OrderBy_(tbl.Fld_page_score_max(), false)
+// // .Offset_();
+// ;
+// Db_stmt stmt = conn.Stmt_new(qry);
+// stmt.Clear().Crt_str(tbl.Fld_text(), req.search);
+// Db_rdr rdr = stmt.Exec_select__rls_auto();
+// int cur_count = 0;
+// while (rdr.Move_next()) {
+// int word_id = rdr.Read_int(tbl.Fld_id());
+// byte[] word_text = rdr.Read_bry_by_str(tbl.Fld_text());
+// int page_count = rdr.Read_int(tbl.Fld_page_count());
+// int page_score_max = rdr.Read_int(tbl.Fld_page_score_max());
+// Srch_word_row row = new Srch_word_row(word_id, word_text, page_count, page_score_max);
+// cache_word.words.Add(row);
+// cur_count += page_count;
+// ++cache_word.offset;
+// if (cur_count >= (req.req__count * 2)) break;
+// }
+// /*
+// Get_rng; now in set of 100, scores may range from 1234 to 50; search every word to get minimum
+// */
+// }
+// }
+// class Srch_page_tbl {
+// public void Get(Srch_request req) {
+// }
+// }
+// class Page_tbl {
+// public void Get(Srch_request req) {}
+// }
+// class Srch_word_row {
+// public int word_id;
+// public byte[] text;
+// public int page_count;
+// public int page_score_max;
+// public int rslts_offset;
+// public boolean rslts_done;
+// public Srch_word_row(int word_id, byte[] text, int page_count, int page_score_max) {
+// this.word_id = word_id; this.text = text; this.page_count = page_count; this.page_score_max = page_score_max;
+// rslts_offset = 0; rslts_done = false;
+// }
+// public void Rslts_offset_add_1() {++rslts_offset;}
+// public void Rslts_done_y_() {rslts_done = true;}
+// }
+// class Srch_page_row {
+// public int word_id;
+// public int page_id;
+// public void Load(int word_id, int page_id) {
+// this.word_id = word_id; this.page_id = page_id;
+// }
+// }
+// class Srch_cache_word {
+// public byte[] search;
+// public final List_adp words = List_adp_.new_();
+// public int offset;
+// public void Init_new(byte[] search) {
+// this.search = search;
+// words.Clear();
+// offset = 0;
+// }
+// }
+// class Srch_request {
+// public String search;
+// public int req__count;
+// public boolean wildcard;
+// public String bmk__word__text;
+// public int bmk__page__word_id;
+// public int bmk__page__page_id;
+// // all_pages;
+// // view_pages
+// public final List_adp results = List_adp_.new_();
+// public final Srch_cache_word tbl__word = new Srch_cache_word();
+// public void Init_new(String search, boolean wildcard, int req__count) {
+// this.search = search; this.wildcard = wildcard; this.req__count = req__count;
+// this.bmk__word__text = "";
+// this.bmk__page__word_id = -1;
+// this.bmk__page__page_id = -1;
+// tbl__word.Init_new(Bry_.new_a7(search));
+// results.Clear();
+// }
+// public void Init_continue(int req__count) {
+// }
+// }
+// class Srch_query {
+// public String raw;
+// public Srch_query(String raw) {
+// this.raw = raw;
+// // separate to words
+// }
+// }
+//}
diff --git a/400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_parser.java b/400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_parser.java
deleted file mode 100644
index 232d972e8..000000000
--- a/400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_parser.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
-XOWA: the XOWA Offline Wiki Application
-Copyright (C) 2012 gnosygnu@gmail.com
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-package gplx.xowa.specials.search.parsers_old; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*;
-public class Xow_search_parser {
- private Xow_search_parser_ctx parse_ctx = new Xow_search_parser_ctx(); private byte[] src;
- public Xows_db_matcher Parse(byte[] src) {
- this.src = src;
- Xow_search_tkn[] tkns = new Xow_search_scanner().Scan(src);
- return Parse_itm_or(parse_ctx.Init(tkns));
- }
- private Xows_db_matcher Parse_itm_or(Xow_search_parser_ctx parse_ctx) {
- Xows_db_matcher lhs = Parse_itm_and(parse_ctx);
- while (parse_ctx.Cur_tid(Xow_search_tkn.Tid_or)) {
- parse_ctx.Move_next();
- Xows_db_matcher rhs = Parse_itm_and(parse_ctx);
- lhs = new_join(Xows_db_matcher.Tid_or, lhs, rhs);
- }
- return lhs;
- }
- private Xows_db_matcher Parse_itm_and(Xow_search_parser_ctx parse_ctx) {
- Xows_db_matcher lhs = Parse_itm_not(parse_ctx);
- while (parse_ctx.Cur_tid(Xow_search_tkn.Tid_and)) {
- parse_ctx.Move_next();
- Xows_db_matcher rhs = Parse_itm_not(parse_ctx);
- lhs = new_join(Xows_db_matcher.Tid_and, lhs, rhs);
- }
- return lhs;
- }
- private Xows_db_matcher Parse_itm_not(Xow_search_parser_ctx parse_ctx) {
- Xows_db_matcher lhs = Parse_itm_leaf(parse_ctx);
- while (parse_ctx.Cur_tid(Xow_search_tkn.Tid_not)) {
- parse_ctx.Move_next();
- Xows_db_matcher rhs = Parse_itm_leaf(parse_ctx);
- lhs = new_join(Xows_db_matcher.Tid_not, null, rhs);
- }
- return lhs;
- }
- private Xows_db_matcher Parse_itm_leaf(Xow_search_parser_ctx parse_ctx) {
- if (parse_ctx.Cur_tid(Xow_search_tkn.Tid_paren_bgn)) {
- parse_ctx.Move_next();
- Xows_db_matcher lhs = Parse_itm_or(parse_ctx);
- if (parse_ctx.Cur_tid(Xow_search_tkn.Tid_paren_end)) parse_ctx.Move_next(); // skip token
- return lhs;
- }
- else if (parse_ctx.Cur_tid(Xow_search_tkn.Tid_eos))
- return Xows_db_matcher.Null;
- else {
- Xow_search_tkn word_tkn = parse_ctx.Move_next();
- if (word_tkn.Tid() == Xow_search_tkn.Tid_not) {
- word_tkn = parse_ctx.Move_next();
- if (word_tkn == null) return Xows_db_matcher.Null; // occurs in "a -"
- Xows_db_matcher word_itm = new_word(word_tkn, src);
- return new_join(Xows_db_matcher.Tid_not, null, word_itm);
- }
- else
- return new_word(word_tkn, src);
- }
- }
- private static Xows_db_matcher new_word(Xow_search_tkn tkn, byte[] src) {
- int tid = tkn.Tid() == Xow_search_tkn.Tid_word ? Xows_db_matcher.Tid_word : Xows_db_matcher.Tid_word_quote;
- return new Xows_db_matcher(tid, tkn.Val(src), null, null);
- }
- private static Xows_db_matcher new_join(int tid, Xows_db_matcher lhs, Xows_db_matcher rhs) {return new Xows_db_matcher(tid, null, lhs, rhs);}
-}
-class Xow_search_parser_ctx {
- private Xow_search_tkn[] ary; private int pos = 0; private int ary_len;
- public Xow_search_parser_ctx Init(Xow_search_tkn[] ary) {
- this.ary = ary;
- this.ary_len = ary.length;
- this.pos = 0;
- return this;
- }
- public boolean Cur_tid(byte tid) {return pos < ary_len ? tid == ary[pos].Tid(): tid == Xow_search_tkn.Tid_eos;}
- public Xow_search_tkn Move_next() {
- Xow_search_tkn rv = null;
- if (pos < ary_len) rv = ary[pos++];
- return rv;
- }
-}
diff --git a/400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_tkn.java b/400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_tkn.java
deleted file mode 100644
index 7f78f56f8..000000000
--- a/400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_tkn.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-XOWA: the XOWA Offline Wiki Application
-Copyright (C) 2012 gnosygnu@gmail.com
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-package gplx.xowa.specials.search.parsers_old; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*;
-class Xow_search_tkn {
- private final int val_bgn, val_end;
- private final byte[] val_bry;
- Xow_search_tkn(byte tid, int val_bgn, int val_end, byte[] val_bry) {this.tid = tid; this.val_bgn = val_bgn; this.val_end = val_end; this.val_bry = val_bry;}
- public byte Tid() {return tid;} private final byte tid;
- public byte[] Val(byte[] src) {return val_bry == null ? Bry_.Mid(src, val_bgn, val_end) : val_bry;}
- public static Xow_search_tkn new_pos(byte tid, int val_bgn, int val_end) {return new Xow_search_tkn(tid, val_bgn, val_end, null);}
- public static Xow_search_tkn new_bry(byte tid, byte[] val_bry) {return new Xow_search_tkn(tid, -1, -1, val_bry);}
- public static final byte
- Tid_root = 1
- , Tid_word = 2
- , Tid_word_quoted = 3
- , Tid_space = 4
- , Tid_quote = 5
- , Tid_not = 6
- , Tid_paren_bgn = 7
- , Tid_paren_end = 8
- , Tid_or = 9
- , Tid_and = 10
- , Tid_eos = 11
- ;
-}
diff --git a/400_xowa/src/gplx/xowa/specials/search/quicks/Xoa_search_itm.java b/400_xowa/src/gplx/xowa/specials/search/quicks/Xoa_search_itm.java
deleted file mode 100644
index 6ce7ad273..000000000
--- a/400_xowa/src/gplx/xowa/specials/search/quicks/Xoa_search_itm.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-XOWA: the XOWA Offline Wiki Application
-Copyright (C) 2012 gnosygnu@gmail.com
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-package gplx.xowa.specials.search.quicks; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*;
-public class Xoa_search_itm {
- public Xoa_search_itm(byte[] url, byte[] name, byte[] descrip, byte[] img) {
- this.url = url; this.name = name; this.descrip = descrip; this.img = img;
- }
- public byte[] Url() {return url;} private final byte[] url; // EX: en.wikipedia.org/wiki/Earth
- public byte[] Name() {return name;} private final byte[] name; // EX: Earth
- public byte[] Descrip() {return descrip;} private final byte[] descrip; // EX: Third planet from the Sun
- public byte[] Img() {return img;} private final byte[] img; // EX: Earth.png
-}
diff --git a/400_xowa/src/gplx/xowa/specials/xowa/diags/Db_rdr_utl.java b/400_xowa/src/gplx/xowa/specials/xowa/diags/Db_rdr_utl.java
index c2a55629d..0864160b3 100644
--- a/400_xowa/src/gplx/xowa/specials/xowa/diags/Db_rdr_utl.java
+++ b/400_xowa/src/gplx/xowa/specials/xowa/diags/Db_rdr_utl.java
@@ -25,7 +25,7 @@ class Db_rdr_utl {
}
public static Mem_qry_set Load_as_qry_set(Db_conn conn, Dbmeta_fld_list fld_list, String sql) {
Mem_qry_set qry_set = new Mem_qry_set();
- DataRdr rdr = conn.Exec_sql_as_rdr(sql);
+ DataRdr rdr = conn.Exec_sql_as_old_rdr(sql);
try {
int fld_count = rdr.FieldCount();
while (rdr.MoveNextPeer()) {
@@ -42,7 +42,7 @@ class Db_rdr_utl {
}
public static Object[][] Load(Db_conn conn, String sql) {
List_adp list = List_adp_.new_();
- DataRdr rdr = conn.Exec_sql_as_rdr(sql);
+ DataRdr rdr = conn.Exec_sql_as_old_rdr(sql);
try {
int fld_count = rdr.FieldCount();
while (rdr.MoveNextPeer()) {
diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl__in_wkr.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl__in_wkr.java
index b3d0683b5..0cafcc646 100644
--- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl__in_wkr.java
+++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl__in_wkr.java
@@ -26,7 +26,7 @@ class Xowd_cat_core_tbl__in_wkr extends Db_in_wkr__base {
public void Init(Ordered_hash hash) {this.hash = hash;}
@Override protected Db_qry Make_qry(int bgn, int end) {
Object[] part_ary = In_ary(end - bgn);
- return Db_qry_.select_cols_(tbl_name, Db_crt_.in_(fld_cat_id, part_ary), flds.To_str_ary());
+ return Db_qry_.select_cols_(tbl_name, Db_crt_.New_in(fld_cat_id, part_ary), flds.To_str_ary());
}
@Override protected void Fill_stmt(Db_stmt stmt, int bgn, int end) {
for (int i = bgn; i < end; i++) {
diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java
index d5ee84a3a..473da0b19 100644
--- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java
+++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java
@@ -54,11 +54,11 @@ public class Xowd_cat_link_tbl implements Rls_able {
public int Select_by_type(List_adp list, int cat_page_id, byte arg_tid, byte[] arg_sortkey, boolean arg_is_from, int limit) {
String arg_sortkey_str = arg_sortkey == null ? "" : String_.new_u8(arg_sortkey);
gplx.core.criterias.Criteria comp_crt = !arg_is_from
- ? Db_crt_.mte_(fld_sortkey, arg_sortkey_str) // from: sortkey >= 'val'
- : Db_crt_.lte_(fld_sortkey, arg_sortkey_str); // until: sortkey <= 'val'
+ ? Db_crt_.New_mte(fld_sortkey, arg_sortkey_str) // from: sortkey >= 'val'
+ : Db_crt_.New_lte(fld_sortkey, arg_sortkey_str); // until: sortkey <= 'val'
Db_qry__select_cmd qry = Db_qry_.select_().Cols_(fld_from, fld_sortkey).From_(tbl_name)
- .Where_(gplx.core.criterias.Criteria_.And_many(Db_crt_.eq_(fld_to_id, -1), Db_crt_.eq_(fld_type_id, arg_tid), comp_crt))
- .OrderBy_(fld_sortkey, !arg_is_from)
+ .Where_(gplx.core.criterias.Criteria_.And_many(Db_crt_.New_eq(fld_to_id, -1), Db_crt_.New_eq(fld_type_id, arg_tid), comp_crt))
+ .Order_(fld_sortkey, !arg_is_from)
.Limit_(limit + 1); // + 1 to get last_plus_one for next page / previous page
Db_rdr rdr = conn.Stmt_new(qry).Crt_int(fld_to_id, cat_page_id).Crt_byte(fld_type_id, arg_tid).Crt_str(fld_sortkey, arg_sortkey_str).Exec_select__rls_auto();
int count = 0;
diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java
index 7f8a608f4..1950f7c3e 100644
--- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java
+++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java
@@ -31,6 +31,7 @@ public class Xowd_page_tbl implements Rls_able {
public String Fld_page_title() {return fld_title;}
public String Fld_page_len() {return fld_len;}
public String Fld_html_db_id() {return fld_html_db_id;}
+ public String Fld_is_redirect() {return fld_is_redirect;}
public String Fld_redirect_id() {return fld_redirect_id;}
public String[] Flds_select_idx() {return flds_select_idx;}
public String[] Flds_select_all() {return flds_select_all;}
@@ -111,7 +112,7 @@ public class Xowd_page_tbl implements Rls_able {
return false;
}
public Db_rdr Select_all() {
- Db_qry__select_cmd qry = Db_qry__select_cmd.new_().From_(tbl_name).Cols_(fld_id, fld_title).OrderBy_asc_(fld_id);
+ Db_qry__select_cmd qry = new Db_qry__select_cmd().From_(tbl_name).Cols_(fld_id, fld_title).Order_asc_(fld_id);
return conn.Stmt_new(qry).Exec_select__rls_auto();
}
public int Select_id(int ns_id, byte[] ttl) {
@@ -167,7 +168,7 @@ public class Xowd_page_tbl implements Rls_able {
}
public void Select_by_search(Cancelable cancelable, List_adp rv, byte[] search, int results_max) {
if (Bry_.Len_eq_0(search)) return; // do not allow empty search
- Criteria crt = Criteria_.And_many(Db_crt_.eq_(fld_ns, Xow_ns_.Tid__main), Db_crt_.like_(fld_title, ""));
+ Criteria crt = Criteria_.And_many(Db_crt_.New_eq(fld_ns, Xow_ns_.Tid__main), Db_crt_.New_like(fld_title, ""));
Db_qry__select_cmd qry = Db_qry_.select_().From_(tbl_name).Cols_(fld_id, fld_len, fld_ns, fld_title).Where_(crt); // NOTE: use fields from main index only
search = Bry_.Replace(search, Byte_ascii.Star, Byte_ascii.Percent);
Db_rdr rdr = conn.Stmt_new(qry).Clear().Crt_int(fld_ns, Xow_ns_.Tid__main).Val_bry_as_str(fld_title, search).Exec_select__rls_auto();
@@ -207,16 +208,16 @@ public class Xowd_page_tbl implements Rls_able {
}
private Db_rdr Load_ttls_starting_with_rdr(int ns_id, byte[] ttl_frag, boolean include_redirects, int max_results, int min_page_len, int browse_len, boolean fwd, boolean search_suggest) {
String ttl_frag_str = String_.new_u8(ttl_frag);
- Criteria crt_ttl = fwd ? Db_crt_.mte_(fld_title, ttl_frag_str) : Db_crt_.lt_(fld_title, ttl_frag_str);
- Criteria crt = Criteria_.And_many(Db_crt_.eq_(fld_ns, ns_id), crt_ttl, Db_crt_.mte_(fld_len, min_page_len));
+ Criteria crt_ttl = fwd ? Db_crt_.New_mte(fld_title, ttl_frag_str) : Db_crt_.New_lt(fld_title, ttl_frag_str);
+ Criteria crt = Criteria_.And_many(Db_crt_.New_eq(fld_ns, ns_id), crt_ttl, Db_crt_.New_mte(fld_len, min_page_len));
if (!include_redirects)
- crt = Criteria_.And(crt, Db_crt_.eq_(fld_is_redirect, Byte_.Zero));
+ crt = Criteria_.And(crt, Db_crt_.New_eq(fld_is_redirect, Byte_.Zero));
String[] cols = search_suggest
? flds_select_idx
: flds_select_all
;
int limit = fwd ? max_results + 1 : max_results; // + 1 to get next item
- Db_qry__select_cmd qry = Db_qry_.select_cols_(tbl_name, crt, cols).Limit_(limit).OrderBy_(fld_title, fwd);
+ Db_qry__select_cmd qry = Db_qry_.select_cols_(tbl_name, crt, cols).Limit_(limit).Order_(fld_title, fwd);
Db_stmt stmt = conn.Stmt_new(qry).Crt_int(fld_ns, ns_id).Crt_str(fld_title, ttl_frag_str).Crt_int(fld_len, min_page_len);
if (!include_redirects)
stmt.Crt_bool_as_byte(fld_is_redirect, include_redirects);
diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl__in_wkrs.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl__in_wkrs.java
index 9cd211a20..f51576b38 100644
--- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl__in_wkrs.java
+++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl__in_wkrs.java
@@ -28,7 +28,7 @@ class Xowd_page_tbl__ttl_ns extends Xowd_page_tbl__in_wkr__base {
Criteria[] crt_ary = new Criteria[len];
String fld_ns = tbl.Fld_page_ns(); String fld_ttl = tbl.Fld_page_title();
for (int i = 0; i < len; i++)
- crt_ary[i] = Criteria_.And(Db_crt_.eq_(fld_ns, 0), Db_crt_.eq_(fld_ttl, Bry_.Empty));
+ crt_ary[i] = Criteria_.And(Db_crt_.New_eq(fld_ns, 0), Db_crt_.New_eq(fld_ttl, Bry_.Empty));
return Criteria_.Or_many(crt_ary);
}
@Override protected void Fill_stmt(Db_stmt stmt, int bgn, int end) {
@@ -55,7 +55,7 @@ class Xowd_page_tbl__ttl extends Xowd_page_tbl__in_wkr__base {
Criteria[] crt_ary = new Criteria[len];
String fld_ns = tbl.Fld_page_ns(); String fld_ttl = tbl.Fld_page_title();
for (int i = 0; i < len; i++)
- crt_ary[i] = Criteria_.And(Db_crt_.eq_(fld_ns, in_ns), Db_crt_.eq_(fld_ttl, Bry_.Empty));
+ crt_ary[i] = Criteria_.And(Db_crt_.New_eq(fld_ns, in_ns), Db_crt_.New_eq(fld_ttl, Bry_.Empty));
return Criteria_.Or_many(crt_ary);
}
@Override protected void Fill_stmt(Db_stmt stmt, int bgn, int end) {
@@ -73,7 +73,7 @@ class Xowd_page_tbl__id extends Xowd_page_tbl__in_wkr__base {
public void Init(List_adp list, Ordered_hash hash) {this.list = list; this.hash = hash; this.Fill_idx_fields_only_(true);}
@Override protected boolean Show_progress() {return true;}
@Override protected Criteria In_filter(Object[] part_ary) {
- return Db_crt_.in_(this.In_fld_name(), part_ary);
+ return Db_crt_.New_in(this.In_fld_name(), part_ary);
}
@Override protected void Fill_stmt(Db_stmt stmt, int bgn, int end) {
for (int i = bgn; i < end; i++) {
diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java
index 5b18fd72d..61d413f24 100644
--- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java
+++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java
@@ -21,7 +21,7 @@ import gplx.dbs.*; import gplx.dbs.utls.*;
public class Xowd_search_link_tbl {
private final String tbl_name; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_();
private final String fld_word_id, fld_page_id;
- private final Db_conn conn; private Db_stmt stmt_insert; private final Xowd_search_page_tbl__in_wkr in_wkr = new Xowd_search_page_tbl__in_wkr();
+ public final Db_conn conn; private Db_stmt stmt_insert; private final Xowd_search_page_tbl__in_wkr in_wkr = new Xowd_search_page_tbl__in_wkr();
public Xowd_search_link_tbl(Db_conn conn, boolean schema_is_1) {
this.conn = conn;
String fld_prefix = "";
@@ -56,7 +56,7 @@ class Xowd_search_page_tbl__in_wkr extends Db_in_wkr__base {
public void Init(List_adp words, List_adp pages) {this.words = words; this.pages = pages;}
@Override protected Db_qry Make_qry(int bgn, int end) {
Object[] part_ary = In_ary(end - bgn);
- return Db_qry_.select_cols_(tbl_name, Db_crt_.in_(fld_word_id, part_ary), flds.To_str_ary());
+ return Db_qry_.select_cols_(tbl_name, Db_crt_.New_in(fld_word_id, part_ary), flds.To_str_ary());
}
@Override protected void Fill_stmt(Db_stmt stmt, int bgn, int end) {
for (int i = bgn; i < end; i++) {
diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java
index c42838dd0..a13f8908b 100644
--- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java
+++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java
@@ -18,7 +18,7 @@ along with this program. If not, see .
package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*;
import gplx.dbs.*; import gplx.dbs.engines.sqlite.*;
public class Xowd_search_temp_tbl {
- private final String tbl_name = "search_temp"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_();
+ private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_();
private final String fld_page_id, fld_word_text;
private final Db_conn conn; private Db_stmt stmt_insert;
private final String sql_create_word, sql_create_link;
@@ -26,10 +26,12 @@ public class Xowd_search_temp_tbl {
this.conn = conn;
if (schema_is_1) {sql_create_word = Sql_create_word_v1; sql_create_link = Sql_create_link_v1;}
else {sql_create_word = Sql_create_word_v2; sql_create_link = Sql_create_link_v2;}
+ // flds.Add_int_dflt("word_id", -1);
flds.Add_int_pkey_autonum("word_id");
fld_page_id = flds.Add_int("page_id");
fld_word_text = flds.Add_str("word_text", 255);
}
+ public String Tbl_name() {return tbl_name;} private final String tbl_name = "search_temp";
public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));}
public void Insert_bgn() {conn.Txn_bgn("schema__search_temp__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);}
public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);}
@@ -40,7 +42,9 @@ public class Xowd_search_temp_tbl {
}
public void Make_data(Gfo_usr_dlg usr_dlg, Xowd_search_link_tbl search_link_tbl, Xowd_search_word_tbl search_word_tbl) {
conn.Ddl_create_idx(usr_dlg, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_word_text, fld_page_id));
+ conn.Exec_delete_all(search_word_tbl.Tbl_name());
conn.Exec_sql_plog_txn("search_temp.create_word", sql_create_word);
+ conn.Exec_delete_all(search_link_tbl.Tbl_name());
conn.Exec_sql_plog_txn("search_temp.create_link", sql_create_link);
Create_idx(usr_dlg, search_link_tbl, search_word_tbl);
conn.Env_vacuum();
@@ -55,6 +59,23 @@ public class Xowd_search_temp_tbl {
search_link_tbl.Create_idx_normal();;
}
}
+ public void Update_word_id(Db_conn cur_conn, Io_url prv_url) {
+ String sql = String_.Concat_lines_nl_skip_last
+ ( "REPLACE INTO search_temp (word_id, page_id, word_text)"
+ , "SELECT Coalesce(prv.word_id, cur.word_id), cur.page_id, cur.word_text"
+ , "FROM search_temp cur"
+ , " LEFT JOIN search_word prv ON cur.word_text = prv.word_text"
+ );
+ Db_attach_cmd.new_(cur_conn, "prv_db", prv_url).Add_fmt("updating_word_ids", sql).Exec();
+ Db_stmt update_stmt = cur_conn.Stmt_update(tbl_name, String_.Ary(fld_word_text), fld_page_id);
+ Db_rdr rdr = cur_conn.Stmt_select(tbl_name, flds, String_.Ary(fld_page_id)).Crt_int(fld_page_id, -1).Exec_select__rls_auto();
+ int nxt_page_id = 1000;
+ try {
+ while (rdr.Move_next()) {
+ update_stmt.Crt_int(fld_page_id, ++nxt_page_id).Exec_update();
+ }
+ } finally {rdr.Rls();}
+ }
private static final String Sql_create_word_v1 = String_.Concat_lines_nl
( "INSERT INTO search_title_word (stw_word_id, stw_word)"
, "SELECT word_id"
diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java
index 6c1913ab0..41f892e1e 100644
--- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java
+++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java
@@ -20,7 +20,7 @@ import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.cfgs.*; import
public class Xowd_search_word_tbl implements Rls_able {
private final String tbl_name; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_();
private final String fld_id, fld_text; private String fld_page_count; private boolean page_count_exists;
- private final Db_conn conn; private Db_stmt stmt_insert, stmt_select_by, stmt_select_in;
+ public final Db_conn conn; private Db_stmt stmt_insert, stmt_select_by, stmt_select_in;
public Xowd_search_word_tbl(Db_conn conn, boolean schema_is_1, boolean page_count_exists) {
this.conn = conn; this.page_count_exists = page_count_exists;
String fld_prefix = "", fld_text_name = "word_text";
@@ -31,6 +31,11 @@ public class Xowd_search_word_tbl implements Rls_able {
this.fld_page_count = page_count_exists ? flds.Add_int_dflt("word_page_count", 0) : Dbmeta_fld_itm.Key_null;
conn.Rls_reg(this);
}
+ public String Tbl_name() {return tbl_name;}
+ public String Fld_id() {return fld_id;}
+ public String Fld_text() {return fld_text;}
+ public String Fld_page_count() {return fld_page_count;}
+ public String Fld_page_score_max() {return Dbmeta_fld_itm.Key_null;}
public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));}
public void Create_idx() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_text, fld_id, fld_page_count));}
public void Insert_bgn() {conn.Txn_bgn("schema__search_word__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);}
@@ -52,7 +57,7 @@ public class Xowd_search_word_tbl implements Rls_able {
}
public Xowd_search_word_row[] Select_in(Cancelable cxl, byte[] word) {
if (stmt_select_in == null) {
- Db_qry__select_cmd qry = Db_qry_.select_().From_(tbl_name).OrderBy_(fld_page_count, Bool_.N).Where_(Db_crt_.like_(fld_text, "")); // order by highest page count to look at most common words
+ Db_qry__select_cmd qry = Db_qry_.select_().From_(tbl_name).Order_(fld_page_count, Bool_.N).Where_(Db_crt_.New_like(fld_text, "")); // order by highest page count to look at most common words
stmt_select_in = conn.Stmt_new(qry);
}
List_adp list = List_adp_.new_();
@@ -74,10 +79,10 @@ public class Xowd_search_word_tbl implements Rls_able {
gplx.core.criterias.Criteria crt = null;
if (Bry_.Has(search, Byte_ascii.Star)) {
search = Bry_.Replace(search, Byte_ascii.Star, Byte_ascii.Percent);
- crt = Db_crt_.like_ (fld_text, String_.new_u8(search));
+ crt = Db_crt_.New_like (fld_text, String_.new_u8(search));
}
else
- crt = Db_crt_.eq_ (fld_text, String_.new_u8(search));
+ crt = Db_crt_.New_eq (fld_text, String_.new_u8(search));
Db_qry__select_cmd qry = Db_qry_.select_().Cols_(fld_id).From_(tbl_name).Where_(crt);
List_adp words = List_adp_.new_();
diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_upgrade_mgr.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_upgrade_mgr.java
index fb1e8bfd2..55ebd3270 100644
--- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_upgrade_mgr.java
+++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_upgrade_mgr.java
@@ -51,7 +51,7 @@ class Xodb_upgrade_mgr {
// }
// }
// private static void Fix_category_version(Db_conn p, Xodb_mgr_sql db_mgr) {
-// Db_qry qry = Db_qry_.select_().From_(Xodb_categorylinks_tbl.Tbl_name).Cols_(Xodb_categorylinks_tbl.Fld_cl_type_id).Where_(Db_crt_.eq_(Xodb_categorylinks_tbl.Fld_cl_type_id, ));
+// Db_qry qry = Db_qry_.select_().From_(Xodb_categorylinks_tbl.Tbl_name).Cols_(Xodb_categorylinks_tbl.Fld_cl_type_id).Where_(Db_crt_.New_eq(Xodb_categorylinks_tbl.Fld_cl_type_id, ));
// Db_stmt stmt = Db_stmt_.Null;
// DataRdr rdr = DataRdr_.Null;
// int types = 0;
diff --git a/400_xowa/src/gplx/xowa/wikis/pages/Xopg_page_heading.java b/400_xowa/src/gplx/xowa/wikis/pages/Xopg_page_heading.java
index d4eda1c0b..3f7a9ac00 100644
--- a/400_xowa/src/gplx/xowa/wikis/pages/Xopg_page_heading.java
+++ b/400_xowa/src/gplx/xowa/wikis/pages/Xopg_page_heading.java
@@ -27,7 +27,7 @@ public class Xopg_page_heading implements Bfr_arg {
}
public void Bfr_arg__add(Bry_bfr bfr) {
if (html_data.Xtn_pgbnr() != null) return; // pgbnr exists; don't add title
- fmtr.Bld_bfr_many(bfr, page_ttl.Page_txt());
+ fmtr.Bld_many(bfr, page_ttl.Page_txt());
}
private final Bry_fmt fmtr = Bry_fmt.New(Bry_.New_u8_nl_apos("~{page_title}"), "page_title");
}
diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_icon.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_icon.java
index 323326440..2bf9de7ae 100644
--- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_icon.java
+++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_icon.java
@@ -22,7 +22,7 @@ public class Pgbnr_icon implements Mustache_doc_itm {
private final byte[] name, title, href, html;
public Pgbnr_icon(Bry_bfr tmp_bfr, byte[] name, byte[] title, byte[] href) {
this.name = name; this.title = title; this.href = href;
- fmt.Bld_bfr_many(tmp_bfr, name, title);
+ fmt.Bld_many(tmp_bfr, name, title);
this.html = tmp_bfr.To_bry_and_clear();
}
public byte[] Get_prop(String key) {
diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-file-user.xowa b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-file-user.xowa
new file mode 100644
index 000000000..086415eb2
Binary files /dev/null and b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-file-user.xowa differ
diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-file.xowa b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-file.xowa
new file mode 100644
index 000000000..0d52b08f0
Binary files /dev/null and b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-file.xowa differ
diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa
index 880196eaa..57dd77fd8 100644
Binary files a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa and b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa differ
|