Reuse quantity.unit code for renderSnake

v3.3.4
gnosygnu 8 years ago
parent f17aadfcba
commit d983a32397

@ -102,8 +102,8 @@ public class Scrib_lib_wikibase_tst {
fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnak, args, "test_str");
}
@Test public void RenderSnak__quantity() {
Keyval[] args = Wbase_snak_utl_.Get_snak(wdata_fxt, wdata_fxt.Make_claim_quantity(3, "123", "2", "125", "121"));
fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnak, args, "123±2");
Keyval[] args = Wbase_snak_utl_.Get_snak(wdata_fxt, wdata_fxt.Make_claim_quantity(3, "123", "units", "125", "121"));
fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnak, args, "123±2 units");
}
@Test public void RenderSnak__time() {
Keyval[] args = Wbase_snak_utl_.Get_snak(wdata_fxt, wdata_fxt.Make_claim_time(3, "2012-01-02 03:04:05"));

@ -45,18 +45,35 @@ public class Wdata_prop_val_visitor_ {
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) {
Keyval[] datavalue_ary = (Keyval[])Scrib_kv_utl_.Get_sub_by_key_or_null(props, Wdata_dict_mainsnak.Itm__datavalue.Key_str());
// [snaktype=value, property=P1082, datavalue=[Lgplx.Keyval;@44a11b76, datatype=quantity]
// loop props to get (a) snaktype; (b) property; (c) datavalue
byte snak_tid = Byte_.Max_value_127;
int pid = -1;
Keyval[] datavalue_ary = null;
int len = props.length;
for (int i = 0; i < len; ++i) {
Keyval prop = props[i];
byte prop_tid = Wdata_dict_mainsnak.Reg.Get_tid_or_max_and_log(page_url, prop.Key()); if (prop_tid == Byte_.Max_value_127) continue;
switch (prop_tid) {
case Wdata_dict_mainsnak.Tid__snaktype: snak_tid = Wbase_claim_value_type_.Reg.Get_tid_or_fail(prop.Val_to_bry()); break;
case Wdata_dict_mainsnak.Tid__datavalue: datavalue_ary = (Keyval[])prop.Val(); break;
case Wdata_dict_mainsnak.Tid__datatype: break; // ignore: has values like "wikibase-property"; EX: www.wikidata.org/wiki/Property:P397; DATE:2015-06-12
case Wdata_dict_mainsnak.Tid__property: pid = To_pid_int(prop.Val_to_bry()); break;
case Wdata_dict_mainsnak.Tid__hash: break; // ignore: "84487fc3f93b4f74ab1cc5a47d78f596f0b49390"
}
}
// loop datavalue_ary to get tid, val_obj
byte tid = Byte_.Max_value_127;
Object val_obj = null;
int len = datavalue_ary.length;
len = datavalue_ary.length;
for (int i = 0; i < len; ++i) {
String key = datavalue_ary[i].Key();
Keyval datavalue_itm = datavalue_ary[i];
String key = datavalue_itm.Key();
if (String_.Eq(key, Wdata_dict_datavalue.Itm__type.Key_str()))
tid = Wbase_claim_type_.Get_tid_or_unknown((String)datavalue_ary[i].Val());
tid = Wbase_claim_type_.Get_tid_or_unknown((String)datavalue_itm.Val());
else if (String_.Eq(key, Wdata_dict_datavalue.Itm__value.Key_str()))
val_obj = datavalue_ary[i].Val();
val_obj = datavalue_itm.Val();
}
// render val_obj based on tid
@ -65,7 +82,7 @@ public class Wdata_prop_val_visitor_ {
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, 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;
}
lang.Comma_wkr().Comma__itm(bfr, sub_idx, sub_len);
@ -125,7 +142,7 @@ public class Wdata_prop_val_visitor_ {
, parser_mgr.Wbase__time__msgs(), page_url, Bry_.Empty, date, calendar_is_julian
);
}
private static void Render__quantity(Bry_bfr bfr, Xol_lang_itm lang, byte[] page_url, Keyval[] kvs) {
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;
int len = kvs.length;
for (int i = 0; i < len; ++i) {
@ -139,18 +156,19 @@ public class Wdata_prop_val_visitor_ {
case Wbase_claim_quantity_.Tid__upperbound: ubound_bry = val_bry; break;
}
}
Render__quantity(bfr, lang, amount_bry, lbound_bry, ubound_bry, unit_bry);
}
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
}
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);
}
// 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;
int len = kvs.length;
@ -177,5 +195,6 @@ public class Wdata_prop_val_visitor_ {
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 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(", ");
}

@ -82,10 +82,14 @@ public class Wdata_wiki_mgr implements Gfo_evt_itm, Gfo_invk {
Wdata_doc wdoc = Doc_mgr.Get_by_bry_or_null(qid); if (wdoc == null) return or;
Wbase_claim_grp claim_grp = wdoc.Claim_list_get(pid); if (claim_grp == null || claim_grp.Len() == 0) return or;
Wbase_claim_base claim_itm = claim_grp.Get_at(0);
Resolve_claim(tmp_bfr, domain, claim_itm);
return tmp_bfr.To_bry_and_clear();
}
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
prop_val_visitor.Init(tmp_bfr, hwtr_mgr.Msgs(), domain.Lang_orig_key());
Hwtr_mgr_assert();
prop_val_visitor.Init(rv, hwtr_mgr.Msgs(), domain.Lang_orig_key());
claim_itm.Welcome(prop_val_visitor);
return tmp_bfr.To_bry_and_clear();
}
}
public void Resolve_to_bfr(Bry_bfr bfr, Wbase_claim_grp prop_grp, byte[] lang_key) {

Loading…
Cancel
Save