Wbase: Do not fail if null quantity.lbound or quantity.ubound

v3.3.4
gnosygnu 8 years ago
parent 9fd328ac8f
commit 364e72e869

@ -21,13 +21,13 @@ import java.text.NumberFormat;
import java.text.ParseException; import java.text.ParseException;
import java.util.Locale; import java.util.Locale;
public class Decimal_adp_ { public class Decimal_adp_ {
public static final Class<?> Cls_ref_type = Decimal_adp.class; public static final Class<?> Cls_ref_type = Decimal_adp.class;
public static Decimal_adp as_(Object obj) {return obj instanceof Decimal_adp ? (Decimal_adp)obj : null;} public static Decimal_adp as_(Object obj) {return obj instanceof Decimal_adp ? (Decimal_adp)obj : null;}
public static final Decimal_adp Zero = new Decimal_adp(0); public static final Decimal_adp Zero = new Decimal_adp(0);
public static final Decimal_adp One = new Decimal_adp(1); public static final Decimal_adp One = new Decimal_adp(1);
public static final Decimal_adp Neg1 = new Decimal_adp(-1); public static final Decimal_adp Neg1 = new Decimal_adp(-1);
public static final Decimal_adp Const_e = Decimal_adp_.double_(Math_.E); public static final Decimal_adp Const_e = Decimal_adp_.double_(Math_.E);
public static final Decimal_adp Const_pi = Decimal_adp_.double_(Math_.Pi); public static final Decimal_adp Const_pi = Decimal_adp_.double_(Math_.Pi);
public static Decimal_adp base1000_(long v) {return divide_(v, 1000);} public static Decimal_adp base1000_(long v) {return divide_(v, 1000);}
public static Decimal_adp parts_1000_(long num, int frc) {return divide_((num * (1000)) + frc, 1000);} public static Decimal_adp parts_1000_(long num, int frc) {return divide_((num * (1000)) + frc, 1000);}
public static Decimal_adp parts_(long num, int frc) { public static Decimal_adp parts_(long num, int frc) {

@ -105,6 +105,10 @@ public class Scrib_lib_wikibase_tst {
Keyval[] args = Wbase_snak_utl_.Get_snak(wdata_fxt, wdata_fxt.Make_claim_quantity(3, "123", "1", "125", "121")); // NOTE: entity-less units output "1"; EX:wd:Q493409 DATE:2016-11-08 Keyval[] args = Wbase_snak_utl_.Get_snak(wdata_fxt, wdata_fxt.Make_claim_quantity(3, "123", "1", "125", "121")); // NOTE: entity-less units output "1"; EX:wd:Q493409 DATE:2016-11-08
fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnak, args, "123±2"); fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnak, args, "123±2");
} }
@Test public void RenderSnak__quantity__null_bounds() { // PURPOSE: handle null lbound / ubound; PAGE:wd.q:183 DATE:2016-12-03
Keyval[] args = Wbase_snak_utl_.Get_snak(wdata_fxt, wdata_fxt.Make_claim_quantity(3, "123", "1", null, null));
fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnak, args, "123");
}
@Test public void RenderSnak__time() { @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")); Keyval[] args = Wbase_snak_utl_.Get_snak(wdata_fxt, wdata_fxt.Make_claim_time(3, "2012-01-02 03:04:05"));
fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnak, args, "30405 2 Jan 2012"); // NOTE: format is missing ":" b/c test does not init messages for html_wtr; DATE:2015-08-03 fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnak, args, "30405 2 Jan 2012"); // NOTE: format is missing ":" b/c test does not init messages for html_wtr; DATE:2015-08-03

