Mass_parse: Do not reuse json_parser else threading issues with itwiki [#818]

master
gnosygnu 4 years ago
parent 541f5f6524
commit 845253af79

@ -106,7 +106,6 @@ public class Wdata_wiki_mgr implements Gfo_evt_itm, Gfo_invk {
} }
return wdata_wiki; return wdata_wiki;
} private Xowe_wiki wdata_wiki; } private Xowe_wiki wdata_wiki;
public Json_parser Jdoc_parser() {return jdoc_parser;} private Json_parser jdoc_parser = new Json_parser();
public void Init_by_app() {} public void Init_by_app() {}
public Wdata_doc_parser Wdoc_parser(Json_doc jdoc) { public Wdata_doc_parser Wdoc_parser(Json_doc jdoc) {
Json_kv itm_0 = Json_kv.Cast(jdoc.Root_nde().Get_at(0)); // get 1st node Json_kv itm_0 = Json_kv.Cast(jdoc.Root_nde().Get_at(0)); // get 1st node

@ -29,6 +29,7 @@ import gplx.Tfds;
import gplx.core.primitives.Gfo_number_parser; import gplx.core.primitives.Gfo_number_parser;
import gplx.core.primitives.Int_obj_ref; import gplx.core.primitives.Int_obj_ref;
import gplx.langs.jsons.Json_doc; import gplx.langs.jsons.Json_doc;
import gplx.langs.jsons.Json_parser;
import gplx.xowa.Xoa_ttl; import gplx.xowa.Xoa_ttl;
import gplx.xowa.Xoae_app; import gplx.xowa.Xoae_app;
import gplx.xowa.Xoae_page; import gplx.xowa.Xoae_page;
@ -62,6 +63,7 @@ public class Wdata_wiki_mgr_fxt {
private Xoae_app app; private Xowe_wiki wiki; private Wdata_doc_bldr wdoc_bldr; private Xoae_app app; private Xowe_wiki wiki; private Wdata_doc_bldr wdoc_bldr;
private final Wdata_xwiki_link_wtr wdata_lang_wtr = new Wdata_xwiki_link_wtr(); private final Wdata_xwiki_link_wtr wdata_lang_wtr = new Wdata_xwiki_link_wtr();
private final Bry_bfr tmp_time_bfr = Bry_bfr_.New(); private final Bry_bfr tmp_time_bfr = Bry_bfr_.New();
private final Json_parser jsonParser = new Json_parser();
public Xowe_wiki Wiki() {return parser_fxt.Wiki();} public Xowe_wiki Wiki() {return parser_fxt.Wiki();}
public Wdata_wiki_mgr_fxt Init() {return Init(new Xop_fxt(), true);} public Wdata_wiki_mgr_fxt Init() {return Init(new Xop_fxt(), true);}
public Wdata_wiki_mgr_fxt Init(Xop_fxt parser_fxt, boolean reset) { public Wdata_wiki_mgr_fxt Init(Xop_fxt parser_fxt, boolean reset) {
@ -224,7 +226,7 @@ public class Wdata_wiki_mgr_fxt {
byte[] raw_bry = Bry_.new_a7(raw_str); byte[] raw_bry = Bry_.new_a7(raw_str);
raw_bry = Bry_.new_u8(Json_doc.Make_str_by_apos(raw_str)); raw_bry = Bry_.new_u8(Json_doc.Make_str_by_apos(raw_str));
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512();
Wdata_wiki_mgr.Write_json_as_html(wdata_mgr.Jdoc_parser(), bfr, raw_bry); Wdata_wiki_mgr.Write_json_as_html(jsonParser, bfr, raw_bry);
Tfds.Eq(expd, bfr.To_str_and_rls()); Tfds.Eq(expd, bfr.To_str_and_rls());
} }
public static String New_json(String entity_id, String grp_key, String[] grp_vals) { public static String New_json(String entity_id, String grp_key, String[] grp_vals) {

@ -1,6 +1,6 @@
/* /*
XOWA: the XOWA Offline Wiki Application XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com Copyright (C) 2012-2020 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3, XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0. or alternatively under the terms of the Apache License Version 2.0.
@ -13,414 +13,451 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/ */
package gplx.xowa.xtns.wbases.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wbases.*; package gplx.xowa.xtns.wbases.imports;
import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.bldrs.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.origs.*;
import gplx.xowa.bldrs.wkrs.*; import gplx.Bool_;
import gplx.langs.jsons.*; import gplx.Bry_;
import gplx.xowa.langs.*; import gplx.Byte_ascii;
import gplx.xowa.wikis.nss.*; import gplx.Gfo_usr_dlg;
import gplx.xowa.bldrs.cmds.*; import gplx.xowa.wikis.data.tbls.*; import gplx.Int_ary_;
import gplx.xowa.xtns.wbases.*; import gplx.xowa.xtns.wbases.core.*; import gplx.xowa.xtns.wbases.claims.*; import gplx.xowa.xtns.wbases.claims.itms.*; import gplx.Ordered_hash;
public class Xob_wdata_db_cmd extends Xob_dump_mgr_base implements Xob_cmd { import gplx.String_;
private Wdata_tbl_mgr tbl_mgr = new Wdata_tbl_mgr(); import gplx.dbs.Db_conn;
private Wdata_wiki_mgr wdata_mgr; private Json_parser json_parser; import gplx.dbs.Db_idx_itm;
private byte[] lang_key = Xol_lang_itm_.Key_en; import gplx.dbs.Db_stmt;
public Xob_wdata_db_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} import gplx.dbs.Db_stmt_;
@Override public String Cmd_key() {return Xob_cmd_keys.Key_wbase_db;} import gplx.dbs.cfgs.Db_cfg_tbl;
@Override public byte Init_redirect() {return Bool_.N_byte;} // json will never be found in a redirect import gplx.dbs.engines.sqlite.Sqlite_engine_;
@Override public int[] Init_ns_ary() {return Int_ary_.New(Xow_ns_.Tid__main, Wdata_wiki_mgr.Ns_property);} import gplx.langs.jsons.Json_doc;
@Override protected void Init_reset(Db_conn conn) { import gplx.langs.jsons.Json_grp;
Db_cfg_tbl cfg_tbl = gplx.xowa.wikis.data.Xowd_cfg_tbl_.New(conn); import gplx.langs.jsons.Json_itm;
cfg_tbl.Delete_all(); import gplx.langs.jsons.Json_itm_;
} import gplx.langs.jsons.Json_kv;
@Override protected Db_conn Init_db_file() { import gplx.langs.jsons.Json_nde;
Xob_db_file tbl_file = Xob_db_file.New(wiki.Fsys_mgr().Root_dir(), "wdata_db.sqlite3"); import gplx.langs.jsons.Json_parser;
Db_conn conn = tbl_file.Conn(); import gplx.xowa.Xowe_wiki;
tbl_mgr.Init(conn); import gplx.xowa.bldrs.Xob_bldr;
return conn; import gplx.xowa.bldrs.Xob_cmd_keys;
} import gplx.xowa.bldrs.Xob_db_file;
@Override protected void Cmd_bgn_end() { import gplx.xowa.bldrs.cmds.Xob_dump_mgr_base;
wdata_mgr = bldr.App().Wiki_mgr().Wdata_mgr(); import gplx.xowa.bldrs.wkrs.Xob_cmd;
json_parser = wdata_mgr.Jdoc_parser(); import gplx.xowa.langs.Xol_lang_itm_;
tbl_mgr.Conn().Txn_bgn("bldr__wdata_db"); import gplx.xowa.wikis.data.tbls.Xowd_page_itm;
} import gplx.xowa.wikis.nss.Xow_ns;
@Override public void Exec_pg_itm_hook(int ns_ord, Xow_ns ns, Xowd_page_itm page, byte[] page_src) { import gplx.xowa.wikis.nss.Xow_ns_;
Json_doc jdoc = json_parser.Parse(page_src); if (jdoc == null) return; // not a json document import gplx.xowa.xtns.wbases.Wdata_doc;
Wdata_doc wdoc = new Wdata_doc(wdata_mgr, jdoc, page.Ttl_page_db()); import gplx.xowa.xtns.wbases.Wdata_wiki_mgr;
tbl_mgr.Exec_insert_by_wdoc(lang_key, wdata_mgr, page.Id(), wdoc); import gplx.xowa.xtns.wbases.claims.Wbase_claim_grp;
} import gplx.xowa.xtns.wbases.claims.Wbase_claim_visitor;
@Override public void Exec_commit_hook() { import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_base;
tbl_mgr.Conn().Txn_sav(); import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_entity;
} import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_globecoordinate;
@Override public void Exec_end_hook() { import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_monolingualtext;
tbl_mgr.Term(usr_dlg); import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_quantity;
} import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_string;
} import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_time;
class Wdata_tbl_mgr { import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_value;
private Wdata_tbl_base[] tbls; private int tbls_len;
public Wdata_tbl_mgr() { public class Xob_wdata_db_cmd extends Xob_dump_mgr_base implements Xob_cmd {
tbls = new Wdata_tbl_base[] {label_tbl, alias_tbl, description_tbl, link_tbl, claim_tbl, claim_time_tbl, claim_geo_tbl}; private Wdata_tbl_mgr tbl_mgr = new Wdata_tbl_mgr();
tbls_len = tbls.length; private Wdata_wiki_mgr wdata_mgr;
} private byte[] lang_key = Xol_lang_itm_.Key_en;
public Db_conn Conn() {return conn;} private Db_conn conn; private final Json_parser json_parser = new Json_parser();
public Wdata_label_tbl Label_tbl() {return label_tbl;} private Wdata_label_tbl label_tbl = new Wdata_label_tbl(); public Xob_wdata_db_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);}
public Wdata_alias_tbl Alias_tbl() {return alias_tbl;} private Wdata_alias_tbl alias_tbl = new Wdata_alias_tbl(); @Override public String Cmd_key() {return Xob_cmd_keys.Key_wbase_db;}
public Wdata_description_tbl Description_tbl() {return description_tbl;} private Wdata_description_tbl description_tbl = new Wdata_description_tbl(); @Override public byte Init_redirect() {return Bool_.N_byte;} // json will never be found in a redirect
public Wdata_link_tbl Link_tbl() {return link_tbl;} private Wdata_link_tbl link_tbl = new Wdata_link_tbl(); @Override public int[] Init_ns_ary() {return Int_ary_.New(Xow_ns_.Tid__main, Wdata_wiki_mgr.Ns_property);}
public Wbase_claim_tbl Claim_tbl() {return claim_tbl;} private Wbase_claim_tbl claim_tbl = new Wbase_claim_tbl(); @Override protected void Init_reset(Db_conn conn) {
public Wbase_claim_time_tbl Claim_time_tbl() {return claim_time_tbl;} private Wbase_claim_time_tbl claim_time_tbl = new Wbase_claim_time_tbl(); Db_cfg_tbl cfg_tbl = gplx.xowa.wikis.data.Xowd_cfg_tbl_.New(conn);
public Wbase_claim_geo_tbl Claim_geo_tbl() {return claim_geo_tbl;} private Wbase_claim_geo_tbl claim_geo_tbl = new Wbase_claim_geo_tbl(); cfg_tbl.Delete_all();
public void Init(Db_conn conn) { }
this.conn = conn; @Override protected Db_conn Init_db_file() {
for (int i = 0; i < tbls_len; i++) Xob_db_file tbl_file = Xob_db_file.New(wiki.Fsys_mgr().Root_dir(), "wdata_db.sqlite3");
tbls[i].Init(conn); Db_conn conn = tbl_file.Conn();
} tbl_mgr.Init(conn);
public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) { return conn;
for (int i = 0; i < tbls_len; i++) }
tbls[i].Exec_insert_by_wdoc(lang_key, wdata_mgr, page_id, wdoc); @Override protected void Cmd_bgn_end() {
} wdata_mgr = bldr.App().Wiki_mgr().Wdata_mgr();
public void Term(Gfo_usr_dlg usr_dlg) { tbl_mgr.Conn().Txn_bgn("bldr__wdata_db");
conn.Txn_end(); }
for (int i = 0; i < tbls_len; i++) @Override public void Exec_pg_itm_hook(int ns_ord, Xow_ns ns, Xowd_page_itm page, byte[] page_src) {
tbls[i].Make_idxs(usr_dlg, conn); Json_doc jdoc = json_parser.Parse(page_src); if (jdoc == null) return; // not a json document
} Wdata_doc wdoc = new Wdata_doc(wdata_mgr, jdoc, page.Ttl_page_db());
} tbl_mgr.Exec_insert_by_wdoc(lang_key, wdata_mgr, page.Id(), wdoc);
abstract class Wdata_tbl_base { }
public abstract String Tbl_name(); @Override public void Exec_commit_hook() {
public abstract String Tbl_create_sql(); tbl_mgr.Conn().Txn_sav();
public abstract Db_idx_itm[] Idx_ary(); }
public abstract String[] Fld_ary(); @Override public void Exec_end_hook() {
@gplx.Virtual public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) {} tbl_mgr.Term(usr_dlg);
public void Make_tbl(Db_conn p) {Sqlite_engine_.Tbl_create(p, this.Tbl_name(), this.Tbl_create_sql());} }
public void Make_idxs(Gfo_usr_dlg usr_dlg, Db_conn p) { }
Sqlite_engine_.Idx_create(usr_dlg, p, this.Tbl_name(), this.Idx_ary()); class Wdata_tbl_mgr {
} private Wdata_tbl_base[] tbls; private int tbls_len;
public Db_stmt Make_insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, this.Tbl_name(), this.Fld_ary());} public Wdata_tbl_mgr() {
public Db_stmt Insert_stmt() {return insert_stmt;} private Db_stmt insert_stmt; tbls = new Wdata_tbl_base[] {label_tbl, alias_tbl, description_tbl, link_tbl, claim_tbl, claim_time_tbl, claim_geo_tbl};
public void Init(Db_conn conn) { tbls_len = tbls.length;
this.Make_tbl(conn); }
insert_stmt = this.Make_insert_stmt(conn); public Db_conn Conn() {return conn;} private Db_conn conn;
} public Wdata_label_tbl Label_tbl() {return label_tbl;} private Wdata_label_tbl label_tbl = new Wdata_label_tbl();
public static void Exec_insert_kvs(Db_stmt stmt, int page_id, Ordered_hash hash) { public Wdata_alias_tbl Alias_tbl() {return alias_tbl;} private Wdata_alias_tbl alias_tbl = new Wdata_alias_tbl();
int len = hash.Count(); public Wdata_description_tbl Description_tbl() {return description_tbl;} private Wdata_description_tbl description_tbl = new Wdata_description_tbl();
for (int i = 0; i < len; i++) { public Wdata_link_tbl Link_tbl() {return link_tbl;} private Wdata_link_tbl link_tbl = new Wdata_link_tbl();
Json_kv kv = (Json_kv)hash.Get_at(i); public Wbase_claim_tbl Claim_tbl() {return claim_tbl;} private Wbase_claim_tbl claim_tbl = new Wbase_claim_tbl();
stmt.Clear() public Wbase_claim_time_tbl Claim_time_tbl() {return claim_time_tbl;} private Wbase_claim_time_tbl claim_time_tbl = new Wbase_claim_time_tbl();
.Val_int(page_id) public Wbase_claim_geo_tbl Claim_geo_tbl() {return claim_geo_tbl;} private Wbase_claim_geo_tbl claim_geo_tbl = new Wbase_claim_geo_tbl();
.Val_bry_as_str(kv.Key().Data_bry()) public void Init(Db_conn conn) {
.Val_bry_as_str(kv.Val().Data_bry()) this.conn = conn;
.Exec_insert(); for (int i = 0; i < tbls_len; i++)
} tbls[i].Init(conn);
} }
} public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) {
class Wdata_label_tbl extends Wdata_tbl_base { for (int i = 0; i < tbls_len; i++)
@Override public String Tbl_name() {return "wdata_label";} tbls[i].Exec_insert_by_wdoc(lang_key, wdata_mgr, page_id, wdoc);
@Override public String Tbl_create_sql() { }
return String_.Concat_lines_nl public void Term(Gfo_usr_dlg usr_dlg) {
( "CREATE TABLE IF NOT EXISTS wdata_label" conn.Txn_end();
, "( page_id integer NOT NULL" for (int i = 0; i < tbls_len; i++)
, ", lang_key varchar(16) NOT NULL" tbls[i].Make_idxs(usr_dlg, conn);
, ", val varchar(255) NOT NULL" }
, ");" }
); abstract class Wdata_tbl_base {
} public abstract String Tbl_name();
@Override public Db_idx_itm[] Idx_ary() {return new Db_idx_itm[] {Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_label__main ON wdata_label (page_id, lang_key);")};} public abstract String Tbl_create_sql();
@Override public String[] Fld_ary() {return new String[] {Fld_page_id, Fld_lang_key, Fld_val};} public abstract Db_idx_itm[] Idx_ary();
@Override public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) {Exec_insert_kvs(this.Insert_stmt(), page_id, wdoc.Label_list());} public abstract String[] Fld_ary();
private static final String Fld_page_id = "page_id", Fld_lang_key = "lang_key", Fld_val = "val"; @gplx.Virtual public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) {}
} public void Make_tbl(Db_conn p) {Sqlite_engine_.Tbl_create(p, this.Tbl_name(), this.Tbl_create_sql());}
class Wdata_alias_tbl extends Wdata_tbl_base { public void Make_idxs(Gfo_usr_dlg usr_dlg, Db_conn p) {
@Override public String Tbl_name() {return "wdata_alias";} Sqlite_engine_.Idx_create(usr_dlg, p, this.Tbl_name(), this.Idx_ary());
@Override public String Tbl_create_sql() { }
return String_.Concat_lines_nl public Db_stmt Make_insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, this.Tbl_name(), this.Fld_ary());}
( "CREATE TABLE IF NOT EXISTS wdata_alias" public Db_stmt Insert_stmt() {return insert_stmt;} private Db_stmt insert_stmt;
, "( page_id integer NOT NULL" public void Init(Db_conn conn) {
, ", lang_key varchar(16) NOT NULL" this.Make_tbl(conn);
, ", val varchar(255) NOT NULL" insert_stmt = this.Make_insert_stmt(conn);
, ");" }
); public static void Exec_insert_kvs(Db_stmt stmt, int page_id, Ordered_hash hash) {
} int len = hash.Count();
@Override public Db_idx_itm[] Idx_ary() {return new Db_idx_itm[] {Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_alias__main ON wdata_alias (page_id, lang_key);")};} for (int i = 0; i < len; i++) {
@Override public String[] Fld_ary() {return new String[] {Fld_page_id, Fld_lang_key, Fld_val};} Json_kv kv = (Json_kv)hash.Get_at(i);
@Override public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) { stmt.Clear()
Ordered_hash hash = wdoc.Alias_list(); .Val_int(page_id)
int len = hash.Count(); .Val_bry_as_str(kv.Key().Data_bry())
Db_stmt insert_stmt = this.Insert_stmt(); .Val_bry_as_str(kv.Val().Data_bry())
for (int i = 0; i < len; i++) { .Exec_insert();
Json_kv kv = (Json_kv)hash.Get_at(i); }
byte[] key = kv.Key().Data_bry(); }
Json_grp val_grp = (Json_grp)kv.Val(); }
int val_grp_len = val_grp.Len(); class Wdata_label_tbl extends Wdata_tbl_base {
for (int j = 0; j < val_grp_len; j++) { @Override public String Tbl_name() {return "wdata_label";}
Json_itm val_itm = val_grp.Get_at(j); @Override public String Tbl_create_sql() {
byte[] val = Bry_.Empty; return String_.Concat_lines_nl
if (val_itm.Tid() == Json_itm_.Tid__str) ( "CREATE TABLE IF NOT EXISTS wdata_label"
val = val_itm.Data_bry(); , "( page_id integer NOT NULL"
else if (val_itm.Tid() == Json_itm_.Tid__kv) { // EX: q80 and de aliases , ", lang_key varchar(16) NOT NULL"
val = ((Json_kv)val_itm).Val().Data_bry(); , ", val varchar(255) NOT NULL"
} , ");"
insert_stmt.Clear() );
.Val_int(page_id) }
.Val_bry_as_str(key) @Override public Db_idx_itm[] Idx_ary() {return new Db_idx_itm[] {Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_label__main ON wdata_label (page_id, lang_key);")};}
.Val_bry_as_str(val) @Override public String[] Fld_ary() {return new String[] {Fld_page_id, Fld_lang_key, Fld_val};}
.Exec_insert(); @Override public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) {Exec_insert_kvs(this.Insert_stmt(), page_id, wdoc.Label_list());}
} private static final String Fld_page_id = "page_id", Fld_lang_key = "lang_key", Fld_val = "val";
} }
} class Wdata_alias_tbl extends Wdata_tbl_base {
private static final String Fld_page_id = "page_id", Fld_lang_key = "lang_key", Fld_val = "val"; @Override public String Tbl_name() {return "wdata_alias";}
} @Override public String Tbl_create_sql() {
class Wdata_description_tbl extends Wdata_tbl_base { return String_.Concat_lines_nl
@Override public String Tbl_name() {return "wdata_description";} ( "CREATE TABLE IF NOT EXISTS wdata_alias"
@Override public String Tbl_create_sql() { , "( page_id integer NOT NULL"
return String_.Concat_lines_nl , ", lang_key varchar(16) NOT NULL"
( "CREATE TABLE IF NOT EXISTS wdata_description" , ", val varchar(255) NOT NULL"
, "( page_id integer NOT NULL" , ");"
, ", lang_key varchar(16) NOT NULL" );
, ", val varchar(255) NOT NULL" }
, ");" @Override public Db_idx_itm[] Idx_ary() {return new Db_idx_itm[] {Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_alias__main ON wdata_alias (page_id, lang_key);")};}
); @Override public String[] Fld_ary() {return new String[] {Fld_page_id, Fld_lang_key, Fld_val};}
} @Override public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) {
@Override public Db_idx_itm[] Idx_ary() {return new Db_idx_itm[] {Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_description__main ON wdata_description (page_id, lang_key);")};} Ordered_hash hash = wdoc.Alias_list();
@Override public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) {Exec_insert_kvs(this.Insert_stmt(), page_id, wdoc.Descr_list());} int len = hash.Count();
@Override public String[] Fld_ary() {return new String[] {Fld_page_id, Fld_lang_key, Fld_val};} Db_stmt insert_stmt = this.Insert_stmt();
private static final String Fld_page_id = "page_id", Fld_lang_key = "lang_key", Fld_val = "val"; for (int i = 0; i < len; i++) {
} Json_kv kv = (Json_kv)hash.Get_at(i);
class Wdata_link_tbl extends Wdata_tbl_base { byte[] key = kv.Key().Data_bry();
@Override public String Tbl_name() {return "wdata_link";} Json_grp val_grp = (Json_grp)kv.Val();
@Override public String Tbl_create_sql() { int val_grp_len = val_grp.Len();
return String_.Concat_lines_nl for (int j = 0; j < val_grp_len; j++) {
( "CREATE TABLE IF NOT EXISTS wdata_link" Json_itm val_itm = val_grp.Get_at(j);
, "( page_id integer NOT NULL" byte[] val = Bry_.Empty;
, ", wiki_key varchar(255) NOT NULL" if (val_itm.Tid() == Json_itm_.Tid__str)
, ", val varchar(255) NOT NULL" val = val_itm.Data_bry();
, ");" else if (val_itm.Tid() == Json_itm_.Tid__kv) { // EX: q80 and de aliases
); val = ((Json_kv)val_itm).Val().Data_bry();
} }
@Override public Db_idx_itm[] Idx_ary() {return new Db_idx_itm[] {Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_link__main ON wdata_link (page_id, wiki_key);")};} insert_stmt.Clear()
@Override public String[] Fld_ary() {return new String[] {Fld_page_id, Fld_wiki_key, Fld_val};} .Val_int(page_id)
@Override public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) { .Val_bry_as_str(key)
Ordered_hash hash = wdoc.Slink_list(); .Val_bry_as_str(val)
int len = hash.Count(); .Exec_insert();
Db_stmt insert_stmt = this.Insert_stmt(); }
for (int i = 0; i < len; i++) { }
Json_kv kv = (Json_kv)hash.Get_at(i); }
byte[] key = kv.Key().Data_bry(); private static final String Fld_page_id = "page_id", Fld_lang_key = "lang_key", Fld_val = "val";
Json_itm kv_val = kv.Val(); }
byte[] val = Bry_.Empty; class Wdata_description_tbl extends Wdata_tbl_base {
if (kv_val.Tid() == Json_itm_.Tid__str) @Override public String Tbl_name() {return "wdata_description";}
val = kv_val.Data_bry(); @Override public String Tbl_create_sql() {
else { return String_.Concat_lines_nl
Json_nde val_nde = (Json_nde)kv.Val(); ( "CREATE TABLE IF NOT EXISTS wdata_description"
Json_kv val_name_kv = (Json_kv)val_nde.Get_at(0); // ASSUME: 1st item is always "name" kv; EX: "name":"Earth" , "( page_id integer NOT NULL"
val = val_name_kv.Val().Data_bry(); , ", lang_key varchar(16) NOT NULL"
} , ", val varchar(255) NOT NULL"
insert_stmt.Clear() , ");"
.Val_int(page_id) );
.Val_bry_as_str(key) }
.Val_bry_as_str(val) @Override public Db_idx_itm[] Idx_ary() {return new Db_idx_itm[] {Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_description__main ON wdata_description (page_id, lang_key);")};}
.Exec_insert(); @Override public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) {Exec_insert_kvs(this.Insert_stmt(), page_id, wdoc.Descr_list());}
} @Override public String[] Fld_ary() {return new String[] {Fld_page_id, Fld_lang_key, Fld_val};}
} private static final String Fld_page_id = "page_id", Fld_lang_key = "lang_key", Fld_val = "val";
private static final String Fld_page_id = "page_id", Fld_wiki_key = "wiki_key", Fld_val = "val"; }
} class Wdata_link_tbl extends Wdata_tbl_base {
class Wbase_claim_tbl extends Wdata_tbl_base { @Override public String Tbl_name() {return "wdata_link";}
@Override public String Tbl_name() {return "wdata_claim";} @Override public String Tbl_create_sql() {
@Override public String Tbl_create_sql() { return String_.Concat_lines_nl
return String_.Concat_lines_nl ( "CREATE TABLE IF NOT EXISTS wdata_link"
( "CREATE TABLE IF NOT EXISTS wdata_claim" , "( page_id integer NOT NULL"
, "( claim_id integer NOT NULL" , ", wiki_key varchar(255) NOT NULL"
, ", page_id integer NOT NULL" , ", val varchar(255) NOT NULL"
, ", prop_id integer NOT NULL" // 60; P60 , ");"
, ", val_tid smallint NOT NULL" // String;wikibase-entity-id;time;globecoordinate );
, ", entity_tid smallint NOT NULL" // null;item }
, ", entity_id integer NOT NULL" // null;123 @Override public Db_idx_itm[] Idx_ary() {return new Db_idx_itm[] {Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_link__main ON wdata_link (page_id, wiki_key);")};}
, ", val_text varchar(255) NOT NULL" @Override public String[] Fld_ary() {return new String[] {Fld_page_id, Fld_wiki_key, Fld_val};}
, ", guid varchar(64) NOT NULL" @Override public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) {
, ", rank integer NOT NULL" Ordered_hash hash = wdoc.Slink_list();
, ", ref_count integer NOT NULL" int len = hash.Count();
, ", qual_count integer NOT NULL" Db_stmt insert_stmt = this.Insert_stmt();
, ");" for (int i = 0; i < len; i++) {
); Json_kv kv = (Json_kv)hash.Get_at(i);
} byte[] key = kv.Key().Data_bry();
@Override public Db_idx_itm[] Idx_ary() { Json_itm kv_val = kv.Val();
return new Db_idx_itm[] byte[] val = Bry_.Empty;
{ Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_claim__main ON wdata_claim (page_id, prop_id, val_tid, entity_tid);") if (kv_val.Tid() == Json_itm_.Tid__str)
}; val = kv_val.Data_bry();
} else {
@Override public String[] Fld_ary() {return new String[] {Fld_claim_id, Fld_page_id, Fld_prop_id, Fld_val_tid, Fld_entity_tid, Fld_entity_id, Fld_val_text, Fld_guid, Fld_rank, Fld_ref_count, Fld_qual_count};} Json_nde val_nde = (Json_nde)kv.Val();
private int next_claim_id = 0; Json_kv val_name_kv = (Json_kv)val_nde.Get_at(0); // ASSUME: 1st item is always "name" kv; EX: "name":"Earth"
private Xob_wdata_db_visitor visitor; val = val_name_kv.Val().Data_bry();
@Override public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) { }
if (visitor == null) visitor = new Xob_wdata_db_visitor(wdata_mgr); insert_stmt.Clear()
visitor.Init(lang_key); .Val_int(page_id)
Ordered_hash list = wdoc.Claim_list(); .Val_bry_as_str(key)
int list_len = list.Count(); .Val_bry_as_str(val)
for (int i = 0; i < list_len; i++) { .Exec_insert();
Wbase_claim_grp claim_grp = (Wbase_claim_grp)list.Get_at(i); }
int itms_len = claim_grp.Len(); }
int entity_id = -1; private static final String Fld_page_id = "page_id", Fld_wiki_key = "wiki_key", Fld_val = "val";
byte[] claim_val = Bry_.Empty; }
for (int j = 0; j < itms_len; j++) { class Wbase_claim_tbl extends Wdata_tbl_base {
Wbase_claim_base claim = claim_grp.Get_at(j); @Override public String Tbl_name() {return "wdata_claim";}
claim.Welcome(visitor); @Override public String Tbl_create_sql() {
claim_val = visitor.Rv(); return String_.Concat_lines_nl
Exec_insert(++next_claim_id, page_id, claim_grp.Id(), claim.Val_tid(), claim.Snak_tid(), entity_id, claim_val, claim.Wguid(), claim.Rank_tid(), 0, 0); ( "CREATE TABLE IF NOT EXISTS wdata_claim"
} , "( claim_id integer NOT NULL"
} , ", page_id integer NOT NULL"
} , ", prop_id integer NOT NULL" // 60; P60
public void Exec_insert(int claim_id, int page_id, int prop_id, byte val_tid, byte entity_tid, int entity_id, byte[] val_text, byte[] guid, int rank, int ref_count, int qual_count) { , ", val_tid smallint NOT NULL" // String;wikibase-entity-id;time;globecoordinate
if (val_text == null) val_text = Bry_.Empty; , ", entity_tid smallint NOT NULL" // null;item
if (guid == null) guid = Bry_.Empty; , ", entity_id integer NOT NULL" // null;123
this.Insert_stmt().Clear() , ", val_text varchar(255) NOT NULL"
.Val_int(claim_id) , ", guid varchar(64) NOT NULL"
.Val_int(page_id) , ", rank integer NOT NULL"
.Val_int(prop_id) , ", ref_count integer NOT NULL"
.Val_byte(val_tid) , ", qual_count integer NOT NULL"
.Val_byte(entity_tid) , ");"
.Val_int(entity_id) );
.Val_bry_as_str(val_text) }
.Val_bry_as_str(guid) @Override public Db_idx_itm[] Idx_ary() {
.Val_int(rank) return new Db_idx_itm[]
.Val_int(ref_count) { Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_claim__main ON wdata_claim (page_id, prop_id, val_tid, entity_tid);")
.Val_int(qual_count) };
.Exec_insert(); }
} @Override public String[] Fld_ary() {return new String[] {Fld_claim_id, Fld_page_id, Fld_prop_id, Fld_val_tid, Fld_entity_tid, Fld_entity_id, Fld_val_text, Fld_guid, Fld_rank, Fld_ref_count, Fld_qual_count};}
private static final String Fld_claim_id = "claim_id", Fld_page_id = "page_id", Fld_prop_id = "prop_id", Fld_val_tid = "val_tid", Fld_entity_tid = "entity_tid", Fld_entity_id = "entity_id", Fld_val_text = "val_text" private int next_claim_id = 0;
, Fld_guid = "guid", Fld_rank = "rank", Fld_ref_count = "ref_count", Fld_qual_count = "qual_count" private Xob_wdata_db_visitor visitor;
; @Override public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) {
} if (visitor == null) visitor = new Xob_wdata_db_visitor(wdata_mgr);
class Wbase_claim_time_tbl extends Wdata_tbl_base { visitor.Init(lang_key);
@Override public String Tbl_name() {return "wdata_claim_time";} Ordered_hash list = wdoc.Claim_list();
@Override public String Tbl_create_sql() { int list_len = list.Count();
return String_.Concat_lines_nl for (int i = 0; i < list_len; i++) {
( "CREATE TABLE IF NOT EXISTS wdata_claim_time" Wbase_claim_grp claim_grp = (Wbase_claim_grp)list.Get_at(i);
, "( claim_id integer NOT NULL" int itms_len = claim_grp.Len();
, ", time_val varchar(64) NOT NULL" // -04540000000-01-01T00:00:00Z int entity_id = -1;
, ", time_tz integer NOT NULL" // 0 byte[] claim_val = Bry_.Empty;
, ", time_before integer NOT NULL" // 0 for (int j = 0; j < itms_len; j++) {
, ", time_after integer NOT NULL" // 0 Wbase_claim_base claim = claim_grp.Get_at(j);
, ", time_precision integer NOT NULL" // 2; number of digits claim.Welcome(visitor);
, ", time_model varchar(64) NOT NULL" // http:\/\/www.wikidata.org\/entity\/Q1985727 claim_val = visitor.Rv();
, ");" Exec_insert(++next_claim_id, page_id, claim_grp.Id(), claim.Val_tid(), claim.Snak_tid(), entity_id, claim_val, claim.Wguid(), claim.Rank_tid(), 0, 0);
); }
} }
@Override public Db_idx_itm[] Idx_ary() { }
return new Db_idx_itm[] { public void Exec_insert(int claim_id, int page_id, int prop_id, byte val_tid, byte entity_tid, int entity_id, byte[] val_text, byte[] guid, int rank, int ref_count, int qual_count) {
Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_claim_time__main ON wdata_claim_time (claim_id);") if (val_text == null) val_text = Bry_.Empty;
}; if (guid == null) guid = Bry_.Empty;
} this.Insert_stmt().Clear()
@Override public String[] Fld_ary() {return new String[] {Fld_claim_id, Fld_time_val, Fld_time_tz, Fld_time_before, Fld_time_after, Fld_time_precision, Fld_time_model};} .Val_int(claim_id)
public void Insert(Db_stmt stmt, int claim_id, byte[] time_val, int tz, int before, int after, int precision, byte[] model) { .Val_int(page_id)
stmt.Clear() .Val_int(prop_id)
.Val_int(claim_id) .Val_byte(val_tid)
.Val_bry_as_str(time_val) .Val_byte(entity_tid)
.Val_int(tz) .Val_int(entity_id)
.Val_int(before) .Val_bry_as_str(val_text)
.Val_int(after) .Val_bry_as_str(guid)
.Val_int(precision) .Val_int(rank)
.Val_bry_as_str(model) .Val_int(ref_count)
.Exec_insert(); .Val_int(qual_count)
} .Exec_insert();
private static final String Fld_claim_id = "claim_id", Fld_time_val = "time_val", Fld_time_tz = "time_tz", Fld_time_before = "time_before", Fld_time_after = "time_after", Fld_time_precision = "time_precision", Fld_time_model = "time_model"; }
} private static final String Fld_claim_id = "claim_id", Fld_page_id = "page_id", Fld_prop_id = "prop_id", Fld_val_tid = "val_tid", Fld_entity_tid = "entity_tid", Fld_entity_id = "entity_id", Fld_val_text = "val_text"
class Wbase_claim_geo_tbl extends Wdata_tbl_base { , Fld_guid = "guid", Fld_rank = "rank", Fld_ref_count = "ref_count", Fld_qual_count = "qual_count"
@Override public String Tbl_name() {return "wdata_claim_geo";} ;
@Override public String Tbl_create_sql() { }
return String_.Concat_lines_nl class Wbase_claim_time_tbl extends Wdata_tbl_base {
( "CREATE TABLE IF NOT EXISTS wdata_claim_geo" @Override public String Tbl_name() {return "wdata_claim_time";}
, "( claim_id integer NOT NULL" @Override public String Tbl_create_sql() {
, ", geo_latitude double NOT NULL" // 41.590833333333 return String_.Concat_lines_nl
, ", geo_longitude double NOT NULL" // -93.620833333333 ( "CREATE TABLE IF NOT EXISTS wdata_claim_time"
, ", geo_altitude varchar(255) NOT NULL" // null , "( claim_id integer NOT NULL"
, ", geo_precision double NOT NULL" // 0.00027777777777778 , ", time_val varchar(64) NOT NULL" // -04540000000-01-01T00:00:00Z
, ", geo_globe integer NOT NULL" // http:\/\/www.wikidata.org\/entity\/Q2 , ", time_tz integer NOT NULL" // 0
, ");" , ", time_before integer NOT NULL" // 0
); , ", time_after integer NOT NULL" // 0
} , ", time_precision integer NOT NULL" // 2; number of digits
@Override public Db_idx_itm[] Idx_ary() { , ", time_model varchar(64) NOT NULL" // http:\/\/www.wikidata.org\/entity\/Q1985727
return new Db_idx_itm[] , ");"
{ Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_claim_geo__main ON wdata_claim_geo (claim_id);") );
}; }
} @Override public Db_idx_itm[] Idx_ary() {
public void Insert(Db_stmt stmt, int claim_id, double latitude, double longitude, byte[] altitude, double precision, byte[] globe) { return new Db_idx_itm[] {
stmt.Clear() Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_claim_time__main ON wdata_claim_time (claim_id);")
.Val_int(claim_id) };
.Val_double(latitude) }
.Val_double(longitude) @Override public String[] Fld_ary() {return new String[] {Fld_claim_id, Fld_time_val, Fld_time_tz, Fld_time_before, Fld_time_after, Fld_time_precision, Fld_time_model};}
.Val_bry_as_str(altitude) public void Insert(Db_stmt stmt, int claim_id, byte[] time_val, int tz, int before, int after, int precision, byte[] model) {
.Val_double(precision) stmt.Clear()
.Val_bry_as_str(globe) .Val_int(claim_id)
.Exec_insert(); .Val_bry_as_str(time_val)
} .Val_int(tz)
@Override public String[] Fld_ary() {return new String[] {Fld_claim_id, Fld_geo_latitude, Fld_geo_longitude, Fld_geo_altitude, Fld_geo_precision, Fld_geo_globe};} .Val_int(before)
private static final String Fld_claim_id = "claim_id", Fld_geo_latitude = "geo_latitude", Fld_geo_longitude = "geo_longitude", Fld_geo_altitude = "geo_altitude", Fld_geo_precision = "geo_precision", Fld_geo_globe = "geo_globe"; .Val_int(after)
} .Val_int(precision)
class Wdata_ref_tbl extends Wdata_tbl_base { .Val_bry_as_str(model)
@Override public String Tbl_name() {return "wdata_ref";} .Exec_insert();
@Override public String Tbl_create_sql() { }
return String_.Concat_lines_nl private static final String Fld_claim_id = "claim_id", Fld_time_val = "time_val", Fld_time_tz = "time_tz", Fld_time_before = "time_before", Fld_time_after = "time_after", Fld_time_precision = "time_precision", Fld_time_model = "time_model";
( "CREATE TABLE IF NOT EXISTS wdata_ref" }
, "( ref_id integer NOT NULL" class Wbase_claim_geo_tbl extends Wdata_tbl_base {
, ", page_id integer NOT NULL" @Override public String Tbl_name() {return "wdata_claim_geo";}
, ", prop_id integer NOT NULL" // 60; P60 @Override public String Tbl_create_sql() {
, ", val_tid smallint NOT NULL" // String;wikibase-entity-id;time;globecoordinate return String_.Concat_lines_nl
, ", entity_tid smallint NOT NULL" // null;item ( "CREATE TABLE IF NOT EXISTS wdata_claim_geo"
, ", entity_id integer NOT NULL" // null;123 , "( claim_id integer NOT NULL"
, ", val_text varchar(255) NOT NULL" , ", geo_latitude double NOT NULL" // 41.590833333333
, ");" , ", geo_longitude double NOT NULL" // -93.620833333333
); , ", geo_altitude varchar(255) NOT NULL" // null
} , ", geo_precision double NOT NULL" // 0.00027777777777778
@Override public Db_idx_itm[] Idx_ary() { , ", geo_globe integer NOT NULL" // http:\/\/www.wikidata.org\/entity\/Q2
return new Db_idx_itm[] { , ");"
Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_ref__main ON wdata_ref (page_id, prop_id, val_tid, entity_tid);") );
}; }
} @Override public Db_idx_itm[] Idx_ary() {
@Override public String[] Fld_ary() {return new String[] {Fld_ref_id, Fld_page_id, Fld_prop_id, Fld_val_tid, Fld_entity_tid, Fld_entity_id, Fld_val_text};} return new Db_idx_itm[]
private static final String Fld_ref_id = "ref_id", Fld_page_id = "page_id", Fld_prop_id = "prop_id", Fld_val_tid = "val_tid", Fld_entity_tid = "entity_tid", Fld_entity_id = "entity_id", Fld_val_text = "val_ext"; { Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_claim_geo__main ON wdata_claim_geo (claim_id);")
} };
class Wdata_qual_tbl extends Wdata_tbl_base { }
@Override public String Tbl_name() {return "wdata_qual";} public void Insert(Db_stmt stmt, int claim_id, double latitude, double longitude, byte[] altitude, double precision, byte[] globe) {
@Override public String Tbl_create_sql() { stmt.Clear()
return String_.Concat_lines_nl .Val_int(claim_id)
( "CREATE TABLE IF NOT EXISTS wdata_qual" .Val_double(latitude)
, "( qual_id integer NOT NULL" .Val_double(longitude)
, ", page_id integer NOT NULL" .Val_bry_as_str(altitude)
, ", val_text varchar(4096) NOT NULL" .Val_double(precision)
, ");" .Val_bry_as_str(globe)
); .Exec_insert();
} }
@Override public Db_idx_itm[] Idx_ary() { @Override public String[] Fld_ary() {return new String[] {Fld_claim_id, Fld_geo_latitude, Fld_geo_longitude, Fld_geo_altitude, Fld_geo_precision, Fld_geo_globe};}
return new Db_idx_itm[] { private static final String Fld_claim_id = "claim_id", Fld_geo_latitude = "geo_latitude", Fld_geo_longitude = "geo_longitude", Fld_geo_altitude = "geo_altitude", Fld_geo_precision = "geo_precision", Fld_geo_globe = "geo_globe";
Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_qual__main ON wdata_ref (qual_id, page_id);") }
}; class Wdata_ref_tbl extends Wdata_tbl_base {
} @Override public String Tbl_name() {return "wdata_ref";}
@Override public String[] Fld_ary() {return new String[] {Fld_qual_id, Fld_page_id, Fld_val_text};} @Override public String Tbl_create_sql() {
public void Insert(Db_stmt stmt, int qual_id, int page_id, byte[] val_text) { return String_.Concat_lines_nl
stmt.Clear() ( "CREATE TABLE IF NOT EXISTS wdata_ref"
.Val_int(qual_id) , "( ref_id integer NOT NULL"
.Val_int(page_id) , ", page_id integer NOT NULL"
.Val_bry_as_str(val_text) , ", prop_id integer NOT NULL" // 60; P60
.Exec_insert(); , ", val_tid smallint NOT NULL" // String;wikibase-entity-id;time;globecoordinate
} , ", entity_tid smallint NOT NULL" // null;item
private static final String Fld_qual_id = "qual_id", Fld_page_id = "page_id", Fld_val_text = "val_text"; , ", entity_id integer NOT NULL" // null;123
} , ", val_text varchar(255) NOT NULL"
class Xob_wdata_db_visitor implements Wbase_claim_visitor { , ");"
private final Wdata_wiki_mgr wdata_mgr; private byte[] lang_key; );
public Xob_wdata_db_visitor(Wdata_wiki_mgr wdata_mgr) {this.wdata_mgr = wdata_mgr;} }
public void Init(byte[] lang_key) {this.lang_key = lang_key;} @Override public Db_idx_itm[] Idx_ary() {
public byte[] Rv() {return rv;} private byte[] rv; return new Db_idx_itm[] {
public void Visit_str(Wbase_claim_string itm) {rv = itm.Val_bry();} Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_ref__main ON wdata_ref (page_id, prop_id, val_tid, entity_tid);")
public void Visit_monolingualtext(Wbase_claim_monolingualtext itm) {rv = Bry_.Add_w_dlm(Byte_ascii.Pipe, itm.Lang(), itm.Text());} };
public void Visit_quantity(Wbase_claim_quantity itm) {rv = itm.Amount();} }
public void Visit_time(Wbase_claim_time itm) {rv = itm.Time();} @Override public String[] Fld_ary() {return new String[] {Fld_ref_id, Fld_page_id, Fld_prop_id, Fld_val_tid, Fld_entity_tid, Fld_entity_id, Fld_val_text};}
public void Visit_globecoordinate(Wbase_claim_globecoordinate itm) {rv = Bry_.Add_w_dlm(Byte_ascii.Comma, itm.Lat(), itm.Lng());} private static final String Fld_ref_id = "ref_id", Fld_page_id = "page_id", Fld_prop_id = "prop_id", Fld_val_tid = "val_tid", Fld_entity_tid = "entity_tid", Fld_entity_id = "entity_id", Fld_val_text = "val_ext";
public void Visit_system(Wbase_claim_value itm) {rv = Bry_.Empty;} }
public void Visit_entity(Wbase_claim_entity itm) { class Wdata_qual_tbl extends Wdata_tbl_base {
Wdata_doc entity_doc = wdata_mgr.Doc_mgr.Get_by_xid_or_null(itm.Page_ttl_db()); @Override public String Tbl_name() {return "wdata_qual";}
if (entity_doc != null) { @Override public String Tbl_create_sql() {
rv = entity_doc.Get_label_bry_or_null(lang_key); return String_.Concat_lines_nl
} ( "CREATE TABLE IF NOT EXISTS wdata_qual"
if (rv == null) // can be null if entity_doc is null or if label is null; , "( qual_id integer NOT NULL"
rv = Bry_.Empty; , ", page_id integer NOT NULL"
} , ", val_text varchar(4096) NOT NULL"
} , ");"
);
}
@Override public Db_idx_itm[] Idx_ary() {
return new Db_idx_itm[] {
Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_qual__main ON wdata_ref (qual_id, page_id);")
};
}
@Override public String[] Fld_ary() {return new String[] {Fld_qual_id, Fld_page_id, Fld_val_text};}
public void Insert(Db_stmt stmt, int qual_id, int page_id, byte[] val_text) {
stmt.Clear()
.Val_int(qual_id)
.Val_int(page_id)
.Val_bry_as_str(val_text)
.Exec_insert();
}
private static final String Fld_qual_id = "qual_id", Fld_page_id = "page_id", Fld_val_text = "val_text";
}
class Xob_wdata_db_visitor implements Wbase_claim_visitor {
private final Wdata_wiki_mgr wdata_mgr; private byte[] lang_key;
public Xob_wdata_db_visitor(Wdata_wiki_mgr wdata_mgr) {this.wdata_mgr = wdata_mgr;}
public void Init(byte[] lang_key) {this.lang_key = lang_key;}
public byte[] Rv() {return rv;} private byte[] rv;
public void Visit_str(Wbase_claim_string itm) {rv = itm.Val_bry();}
public void Visit_monolingualtext(Wbase_claim_monolingualtext itm) {rv = Bry_.Add_w_dlm(Byte_ascii.Pipe, itm.Lang(), itm.Text());}
public void Visit_quantity(Wbase_claim_quantity itm) {rv = itm.Amount();}
public void Visit_time(Wbase_claim_time itm) {rv = itm.Time();}
public void Visit_globecoordinate(Wbase_claim_globecoordinate itm) {rv = Bry_.Add_w_dlm(Byte_ascii.Comma, itm.Lat(), itm.Lng());}
public void Visit_system(Wbase_claim_value itm) {rv = Bry_.Empty;}
public void Visit_entity(Wbase_claim_entity itm) {
Wdata_doc entity_doc = wdata_mgr.Doc_mgr.Get_by_xid_or_null(itm.Page_ttl_db());
if (entity_doc != null) {
rv = entity_doc.Get_label_bry_or_null(lang_key);
}
if (rv == null) // can be null if entity_doc is null or if label is null;
rv = Bry_.Empty;
}
}

@ -1,6 +1,6 @@
/* /*
XOWA: the XOWA Offline Wiki Application XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com Copyright (C) 2012-2020 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3, XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0. or alternatively under the terms of the Apache License Version 2.0.
@ -13,82 +13,102 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/ */
package gplx.xowa.xtns.wbases.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wbases.*; package gplx.xowa.xtns.wbases.imports;
import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*;
import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.Bool_;
import gplx.xowa.xtns.wbases.core.*; import gplx.xowa.xtns.wbases.claims.enums.*; import gplx.xowa.xtns.wbases.parsers.*; import gplx.xowa.xtns.wbases.dbs.*; import gplx.Bry_;
import gplx.langs.jsons.*; import gplx.Gfo_invk;
public class Xob_wdata_pid extends Xob_itm_dump_base implements Xob_page_wkr, Gfo_invk { import gplx.Ordered_hash;
private Db_conn conn; import gplx.Ordered_hash_;
private Wbase_pid_tbl tbl__pid; import gplx.String_;
private Xowb_prop_tbl tbl__prop; import gplx.dbs.Db_conn;
private Json_parser jdoc_parser; import gplx.langs.jsons.Json_doc;
private final Ordered_hash datatype_hash = Ordered_hash_.New_bry(); import gplx.langs.jsons.Json_parser;
public Xob_wdata_pid(Db_conn conn) { import gplx.xowa.Xowe_wiki;
this.conn = conn; import gplx.xowa.bldrs.Xob_bldr;
} import gplx.xowa.bldrs.wkrs.Xob_itm_dump_base;
public Xob_wdata_pid Ctor(Xob_bldr bldr, Xowe_wiki wiki) { import gplx.xowa.bldrs.wkrs.Xob_page_wkr;
this.Cmd_ctor(bldr, wiki); import gplx.xowa.wikis.data.tbls.Xowd_page_itm;
this.jdoc_parser = bldr.App().Wiki_mgr().Wdata_mgr().Jdoc_parser(); import gplx.xowa.xtns.wbases.Wdata_wiki_mgr;
return this; import gplx.xowa.xtns.wbases.claims.enums.Wbase_claim_type;
} import gplx.xowa.xtns.wbases.claims.enums.Wbase_claim_type_;
public String Page_wkr__key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_wbase_pid;} import gplx.xowa.xtns.wbases.claims.enums.Wbase_enum_hash;
public void Page_wkr__bgn() {this.Pid__bgn();} import gplx.xowa.xtns.wbases.core.Wdata_dict_mainsnak;
public void Page_wkr__run(Xowd_page_itm page) { import gplx.xowa.xtns.wbases.core.Wdata_langtext_itm;
if (page.Ns_id() != Wdata_wiki_mgr.Ns_property) return; import gplx.xowa.xtns.wbases.dbs.Wbase_pid_tbl;
import gplx.xowa.xtns.wbases.dbs.Xowb_prop_tbl;
Json_doc jdoc = jdoc_parser.Parse(page.Text()); import gplx.xowa.xtns.wbases.parsers.Wdata_doc_parser;
if (jdoc == null) {
bldr.Usr_dlg().Warn_many(GRP_KEY, "json.invalid", "json is invalid: ns=~{0} id=~{1}", page.Ns_id(), String_.new_u8(page.Ttl_page_db())); public class Xob_wdata_pid extends Xob_itm_dump_base implements Xob_page_wkr, Gfo_invk {
return; private Db_conn conn;
} private Wbase_pid_tbl tbl__pid;
Pid__run(jdoc); private Xowb_prop_tbl tbl__prop;
} private final Json_parser jdoc_parser = new Json_parser();
public void Page_wkr__run_cleanup() {} private final Ordered_hash datatype_hash = Ordered_hash_.New_bry();
public void Page_wkr__end() {this.Pid__end();} public Xob_wdata_pid(Db_conn conn) {
public void Pid__bgn() { this.conn = conn;
if (conn == null) // conn will be null unless test }
conn = wiki.Data__core_mgr().Db__wbase().Conn(); public Xob_wdata_pid Ctor(Xob_bldr bldr, Xowe_wiki wiki) {
this.Cmd_ctor(bldr, wiki);
// init datatype_hash return this;
Wbase_enum_hash enum_hash = Wbase_claim_type_.Reg; }
byte len = (byte)enum_hash.Len(); public String Page_wkr__key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_wbase_pid;}
for (byte i = 0; i < len; i++) { public void Page_wkr__bgn() {this.Pid__bgn();}
Wbase_claim_type claim_type = (Wbase_claim_type)enum_hash.Get_itm_or(i, null); public void Page_wkr__run(Xowd_page_itm page) {
datatype_hash.Add(Bry_.new_u8(claim_type.Key_for_scrib()), claim_type); if (page.Ns_id() != Wdata_wiki_mgr.Ns_property) return;
}
Json_doc jdoc = jdoc_parser.Parse(page.Text());
// init wbase_pid if (jdoc == null) {
tbl__pid = Wbase_pid_tbl.New_make(conn); bldr.Usr_dlg().Warn_many(GRP_KEY, "json.invalid", "json is invalid: ns=~{0} id=~{1}", page.Ns_id(), String_.new_u8(page.Ttl_page_db()));
tbl__pid.Create_tbl(); return;
tbl__pid.Insert_bgn(); }
Pid__run(jdoc);
// init wbase_prop }
tbl__prop = new Xowb_prop_tbl(conn); public void Page_wkr__run_cleanup() {}
tbl__prop.Create_tbl(); public void Page_wkr__end() {this.Pid__end();}
tbl__prop.Insert_bgn(); public void Pid__bgn() {
} if (conn == null) // conn will be null unless test
public void Pid__run(Json_doc jdoc) { conn = wiki.Data__core_mgr().Db__wbase().Conn();
Wdata_doc_parser wdoc_parser = app.Wiki_mgr().Wdata_mgr().Wdoc_parser(jdoc);
byte[] pid = wdoc_parser.Parse_qid(jdoc); // init datatype_hash
Wbase_enum_hash enum_hash = Wbase_claim_type_.Reg;
// add datatype byte len = (byte)enum_hash.Len();
byte[] datatype = jdoc.Root_nde().Get_as_bry(Wdata_dict_mainsnak.Itm__datatype.Key_str()); for (byte i = 0; i < len; i++) {
Wbase_claim_type claim_type = (Wbase_claim_type)datatype_hash.Get_by_or_fail(datatype); Wbase_claim_type claim_type = (Wbase_claim_type)enum_hash.Get_itm_or(i, null);
tbl__prop.Insert_cmd_by_batch(pid, claim_type.Tid()); datatype_hash.Add(Bry_.new_u8(claim_type.Key_for_scrib()), claim_type);
}
// add langs
Ordered_hash list = wdoc_parser.Parse_langvals(pid, jdoc, Bool_.Y); // init wbase_pid
int len = list.Count(); tbl__pid = Wbase_pid_tbl.New_make(conn);
for (int i = 0; i < len; ++i) { tbl__pid.Create_tbl();
Wdata_langtext_itm label = (Wdata_langtext_itm)list.Get_at(i); tbl__pid.Insert_bgn();
tbl__pid.Insert_cmd_by_batch(label.Lang(), label.Text(), pid);
} // init wbase_prop
} tbl__prop = new Xowb_prop_tbl(conn);
public void Pid__end() { tbl__prop.Create_tbl();
tbl__pid.Insert_end(); tbl__prop.Insert_bgn();
tbl__pid.Create_idx(); }
tbl__prop.Insert_end(); public void Pid__run(Json_doc jdoc) {
} Wdata_doc_parser wdoc_parser = app.Wiki_mgr().Wdata_mgr().Wdoc_parser(jdoc);
private static final String GRP_KEY = "xowa.wdata.pid_wkr"; byte[] pid = wdoc_parser.Parse_qid(jdoc);
}
// add datatype
byte[] datatype = jdoc.Root_nde().Get_as_bry(Wdata_dict_mainsnak.Itm__datatype.Key_str());
Wbase_claim_type claim_type = (Wbase_claim_type)datatype_hash.Get_by_or_fail(datatype);
tbl__prop.Insert_cmd_by_batch(pid, claim_type.Tid());
// add langs
Ordered_hash list = wdoc_parser.Parse_langvals(pid, jdoc, Bool_.Y);
int len = list.Count();
for (int i = 0; i < len; ++i) {
Wdata_langtext_itm label = (Wdata_langtext_itm)list.Get_at(i);
tbl__pid.Insert_cmd_by_batch(label.Lang(), label.Text(), pid);
}
}
public void Pid__end() {
tbl__pid.Insert_end();
tbl__pid.Create_idx();
tbl__prop.Insert_end();
}
private static final String GRP_KEY = "xowa.wdata.pid_wkr";
}

