1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00
This commit is contained in:
gnosygnu
2016-02-07 23:20:20 -05:00
parent 6d179ca59d
commit de67253a9c
215 changed files with 3387 additions and 2055 deletions

View File

@@ -49,7 +49,7 @@ class Xob_dump_src_id {
cur_text_db_idx = text_db_idx;
Xowd_db_file text_db = db_mgr.Core_data_mgr().Dbs__get_at(text_db_idx);
Db_conn conn = text_db.Conn();
String sql = String_.Format(Sql_select, New_rdr__redirect_clause(redirect));
String sql = String_.Format(Sql_select_itm, New_rdr__redirect_clause(redirect));
text_stmt = conn.Stmt_new(Db_qry_sql.rdr_(sql));
}
return text_stmt.Clear().Val_int(prv_id).Val_int(cur_ns).Exec_select();
@@ -75,7 +75,7 @@ class Xob_dump_src_id {
default: throw Err_.new_unhandled(redirect);
}
}
private static final String Sql_select = String_.Concat_lines_nl
private static final String Sql_select_itm = String_.Concat_lines_nl
( "SELECT p.page_id"
, ", p.page_title"
, ", t.text_data"

View File

@@ -96,7 +96,7 @@ class Db_tst_qry {
DataRdr rdr = DataRdr_.Null;
Bry_bfr bfr = Bry_bfr.new_();
try {
rdr = conn.Exec_qry_as_rdr(qry);
rdr = conn.Exec_qry_as_old_rdr(qry);
int expd_row_idx = 0, expd_row_max = rows.Count();
while (rdr.MoveNextPeer()) {
if (expd_row_idx == expd_row_max) break;
@@ -127,11 +127,11 @@ class Db_tst_qry {
}
if (!pass) {
bfr.Add(Lbl_row_hdr).Add_int_variable(expd_row_idx).Add_byte_nl();
bfr.Add_str_u8(qry.Xto_sql()).Add_byte(Byte_ascii.Semic);
bfr.Add_str_u8(qry.To_sql__exec(gplx.dbs.sqls.Sql_qry_wtr_.Sqlite)).Add_byte(Byte_ascii.Semic);
throw Err_.new_wo_type(bfr.To_str_and_clear());
}
} static final byte[] Lbl_row_hdr = Bry_.new_a7("row: "), Lbl_eq_y = Bry_.new_a7(" == "), Lbl_eq_n = Bry_.new_a7(" != ");
public static Db_tst_qry tbl_(String tbl_name, String order_by) {return new_(Db_qry_.select_tbl_(tbl_name).OrderBy_asc_(order_by));}
public static Db_tst_qry tbl_(String tbl_name, String order_by) {return new_(Db_qry_.select_tbl_(tbl_name).Order_asc_(order_by));}
public static Db_tst_qry new_(Db_qry qry) {
Db_tst_qry rv = new Db_tst_qry();
rv.qry = qry;

View File

@@ -19,16 +19,19 @@ package gplx.xowa.bldrs.cmds.diffs; import gplx.*; import gplx.xowa.*; import gp
public class Xob_diff_build_cmd implements Xob_cmd {
private final Xob_bldr bldr; private final Xowe_wiki wiki;
private String prev_url, curr_url, diff_url; private int commit_interval;
private int[] db_ids = Int_.Ary_empty; private String bld_name = "all";
public Xob_diff_build_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki;}
public String Cmd_key() {return Xob_cmd_keys.Key_diff_build;}
public void Cmd_run() {
new Xob_diff_build_wkr(bldr, wiki, prev_url, curr_url, diff_url, commit_interval).Exec();
new Xob_diff_build_wkr(bldr, wiki, prev_url, curr_url, diff_url, commit_interval, new Xowd_tbl_mapr(bld_name, db_ids)).Exec();
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk__prev_url_)) prev_url = m.ReadStr("v");
else if (ctx.Match(k, Invk__curr_url_)) curr_url = m.ReadStr("v");
else if (ctx.Match(k, Invk__diff_url_)) diff_url = m.ReadStr("v");
else if (ctx.Match(k, Invk__commit_interval_)) commit_interval = m.ReadInt("v");
else if (ctx.Match(k, Invk__db_ids_)) db_ids = Int_.Ary_parse(m.ReadStr("v"), "|");
else if (ctx.Match(k, Invk__bld_name_)) bld_name = m.ReadStr("v");
else return GfoInvkAble_.Rv_unhandled;
return this;
}
@@ -36,5 +39,6 @@ public class Xob_diff_build_cmd implements Xob_cmd {
public void Cmd_bgn(Xob_bldr bldr) {}
public void Cmd_end() {}
public void Cmd_term() {}
private static final String Invk__prev_url_ = "prev_url_", Invk__curr_url_ = "curr_url_", Invk__diff_url_ = "diff_url_", Invk__commit_interval_ = "commit_interval_";
private static final String Invk__prev_url_ = "prev_url_", Invk__curr_url_ = "curr_url_", Invk__diff_url_ = "diff_url_"
, Invk__commit_interval_ = "commit_interval_", Invk__db_ids_ = "db_ids_", Invk__bld_name_ = "bld_name_";
}

View File

@@ -17,33 +17,42 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.bldrs.cmds.diffs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.core.brys.*; import gplx.core.brys.fmtrs.*;
import gplx.dbs.*; import gplx.dbs.metas.*; import gplx.dbs.diffs.*; import gplx.dbs.diffs.builds.*;
import gplx.dbs.*; import gplx.dbs.metas.*; import gplx.dbs.diffs.*; import gplx.dbs.diffs.builds.*; import gplx.dbs.diffs.itms.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*;
class Xob_diff_build_wkr {
private final Gfdb_diff_bldr dif_bldr = new Gfdb_diff_bldr();
private final Xowe_wiki wiki;
private Db_conn old_conn, new_conn, dif_conn;
public Xob_diff_build_wkr(Xob_bldr bldr, Xowe_wiki wiki, String old_url, String new_url, String dif_url, int commit_interval) {
private final Xowd_tbl_mapr tbl_mapr;
public Xob_diff_build_wkr(Xob_bldr bldr, Xowe_wiki wiki, String old_url, String new_url, String dif_url, int commit_interval, Xowd_tbl_mapr tbl_mapr) {
this.wiki = wiki;
wiki.Init_by_wiki();
Bry_fmt url_fmt = Bry_fmt.New("").Args_(New_url_args(wiki));
Bry_fmt url_fmt = Bry_fmt.New("").Args_(New_url_args(wiki, tbl_mapr.Name));
Bry_bfr tmp_bfr = Bry_bfr.new_();
old_conn = New_conn(Bool_.N, wiki, url_fmt, old_url, tmp_bfr);
new_conn = New_conn(Bool_.N, wiki, url_fmt, new_url, tmp_bfr);
dif_conn = New_conn(Bool_.Y, wiki, url_fmt, dif_url, tmp_bfr);
old_conn = New_conn(tmp_bfr, wiki, url_fmt, Bool_.N, old_url);
new_conn = New_conn(tmp_bfr, wiki, url_fmt, Bool_.N, new_url);
dif_conn = New_conn(tmp_bfr, wiki, url_fmt, Bool_.Y, dif_url);
this.tbl_mapr = tbl_mapr;
}
public void Exec() {
Gfdb_diff_db dif_db = new Gfdb_diff_db(dif_conn);
Gdif_core dif_core = new Gdif_core(dif_conn);
String name = String_.Format("{0}|{1}|diffs|{2}", wiki.Domain_str(), tbl_mapr.Name, wiki.Props().Modified_latest().XtoStr_fmt(DateAdp_.Fmt__yyyyMMdd)); // EX: "simple.wikipedia.org|text|diffs|20160112"
String made_by = wiki.App().User().Key();
Gdif_job_itm job_itm = dif_core.New_job(name, made_by);
Gdif_bldr_ctx ctx = new Gdif_bldr_ctx().Init(dif_core, job_itm);
Gfdb_diff_wkr__db dif_wkr = new Gfdb_diff_wkr__db();
Gdif_db dif_db = dif_core.Db();
dif_wkr.Init_conn(dif_db, 1000);
dif_bldr.Init(dif_wkr);
Dbmeta_tbl_mgr old_tbl_mgr = old_conn.Meta_tbl_load_all();
Dbmeta_tbl_mgr new_tbl_mgr = old_conn.Meta_tbl_load_all();
int new_tbl_len = new_tbl_mgr.Len();
int txn = -1;
for (int i = 0; i < new_tbl_len; ++i) {
Dbmeta_tbl_itm new_tbl = new_tbl_mgr.Get_at(i);
Dbmeta_tbl_itm old_tbl = old_tbl_mgr.Get_by(new_tbl.Name()); if (old_tbl == null) continue;
Gfdb_diff_tbl dif_tbl = Gfdb_diff_tbl.New(new_tbl);
dif_bldr.Compare(++txn, dif_tbl, old_conn, new_conn);
// save txn
// wiki.Data__core_mgr().Db__core().Conn().Conn_info();
Xowd_db_file[] db_files = wiki.Data__core_mgr().Db__core().Tbl__db().Select_all(wiki.Data__core_mgr().Props(), Io_url_.Empty);
int db_files_len = db_files.length;
for (int i = 0; i < db_files_len; ++i) {
Xowd_db_file db_file = db_files[i];
if (tbl_mapr.Db_ids__has(db_file.Tid()))
Compare(ctx);
}
// int old_tbl_len = old_tbl_mgr.Len();
// for (int i = 0; i < old_tbl_len; ++i) {
@@ -54,20 +63,35 @@ class Xob_diff_build_wkr {
// }
// }
}
public static Db_conn New_conn(boolean autocreate, Xow_wiki wiki, Bry_fmt fmtr, String url_fmt, Bry_bfr tmp_bfr) {
fmtr.Fmt_(url_fmt).Bld_bfr_many(tmp_bfr);
private void Compare(Gdif_bldr_ctx ctx) {
Dbmeta_tbl_mgr old_tbl_mgr = old_conn.Meta_tbl_load_all();
Dbmeta_tbl_mgr new_tbl_mgr = old_conn.Meta_tbl_load_all();
int new_tbl_len = new_tbl_mgr.Len();
for (int i = 0; i < new_tbl_len; ++i) {
Dbmeta_tbl_itm new_tbl = new_tbl_mgr.Get_at(i);
Dbmeta_tbl_itm old_tbl = old_tbl_mgr.Get_by(new_tbl.Name()); if (old_tbl == null) continue;
Gfdb_diff_tbl dif_tbl = Gfdb_diff_tbl.New(new_tbl);
dif_bldr.Compare(ctx, dif_tbl, old_conn, new_conn);
// save txn
}
}
public static Db_conn New_conn(Bry_bfr tmp_bfr, Xow_wiki wiki, Bry_fmt fmtr, boolean autocreate, String url_fmt) {
fmtr.Fmt_(url_fmt).Bld_many(tmp_bfr);
return Db_conn_bldr.Instance.Get_or_autocreate(autocreate, Io_url_.new_any_(tmp_bfr.To_str_and_clear()));
}
private static Bfr_fmt_arg[] New_url_args(Xow_wiki wiki) {
private static Bfr_fmt_arg[] New_url_args(Xow_wiki wiki, String db_mapr_name) {
Bfr_fmt_arg[] rv = new Bfr_fmt_arg[]
{ new Bfr_fmt_arg(Bry_.new_a7(".dump_dir"), new Bfr_arg__dump_dir(wiki))
, new Bfr_fmt_arg(Bry_.new_a7(".dump_core"), new Bfr_arg__dump_core(wiki))
, new Bfr_fmt_arg(Bry_.new_a7(".dump_domain"), new Bfr_arg__dump_domain(wiki))
, new Bfr_fmt_arg(Bry_.new_a7(".dir_spr"), new Bfr_arg__dir_spr())
, new Bfr_fmt_arg(Bry_.new_a7(".dif_name"), Bfr_arg_.New_bry(db_mapr_name))
};
return rv;
}
}
//old_url='~{.dump_dir}-prev/~{.dump_core}';
//new_url='~{.dump_dir}/~{.dump_core}';
//dif_url='~{.dump_dir}/~{.dump_domain}-diff.xowa';
//dif_url='~{.dump_dir}/~{.dump_domain}-{.dif_name}-diff.xowa';
// old_conn='data source="~{.dump_dir}/~{.dump_core}";url='
// dif_conn='gplx_key=sqlite;url='
}

View File

@@ -15,17 +15,20 @@ 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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.bldrs.cmds.randoms; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
public class Xob_rnd_cmd implements Xob_cmd {
// private final Xob_bldr bldr; private final Xowe_wiki wiki;
public Xob_rnd_cmd(Xob_bldr bldr, Xowe_wiki wiki) {}//this.bldr = bldr; this.wiki = wiki;}
public String Cmd_key() {return Xob_cmd_keys.Key_util_random;}
public void Cmd_run() {
package gplx.xowa.bldrs.cmds.diffs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.xowa.wikis.data.*;
class Xowd_tbl_mapr {
public Xowd_tbl_mapr(String name, int[] db_ids) {
this.Name = name;
this.Db_ids = db_ids;
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return this;}
public void Cmd_init(Xob_bldr bldr) {}
public void Cmd_bgn(Xob_bldr bldr) {}
public void Cmd_end() {}
public void Cmd_term() {}
public final String Name;
public final int[] Db_ids;
public boolean Db_ids__has(int id) {return true;}
// private static List_adp Fill_tbl_names(List_adp rv, int db_tid) {
// switch (db_tid) {
// case Xowd_db_file_.Tid_cat:
// return
// break;
// }
}

View File

@@ -48,7 +48,7 @@ public class Xob_diff_regy_make_cmd extends Xob_itm_basic_base implements Xob_cm
Sqlite_engine_.Idx_create(make_db_provider, Xob_diff_regy_tbl.Idx_diff_regy__load);
}
private void Make_delete_sql(Db_conn make_db_provider) {
DataRdr rdr = make_db_provider.Exec_sql_as_rdr(Xob_diff_regy_tbl.Make_deletes);
DataRdr rdr = make_db_provider.Exec_sql_as_old_rdr(Xob_diff_regy_tbl.Make_deletes);
int cur_db_id = -1, cur_count = 0;
Bry_bfr atr_bfr = Bry_bfr.new_(), bin_bfr = Bry_bfr.new_();
Io_url sql_tmp_dir = wiki.App().Fsys_mgr().File_dir().GenSubDir_nest(wiki.Domain_str(), "tmp_sql");

View File

@@ -49,7 +49,7 @@ public class Xob_orig_regy_update_cmd extends Xob_itm_basic_base implements Xob_
}
*/
}
public DataRdr Select(Db_conn p, byte prv_repo_id, byte[] prv_ttl) {
public DataRdr Select(Db_conn conn, byte prv_repo_id, byte[] prv_ttl) {
String sql = String_.Concat_lines_nl_skip_last
( "SELECT lnki_ttl"
, "FROM orig_regy"
@@ -58,7 +58,7 @@ public class Xob_orig_regy_update_cmd extends Xob_itm_basic_base implements Xob_
, "AND oimg_orig_page_id = -1;"
);
Db_qry select_qry = Db_qry_sql.rdr_(sql);
return p.Exec_qry_as_rdr(select_qry);
return conn.Exec_qry_as_old_rdr(select_qry);
}
public void Cmd_run() {}
public void Cmd_end() {}

View File

@@ -33,19 +33,19 @@ public class Xob_xfer_regy_tbl {
p.Exec_sql(Sql_create_data_thumb);
}
public static void Create_index(Gfo_usr_dlg usr_dlg, Db_conn p) {Sqlite_engine_.Idx_create(usr_dlg, p, Xob_db_file.Name__file_make, Idx_lnki_page_id, Idx_lnki_ttl);}
public static DataRdr Select(Db_conn p, byte repo_id, byte[] ttl, int limit) {
public static DataRdr Select(Db_conn conn, byte repo_id, byte[] ttl, int limit) {
Db_qry qry = Db_qry_.select_().Cols_all_()
.From_(Tbl_name)
.Where_(gplx.core.criterias.Criteria_.And_many(Db_crt_.mte_(Fld_orig_repo, repo_id), Db_crt_.mt_(Fld_lnki_ttl, String_.new_u8(ttl)), Db_crt_.eq_(Fld_xfer_status, 0)))
.OrderBy_many_(Fld_xfer_status, Fld_orig_repo, Fld_lnki_ttl, Fld_file_w)
.Where_(gplx.core.criterias.Criteria_.And_many(Db_crt_.New_mte(Fld_orig_repo, repo_id), Db_crt_.New_mt(Fld_lnki_ttl, String_.new_u8(ttl)), Db_crt_.New_eq(Fld_xfer_status, 0)))
.Order_asc_many_(Fld_xfer_status, Fld_orig_repo, Fld_lnki_ttl, Fld_file_w)
.Limit_(limit)
;
return p.Exec_qry_as_rdr(qry);
return conn.Exec_qry_as_old_rdr(qry);
}
public static Db_stmt Select_by_page_id_stmt(Db_conn p) {return p.Stmt_new(Db_qry_sql.rdr_(Sql_select));}
public static Db_stmt Select_by_page_id_stmt(Db_conn p) {return p.Stmt_new(Db_qry_sql.rdr_(Sql_select_itm));}
public static DataRdr Select_by_page_id(Db_stmt stmt, int page_id, int limit) {return stmt.Val_int(page_id).Val_int(limit).Exec_select();}
private static final String
Sql_select = String_.Concat_lines_nl
Sql_select_itm = String_.Concat_lines_nl
( "SELECT *"
, "FROM xfer_regy"
, "WHERE xfer_status = 0"
@@ -59,17 +59,17 @@ public class Xob_xfer_regy_tbl {
, "WHERE xfer_status = 0"
)
;
public static DataRdr Select_by_tier_page(Db_conn p, int tier_id, int page_id, int select_interval) {
public static DataRdr Select_by_tier_page(Db_conn conn, int tier_id, int page_id, int select_interval) {
Db_qry qry = Db_qry_.select_().Cols_all_()
.From_(Tbl_name)
.Where_(gplx.core.criterias.Criteria_.And_many(Db_crt_.eq_(Fld_xfer_status, 0), Db_crt_.eq_(Fld_lnki_tier_id, tier_id), Db_crt_.mte_(Fld_lnki_page_id, page_id)))
.OrderBy_many_(Fld_lnki_tier_id, Fld_lnki_page_id, Fld_lnki_id)
.Where_(gplx.core.criterias.Criteria_.And_many(Db_crt_.New_eq(Fld_xfer_status, 0), Db_crt_.New_eq(Fld_lnki_tier_id, tier_id), Db_crt_.New_mte(Fld_lnki_page_id, page_id)))
.Order_asc_many_(Fld_lnki_tier_id, Fld_lnki_page_id, Fld_lnki_id)
.Limit_(select_interval)
;
return p.Exec_qry_as_rdr(qry);
return conn.Exec_qry_as_old_rdr(qry);
}
public static int Select_total_pending(Db_conn p) {
DataRdr rdr = p.Exec_sql_as_rdr(Sql_select_total_pending);
DataRdr rdr = p.Exec_sql_as_old_rdr(Sql_select_total_pending);
int rv = 0;
if (rdr.MoveNextPeer())
rv = rdr.ReadInt("CountAll");

View File

@@ -30,7 +30,7 @@ public class Xob_xfer_temp_cmd_orig extends Xob_itm_basic_base implements Xob_cm
Xob_xfer_temp_tbl.Create_table(conn);
Db_stmt trg_stmt = Xob_xfer_temp_tbl.Insert_stmt(conn);
conn.Txn_bgn("bldr__xfer_temp");
DataRdr rdr = conn.Exec_sql_as_rdr(Sql_select);
DataRdr rdr = conn.Exec_sql_as_old_rdr(Sql_select_itm);
long[] ext_maxs = Calc_ext_max();
while (rdr.MoveNextPeer()) {
int lnki_ext = rdr.ReadByte(Xob_lnki_regy_tbl.Fld_lnki_ext);
@@ -76,7 +76,7 @@ public class Xob_xfer_temp_cmd_orig extends Xob_itm_basic_base implements Xob_cm
public void Cmd_end() {}
public void Cmd_term() {}
private static final String
Sql_select = String_.Concat_lines_nl
Sql_select_itm = String_.Concat_lines_nl
( "SELECT DISTINCT"
, " l.lnki_id"
// , ", lnki_ttl"

View File

@@ -28,7 +28,7 @@ public class Xob_xfer_temp_cmd_thumb extends Xob_itm_basic_base implements Xob_c
Xob_xfer_temp_tbl.Create_table(conn);
Db_stmt trg_stmt = Xob_xfer_temp_tbl.Insert_stmt(conn);
conn.Txn_bgn("bldr__xfer_temp_thumb");
DataRdr rdr = conn.Exec_sql_as_rdr(Sql_select);
DataRdr rdr = conn.Exec_sql_as_old_rdr(Sql_select_itm);
Xob_xfer_temp_itm temp_itm = new Xob_xfer_temp_itm();
Xof_img_size img_size = new Xof_img_size();
byte[] cur_ttl = Bry_.Empty; byte cur_repo = Byte_.Max_value_127;
@@ -52,7 +52,7 @@ public class Xob_xfer_temp_cmd_thumb extends Xob_itm_basic_base implements Xob_c
public void Cmd_end() {}
public void Cmd_term() {}
private static final String
Sql_select = String_.Concat_lines_nl
Sql_select_itm = String_.Concat_lines_nl
( "SELECT l.lnki_id"
, ", l.lnki_tier_id"
, ", l.lnki_page_id"

View File

@@ -37,6 +37,7 @@ public class Xob_search_sql_cmd extends Xob_itm_basic_base implements Xob_cmd {
Db_conn search_conn = search_db.Conn();
Xowd_search_temp_tbl search_temp_tbl = new Xowd_search_temp_tbl(search_conn, db_mgr.Props().Schema_is_1());
search_temp_tbl.Create_tbl();
search_conn.Exec_delete_all(search_temp_tbl.Tbl_name());
search_temp_tbl.Insert_bgn();
Xowd_page_tbl page_tbl = db_mgr.Tbl__page();
Db_rdr page_rdr = page_tbl.Select_all();

View File

@@ -22,7 +22,7 @@ import gplx.xowa.langs.*;
import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.tbls.*;
public class Xob_search_sql_wkr extends Xob_search_base implements Io_make_cmd { // search version 2
private Xowd_db_mgr db_mgr; private Xowd_search_link_tbl search_page_tbl; private Xowd_search_word_tbl search_word_tbl;
private int search_id = 0; private byte[] prv_word = Bry_.Empty; private int page_count;
private int search_id = 0; private byte[] prv_word = null; private int page_count;
public Xob_search_sql_wkr(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);}
@Override public String Wkr_key() {return Xob_cmd_keys.Key_text_search_wkr;}
@Override public gplx.core.ios.Io_make_cmd Make_cmd_site() {return this;}
@@ -35,20 +35,22 @@ public class Xob_search_sql_wkr extends Xob_search_base implements Io_make_cmd {
this.search_word_tbl = db_mgr.Db__search().Tbl__search_word();
search_page_tbl.Insert_bgn(); search_word_tbl.Insert_bgn();
}
public void Sort_do(Io_line_rdr rdr) {
byte[] bry = rdr.Bfr();
byte[] cur_word = Bry_.Mid(bry, rdr.Key_pos_bgn(), rdr.Key_pos_end());
if (!Bry_.Eq(cur_word, prv_word)) {
search_word_tbl.Insert_cmd_by_batch(++search_id, prv_word, page_count);
public void Sort_do(Io_line_rdr rdr) {Sort_do(rdr.Bfr(), rdr.Key_pos_bgn(), rdr.Key_pos_end());}
public void Sort_do(byte[] line, int key_bgn, int key_end) {// EX: abc|123
byte[] cur_word = Bry_.Mid(line, key_bgn, key_end);
if (!Bry_.Eq(cur_word, prv_word)) { // if new_word, insert old one
if (prv_word != null) // do not insert for 1st word
search_word_tbl.Insert_cmd_by_batch(search_id, prv_word, page_count);
++search_id;
prv_word = cur_word;
page_count = 0;
}
search_page_tbl.Insert_cmd_by_batch(search_id, Base85_.To_int_by_bry(bry, rdr.Key_pos_end() + 1, rdr.Key_pos_end() + 5)); // -1: ignore rdr_dlm
search_page_tbl.Insert_cmd_by_batch(search_id, Base85_.To_int_by_bry(line, key_end + 1, key_end + 5)); // -1: ignore rdr_dlm
++page_count;
if (search_id % 10000 == 0)
usr_dlg.Prog_many("", "", "creating title index: count=~{0}", search_id);
if (search_id % 10000 == 0) usr_dlg.Prog_many("", "", "creating title index: count=~{0}", search_id);
}
public void Sort_end() {
search_word_tbl.Insert_cmd_by_batch(search_id, prv_word, page_count);
search_page_tbl.Insert_end(); search_word_tbl.Insert_end();
Xowd_db_file search_db = db_mgr.Db__search();
Xowd_search_temp_tbl search_temp_tbl = new Xowd_search_temp_tbl(search_db.Conn(), db_mgr.Props().Schema_is_1());

View File

@@ -0,0 +1,68 @@
/*
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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*;
import org.junit.*; import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*;
public class Xob_search_sql_wkr_tst {
private final Xob_search_sql_wkr_fxt fxt = new Xob_search_sql_wkr_fxt();
@Test public void Basic() {
fxt.Exec__sort
( "a|!!!!#"
, "a|!!!!$"
, "b|!!!!#"
, "b|!!!!$"
, "b|!!!!%"
);
fxt.Test__search_word
( "1|a|2"
, "2|b|3"
);
fxt.Test__search_link
( "1|2"
, "1|3"
, "2|2"
, "2|3"
, "2|4"
);
}
}
class Xob_search_sql_wkr_fxt {
private final Xob_search_sql_wkr wkr;
private final Xowe_wiki wiki;
private final Bry_bfr tmp_bfr = Bry_bfr.new_();
public Xob_search_sql_wkr_fxt() {
Xoae_app app = Xoa_app_fxt.app_();
this.wiki = Xoa_app_fxt.wiki_tst_(app);
Xoa_test_.Db__init__mem(wiki);
wkr = new Xob_search_sql_wkr(app.Bldr(), wiki);
}
public void Exec__sort(String... lines_str) {
byte[][] lines = Bry_.Ary(lines_str);
wkr.Sort_bgn();
for (byte[] line : lines)
wkr.Sort_do(line, 0, Bry_find_.Find_fwd(line, Byte_ascii.Pipe));
wkr.Sort_end();
}
public void Test__search_word(String... lines) {
Xowd_search_word_tbl tbl = wiki.Data__core_mgr().Db__search().Tbl__search_word();
Tfds.Eq_str_lines(String_.Concat_lines_nl(lines), Xoa_test_.Db__print_tbl_as_str(tmp_bfr, tbl.conn, tbl.Tbl_name(), tbl.Fld_id(), tbl.Fld_text(), tbl.Fld_page_count()));
}
public void Test__search_link(String... lines) {
Xowd_search_link_tbl tbl = wiki.Data__core_mgr().Db__search().Tbl__search_link();
Tfds.Eq_str_lines(String_.Concat_lines_nl(lines), Xoa_test_.Db__print_tbl_as_str(tmp_bfr, tbl.conn, tbl.Tbl_name(), tbl.Fld_word_id(), tbl.Fld_page_id()));
}
}