@ -58,9 +58,9 @@ public class Wdata_prop_val_visitor implements Wbase_claim_visitor {
public void Visit_quantity(Wbase_claim_quantity itm) {Write_quantity(bfr, wdata_mgr, lang, itm.Amount(), itm.Lbound(), itm.Ubound(), itm.Unit());} public void Visit_quantity(Wbase_claim_quantity itm) {Write_quantity(bfr, wdata_mgr, lang, itm.Amount(), itm.Lbound(), itm.Ubound(), itm.Unit());}
public static void Write_quantity(Bry_bfr bfr, Wdata_wiki_mgr wdata_mgr, Xol_lang_itm lang, byte[] val_bry, byte[] lo_bry, byte[] hi_bry, byte[] unit) { public static void Write_quantity(Bry_bfr bfr, Wdata_wiki_mgr wdata_mgr, Xol_lang_itm lang, byte[] val_bry, byte[] lo_bry, byte[] hi_bry, byte[] unit) {
// get val, lo, hi; NOTE: must handle large numbers; EX:{{#property:P1082}} PAGE:en.w:Earth; DATE:2015-08-02; NOTE: must handle decimals; PAGE:en.w:Malinao,_Aklan; DATE:2016-11-08 // get val, lo, hi; NOTE: must handle large numbers; EX:{{#property:P1082}} PAGE:en.w:Earth; DATE:2015-08-02; NOTE: must handle decimals; PAGE:en.w:Malinao,_Aklan; DATE:2016-11-08
Decimal_adp val = Decimal_adp_.parse(String_.new_u8(Normalize_for_decimal(val_bry))); Decimal_adp val = Decimal__parse_or(val_bry, null); if (val == null) throw Err_.new_wo_type("wbase:quanity val can not be null");
Decimal_adp lo = Decimal_adp_.parse(String_.new_u8(Normalize_for_decimal(lo_bry))); Decimal_adp lo = Decimal__parse_or(lo_bry, val);
Decimal_adp hi = Decimal_adp_.parse(String_.new_u8(Normalize_for_decimal(hi_bry))); Decimal_adp hi = Decimal__parse_or(hi_bry, val);
// fmt val // fmt val
if (lo.Eq(hi) && hi.Eq(val))// lo, hi, val are same; print val only; if (lo.Eq(hi) && hi.Eq(val))// lo, hi, val are same; print val only;
@ -82,7 +82,7 @@ public class Wdata_prop_val_visitor implements Wbase_claim_visitor {
} }
// output unit // output unit
int unit_qid_bgn = Bry_find_.Find_fwd(unit, Wikidata_url); int unit_qid_bgn = unit == null ? Bry_find_.Not_found : Bry_find_.Find_fwd(unit, Wikidata_url);
if (unit_qid_bgn == Bry_find_.Not_found) {} // entity missing; output nothing; EX:"unit":"1"; PAGE:en.w:Malinao,_Aklan DATE:2016-11-08 if (unit_qid_bgn == Bry_find_.Not_found) {} // entity missing; output nothing; EX:"unit":"1"; PAGE:en.w:Malinao,_Aklan DATE:2016-11-08
else { // entity exists; EX:"http://www.wikidata.org/entity/Q11573" (meter) else { // entity exists; EX:"http://www.wikidata.org/entity/Q11573" (meter)
bfr.Add_byte_space(); bfr.Add_byte_space();
@ -91,7 +91,11 @@ public class Wdata_prop_val_visitor implements Wbase_claim_visitor {
bfr.Add(entity_doc.Label_list__get_or_fallback(lang)); bfr.Add(entity_doc.Label_list__get_or_fallback(lang));
} }
} }
private static Decimal_adp Decimal__parse_or(byte[] bry, Decimal_adp or) { // handle missing lbound / ubound; DATE:2016-12-03
return bry == null ? or : Decimal_adp_.parse(String_.new_u8(Normalize_for_decimal(bry)));
}
public static byte[] Normalize_for_decimal(byte[] bry) { // remove leading "+" and any commas; was Bry_.To_long_or(val_bry, Byte_ascii.Comma_bry, 0, val_bry.length, 0) public static byte[] Normalize_for_decimal(byte[] bry) { // remove leading "+" and any commas; was Bry_.To_long_or(val_bry, Byte_ascii.Comma_bry, 0, val_bry.length, 0)
if (bry == null) return null;
Bry_bfr bfr = null; Bry_bfr bfr = null;
int len = bry.length; int len = bry.length;
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {

@ -55,12 +55,19 @@ public class Wdata_wiki_mgr_tst {
, "</span>" , "</span>"
)); ));
} }
@Test public void normalize_for_decimal() { @Test public void Normalize_for_decimal() {
fxt.Test__normalize_for_decimal("1234" , "1234"); // basic fxt.Test__normalize_for_decimal("1234" , "1234"); // basic
fxt.Test__normalize_for_decimal("+1234" , "1234"); // plus fxt.Test__normalize_for_decimal("+1234" , "1234"); // plus
fxt.Test__normalize_for_decimal("1,234" , "1234"); // comma fxt.Test__normalize_for_decimal("1,234" , "1234"); // comma
fxt.Test__normalize_for_decimal("+1,234" , "1234"); // both fxt.Test__normalize_for_decimal("+1,234" , "1234"); // both
} }
@Test public void Write_quantity_null() { // handle missing lbound / ubound; DATE:2016-12-03
Wdata_wiki_mgr_fxt fxt = new Wdata_wiki_mgr_fxt().Init();
Bry_bfr bfr = Bry_bfr_.New();
Wdata_prop_val_visitor.Write_quantity(bfr, fxt.Wdata_mgr(), fxt.Wiki().Lang(), Bry_.new_a7("123"), null, null, null);
Gftest.Eq__str("123", bfr.To_bry_and_clear());
}
} }
class Wdata_prop_val_visitor__fxt { class Wdata_prop_val_visitor__fxt {
public void Test__normalize_for_decimal(String raw, String expd) { public void Test__normalize_for_decimal(String raw, String expd) {

@ -28,15 +28,31 @@ public class Wbase_claim_quantity extends Wbase_claim_base {
public byte[] Unit() {return unit;} private final byte[] unit; public byte[] Unit() {return unit;} private final byte[] unit;
public Decimal_adp Amount_as_num() { public Decimal_adp Amount_as_num() {
if (amount_as_num == null) amount_as_num = To_decimal("amount", amount); if (amount_as_num == null) {
amount_as_num = To_decimal_or_null("amount", amount);
if (amount_as_num == null) {
amount_as_num = Decimal_adp_.Zero;
Gfo_usr_dlg_.Instance.Warn_many("", "", "wbase.claim: value is null; name=~{0}", "amount");
}
}
return amount_as_num; return amount_as_num;
} private Decimal_adp amount_as_num; } private Decimal_adp amount_as_num;
public Decimal_adp Ubound_as_num() { public Decimal_adp Ubound_as_num() {
if (ubound_as_num == null) ubound_as_num = To_decimal("upper", ubound); if (ubound_as_num == null) {
ubound_as_num = To_decimal_or_null("upper", ubound);
if (ubound_as_num == null) {
ubound_as_num = amount_as_num;
}
}
return ubound_as_num; return ubound_as_num;
} private Decimal_adp ubound_as_num; } private Decimal_adp ubound_as_num;
public Decimal_adp Lbound_as_num() { public Decimal_adp Lbound_as_num() {
if (lbound_as_num == null) lbound_as_num = To_decimal("lower", lbound); if (lbound_as_num == null) {
lbound_as_num = To_decimal_or_null("lower", lbound);
if (lbound_as_num == null) {
lbound_as_num = amount_as_num;
}
}
return lbound_as_num; return lbound_as_num;
} private Decimal_adp lbound_as_num; } private Decimal_adp lbound_as_num;
@ -46,10 +62,10 @@ public class Wbase_claim_quantity extends Wbase_claim_base {
} }
public static final byte[] Unit_1 = Bry_.new_a7("1"); public static final byte[] Unit_1 = Bry_.new_a7("1");
public static Decimal_adp To_decimal(String name, byte[] bry) { private static Decimal_adp To_decimal_or_null(String name, byte[] bry) {
if (bry == null) throw Err_.new_wo_type("wbase.claim: value is null", "name", name); if (bry == null) return null;
int len = bry.length; int len = bry.length;
if (len == 0) throw Err_.new_wo_type("wbase.claim: value is empty", "name", name); if (len == 0) return null;
if (bry[0] == Byte_ascii.Plus) bry = Bry_.Mid(bry, 1); if (bry[0] == Byte_ascii.Plus) bry = Bry_.Mid(bry, 1);
return Decimal_adp_.parse(String_.new_a7(bry)); return Decimal_adp_.parse(String_.new_a7(bry));
} }

Loading…
Cancel
Save