@ -1,6 +1,6 @@
/* /*
XOWA: the XOWA Offline Wiki Application XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com Copyright (C) 2012-2020 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3, XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0. or alternatively under the terms of the Apache License Version 2.0.
@ -13,74 +13,93 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/ */
package gplx.xowa.xtns.wbases.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wbases.*; package gplx.xowa.xtns.wbases.imports;
import gplx.langs.jsons.*;
import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; import gplx.Bry_;
import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.Bry_bfr;
import gplx.xowa.wikis.nss.*; import gplx.Bry_bfr_;
import gplx.xowa.xtns.wbases.core.*; import gplx.xowa.xtns.wbases.dbs.*; import gplx.xowa.xtns.wbases.parsers.*; import gplx.Gfo_invk;
public class Xob_wdata_qid extends Xob_itm_dump_base implements Xob_page_wkr, Gfo_invk { import gplx.Ordered_hash;
private Db_conn conn; import gplx.String_;
private Wbase_qid_tbl tbl; import gplx.dbs.Db_conn;
private final Object thread_lock = new Object(); import gplx.langs.jsons.Json_doc;
private Json_parser parser; private Xob_wbase_ns_parser ns_parser; private final Xob_wbase_ns_parser_rslt ns_parser_rslt = new Xob_wbase_ns_parser_rslt(); import gplx.langs.jsons.Json_parser;
public Xob_wdata_qid(Db_conn conn) { import gplx.xowa.Xoa_ttl;
this.conn = conn; import gplx.xowa.Xowe_wiki;
} import gplx.xowa.bldrs.Xob_bldr;
public String Page_wkr__key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_wbase_qid;} import gplx.xowa.bldrs.wkrs.Xob_itm_dump_base;
public Xob_wdata_qid Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); return this;} import gplx.xowa.bldrs.wkrs.Xob_page_wkr;
public void Page_wkr__bgn() { import gplx.xowa.wikis.data.Xow_db_file;
this.parser = bldr.App().Wiki_mgr().Wdata_mgr().Jdoc_parser(); import gplx.xowa.wikis.data.Xow_db_file_;
this.ns_parser = new Xob_wbase_ns_parser(bldr.App().Fsys_mgr().Cfg_site_meta_fil()); import gplx.xowa.wikis.data.Xow_db_mgr;
this.Qid__bgn(); import gplx.xowa.wikis.data.tbls.Xowd_page_itm;
} import gplx.xowa.wikis.nss.Xow_ns_;
public void Page_wkr__run(Xowd_page_itm page) { import gplx.xowa.xtns.wbases.core.Wdata_sitelink_itm;
if (page.Ns_id() != Xow_ns_.Tid__main) return; // qid pages are only in the Main Srch_rslt_cbk import gplx.xowa.xtns.wbases.dbs.Wbase_qid_tbl;
Json_doc jdoc = parser.Parse(page.Text()); import gplx.xowa.xtns.wbases.parsers.Wdata_doc_parser;
if (jdoc == null) {bldr.Usr_dlg().Warn_many("", "", "json is invalid: ns=~{0} id=~{1}", page.Ns_id(), String_.new_u8(page.Ttl_page_db())); return;}
this.Qid__run(jdoc); public class Xob_wdata_qid extends Xob_itm_dump_base implements Xob_page_wkr, Gfo_invk {
} private Db_conn conn;
public void Page_wkr__run_cleanup() {} private Wbase_qid_tbl tbl;
public void Page_wkr__end() {this.Qid__end();} private final Object thread_lock = new Object();
public void Qid__bgn() { private final Json_parser parser = new Json_parser();
if (conn == null) { private Xob_wbase_ns_parser ns_parser; private final Xob_wbase_ns_parser_rslt ns_parser_rslt = new Xob_wbase_ns_parser_rslt();
Xow_db_file wbase_db = Make_wbase_db(wiki.Db_mgr_as_sql().Core_data_mgr()); public Xob_wdata_qid(Db_conn conn) {
conn = wbase_db.Conn(); this.conn = conn;
} }
tbl = Wbase_qid_tbl.New_make(conn, false); public String Page_wkr__key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_wbase_qid;}
tbl.Create_tbl(); public Xob_wdata_qid Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); return this;}
tbl.Insert_bgn(); public void Page_wkr__bgn() {
} this.ns_parser = new Xob_wbase_ns_parser(bldr.App().Fsys_mgr().Cfg_site_meta_fil());
public void Qid__run(Json_doc jdoc) { this.Qid__bgn();
synchronized (thread_lock) { }
Wdata_doc_parser wdoc_parser = app.Wiki_mgr().Wdata_mgr().Wdoc_parser(jdoc); public void Page_wkr__run(Xowd_page_itm page) {
byte[] qid = wdoc_parser.Parse_qid(jdoc); if (page.Ns_id() != Xow_ns_.Tid__main) return; // qid pages are only in the Main Srch_rslt_cbk
Bry_bfr tmp_bfr = Bry_bfr_.Reset(255); Json_doc jdoc = parser.Parse(page.Text());
Ordered_hash sitelinks = wdoc_parser.Parse_sitelinks(qid, jdoc); if (jdoc == null) {bldr.Usr_dlg().Warn_many("", "", "json is invalid: ns=~{0} id=~{1}", page.Ns_id(), String_.new_u8(page.Ttl_page_db())); return;}
int sitelinks_len = sitelinks.Count(); if (sitelinks_len == 0) return; // no subs; return; this.Qid__run(jdoc);
for (int i = 0; i < sitelinks_len; i++) { // iterate sitelinks }
Wdata_sitelink_itm sitelink = (Wdata_sitelink_itm)sitelinks.Get_at(i); public void Page_wkr__run_cleanup() {}
byte[] sitelink_site = sitelink.Site(), sitelink_ttl = sitelink.Name(); public void Page_wkr__end() {this.Qid__end();}
ns_parser.Find(ns_parser_rslt, sitelink_site, sitelink_ttl); public void Qid__bgn() {
int sitelink_ns = ns_parser_rslt.Ns_id(); if (conn == null) {
if (sitelink_ns != Xow_ns_.Tid__main) // ttl not in main; chop off ns portion; EX:Aide:French_title -> French_title Xow_db_file wbase_db = Make_wbase_db(wiki.Db_mgr_as_sql().Core_data_mgr());
sitelink_ttl = Bry_.Mid(sitelink_ttl, ns_parser_rslt.Ttl_bgn(), sitelink_ttl.length); conn = wbase_db.Conn();
sitelink_ttl = wiki.Lang().Case_mgr().Case_build_1st_upper(tmp_bfr, sitelink_ttl, 0, sitelink_ttl.length); }
tbl.Insert_cmd_by_batch(sitelink.Site(), sitelink_ns, Xoa_ttl.Replace_spaces(sitelink_ttl), qid); // NOTE: always convert spaces to underscores; EX: "A B" -> "A_B" DATE:2015-04-21 tbl = Wbase_qid_tbl.New_make(conn, false);
} tbl.Create_tbl();
} tbl.Insert_bgn();
} }
public void Qid__end() { public void Qid__run(Json_doc jdoc) {
tbl.Insert_end(); synchronized (thread_lock) {
tbl.Create_idx(); Wdata_doc_parser wdoc_parser = app.Wiki_mgr().Wdata_mgr().Wdoc_parser(jdoc);
} byte[] qid = wdoc_parser.Parse_qid(jdoc);
public static Xow_db_file Make_wbase_db(Xow_db_mgr db_mgr) { Bry_bfr tmp_bfr = Bry_bfr_.Reset(255);
boolean db_is_all_or_few = db_mgr.Props().Layout_text().Tid_is_all_or_few(); Ordered_hash sitelinks = wdoc_parser.Parse_sitelinks(qid, jdoc);
Xow_db_file wbase_db = db_is_all_or_few int sitelinks_len = sitelinks.Count(); if (sitelinks_len == 0) return; // no subs; return;
? db_mgr.Db__core() for (int i = 0; i < sitelinks_len; i++) { // iterate sitelinks
: db_mgr.Dbs__make_by_tid(Xow_db_file_.Tid__wbase); Wdata_sitelink_itm sitelink = (Wdata_sitelink_itm)sitelinks.Get_at(i);
if (db_is_all_or_few) byte[] sitelink_site = sitelink.Site(), sitelink_ttl = sitelink.Name();
db_mgr.Db__wbase_(wbase_db); ns_parser.Find(ns_parser_rslt, sitelink_site, sitelink_ttl);
return wbase_db; int sitelink_ns = ns_parser_rslt.Ns_id();
} if (sitelink_ns != Xow_ns_.Tid__main) // ttl not in main; chop off ns portion; EX:Aide:French_title -> French_title
} sitelink_ttl = Bry_.Mid(sitelink_ttl, ns_parser_rslt.Ttl_bgn(), sitelink_ttl.length);
sitelink_ttl = wiki.Lang().Case_mgr().Case_build_1st_upper(tmp_bfr, sitelink_ttl, 0, sitelink_ttl.length);
tbl.Insert_cmd_by_batch(sitelink.Site(), sitelink_ns, Xoa_ttl.Replace_spaces(sitelink_ttl), qid); // NOTE: always convert spaces to underscores; EX: "A B" -> "A_B" DATE:2015-04-21
}
}
}
public void Qid__end() {
tbl.Insert_end();
tbl.Create_idx();
}
public static Xow_db_file Make_wbase_db(Xow_db_mgr db_mgr) {
boolean db_is_all_or_few = db_mgr.Props().Layout_text().Tid_is_all_or_few();
Xow_db_file wbase_db = db_is_all_or_few
? db_mgr.Db__core()
: db_mgr.Dbs__make_by_tid(Xow_db_file_.Tid__wbase);
if (db_is_all_or_few)
db_mgr.Db__wbase_(wbase_db);
return wbase_db;
}
}

