1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-10-27 20:34:16 +00:00

Wikibase: Calc precision by using longitude when precision is null [#792]

This commit is contained in:
gnosygnu 2020-09-25 08:42:52 -04:00
parent c801e3a20b
commit 5c3d6a173b
3 changed files with 151 additions and 90 deletions

View File

@ -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,8 +13,32 @@ 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.scribunto.libs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; package gplx.xowa.xtns.scribunto.libs;
import gplx.xowa.xtns.wbases.core.*; import gplx.xowa.xtns.wbases.claims.*; import gplx.xowa.xtns.wbases.claims.enums.*; import gplx.xowa.xtns.wbases.claims.itms.*;
import gplx.Bry_;
import gplx.Decimal_adp;
import gplx.Decimal_adp_;
import gplx.Double_;
import gplx.Keyval;
import gplx.Keyval_;
import gplx.Object_;
import gplx.String_;
import gplx.xowa.xtns.wbases.claims.Wbase_claim_visitor;
import gplx.xowa.xtns.wbases.claims.enums.Wbase_claim_type_;
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_entity_;
import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_globecoordinate;
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_monolingualtext_;
import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_quantity;
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_time_;
import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_value;
public class Scrib_lib_wikibase_srl_visitor implements Wbase_claim_visitor { public class Scrib_lib_wikibase_srl_visitor implements Wbase_claim_visitor {
public Keyval[] Rv() {return rv;} Keyval[] rv; public Keyval[] Rv() {return rv;} Keyval[] rv;
public void Visit_str(Wbase_claim_string itm) { public void Visit_str(Wbase_claim_string itm) {
@ -85,10 +109,37 @@ public class Scrib_lib_wikibase_srl_visitor implements Wbase_claim_visitor {
rv[1] = Keyval_.new_(Wbase_claim_globecoordinate_.Itm__longitude.Key_str() , Double_.parse(String_.new_a7(itm.Lng()))); rv[1] = Keyval_.new_(Wbase_claim_globecoordinate_.Itm__longitude.Key_str() , Double_.parse(String_.new_a7(itm.Lng())));
rv[2] = Keyval_.new_(Wbase_claim_globecoordinate_.Itm__altitude.Key_str() , String_.new_u8(itm.Alt())); rv[2] = Keyval_.new_(Wbase_claim_globecoordinate_.Itm__altitude.Key_str() , String_.new_u8(itm.Alt()));
rv[3] = Keyval_.new_(Wbase_claim_globecoordinate_.Itm__globe.Key_str() , String_.new_u8(itm.Glb())); rv[3] = Keyval_.new_(Wbase_claim_globecoordinate_.Itm__globe.Key_str() , String_.new_u8(itm.Glb()));
rv[4] = Keyval_.new_(Wbase_claim_globecoordinate_.Itm__precision.Key_str() , itm.Prc_as_num().To_double()); rv[4] = Keyval_.new_(Wbase_claim_globecoordinate_.Itm__precision.Key_str() , CalcPrecision(itm.Prc(), itm.Lng()).To_double());
return rv; return rv;
} }
public void Visit_system(Wbase_claim_value itm) { public void Visit_system(Wbase_claim_value itm) {
rv = Keyval_.Ary_empty; rv = Keyval_.Ary_empty;
} }
public static Decimal_adp CalcPrecision(byte[] prc, byte[] lng) {
Decimal_adp rv;
// precision is "null"
if (Bry_.Eq(prc, Object_.Bry__null)) {
// 2020-09-25|ISSUE#:792|use longitude to determine precision (contributed by desb42@)
int lngLen = lng.length;
int power = 0;
// calc power by finding decimal point
for (int i = 0; i < lngLen; i++) {
byte b = lng[i];
if (b == '.') {
power = lngLen - (i + 1); // +1 to set after "."
if (power > 8) { // ensure power is 8 or less
power = 8;
}
break;
}
}
rv = Decimal_adp_.float_((float)Math.pow(10, -power));
}
else {
rv = Decimal_adp_.parse(String_.new_a7(prc));
}
return rv;
}
} }

View File

@ -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.
@ -16,6 +16,7 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
package gplx.xowa.xtns.scribunto.libs; package gplx.xowa.xtns.scribunto.libs;
import gplx.Bry_; import gplx.Bry_;
import gplx.Decimal_adp;
import gplx.Double_; import gplx.Double_;
import gplx.Keyval; import gplx.Keyval;
import gplx.core.tests.Gftest; import gplx.core.tests.Gftest;
@ -25,10 +26,23 @@ import org.junit.Test;
public class Scrib_lib_wikibase_srl_visitor_tst { public class Scrib_lib_wikibase_srl_visitor_tst {
private final Scrib_lib_wikibase_srl_visitor_fxt fxt = new Scrib_lib_wikibase_srl_visitor_fxt(); private final Scrib_lib_wikibase_srl_visitor_fxt fxt = new Scrib_lib_wikibase_srl_visitor_fxt();
@Test @Test public void Geo_null_precision() {
public void Geo_null_precision() {
fxt.TestGeoPrecision(0, "null"); // 2020-09-03|ISSUE#:792|null precision should default to 0 not 1;PAGE:wd:Q168751 fxt.TestGeoPrecision(0, "null"); // 2020-09-03|ISSUE#:792|null precision should default to 0 not 1;PAGE:wd:Q168751
} }
@Test public void CalcPrecision() {
// 2020-09-25|ISSUE#:792|use longitude to determine precision (contributed by desb42@)
// precision is non-null -> use it
fxt.TestCalcPrecision("2.8E-4", "0.0002777777777777778", "-76.62027777777777");
// precision is null -> precision is number of decimal points
fxt.TestCalcPrecision("1.0E-4", "null", "-76.1234");
// precision is null -> precision is number of decimal points but max is 8
fxt.TestCalcPrecision("1.0E-8", "null", "-76.62027777777777");
// precision is null -> precision is 1
fxt.TestCalcPrecision("1.0E0", "null", "12");
}
} }
class Scrib_lib_wikibase_srl_visitor_fxt { class Scrib_lib_wikibase_srl_visitor_fxt {
private final Scrib_lib_wikibase_srl_visitor visitor = new Scrib_lib_wikibase_srl_visitor(); private final Scrib_lib_wikibase_srl_visitor visitor = new Scrib_lib_wikibase_srl_visitor();
@ -40,4 +54,8 @@ class Scrib_lib_wikibase_srl_visitor_fxt {
Keyval[] actlGeo = (Keyval[])actl[1].Val(); Keyval[] actlGeo = (Keyval[])actl[1].Val();
Gftest.Eq__double(expd, Double_.cast(actlGeo[4].Val())); Gftest.Eq__double(expd, Double_.cast(actlGeo[4].Val()));
} }
public void TestCalcPrecision(String expd, String prc, String lng) {
Decimal_adp actl = Scrib_lib_wikibase_srl_visitor.CalcPrecision(Bry_.new_u8(prc), Bry_.new_u8(lng));
Gftest.Eq__str(expd, actl.To_str("0.0E0"));
}
} }

View File

@ -38,14 +38,6 @@ public class Wbase_claim_globecoordinate extends Wbase_claim_base {
public byte[] Glb_ttl() {return glb_ttl;} private byte[] glb_ttl; public byte[] Glb_ttl() {return glb_ttl;} private byte[] glb_ttl;
public void Glb_ttl_(byte[] v) {glb_ttl = v;} public void Glb_ttl_(byte[] v) {glb_ttl = v;}
public Decimal_adp Prc_as_num() {
if (prc_as_num == null) {
prc_as_num = Bry_.Eq(prc, Object_.Bry__null)
? Decimal_adp_.Zero // 2020-09-03|ISSUE#:792|null precision should default to 0 not 1;PAGE:wd:Q168751
: Decimal_adp_.parse(String_.new_a7(prc));
}
return prc_as_num;
} private Decimal_adp prc_as_num;
@Override public void Welcome(Wbase_claim_visitor visitor) {visitor.Visit_globecoordinate(this);} @Override public void Welcome(Wbase_claim_visitor visitor) {visitor.Visit_globecoordinate(this);}
@Override public String toString() {// TEST: @Override public String toString() {// TEST: