@ -1,6 +1,6 @@
/ *
XOWA: the XOWA Offline Wiki Application
Copyright ( C ) 2012 - 20 17 gnosygnu @gmail.com
Copyright ( C ) 2012 - 20 20 gnosygnu @gmail.com
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 .
@ -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
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.* ;
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.langs.jsons.* ;
import gplx.xowa.langs.* ;
import gplx.xowa.wikis.nss.* ;
import gplx.xowa.bldrs.cmds.* ; import gplx.xowa.wikis.data.tbls.* ;
import gplx.xowa.xtns.wbases.* ; import gplx.xowa.xtns.wbases.core.* ; import gplx.xowa.xtns.wbases.claims.* ; import gplx.xowa.xtns.wbases.claims.itms.* ;
public class Xob_wdata_db_cmd extends Xob_dump_mgr_base implements Xob_cmd {
private Wdata_tbl_mgr tbl_mgr = new Wdata_tbl_mgr ( ) ;
private Wdata_wiki_mgr wdata_mgr ; private Json_parser json_parser ;
private byte [ ] lang_key = Xol_lang_itm_ . Key_en ;
public Xob_wdata_db_cmd ( Xob_bldr bldr , Xowe_wiki wiki ) { this . Cmd_ctor ( bldr , wiki ) ; }
@Override public String Cmd_key ( ) { return Xob_cmd_keys . Key_wbase_db ; }
@Override public byte Init_redirect ( ) { return Bool_ . N_byte ; } // json will never be found in a redirect
@Override public int [ ] Init_ns_ary ( ) { return Int_ary_ . New ( Xow_ns_ . Tid__main , Wdata_wiki_mgr . Ns_property ) ; }
@Override protected void Init_reset ( Db_conn conn ) {
Db_cfg_tbl cfg_tbl = gplx . xowa . wikis . data . Xowd_cfg_tbl_ . New ( conn ) ;
cfg_tbl . Delete_all ( ) ;
}
@Override protected Db_conn Init_db_file ( ) {
Xob_db_file tbl_file = Xob_db_file . New ( wiki . Fsys_mgr ( ) . Root_dir ( ) , "wdata_db.sqlite3" ) ;
Db_conn conn = tbl_file . Conn ( ) ;
tbl_mgr . Init ( conn ) ;
return conn ;
}
@Override protected void Cmd_bgn_end ( ) {
wdata_mgr = bldr . App ( ) . Wiki_mgr ( ) . Wdata_mgr ( ) ;
json_parser = wdata_mgr . Jdoc_parser ( ) ;
tbl_mgr . Conn ( ) . Txn_bgn ( "bldr__wdata_db" ) ;
}
@Override public void Exec_pg_itm_hook ( int ns_ord , Xow_ns ns , Xowd_page_itm page , byte [ ] page_src ) {
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 ) ;
}
@Override public void Exec_commit_hook ( ) {
tbl_mgr . Conn ( ) . Txn_sav ( ) ;
}
@Override public void Exec_end_hook ( ) {
tbl_mgr . Term ( usr_dlg ) ;
}
}
class Wdata_tbl_mgr {
private Wdata_tbl_base [ ] tbls ; private int tbls_len ;
public Wdata_tbl_mgr ( ) {
tbls = new Wdata_tbl_base [ ] { label_tbl , alias_tbl , description_tbl , link_tbl , claim_tbl , claim_time_tbl , claim_geo_tbl } ;
tbls_len = tbls . length ;
}
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 Wdata_alias_tbl Alias_tbl ( ) { return alias_tbl ; } private Wdata_alias_tbl alias_tbl = new Wdata_alias_tbl ( ) ;
public Wdata_description_tbl Description_tbl ( ) { return description_tbl ; } private Wdata_description_tbl description_tbl = new Wdata_description_tbl ( ) ;
public Wdata_link_tbl Link_tbl ( ) { return link_tbl ; } private Wdata_link_tbl link_tbl = new Wdata_link_tbl ( ) ;
public Wbase_claim_tbl Claim_tbl ( ) { return claim_tbl ; } private Wbase_claim_tbl claim_tbl = new Wbase_claim_tbl ( ) ;
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 ( ) ;
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 ( ) ;
public void Init ( Db_conn conn ) {
this . conn = conn ;
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 ) {
for ( int i = 0 ; i < tbls_len ; i + + )
tbls [ i ] . Exec_insert_by_wdoc ( lang_key , wdata_mgr , page_id , wdoc ) ;
}
public void Term ( Gfo_usr_dlg usr_dlg ) {
conn . Txn_end ( ) ;
for ( int i = 0 ; i < tbls_len ; i + + )
tbls [ i ] . Make_idxs ( usr_dlg , conn ) ;
}
}
abstract class Wdata_tbl_base {
public abstract String Tbl_name ( ) ;
public abstract String Tbl_create_sql ( ) ;
public abstract Db_idx_itm [ ] Idx_ary ( ) ;
public abstract String [ ] Fld_ary ( ) ;
@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 ( ) ) ; }
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 ( ) ) ;
}
public Db_stmt Make_insert_stmt ( Db_conn p ) { return Db_stmt_ . new_insert_ ( p , this . Tbl_name ( ) , this . Fld_ary ( ) ) ; }
public Db_stmt Insert_stmt ( ) { return insert_stmt ; } private Db_stmt insert_stmt ;
public void Init ( Db_conn conn ) {
this . Make_tbl ( conn ) ;
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 ( ) ;
for ( int i = 0 ; i < len ; i + + ) {
Json_kv kv = ( Json_kv ) hash . Get_at ( i ) ;
stmt . Clear ( )
. Val_int ( page_id )
. Val_bry_as_str ( kv . Key ( ) . Data_bry ( ) )
. Val_bry_as_str ( kv . Val ( ) . Data_bry ( ) )
. Exec_insert ( ) ;
}
}
}
class Wdata_label_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_label" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_label"
, "( 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_label__main ON wdata_label (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 ) { 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 {
@Override public String Tbl_name ( ) { return "wdata_alias" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_alias"
, "( 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 ) {
Ordered_hash hash = wdoc . Alias_list ( ) ;
int len = hash . Count ( ) ;
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 ( ) ;
Json_grp val_grp = ( Json_grp ) kv . Val ( ) ;
int val_grp_len = val_grp . Len ( ) ;
for ( int j = 0 ; j < val_grp_len ; j + + ) {
Json_itm val_itm = val_grp . Get_at ( j ) ;
byte [ ] val = Bry_ . Empty ;
if ( val_itm . Tid ( ) = = Json_itm_ . Tid__str )
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 ( ) ;
}
insert_stmt . Clear ( )
. Val_int ( page_id )
. Val_bry_as_str ( key )
. Val_bry_as_str ( val )
. Exec_insert ( ) ;
}
}
}
private static final String Fld_page_id = "page_id" , Fld_lang_key = "lang_key" , Fld_val = "val" ;
}
class Wdata_description_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_description" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_description"
, "( 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_description__main ON wdata_description (page_id, lang_key);" ) } ; }
@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" ;
}
class Wdata_link_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_link" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_link"
, "( page_id integer NOT NULL"
, ", wiki_key varchar(255) 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_link__main ON wdata_link (page_id, wiki_key);" ) } ; }
@Override public String [ ] Fld_ary ( ) { return new String [ ] { Fld_page_id , Fld_wiki_key , Fld_val } ; }
@Override public void Exec_insert_by_wdoc ( byte [ ] lang_key , Wdata_wiki_mgr wdata_mgr , int page_id , Wdata_doc wdoc ) {
Ordered_hash hash = wdoc . Slink_list ( ) ;
int len = hash . Count ( ) ;
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 ( ) ;
Json_itm kv_val = kv . Val ( ) ;
byte [ ] val = Bry_ . Empty ;
if ( kv_val . Tid ( ) = = Json_itm_ . Tid__str )
val = kv_val . Data_bry ( ) ;
else {
Json_nde val_nde = ( Json_nde ) kv . Val ( ) ;
Json_kv val_name_kv = ( Json_kv ) val_nde . Get_at ( 0 ) ; // ASSUME: 1st item is always "name" kv; EX: "name":"Earth"
val = val_name_kv . Val ( ) . Data_bry ( ) ;
}
insert_stmt . Clear ( )
. Val_int ( page_id )
. Val_bry_as_str ( key )
. Val_bry_as_str ( val )
. Exec_insert ( ) ;
}
}
private static final String Fld_page_id = "page_id" , Fld_wiki_key = "wiki_key" , Fld_val = "val" ;
}
class Wbase_claim_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_claim" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_claim"
, "( claim_id integer NOT NULL"
, ", page_id integer 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
, ", val_text varchar(255) NOT NULL"
, ", guid varchar(64) NOT NULL"
, ", rank integer NOT NULL"
, ", ref_count integer NOT NULL"
, ", qual_count integer NOT NULL"
, ");"
) ;
}
@Override public Db_idx_itm [ ] Idx_ary ( ) {
return new Db_idx_itm [ ]
{ Db_idx_itm . sql_ ( "CREATE INDEX IF NOT EXISTS wdata_claim__main ON wdata_claim (page_id, prop_id, val_tid, entity_tid);" )
} ;
}
@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 int next_claim_id = 0 ;
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 ) ;
visitor . Init ( lang_key ) ;
Ordered_hash list = wdoc . Claim_list ( ) ;
int list_len = list . Count ( ) ;
for ( int i = 0 ; i < list_len ; i + + ) {
Wbase_claim_grp claim_grp = ( Wbase_claim_grp ) list . Get_at ( i ) ;
int itms_len = claim_grp . Len ( ) ;
int entity_id = - 1 ;
byte [ ] claim_val = Bry_ . Empty ;
for ( int j = 0 ; j < itms_len ; j + + ) {
Wbase_claim_base claim = claim_grp . Get_at ( j ) ;
claim . Welcome ( visitor ) ;
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 ) ;
}
}
}
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 ) {
if ( val_text = = null ) val_text = Bry_ . Empty ;
if ( guid = = null ) guid = Bry_ . Empty ;
this . Insert_stmt ( ) . Clear ( )
. Val_int ( claim_id )
. Val_int ( page_id )
. Val_int ( prop_id )
. Val_byte ( val_tid )
. Val_byte ( entity_tid )
. Val_int ( entity_id )
. Val_bry_as_str ( val_text )
. Val_bry_as_str ( guid )
. Val_int ( rank )
. Val_int ( ref_count )
. Val_int ( qual_count )
. Exec_insert ( ) ;
}
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"
, Fld_guid = "guid" , Fld_rank = "rank" , Fld_ref_count = "ref_count" , Fld_qual_count = "qual_count"
;
}
class Wbase_claim_time_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_claim_time" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_claim_time"
, "( claim_id integer NOT NULL"
, ", time_val varchar(64) NOT NULL" // -04540000000-01-01T00:00:00Z
, ", 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
, ", time_model varchar(64) NOT NULL" // http:\/\/www.wikidata.org\/entity\/Q1985727
, ");"
) ;
}
@Override public Db_idx_itm [ ] Idx_ary ( ) {
return new Db_idx_itm [ ] {
Db_idx_itm . sql_ ( "CREATE INDEX IF NOT EXISTS wdata_claim_time__main ON wdata_claim_time (claim_id);" )
} ;
}
@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 } ; }
public void Insert ( Db_stmt stmt , int claim_id , byte [ ] time_val , int tz , int before , int after , int precision , byte [ ] model ) {
stmt . Clear ( )
. Val_int ( claim_id )
. Val_bry_as_str ( time_val )
. Val_int ( tz )
. Val_int ( before )
. Val_int ( after )
. Val_int ( precision )
. Val_bry_as_str ( model )
. 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" ;
}
class Wbase_claim_geo_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_claim_geo" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_claim_geo"
, "( claim_id integer 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
, ", geo_globe integer NOT NULL" // http:\/\/www.wikidata.org\/entity\/Q2
, ");"
) ;
}
@Override public Db_idx_itm [ ] Idx_ary ( ) {
return new Db_idx_itm [ ]
{ Db_idx_itm . sql_ ( "CREATE INDEX IF NOT EXISTS wdata_claim_geo__main ON wdata_claim_geo (claim_id);" )
} ;
}
public void Insert ( Db_stmt stmt , int claim_id , double latitude , double longitude , byte [ ] altitude , double precision , byte [ ] globe ) {
stmt . Clear ( )
. Val_int ( claim_id )
. Val_double ( latitude )
. Val_double ( longitude )
. Val_bry_as_str ( altitude )
. Val_double ( precision )
. Val_bry_as_str ( globe )
. Exec_insert ( ) ;
}
@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 } ; }
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" ;
}
class Wdata_ref_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_ref" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_ref"
, "( ref_id integer NOT NULL"
, ", page_id integer 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
, ", val_text 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_ref__main ON wdata_ref (page_id, prop_id, val_tid, entity_tid);" )
} ;
}
@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 } ; }
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" ;
}
class Wdata_qual_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_qual" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_qual"
, "( qual_id integer NOT NULL"
, ", 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 ;
}
}
package gplx.xowa.xtns.wbases.imports ;
import gplx.Bool_ ;
import gplx.Bry_ ;
import gplx.Byte_ascii ;
import gplx.Gfo_usr_dlg ;
import gplx.Int_ary_ ;
import gplx.Ordered_hash ;
import gplx.String_ ;
import gplx.dbs.Db_conn ;
import gplx.dbs.Db_idx_itm ;
import gplx.dbs.Db_stmt ;
import gplx.dbs.Db_stmt_ ;
import gplx.dbs.cfgs.Db_cfg_tbl ;
import gplx.dbs.engines.sqlite.Sqlite_engine_ ;
import gplx.langs.jsons.Json_doc ;
import gplx.langs.jsons.Json_grp ;
import gplx.langs.jsons.Json_itm ;
import gplx.langs.jsons.Json_itm_ ;
import gplx.langs.jsons.Json_kv ;
import gplx.langs.jsons.Json_nde ;
import gplx.langs.jsons.Json_parser ;
import gplx.xowa.Xowe_wiki ;
import gplx.xowa.bldrs.Xob_bldr ;
import gplx.xowa.bldrs.Xob_cmd_keys ;
import gplx.xowa.bldrs.Xob_db_file ;
import gplx.xowa.bldrs.cmds.Xob_dump_mgr_base ;
import gplx.xowa.bldrs.wkrs.Xob_cmd ;
import gplx.xowa.langs.Xol_lang_itm_ ;
import gplx.xowa.wikis.data.tbls.Xowd_page_itm ;
import gplx.xowa.wikis.nss.Xow_ns ;
import gplx.xowa.wikis.nss.Xow_ns_ ;
import gplx.xowa.xtns.wbases.Wdata_doc ;
import gplx.xowa.xtns.wbases.Wdata_wiki_mgr ;
import gplx.xowa.xtns.wbases.claims.Wbase_claim_grp ;
import gplx.xowa.xtns.wbases.claims.Wbase_claim_visitor ;
import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_base ;
import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_entity ;
import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_globecoordinate ;
import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_monolingualtext ;
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 ;
import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_value ;
public class Xob_wdata_db_cmd extends Xob_dump_mgr_base implements Xob_cmd {
private Wdata_tbl_mgr tbl_mgr = new Wdata_tbl_mgr ( ) ;
private Wdata_wiki_mgr wdata_mgr ;
private byte [ ] lang_key = Xol_lang_itm_ . Key_en ;
private final Json_parser json_parser = new Json_parser ( ) ;
public Xob_wdata_db_cmd ( Xob_bldr bldr , Xowe_wiki wiki ) { this . Cmd_ctor ( bldr , wiki ) ; }
@Override public String Cmd_key ( ) { return Xob_cmd_keys . Key_wbase_db ; }
@Override public byte Init_redirect ( ) { return Bool_ . N_byte ; } // json will never be found in a redirect
@Override public int [ ] Init_ns_ary ( ) { return Int_ary_ . New ( Xow_ns_ . Tid__main , Wdata_wiki_mgr . Ns_property ) ; }
@Override protected void Init_reset ( Db_conn conn ) {
Db_cfg_tbl cfg_tbl = gplx . xowa . wikis . data . Xowd_cfg_tbl_ . New ( conn ) ;
cfg_tbl . Delete_all ( ) ;
}
@Override protected Db_conn Init_db_file ( ) {
Xob_db_file tbl_file = Xob_db_file . New ( wiki . Fsys_mgr ( ) . Root_dir ( ) , "wdata_db.sqlite3" ) ;
Db_conn conn = tbl_file . Conn ( ) ;
tbl_mgr . Init ( conn ) ;
return conn ;
}
@Override protected void Cmd_bgn_end ( ) {
wdata_mgr = bldr . App ( ) . Wiki_mgr ( ) . Wdata_mgr ( ) ;
tbl_mgr . Conn ( ) . Txn_bgn ( "bldr__wdata_db" ) ;
}
@Override public void Exec_pg_itm_hook ( int ns_ord , Xow_ns ns , Xowd_page_itm page , byte [ ] page_src ) {
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 ) ;
}
@Override public void Exec_commit_hook ( ) {
tbl_mgr . Conn ( ) . Txn_sav ( ) ;
}
@Override public void Exec_end_hook ( ) {
tbl_mgr . Term ( usr_dlg ) ;
}
}
class Wdata_tbl_mgr {
private Wdata_tbl_base [ ] tbls ; private int tbls_len ;
public Wdata_tbl_mgr ( ) {
tbls = new Wdata_tbl_base [ ] { label_tbl , alias_tbl , description_tbl , link_tbl , claim_tbl , claim_time_tbl , claim_geo_tbl } ;
tbls_len = tbls . length ;
}
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 Wdata_alias_tbl Alias_tbl ( ) { return alias_tbl ; } private Wdata_alias_tbl alias_tbl = new Wdata_alias_tbl ( ) ;
public Wdata_description_tbl Description_tbl ( ) { return description_tbl ; } private Wdata_description_tbl description_tbl = new Wdata_description_tbl ( ) ;
public Wdata_link_tbl Link_tbl ( ) { return link_tbl ; } private Wdata_link_tbl link_tbl = new Wdata_link_tbl ( ) ;
public Wbase_claim_tbl Claim_tbl ( ) { return claim_tbl ; } private Wbase_claim_tbl claim_tbl = new Wbase_claim_tbl ( ) ;
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 ( ) ;
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 ( ) ;
public void Init ( Db_conn conn ) {
this . conn = conn ;
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 ) {
for ( int i = 0 ; i < tbls_len ; i + + )
tbls [ i ] . Exec_insert_by_wdoc ( lang_key , wdata_mgr , page_id , wdoc ) ;
}
public void Term ( Gfo_usr_dlg usr_dlg ) {
conn . Txn_end ( ) ;
for ( int i = 0 ; i < tbls_len ; i + + )
tbls [ i ] . Make_idxs ( usr_dlg , conn ) ;
}
}
abstract class Wdata_tbl_base {
public abstract String Tbl_name ( ) ;
public abstract String Tbl_create_sql ( ) ;
public abstract Db_idx_itm [ ] Idx_ary ( ) ;
public abstract String [ ] Fld_ary ( ) ;
@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 ( ) ) ; }
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 ( ) ) ;
}
public Db_stmt Make_insert_stmt ( Db_conn p ) { return Db_stmt_ . new_insert_ ( p , this . Tbl_name ( ) , this . Fld_ary ( ) ) ; }
public Db_stmt Insert_stmt ( ) { return insert_stmt ; } private Db_stmt insert_stmt ;
public void Init ( Db_conn conn ) {
this . Make_tbl ( conn ) ;
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 ( ) ;
for ( int i = 0 ; i < len ; i + + ) {
Json_kv kv = ( Json_kv ) hash . Get_at ( i ) ;
stmt . Clear ( )
. Val_int ( page_id )
. Val_bry_as_str ( kv . Key ( ) . Data_bry ( ) )
. Val_bry_as_str ( kv . Val ( ) . Data_bry ( ) )
. Exec_insert ( ) ;
}
}
}
class Wdata_label_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_label" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_label"
, "( 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_label__main ON wdata_label (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 ) { 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 {
@Override public String Tbl_name ( ) { return "wdata_alias" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_alias"
, "( 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 ) {
Ordered_hash hash = wdoc . Alias_list ( ) ;
int len = hash . Count ( ) ;
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 ( ) ;
Json_grp val_grp = ( Json_grp ) kv . Val ( ) ;
int val_grp_len = val_grp . Len ( ) ;
for ( int j = 0 ; j < val_grp_len ; j + + ) {
Json_itm val_itm = val_grp . Get_at ( j ) ;
byte [ ] val = Bry_ . Empty ;
if ( val_itm . Tid ( ) = = Json_itm_ . Tid__str )
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 ( ) ;
}
insert_stmt . Clear ( )
. Val_int ( page_id )
. Val_bry_as_str ( key )
. Val_bry_as_str ( val )
. Exec_insert ( ) ;
}
}
}
private static final String Fld_page_id = "page_id" , Fld_lang_key = "lang_key" , Fld_val = "val" ;
}
class Wdata_description_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_description" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_description"
, "( 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_description__main ON wdata_description (page_id, lang_key);" ) } ; }
@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" ;
}
class Wdata_link_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_link" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_link"
, "( page_id integer NOT NULL"
, ", wiki_key varchar(255) 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_link__main ON wdata_link (page_id, wiki_key);" ) } ; }
@Override public String [ ] Fld_ary ( ) { return new String [ ] { Fld_page_id , Fld_wiki_key , Fld_val } ; }
@Override public void Exec_insert_by_wdoc ( byte [ ] lang_key , Wdata_wiki_mgr wdata_mgr , int page_id , Wdata_doc wdoc ) {
Ordered_hash hash = wdoc . Slink_list ( ) ;
int len = hash . Count ( ) ;
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 ( ) ;
Json_itm kv_val = kv . Val ( ) ;
byte [ ] val = Bry_ . Empty ;
if ( kv_val . Tid ( ) = = Json_itm_ . Tid__str )
val = kv_val . Data_bry ( ) ;
else {
Json_nde val_nde = ( Json_nde ) kv . Val ( ) ;
Json_kv val_name_kv = ( Json_kv ) val_nde . Get_at ( 0 ) ; // ASSUME: 1st item is always "name" kv; EX: "name":"Earth"
val = val_name_kv . Val ( ) . Data_bry ( ) ;
}
insert_stmt . Clear ( )
. Val_int ( page_id )
. Val_bry_as_str ( key )
. Val_bry_as_str ( val )
. Exec_insert ( ) ;
}
}
private static final String Fld_page_id = "page_id" , Fld_wiki_key = "wiki_key" , Fld_val = "val" ;
}
class Wbase_claim_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_claim" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_claim"
, "( claim_id integer NOT NULL"
, ", page_id integer 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
, ", val_text varchar(255) NOT NULL"
, ", guid varchar(64) NOT NULL"
, ", rank integer NOT NULL"
, ", ref_count integer NOT NULL"
, ", qual_count integer NOT NULL"
, ");"
) ;
}
@Override public Db_idx_itm [ ] Idx_ary ( ) {
return new Db_idx_itm [ ]
{ Db_idx_itm . sql_ ( "CREATE INDEX IF NOT EXISTS wdata_claim__main ON wdata_claim (page_id, prop_id, val_tid, entity_tid);" )
} ;
}
@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 int next_claim_id = 0 ;
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 ) ;
visitor . Init ( lang_key ) ;
Ordered_hash list = wdoc . Claim_list ( ) ;
int list_len = list . Count ( ) ;
for ( int i = 0 ; i < list_len ; i + + ) {
Wbase_claim_grp claim_grp = ( Wbase_claim_grp ) list . Get_at ( i ) ;
int itms_len = claim_grp . Len ( ) ;
int entity_id = - 1 ;
byte [ ] claim_val = Bry_ . Empty ;
for ( int j = 0 ; j < itms_len ; j + + ) {
Wbase_claim_base claim = claim_grp . Get_at ( j ) ;
claim . Welcome ( visitor ) ;
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 ) ;
}
}
}
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 ) {
if ( val_text = = null ) val_text = Bry_ . Empty ;
if ( guid = = null ) guid = Bry_ . Empty ;
this . Insert_stmt ( ) . Clear ( )
. Val_int ( claim_id )
. Val_int ( page_id )
. Val_int ( prop_id )
. Val_byte ( val_tid )
. Val_byte ( entity_tid )
. Val_int ( entity_id )
. Val_bry_as_str ( val_text )
. Val_bry_as_str ( guid )
. Val_int ( rank )
. Val_int ( ref_count )
. Val_int ( qual_count )
. Exec_insert ( ) ;
}
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"
, Fld_guid = "guid" , Fld_rank = "rank" , Fld_ref_count = "ref_count" , Fld_qual_count = "qual_count"
;
}
class Wbase_claim_time_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_claim_time" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_claim_time"
, "( claim_id integer NOT NULL"
, ", time_val varchar(64) NOT NULL" // -04540000000-01-01T00:00:00Z
, ", 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
, ", time_model varchar(64) NOT NULL" // http:\/\/www.wikidata.org\/entity\/Q1985727
, ");"
) ;
}
@Override public Db_idx_itm [ ] Idx_ary ( ) {
return new Db_idx_itm [ ] {
Db_idx_itm . sql_ ( "CREATE INDEX IF NOT EXISTS wdata_claim_time__main ON wdata_claim_time (claim_id);" )
} ;
}
@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 } ; }
public void Insert ( Db_stmt stmt , int claim_id , byte [ ] time_val , int tz , int before , int after , int precision , byte [ ] model ) {
stmt . Clear ( )
. Val_int ( claim_id )
. Val_bry_as_str ( time_val )
. Val_int ( tz )
. Val_int ( before )
. Val_int ( after )
. Val_int ( precision )
. Val_bry_as_str ( model )
. 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" ;
}
class Wbase_claim_geo_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_claim_geo" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_claim_geo"
, "( claim_id integer 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
, ", geo_globe integer NOT NULL" // http:\/\/www.wikidata.org\/entity\/Q2
, ");"
) ;
}
@Override public Db_idx_itm [ ] Idx_ary ( ) {
return new Db_idx_itm [ ]
{ Db_idx_itm . sql_ ( "CREATE INDEX IF NOT EXISTS wdata_claim_geo__main ON wdata_claim_geo (claim_id);" )
} ;
}
public void Insert ( Db_stmt stmt , int claim_id , double latitude , double longitude , byte [ ] altitude , double precision , byte [ ] globe ) {
stmt . Clear ( )
. Val_int ( claim_id )
. Val_double ( latitude )
. Val_double ( longitude )
. Val_bry_as_str ( altitude )
. Val_double ( precision )
. Val_bry_as_str ( globe )
. Exec_insert ( ) ;
}
@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 } ; }
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" ;
}
class Wdata_ref_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_ref" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_ref"
, "( ref_id integer NOT NULL"
, ", page_id integer 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
, ", val_text 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_ref__main ON wdata_ref (page_id, prop_id, val_tid, entity_tid);" )
} ;
}
@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 } ; }
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" ;
}
class Wdata_qual_tbl extends Wdata_tbl_base {
@Override public String Tbl_name ( ) { return "wdata_qual" ; }
@Override public String Tbl_create_sql ( ) {
return String_ . Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS wdata_qual"
, "( qual_id integer NOT NULL"
, ", 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 ;
}
}