@ -1,6 +1,6 @@
/* /*
XOWA: the XOWA Offline Wiki Application XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com Copyright (C) 2012-2020 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3, XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0. or alternatively under the terms of the Apache License Version 2.0.
@ -13,90 +13,114 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/ */
package gplx.xowa.xtns.wbases.imports.json; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wbases.*; import gplx.xowa.xtns.wbases.imports.*; package gplx.xowa.xtns.wbases.imports.json;
import gplx.core.ios.*;
import gplx.langs.jsons.*; import gplx.Bool_;
import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.sqls.*; import gplx.xowa.apps.apis.xowa.bldrs.imports.*; import gplx.Bry_;
import gplx.xowa.wikis.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.Byte_ascii;
import gplx.xowa.xtns.wbases.core.*; import gplx.xowa.xtns.wbases.parsers.*; import gplx.DateAdp;
class Xowb_json_dump_db { import gplx.DateAdp_;
private final Xoae_app app; private final Gfo_usr_dlg usr_dlg; private final Xowe_wiki wiki; private final Xob_bldr bldr; import gplx.Datetime_now;
private final Json_parser json_parser; import gplx.Gfo_usr_dlg;
private final Xob_wdata_pid pid_cmd; private final Xob_wdata_qid qid_cmd; import gplx.core.ios.Io_stream_zip_mgr;
private Xow_ns_mgr ns_mgr; private Xow_db_mgr db_mgr; import gplx.langs.jsons.Json_doc;
private Xowd_page_tbl page_tbl; private Xob_ns_to_db_mgr ns_to_db_mgr; import gplx.langs.jsons.Json_parser;
private Io_stream_zip_mgr text_zip_mgr; private byte text_zip_tid; import gplx.xowa.Xoae_app;
private DateAdp page_modified_on; import gplx.xowa.Xowe_wiki;
private int page_id = 0, page_count_main = 0; import gplx.xowa.Xowe_wiki_;
public Xowb_json_dump_db(Xob_bldr bldr, Xowe_wiki wiki) { import gplx.xowa.bldrs.Xob_bldr;
this.app = bldr.App(); this.usr_dlg = app.Usr_dlg(); this.wiki = wiki; this.bldr = bldr; import gplx.xowa.bldrs.Xob_ns_to_db_mgr;
this.json_parser = bldr.App().Wiki_mgr().Wdata_mgr().Jdoc_parser(); import gplx.xowa.bldrs.Xobldr_cfg;
this.ns_mgr = wiki.Ns_mgr(); import gplx.xowa.bldrs.cmds.Xob_ns_file_itm;
this.pid_cmd = new Xob_wdata_pid(wiki.Data__core_mgr().Db__wbase().Conn()); import gplx.xowa.bldrs.cmds.texts.sqls.Xob_ns_to_db_wkr__text;
this.qid_cmd = new Xob_wdata_qid(wiki.Data__core_mgr().Db__wbase().Conn()); import gplx.xowa.wikis.data.Xow_db_file;
} import gplx.xowa.wikis.data.Xow_db_file_;
public void Parse_all_bgn(long src_fil_len, String src_fil_name) { import gplx.xowa.wikis.data.Xow_db_mgr;
// load wiki import gplx.xowa.wikis.data.Xowd_cfg_key_;
Xowe_wiki_.Create(wiki, src_fil_len, src_fil_name); import gplx.xowa.wikis.data.tbls.Xowd_page_tbl;
this.db_mgr = wiki.Data__core_mgr(); import gplx.xowa.wikis.nss.Xow_ns;
this.page_tbl = db_mgr.Tbl__page(); import gplx.xowa.wikis.nss.Xow_ns_mgr;
pid_cmd.Cmd_ctor(bldr, wiki); qid_cmd.Cmd_ctor(bldr, wiki); import gplx.xowa.xtns.wbases.Wdata_wiki_mgr;
import gplx.xowa.xtns.wbases.imports.Xob_wdata_pid;
// create ns_mgr import gplx.xowa.xtns.wbases.imports.Xob_wdata_qid;
wiki.Ns_mgr().Add_defaults();
wiki.Ns_mgr().Add_new(Wdata_wiki_mgr.Ns_property, Wdata_wiki_mgr.Ns_property_name); class Xowb_json_dump_db {
wiki.Ns_mgr().Init(); private final Xoae_app app; private final Gfo_usr_dlg usr_dlg; private final Xowe_wiki wiki; private final Xob_bldr bldr;
private final Json_parser json_parser = new Json_parser();
// init ns_map private final Xob_wdata_pid pid_cmd; private final Xob_wdata_qid qid_cmd;
this.ns_to_db_mgr = new Xob_ns_to_db_mgr(new Xob_ns_to_db_wkr__text(), db_mgr, Xobldr_cfg.Max_size__text(app)); private Xow_ns_mgr ns_mgr; private Xow_db_mgr db_mgr;
byte[] ns_file_map = Xobldr_cfg.New_ns_file_map(app, src_fil_len); private Xowd_page_tbl page_tbl; private Xob_ns_to_db_mgr ns_to_db_mgr;
Xob_ns_file_itm.Init_ns_bldr_data(Xow_db_file_.Tid__text, wiki.Ns_mgr(), ns_file_map); private Io_stream_zip_mgr text_zip_mgr; private byte text_zip_tid;
private DateAdp page_modified_on;
// start import private int page_id = 0, page_count_main = 0;
this.text_zip_mgr = wiki.Utl__zip_mgr(); public Xowb_json_dump_db(Xob_bldr bldr, Xowe_wiki wiki) {
this.text_zip_tid = Xobldr_cfg.Zip_mode__text(app); this.app = bldr.App(); this.usr_dlg = app.Usr_dlg(); this.wiki = wiki; this.bldr = bldr;
this.page_modified_on = Datetime_now.Get(); this.ns_mgr = wiki.Ns_mgr();
page_tbl.Insert_bgn(); this.pid_cmd = new Xob_wdata_pid(wiki.Data__core_mgr().Db__wbase().Conn());
qid_cmd.Page_wkr__bgn(); this.qid_cmd = new Xob_wdata_qid(wiki.Data__core_mgr().Db__wbase().Conn());
pid_cmd.Pid__bgn(); }
} public void Parse_all_bgn(long src_fil_len, String src_fil_name) {
public void Parse_doc(byte[] json_bry) { // load wiki
// parse to jdoc Xowe_wiki_.Create(wiki, src_fil_len, src_fil_name);
Json_doc jdoc = json_parser.Parse(json_bry); this.db_mgr = wiki.Data__core_mgr();
if (jdoc == null) {usr_dlg.Warn_many("", "", "wbase.json_dump:json is invalid: json=~{0}", json_bry); return;} this.page_tbl = db_mgr.Tbl__page();
pid_cmd.Cmd_ctor(bldr, wiki); qid_cmd.Cmd_ctor(bldr, wiki);
// extract xid
byte[] id = jdoc.Get_val_as_bry_or(Bry__id_key, null); // create ns_mgr
if (id == null) {usr_dlg.Warn_many("", "", "wbase.json_dump:id is invalid: json=~{0}", json_bry); return;} wiki.Ns_mgr().Add_defaults();
boolean jdoc_is_qid = Bry_.Has_at_bgn(id, Byte_ascii.Ltr_Q, 0); wiki.Ns_mgr().Add_new(Wdata_wiki_mgr.Ns_property, Wdata_wiki_mgr.Ns_property_name);
Xow_ns ns = jdoc_is_qid ? ns_mgr.Ns_main() : ns_mgr.Ids_get_or_null(Wdata_wiki_mgr.Ns_property); wiki.Ns_mgr().Init();
// create page entry // init ns_map
int random_int = ns.Count() + 1; ns.Count_(random_int); this.ns_to_db_mgr = new Xob_ns_to_db_mgr(new Xob_ns_to_db_wkr__text(), db_mgr, Xobldr_cfg.Max_size__text(app));
byte[] json_zip = text_zip_mgr.Zip(text_zip_tid, json_bry); byte[] ns_file_map = Xobldr_cfg.New_ns_file_map(app, src_fil_len);
Xow_db_file text_db = ns_to_db_mgr.Get_by_ns(ns.Bldr_data(), json_zip.length); Xob_ns_file_itm.Init_ns_bldr_data(Xow_db_file_.Tid__text, wiki.Ns_mgr(), ns_file_map);
db_mgr.Create_page(page_tbl, text_db.Tbl__text(), ++page_id, ns.Id(), id, Bool_.N, page_modified_on, json_zip, json_bry.length, random_int, text_db.Id(), -1);
// start import
// insert text this.text_zip_mgr = wiki.Utl__zip_mgr();
if (jdoc_is_qid) { this.text_zip_tid = Xobldr_cfg.Zip_mode__text(app);
qid_cmd.Qid__run(jdoc); this.page_modified_on = Datetime_now.Get();
++page_count_main; page_tbl.Insert_bgn();
} qid_cmd.Page_wkr__bgn();
else pid_cmd.Pid__bgn();
pid_cmd.Pid__run(jdoc); }
} public void Parse_doc(byte[] json_bry) {
public void Parse_all_end() { // parse to jdoc
page_tbl.Insert_end(); Json_doc jdoc = json_parser.Parse(json_bry);
page_tbl.Create_idx(); if (jdoc == null) {usr_dlg.Warn_many("", "", "wbase.json_dump:json is invalid: json=~{0}", json_bry); return;}
qid_cmd.Qid__end();
pid_cmd.Pid__end(); // extract xid
ns_to_db_mgr.Rls_all(); byte[] id = jdoc.Get_val_as_bry_or(Bry__id_key, null);
if (id == null) {usr_dlg.Warn_many("", "", "wbase.json_dump:id is invalid: json=~{0}", json_bry); return;}
// cleanup core boolean jdoc_is_qid = Bry_.Has_at_bgn(id, Byte_ascii.Ltr_Q, 0);
Xow_db_file db_core = db_mgr.Db__core(); Xow_ns ns = jdoc_is_qid ? ns_mgr.Ns_main() : ns_mgr.Ids_get_or_null(Wdata_wiki_mgr.Ns_property);
db_core.Tbl__site_stats().Update(page_count_main, page_id, ns_mgr.Ns_file().Count()); // save page stats
db_core.Tbl__ns().Insert(ns_mgr); // save ns // create page entry
db_mgr.Tbl__cfg().Insert_str(Xowd_cfg_key_.Grp__wiki_init, Xowd_cfg_key_.Key__init__modified_latest, page_modified_on.XtoStr_fmt(DateAdp_.Fmt_iso8561_date_time)); int random_int = ns.Count() + 1; ns.Count_(random_int);
} byte[] json_zip = text_zip_mgr.Zip(text_zip_tid, json_bry);
private static final byte[] Bry__id_key = Bry_.new_a7("id"); Xow_db_file text_db = ns_to_db_mgr.Get_by_ns(ns.Bldr_data(), json_zip.length);
} db_mgr.Create_page(page_tbl, text_db.Tbl__text(), ++page_id, ns.Id(), id, Bool_.N, page_modified_on, json_zip, json_bry.length, random_int, text_db.Id(), -1);
// insert text
if (jdoc_is_qid) {
qid_cmd.Qid__run(jdoc);
++page_count_main;
}
else
pid_cmd.Pid__run(jdoc);
}
public void Parse_all_end() {
page_tbl.Insert_end();
page_tbl.Create_idx();
qid_cmd.Qid__end();
pid_cmd.Pid__end();
ns_to_db_mgr.Rls_all();
// cleanup core
Xow_db_file db_core = db_mgr.Db__core();
db_core.Tbl__site_stats().Update(page_count_main, page_id, ns_mgr.Ns_file().Count()); // save page stats
db_core.Tbl__ns().Insert(ns_mgr); // save ns
db_mgr.Tbl__cfg().Insert_str(Xowd_cfg_key_.Grp__wiki_init, Xowd_cfg_key_.Key__init__modified_latest, page_modified_on.XtoStr_fmt(DateAdp_.Fmt_iso8561_date_time));
}
private static final byte[] Bry__id_key = Bry_.new_a7("id");
}

@ -1,6 +1,6 @@
/* /*
XOWA: the XOWA Offline Wiki Application XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com Copyright (C) 2012-2020 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3, XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0. or alternatively under the terms of the Apache License Version 2.0.
@ -13,147 +13,164 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/ */
package gplx.xowa.xtns.wbases.stores; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wbases.*; package gplx.xowa.xtns.wbases.stores;
import gplx.core.logs.*; import gplx.core.primitives.*;
import gplx.langs.jsons.*; import gplx.Bry_;
import gplx.xowa.wikis.pages.*; import gplx.Bry_bfr;
import gplx.xowa.xtns.wbases.core.*; import gplx.Bry_bfr_;
public class Wbase_doc_mgr { import gplx.Err_;
private final Wdata_wiki_mgr wbase_mgr; import gplx.Gfo_usr_dlg_;
private final Wbase_qid_mgr qid_mgr; import gplx.Ordered_hash;
private Wbase_doc_cache doc_cache; import gplx.Ordered_hash_;
private final Object thread_lock = new Object(); import gplx.String_;
private final Ordered_hash wbase_db_hash = Ordered_hash_.New_bry(); import gplx.core.logs.Gfo_log_wtr;
private final Gfo_log_wtr wbase_db_log; import gplx.langs.jsons.Json_doc;
public Wbase_doc_mgr(Wdata_wiki_mgr wbase_mgr, Wbase_qid_mgr qid_mgr) { import gplx.langs.jsons.Json_nde;
this.wbase_mgr = wbase_mgr; import gplx.langs.jsons.Json_parser;
this.qid_mgr = qid_mgr; import gplx.xowa.Xoa_ttl;
this.doc_cache = new Wbase_doc_cache__hash(); import gplx.xowa.Xoae_page;
this.wbase_db_log = Gfo_log_wtr.New_dflt("wbase", "db_log_{0}.csv"); import gplx.xowa.Xowe_wiki;
} import gplx.xowa.xtns.wbases.Wdata_doc;
public void Enabled_(boolean v) {this.enabled = v;} private boolean enabled; import gplx.xowa.xtns.wbases.Wdata_wiki_mgr;
public void Cache__init(String cache_type, long cache_max, long compress_size, long used_weight) { import gplx.xowa.xtns.wbases.core.Wbase_pid;
if (String_.Eq(cache_type, "null")) doc_cache = new Wbase_doc_cache__null();
else if (String_.Eq(cache_type, "hash")) doc_cache = new Wbase_doc_cache__hash(); public class Wbase_doc_mgr {
else if (String_.Eq(cache_type, "mru" )) doc_cache = new Wbase_doc_cache__mru(cache_max, compress_size, used_weight); private final Wdata_wiki_mgr wbase_mgr;
else throw Err_.new_unhandled_default(cache_type); private final Wbase_qid_mgr qid_mgr;
} private Wbase_doc_cache doc_cache;
public void Cleanup() { private final Object thread_lock = new Object();
doc_cache.Term(); private final Ordered_hash wbase_db_hash = Ordered_hash_.New_bry();
wbase_db_log__flush(); private final Gfo_log_wtr wbase_db_log;
} private final Json_parser jsonParser = new Json_parser();
private void wbase_db_log__flush() { public Wbase_doc_mgr(Wdata_wiki_mgr wbase_mgr, Wbase_qid_mgr qid_mgr) {
int len = wbase_db_hash.Len(); this.wbase_mgr = wbase_mgr;
Bry_bfr tmp_bfr = Bry_bfr_.New(); this.qid_mgr = qid_mgr;
for (int i = 0; i < len; i++) { this.doc_cache = new Wbase_doc_cache__hash();
Wbase_db_log_itm itm = (Wbase_db_log_itm)wbase_db_hash.Get_at(i); this.wbase_db_log = Gfo_log_wtr.New_dflt("wbase", "db_log_{0}.csv");
tmp_bfr.Add(itm.Ttl()); }
tmp_bfr.Add_byte_pipe().Add_int_variable(itm.Count()); public void Enabled_(boolean v) {this.enabled = v;} private boolean enabled;
tmp_bfr.Add_byte_pipe().Add_int_variable(itm.Elapsed()); public void Cache__init(String cache_type, long cache_max, long compress_size, long used_weight) {
tmp_bfr.Add_byte_nl(); if (String_.Eq(cache_type, "null")) doc_cache = new Wbase_doc_cache__null();
wbase_db_log.Write(tmp_bfr); else if (String_.Eq(cache_type, "hash")) doc_cache = new Wbase_doc_cache__hash();
} else if (String_.Eq(cache_type, "mru" )) doc_cache = new Wbase_doc_cache__mru(cache_max, compress_size, used_weight);
wbase_db_log.Flush(); else throw Err_.new_unhandled_default(cache_type);
} }
public void Clear() { public void Cleanup() {
synchronized (thread_lock) { // LOCK:app-level doc_cache.Term();
doc_cache.Clear(); wbase_db_log__flush();
} }
} private void wbase_db_log__flush() {
public Wdata_doc Get_by_ttl_or_null(Xowe_wiki wiki, Xoa_ttl ttl) { // "enwiki", "Earth" -> "Q2" wdoc int len = wbase_db_hash.Len();
byte[] qid_bry = qid_mgr.Get_qid_or_null(wiki, ttl); // EX: "enwiki", "Earth" -> "Q2" Bry_bfr tmp_bfr = Bry_bfr_.New();
return qid_bry == null ? null : this.Get_by_exact_id_or_null(qid_bry); for (int i = 0; i < len; i++) {
} Wbase_db_log_itm itm = (Wbase_db_log_itm)wbase_db_hash.Get_at(i);
public Wdata_doc Get_by_xid_or_null(byte[] xid) {return Get_by_loose_id_or_null(Wbase_pid.Prepend_property_if_needed(xid));}// scribunto passes either p1 or q1; convert p1 to "Property:p1" tmp_bfr.Add(itm.Ttl());
public Wdata_doc Get_by_loose_id_or_null(byte[] ttl_bry) { tmp_bfr.Add_byte_pipe().Add_int_variable(itm.Count());
return Get_by_exact_id_or_null(ttl_bry); tmp_bfr.Add_byte_pipe().Add_int_variable(itm.Elapsed());
} tmp_bfr.Add_byte_nl();
public Wdata_doc Get_by_exact_id_or_null(byte[] ttl_bry) {// must correct case and ns; EX:"Q2" or "Property:P1"; not "q2" or "P2" wbase_db_log.Write(tmp_bfr);
// load from cache }
Wdata_doc rv = null; wbase_db_log.Flush();
synchronized (thread_lock) { }
rv = doc_cache.Get_or_null(ttl_bry); public void Clear() {
if (rv == null) { synchronized (thread_lock) { // LOCK:app-level
// load from db doc_cache.Clear();
rv = Load_wdoc_or_null(ttl_bry); }
if (rv == null) return null; // page not found }
Add(ttl_bry, rv);// NOTE: use ttl_bry, not rv.Qid; allows subsequent lookups to skip this redirect cycle public Wdata_doc Get_by_ttl_or_null(Xowe_wiki wiki, Xoa_ttl ttl) { // "enwiki", "Earth" -> "Q2" wdoc
} byte[] qid_bry = qid_mgr.Get_qid_or_null(wiki, ttl); // EX: "enwiki", "Earth" -> "Q2"
} return qid_bry == null ? null : this.Get_by_exact_id_or_null(qid_bry);
return rv; }
} public Wdata_doc Get_by_xid_or_null(byte[] xid) {return Get_by_loose_id_or_null(Wbase_pid.Prepend_property_if_needed(xid));}// scribunto passes either p1 or q1; convert p1 to "Property:p1"
private Wdata_doc Load_wdoc_or_null(byte[] ttl_bry) { // EX:"Q2" or "Property:P1" public Wdata_doc Get_by_loose_id_or_null(byte[] ttl_bry) {
if (!enabled) return null; return Get_by_exact_id_or_null(ttl_bry);
}
// loggging public Wdata_doc Get_by_exact_id_or_null(byte[] ttl_bry) {// must correct case and ns; EX:"Q2" or "Property:P1"; not "q2" or "P2"
Wbase_db_log_itm wbase_db_itm = (Wbase_db_log_itm)wbase_db_hash.Get_by(ttl_bry); // load from cache
if (wbase_db_itm == null) { Wdata_doc rv = null;
wbase_db_itm = new Wbase_db_log_itm(ttl_bry); synchronized (thread_lock) {
wbase_db_hash.Add(ttl_bry, wbase_db_itm); rv = doc_cache.Get_or_null(ttl_bry);
} if (rv == null) {
long time_bgn = gplx.core.envs.System_.Ticks(); // load from db
rv = Load_wdoc_or_null(ttl_bry);
Wdata_doc rv = null; if (rv == null) return null; // page not found
synchronized (thread_lock) { // LOCK:app-level; jdoc_parser; moved synchronized higher up; DATE:2016-09-03 Add(ttl_bry, rv);// NOTE: use ttl_bry, not rv.Qid; allows subsequent lookups to skip this redirect cycle
byte[] cur_ttl_bry = ttl_bry; }
int load_count = -1; }
while (load_count < 2) { // limit to 2 tries (i.e.: 1 redirect) return rv;
// parse ttl; note that "q2" will get parsed to "Q2" b/c of ns casing }
Xoa_ttl cur_ttl = wbase_mgr.Wdata_wiki().Ttl_parse(cur_ttl_bry); private Wdata_doc Load_wdoc_or_null(byte[] ttl_bry) { // EX:"Q2" or "Property:P1"
if (cur_ttl == null) { if (!enabled) return null;
Gfo_usr_dlg_.Instance.Warn_many("", "", "invalid wbase ttl: orig=~{0} cur=~{1}", ttl_bry, cur_ttl_bry);
break; // loggging
} Wbase_db_log_itm wbase_db_itm = (Wbase_db_log_itm)wbase_db_hash.Get_by(ttl_bry);
if (wbase_db_itm == null) {
// get page wbase_db_itm = new Wbase_db_log_itm(ttl_bry);
Xoae_page page = wbase_mgr.Wdata_wiki().Data_mgr().Load_page_by_ttl(cur_ttl); wbase_db_hash.Add(ttl_bry, wbase_db_itm);
if (!page.Db().Page().Exists()) break; }
long time_bgn = gplx.core.envs.System_.Ticks();
// parse jdoc
Json_doc jdoc = wbase_mgr.Jdoc_parser().Parse(page.Db().Text().Text_bry()); Wdata_doc rv = null;
if (jdoc == null) { synchronized (thread_lock) { // LOCK:app-level; jdoc_parser; moved synchronized higher up; DATE:2016-09-03
Gfo_usr_dlg_.Instance.Warn_many("", "", "invalid jdoc for ttl: orig=~{0} cur=~{1}", ttl_bry, cur_ttl_bry); byte[] cur_ttl_bry = ttl_bry;
break; int load_count = -1;
} while (load_count < 2) { // limit to 2 tries (i.e.: 1 redirect)
// parse ttl; note that "q2" will get parsed to "Q2" b/c of ns casing
// check for redirect; EX: {"entity":"Q22350516","redirect":"Q21006972"}; PAGE:fr.w:Tour_du_Táchira_2016; DATE:2016-08-13 Xoa_ttl cur_ttl = wbase_mgr.Wdata_wiki().Ttl_parse(cur_ttl_bry);
Json_nde jdoc_root = jdoc.Root_nde(); if (cur_ttl == null) {
byte[] redirect_ttl = jdoc_root.Get_as_bry_or(Bry__redirect, null); Gfo_usr_dlg_.Instance.Warn_many("", "", "invalid wbase ttl: orig=~{0} cur=~{1}", ttl_bry, cur_ttl_bry);
if (redirect_ttl != null) { break;
cur_ttl_bry = redirect_ttl; }
load_count++;
continue; // get page
} Xoae_page page = wbase_mgr.Wdata_wiki().Data_mgr().Load_page_by_ttl(cur_ttl);
if (!page.Db().Page().Exists()) break;
// is json doc, and not a redirect; return
rv = new Wdata_doc(wbase_mgr, jdoc, cur_ttl_bry); // parse jdoc
break; Json_doc jdoc = jsonParser.Parse(page.Db().Text().Text_bry());
} if (jdoc == null) {
if (rv == null && load_count >= 2) Gfo_usr_dlg_.Instance.Warn_many("", "", "invalid jdoc for ttl: orig=~{0} cur=~{1}", ttl_bry, cur_ttl_bry);
Gfo_usr_dlg_.Instance.Warn_many("", "", "too many redirects for ttl: orig=~{0} cur=~{1}", ttl_bry, cur_ttl_bry); break;
} }
wbase_db_itm.Update(gplx.core.envs.System_.Ticks__elapsed_in_frac(time_bgn)); // check for redirect; EX: {"entity":"Q22350516","redirect":"Q21006972"}; PAGE:fr.w:Tour_du_Táchira_2016; DATE:2016-08-13
return rv; Json_nde jdoc_root = jdoc.Root_nde();
} byte[] redirect_ttl = jdoc_root.Get_as_bry_or(Bry__redirect, null);
private static final byte[] Bry__redirect = Bry_.new_a7("redirect"); if (redirect_ttl != null) {
cur_ttl_bry = redirect_ttl;
public void Add(byte[] full_db, Wdata_doc page) { // TEST: load_count++;
synchronized (thread_lock) { // LOCK:app-level continue;
if (doc_cache.Get_or_null(full_db) == null) }
doc_cache.Add(full_db, page);
} // is json doc, and not a redirect; return
} rv = new Wdata_doc(wbase_mgr, jdoc, cur_ttl_bry);
} break;
class Wbase_db_log_itm { }
public Wbase_db_log_itm(byte[] ttl) { if (rv == null && load_count >= 2)
this.ttl = ttl; Gfo_usr_dlg_.Instance.Warn_many("", "", "too many redirects for ttl: orig=~{0} cur=~{1}", ttl_bry, cur_ttl_bry);
} }
public byte[] Ttl() {return ttl;} private final byte[] ttl;
public int Count() {return count;} private int count; wbase_db_itm.Update(gplx.core.envs.System_.Ticks__elapsed_in_frac(time_bgn));
public int Elapsed() {return elapsed;} private int elapsed; return rv;
public void Update(int elapsed_diff) { }
count++; private static final byte[] Bry__redirect = Bry_.new_a7("redirect");
this.elapsed += elapsed_diff;
} public void Add(byte[] full_db, Wdata_doc page) { // TEST:
} synchronized (thread_lock) { // LOCK:app-level
if (doc_cache.Get_or_null(full_db) == null)
doc_cache.Add(full_db, page);
}
}
}
class Wbase_db_log_itm {
public Wbase_db_log_itm(byte[] ttl) {
this.ttl = ttl;
}
public byte[] Ttl() {return ttl;} private final byte[] ttl;
public int Count() {return count;} private int count;
public int Elapsed() {return elapsed;} private int elapsed;
public void Update(int elapsed_diff) {
count++;
this.elapsed += elapsed_diff;
}
}

Loading…
Cancel
Save