SPARQL: - fix rounding issue in postgres - tests for ceil, floor and round
Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/d8ff4c8d Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/d8ff4c8d Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/d8ff4c8d Branch: refs/heads/master Commit: d8ff4c8d3a53292a9d828fe77115569c8858a0ea Parents: d135766 Author: Sebastian Schaffert <[email protected]> Authored: Tue Nov 11 13:40:31 2014 +0100 Committer: Sebastian Schaffert <[email protected]> Committed: Tue Nov 11 13:40:31 2014 +0100 ---------------------------------------------------------------------- .../kiwi/sparql/function/numeric/NRound.java | 6 +++++- .../testsuite/KiWiSparqlComplianceTest.java | 16 ++++++++++++++++ .../marmotta/kiwi/sparql/testsuite/ceil.sparql | 5 +++++ .../marmotta/kiwi/sparql/testsuite/floor.sparql | 5 +++++ .../marmotta/kiwi/sparql/testsuite/round.sparql | 5 +++++ .../kiwi/model/rdf/KiWiDoubleLiteral.java | 20 ++++++++++---------- 6 files changed, 46 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/marmotta/blob/d8ff4c8d/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/function/numeric/NRound.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/function/numeric/NRound.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/function/numeric/NRound.java index 0048b71..17bc217 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/function/numeric/NRound.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/function/numeric/NRound.java @@ -52,7 +52,11 @@ public class NRound extends Round implements NativeFunction { */ @Override public String getNative(KiWiDialect dialect, String... args) { - return String.format("round(%s)", args[0]); + if(dialect instanceof PostgreSQLDialect) { + return String.format("round(CAST(%s as decimal))", args[0]); + } else { + return String.format("round(%s)", args[0]); + } } /** http://git-wip-us.apache.org/repos/asf/marmotta/blob/d8ff4c8d/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/testsuite/KiWiSparqlComplianceTest.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/testsuite/KiWiSparqlComplianceTest.java b/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/testsuite/KiWiSparqlComplianceTest.java index 1938b29..d73abd1 100644 --- a/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/testsuite/KiWiSparqlComplianceTest.java +++ b/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/testsuite/KiWiSparqlComplianceTest.java @@ -163,6 +163,22 @@ public class KiWiSparqlComplianceTest { } + @Test + public void testQueryFloor() throws Exception { + testQuery("floor.sparql"); + } + + @Test + public void testQueryCeil() throws Exception { + testQuery("ceil.sparql"); + } + + @Test + public void testQueryRound() throws Exception { + testQuery("round.sparql"); + } + + private void testQuery(String filename) throws Exception { String queryString = IOUtils.toString(this.getClass().getResourceAsStream(filename), "UTF-8"); http://git-wip-us.apache.org/repos/asf/marmotta/blob/d8ff4c8d/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/testsuite/ceil.sparql ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/testsuite/ceil.sparql b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/testsuite/ceil.sparql new file mode 100644 index 0000000..1f19fe5 --- /dev/null +++ b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/testsuite/ceil.sparql @@ -0,0 +1,5 @@ +PREFIX : <http://example.org/> +PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> +SELECT ?s ?num (CEIL(?num) AS ?ceil) WHERE { + ?s :num ?num +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/marmotta/blob/d8ff4c8d/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/testsuite/floor.sparql ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/testsuite/floor.sparql b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/testsuite/floor.sparql new file mode 100644 index 0000000..fdc5747 --- /dev/null +++ b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/testsuite/floor.sparql @@ -0,0 +1,5 @@ +PREFIX : <http://example.org/> +PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> +SELECT ?s ?num (FLOOR(?num) AS ?floor) WHERE { + ?s :num ?num +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/marmotta/blob/d8ff4c8d/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/testsuite/round.sparql ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/testsuite/round.sparql b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/testsuite/round.sparql new file mode 100644 index 0000000..b588024 --- /dev/null +++ b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/testsuite/round.sparql @@ -0,0 +1,5 @@ +PREFIX : <http://example.org/> +PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> +SELECT ?s ?num (ROUND(?num) AS ?round) WHERE { + ?s :num ?num +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/marmotta/blob/d8ff4c8d/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/model/rdf/KiWiDoubleLiteral.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/model/rdf/KiWiDoubleLiteral.java b/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/model/rdf/KiWiDoubleLiteral.java index 7f749b9..37636b4 100644 --- a/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/model/rdf/KiWiDoubleLiteral.java +++ b/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/model/rdf/KiWiDoubleLiteral.java @@ -17,10 +17,6 @@ */ package org.apache.marmotta.kiwi.model.rdf; -import org.apache.marmotta.commons.vocabulary.XSD; - -import java.math.BigDecimal; -import java.math.MathContext; import java.util.Date; /** @@ -67,12 +63,7 @@ public class KiWiDoubleLiteral extends KiWiStringLiteral { public void setDoubleContent(Double doubleContent) { this.doubleContent = doubleContent; - - if(XSD.Decimal.equals(getType())) { - this.content = new BigDecimal(doubleContent, MathContext.DECIMAL64).toString(); - } else { - this.content = doubleContent.toString(); - } + this.content = fmt(doubleContent); } @@ -97,4 +88,13 @@ public class KiWiDoubleLiteral extends KiWiStringLiteral { public double doubleValue() { return getDoubleContent().doubleValue(); } + + + private static String fmt(double d) + { + if(d == (long) d) + return String.format("%d",(long)d); + else + return String.format("%s",d); + } }
