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:
parent
c801e3a20b
commit
5c3d6a173b
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
@ -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"));
|
||||||
|
}
|
||||||
}
|
}
|
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user