Wikibase: Centralize rendering of claim values ({{#property}} and JSON vs renderSnak and Keyval)

v3.3.4
gnosygnu 8 years ago
parent c598d1a218
commit 6748463711

@ -74,7 +74,9 @@ public class Scrib_lib_wikibase implements Scrib_lib {
public boolean GetEntityUrl(Scrib_proc_args args, Scrib_proc_rslt rslt) {throw Err_.new_("wbase", "getEntityUrl not implemented", "url", core.Page().Url().To_str());}
public boolean GetSetting(Scrib_proc_args args, Scrib_proc_rslt rslt) {throw Err_.new_("wbase", "getSetting not implemented", "url", core.Page().Url().To_str());}
public boolean RenderSnak(Scrib_proc_args args, Scrib_proc_rslt rslt) {
String rv = Wdata_prop_val_visitor_.Render_snak(core.Wiki(), core.Page().Url_bry_safe(), args.Pull_kv_ary_safe(0));
Xowe_wiki wiki = core.Wiki();
Wdata_wiki_mgr wdata_mgr = wiki.Appe().Wiki_mgr().Wdata_mgr();
String rv = Wdata_prop_val_visitor_.Render_snak(wdata_mgr, wiki, core.Page().Url_bry_safe(), args.Pull_kv_ary_safe(0));
return rslt.Init_obj(rv);
}
public boolean RenderSnaks(Scrib_proc_args args, Scrib_proc_rslt rslt) {

@ -93,7 +93,7 @@ public class Scrib_lib_wikibase_tst {
fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnaks, args, "P3_en, P3_de");
}
@Test public void RenderSnak__entity() {
wdata_fxt.Init__docs__add(wdata_fxt.Wdoc_bldr("Q3").Add_label("zh-hans", "test_label").Xto_wdoc());
wdata_fxt.Init__docs__add(wdata_fxt.Wdoc_bldr("q3").Add_label("en", "test_label").Xto_wdoc());
Keyval[] args = Wbase_snak_utl_.Get_snak(wdata_fxt, wdata_fxt.Make_claim_entity_qid(2, 3));
fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnak, args, "test_label");
}

@ -82,10 +82,13 @@ class Wdata_prop_val_visitor implements Wbase_claim_visitor {
bfr.Add(entity_doc.Label_list__get_or_fallback(lang));
}
}
private static final byte[] Wikidata_url = Bry_.new_a7("http://www.wikidata.org/entity/");
public void Visit_globecoordinate(Wbase_claim_globecoordinate itm) {
Wdata_prop_val_visitor_.Render__geo(bfr, itm.Lat(), itm.Lng());
bfr.Add(itm.Lat());
bfr.Add(Bry__geo_dlm);
bfr.Add(itm.Lng());
}
private static final byte[] Wikidata_url = Bry_.new_a7("http://www.wikidata.org/entity/");
private static final byte[] Bry__geo_dlm = Bry_.new_a7(", ");
public void Visit_system(Wbase_claim_value itm) {}
public static final byte[] Bry__quantity_margin_of_error = Bry_.new_u8("±");
}

@ -24,27 +24,28 @@ public class Wdata_prop_val_visitor_ {
public static String Render_snaks(Xowe_wiki wiki, byte[] page_url, Keyval[] snaks) {
String rv = null;
int len = snaks.length;
Wdata_wiki_mgr wdata_mgr = wiki.Appe().Wiki_mgr().Wdata_mgr();
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512();
try {
for (int i = 0; i < len; ++i) {
Keyval[] itm = (Keyval[])snaks[i].Val();
Render_snak(bfr, wiki, wiki.Lang(), page_url, itm, i, len);
Render_snak(bfr, wdata_mgr, wiki, wiki.Lang(), page_url, itm, i, len);
}
wiki.Lang().Comma_wkr().Comma__end(bfr);
rv = bfr.To_str_and_clear();
} finally {bfr.Mkr_rls();}
return rv;
}
public static String Render_snak(Xowe_wiki wiki, byte[] page_url, Keyval[] props) {
public static String Render_snak(Wdata_wiki_mgr wdata_mgr, Xowe_wiki wiki, byte[] page_url, Keyval[] props) {
String rv = null;
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512();
try {
Render_snak(bfr, wiki, wiki.Lang(), page_url, props, 0, 1);
Render_snak(bfr, wdata_mgr, wiki, wiki.Lang(), page_url, props, 0, 1);
rv = bfr.To_str_and_clear();
} finally {bfr.Mkr_rls();}
return rv;
}
private static void Render_snak(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, byte[] page_url, Keyval[] props, int sub_idx, int sub_len) {
private static void Render_snak(Bry_bfr bfr, Wdata_wiki_mgr wdata_mgr, Xowe_wiki wiki, Xol_lang_itm lang, byte[] page_url, Keyval[] props, int sub_idx, int sub_len) {
// loop props to get (a) snaktype; (b) property; (c) datavalue
byte snak_tid = Byte_.Max_value_127;
int pid = -1;
@ -75,18 +76,22 @@ public class Wdata_prop_val_visitor_ {
val_obj = datavalue_itm.Val();
}
// render val_obj based on tid
// get claim and render
// NOTE: converting to claim before writing; used to write directly; less efficient, but more consistent; DATE:2016-10-20
Wbase_claim_base claim = null;
switch (tid) {
case Wbase_claim_type_.Tid__entity: Render__entity (bfr, wiki, lang, page_url, (Keyval[])val_obj); break;
case Wbase_claim_type_.Tid__string: bfr.Add_str_u8((String)val_obj); break;
case Wbase_claim_type_.Tid__time: Render__time (bfr, wiki, page_url, (Keyval[])val_obj); break;
case Wbase_claim_type_.Tid__globecoordinate: Render__geo (bfr, lang, page_url, (Keyval[])val_obj); break;
case Wbase_claim_type_.Tid__quantity: Render__quantity (bfr, wiki, lang, page_url, pid, snak_tid, (Keyval[])val_obj); break;
case Wbase_claim_type_.Tid__monolingualtext: Render__langtext (bfr, lang, (Keyval[])val_obj); break;
case Wbase_claim_type_.Tid__entity: claim = Make__entity (page_url, pid, snak_tid, (Keyval[])val_obj); break;
case Wbase_claim_type_.Tid__string: claim = new Wbase_claim_string(pid, snak_tid, To_bry_by_str(val_obj)); break;
case Wbase_claim_type_.Tid__time: claim = Make__time (page_url, pid, snak_tid, (Keyval[])val_obj); break;
case Wbase_claim_type_.Tid__globecoordinate: claim = Make__geo (page_url, pid, snak_tid, (Keyval[])val_obj); break;
case Wbase_claim_type_.Tid__quantity: claim = Make__quantity (page_url, pid, snak_tid, (Keyval[])val_obj); break;
case Wbase_claim_type_.Tid__monolingualtext: claim = Make__langtext (page_url, pid, snak_tid, (Keyval[])val_obj); break;
default: throw Err_.new_unhandled_default(tid);
}
wdata_mgr.Resolve_claim(bfr, wiki.Domain_itm(), claim);
lang.Comma_wkr().Comma__itm(bfr, sub_idx, sub_len);
}
private static void Render__entity(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, byte[] page_url, Keyval[] kvs) {
private static Wbase_claim_entity Make__entity(byte[] page_url, int pid, byte snak_tid, Keyval[] kvs) {
byte entity_tid = Byte_.Max_value_127;
byte[] entity_id_bry = null;
@ -101,99 +106,87 @@ public class Wdata_prop_val_visitor_ {
case Wbase_claim_entity_.Tid__id: break; // ignore
}
}
// convert p/q, number to xid; "p123", "q123"
if (entity_id_bry == null) throw Err_.new_wo_type("xid is invalid entity", "xid", page_url);
byte xid_pre = entity_tid == Wbase_claim_entity_type_.Tid__item ? Byte_ascii.Ltr_Q : Byte_ascii.Ltr_P;
entity_id_bry = Bry_.Add(xid_pre, entity_id_bry);
// get doc
Wdata_doc wdoc = wiki.Appe().Wiki_mgr().Wdata_mgr().Doc_mgr.Get_by_xid_or_null(entity_id_bry); // NOTE: by_xid b/c Module passes just "p1" not "Property:P1"
if (wdoc == null) {
Gfo_usr_dlg_.Instance.Log_many("", "", "qid not found in wikidata for renderSnak; page=~{0} qid=~{1}", page_url, entity_id_bry);
return;
}
// add label
bfr.Add(wdoc.Label_list__get(lang.Key_bry()));
return new Wbase_claim_entity(pid, snak_tid, entity_tid, entity_id_bry);
}
private static void Render__time(Bry_bfr bfr, Xowe_wiki wiki, byte[] page_url, Keyval[] kvs) {
Wbase_date date = null;
byte[] time = null;
int precision_int = 0, before_int = 0, after_int = 0;
boolean calendar_is_julian = true;
private static Wbase_claim_time Make__time(byte[] page_url, int pid, byte snak_tid, Keyval[] kvs) {
byte[] time = null, timezone = null;
byte[] precision = null, before = null, after = null;
byte[] calendar = null;
int len = kvs.length;
for (int i = 0; i < len; ++i) {
Keyval kv = kvs[i];
byte val_tid = Wbase_claim_time_.Reg.Get_tid_or_max_and_log(page_url, kv.Key()); if (val_tid == Byte_.Max_value_127) continue;
switch (val_tid) {
case Wbase_claim_time_.Tid__time: time = Bry_.new_u8((String)kv.Val()); break;
case Wbase_claim_time_.Tid__before: before_int = Int_.cast(kv.Val()); break;
case Wbase_claim_time_.Tid__after: after_int = Int_.cast(kv.Val()); break;
case Wbase_claim_time_.Tid__precision: precision_int = Int_.cast(kv.Val()); break;
case Wbase_claim_time_.Tid__calendarmodel: calendar_is_julian = Bry_.Eq(Bry_.new_u8((String)kv.Val()), Wbase_claim_time.Calendar_julian); break;
case Wbase_claim_time_.Tid__timezone: if (!String_.Eq((String)kv.Val(), "0")) throw Err_.new_unimplemented(); break;
case Wbase_claim_time_.Tid__time: time = To_bry_by_str(kv.Val()); break;
case Wbase_claim_time_.Tid__before: before = To_bry_by_int(kv.Val()); break;
case Wbase_claim_time_.Tid__after: after = To_bry_by_int(kv.Val()); break;
case Wbase_claim_time_.Tid__precision: precision = To_bry_by_int(kv.Val()); break;
case Wbase_claim_time_.Tid__calendarmodel: calendar = To_bry_by_str(kv.Val()); break; // Bry_.Eq(Bry_.new_u8((String)kv.Val()), Wbase_claim_time.Calendar_julian);
case Wbase_claim_time_.Tid__timezone: timezone = To_bry_by_str(kv.Val()); break; // if (!String_.Eq((String)kv.Val(), "0")) throw Err_.new_unimplemented();
}
}
Xow_parser_mgr parser_mgr = wiki.Parser_mgr();
date = Wbase_date.Parse(time, precision_int, before_int, after_int, calendar_is_julian);
Wbase_claim_time.Write_to_bfr(bfr, parser_mgr.Wbase__time__bfr(), parser_mgr.Wbase__time__fmtr()
, parser_mgr.Wbase__time__msgs(), page_url, Bry_.Empty, date, calendar_is_julian
);
// Xow_parser_mgr parser_mgr = wiki.Parser_mgr();
// date = Wbase_date.Parse(time, precision_int, before_int, after_int, calendar_is_julian);
// Wbase_claim_time.Write_to_bfr(bfr, parser_mgr.Wbase__time__bfr(), parser_mgr.Wbase__time__fmtr()
// , parser_mgr.Wbase__time__msgs(), page_url, Bry_.Empty, date, calendar_is_julian
// );
return new Wbase_claim_time(pid, snak_tid, time, timezone, before, after, precision, calendar);
}
private static void Render__quantity(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, byte[] page_url, int pid, byte snak_tid, Keyval[] kvs) {
byte[] amount_bry = null, lbound_bry = null, ubound_bry = null, unit_bry = null;
private static Wbase_claim_quantity Make__quantity(byte[] page_url, int pid, byte snak_tid, Keyval[] kvs) {
byte[] amount = null, lbound = null, ubound = null, unit = null;
int len = kvs.length;
for (int i = 0; i < len; ++i) {
Keyval kv = kvs[i];
byte val_tid = Wbase_claim_quantity_.Reg.Get_tid_or_max_and_log(page_url, kv.Key()); if (val_tid == Byte_.Max_value_127) continue;
byte[] val_bry = Bry_.new_u8((String)kv.Val());
switch (val_tid) {
case Wbase_claim_quantity_.Tid__amount: amount_bry = val_bry; break;
case Wbase_claim_quantity_.Tid__unit: unit_bry = val_bry; break;
case Wbase_claim_quantity_.Tid__lowerbound: lbound_bry = val_bry; break;
case Wbase_claim_quantity_.Tid__upperbound: ubound_bry = val_bry; break;
case Wbase_claim_quantity_.Tid__amount: amount = To_bry_by_str(kv.Val()); break;
case Wbase_claim_quantity_.Tid__unit: unit = To_bry_by_str(kv.Val()); break;
case Wbase_claim_quantity_.Tid__lowerbound: lbound = To_bry_by_str(kv.Val()); break;
case Wbase_claim_quantity_.Tid__upperbound: ubound = To_bry_by_str(kv.Val()); break;
}
}
Wbase_claim_quantity quantity = new Wbase_claim_quantity(pid, snak_tid, amount_bry, unit_bry, ubound_bry, lbound_bry);
wiki.Appe().Wiki_mgr().Wdata_mgr().Resolve_claim(bfr, wiki.Domain_itm(), quantity);
return new Wbase_claim_quantity(pid, snak_tid, amount, unit, ubound, lbound);
}
// private static void Render__quantity(Bry_bfr bfr, Xol_lang_itm lang, byte[] amount_bry, byte[] lbound_bry, byte[] ubound_bry, byte[] unit_bry) {
// long val = Bry_.To_long_or(amount_bry, Byte_ascii.Comma_bry, 0, amount_bry.length, 0); // NOTE: must cast to long for large numbers; EX:{{#property:P1082}} PAGE:en.w:Earth; DATE:2015-08-02
// bfr.Add(lang.Num_mgr().Format_num_by_long(val));// amount; EX: 1,234
// long lbound = Bry_.To_long_or(lbound_bry, val);
// long ubound = Bry_.To_long_or(lbound_bry, val);
// if (lbound != val && ubound != val) { // NOTE: do not output <20> if lbound == val == ubound; PAGE:en.w:Tintinan DATE:2015-08-02
// bfr.Add(Wdata_prop_val_visitor.Bry__quantity_margin_of_error); // symbol: EX: <20>
// bfr.Add(unit_bry); // unit; EX: 1
// }
// }
private static void Render__geo(Bry_bfr bfr, Xol_lang_itm lang, byte[] page_url, Keyval[] kvs) {
double lat = 0, lng = 0;
private static Wbase_claim_globecoordinate Make__geo(byte[] page_url, int pid, byte snak_tid, Keyval[] kvs) {
byte[] lat = null, lng = null, prc = null, alt = null, glb = null;
int len = kvs.length;
for (int i = 0; i < len; ++i) {
Keyval kv = kvs[i];
byte val_tid = Wbase_claim_globecoordinate_.Reg.Get_tid_or_max_and_log(page_url, kv.Key()); if (val_tid == Byte_.Max_value_127) continue;
switch (val_tid) {
case Wbase_claim_globecoordinate_.Tid__latitude: lat = Double_.cast(kv.Val()); break;
case Wbase_claim_globecoordinate_.Tid__longitude: lng = Double_.cast(kv.Val()); break;
case Wbase_claim_globecoordinate_.Tid__latitude: lat = To_bry_by_double(kv.Val()); break;
case Wbase_claim_globecoordinate_.Tid__longitude: lng = To_bry_by_double(kv.Val()); break;
case Wbase_claim_globecoordinate_.Tid__altitude: alt = To_bry_by_str(kv.Val()); break;
case Wbase_claim_globecoordinate_.Tid__precision: prc = To_bry_by_double(kv.Val()); break;
case Wbase_claim_globecoordinate_.Tid__globe: glb = To_bry_by_str(kv.Val()); break;
}
}
Render__geo(bfr, lat, lng);
return new Wbase_claim_globecoordinate(pid, snak_tid, lat, lng, alt, prc, glb);
}
public static void Render__geo(Bry_bfr bfr, byte[] lat, byte[] lng) {
bfr.Add(lat);
bfr.Add(Bry__geo_dlm);
bfr.Add(lng);
private static Wbase_claim_monolingualtext Make__langtext(byte[] page_url, int pid, byte snak_tid, Keyval[] kvs) {
byte[] lang = null, text = null;
int len = kvs.length;
for (int i = 0; i < len; ++i) {
Keyval kv = kvs[i];
byte val_tid = Wbase_claim_monolingualtext_.Reg.Get_tid_or_max_and_log(page_url, kv.Key()); if (val_tid == Byte_.Max_value_127) continue;
switch (val_tid) {
case Wbase_claim_monolingualtext_.Tid__language: lang = To_bry_by_str(kv.Val()); break;
case Wbase_claim_monolingualtext_.Tid__text: text = To_bry_by_str(kv.Val()); break;
}
}
return new Wbase_claim_monolingualtext(pid, snak_tid, lang, text);
}
public static void Render__geo(Bry_bfr bfr, double lat, double lng) {
bfr.Add_double(lat);
bfr.Add(Bry__geo_dlm);
bfr.Add_double(lng);
private static int To_pid_int(byte[] pid) {return Bry_.To_int_or(pid, 1, pid.length, -1);} // skip "P" at bgn; EX: "p123" -> 123
private static byte[] To_bry_by_str(Object o) {
String rv = String_.cast(o);
return rv == null ? null : Bry_.new_u8(rv);
}
private static void Render__langtext(Bry_bfr bfr, Xol_lang_itm lang, Keyval[] kvs) {
bfr.Add_str_u8((String)Scrib_kv_utl_.Get_sub_by_key_or_null(kvs, Wbase_claim_monolingualtext_.Itm__text.Key_str()));
private static byte[] To_bry_by_double(Object o) {
double rv = Double_.cast(o);
return Bry_.new_a7(Double_.To_str(rv));
}
private static byte[] To_bry_by_int(Object o) {
int rv = Int_.cast(o);
return Int_.To_bry(rv);
}
private static int To_pid_int(byte[] pid) {return Bry_.To_int_or(pid, 1, pid.length, -1);} // skip "P" at bgn; EX: "p123" -> 123
private static final byte[] Bry__geo_dlm = Bry_.new_a7(", ");
}

@ -87,14 +87,14 @@ public class Wdata_wiki_mgr implements Gfo_evt_itm, Gfo_invk {
}
public void Resolve_claim(Bry_bfr rv, Xow_domain_itm domain, Wbase_claim_base claim_itm) {
synchronized (thread_lock) { // LOCK:must synchronized b/c prop_val_visitor has member bfr which can get overwritten; DATE:2016-07-06
Hwtr_mgr_assert();
if (hwtr_mgr == null) Hwtr_mgr_assert();
prop_val_visitor.Init(rv, hwtr_mgr.Msgs(), domain.Lang_orig_key());
claim_itm.Welcome(prop_val_visitor);
}
}
public void Resolve_to_bfr(Bry_bfr bfr, Wbase_claim_grp prop_grp, byte[] lang_key) {
synchronized (thread_lock) { // LOCK:must synchronized b/c prop_val_visitor has member bfr which can get overwritten; DATE:2016-07-06
Hwtr_mgr_assert();
if (hwtr_mgr == null) Hwtr_mgr_assert();
int len = prop_grp.Len();
Wbase_claim_base selected = null;
for (int i = 0; i < len; i++) { // NOTE: multiple props possible; EX: {{#property:P1082}}; PAGE:en.w:Earth DATE:2015-08-02
@ -137,7 +137,7 @@ public class Wdata_wiki_mgr implements Gfo_evt_itm, Gfo_invk {
Gfo_evt_mgr_.Sub_same_many(app.Usere(), this, Xoue_user.Evt_lang_changed);
}
private void Hwtr_msgs_make() {
if (!app.Wiki_mgr().Wiki_regy().Has(Xow_domain_itm_.Bry__wikidata)) return;
// if (!app.Wiki_mgr().Wiki_regy().Has(Xow_domain_itm_.Bry__wikidata)) return; // DELETE: don't know why guard is needed; breaks test; DATE:2016-10-20
Xol_lang_itm new_lang = app.Usere().Lang();
Xowe_wiki cur_wiki = this.Wdata_wiki();
cur_wiki.Xtn_mgr().Xtn_wikibase().Load_msgs(cur_wiki, new_lang);

Loading…
Cancel
Save