You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by ki...@apache.org on 2017/06/13 10:13:32 UTC
[5/6] jena git commit: Make NodeSortValueKey comparable,
and add comments
Make NodeSortValueKey comparable, and add comments
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/3b12f834
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/3b12f834
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/3b12f834
Branch: refs/heads/master
Commit: 3b12f8348c2bbedea67080fa3aecc0fd8258a200
Parents: 32e8684
Author: Bruno P. Kinoshita <br...@yahoo.com.br>
Authored: Sat May 13 11:40:29 2017 +1200
Committer: Bruno P. Kinoshita <br...@yahoo.com.br>
Committed: Sat May 13 11:40:29 2017 +1200
----------------------------------------------------------------------
.../org/apache/jena/sparql/expr/NodeValue.java | 18 ++----------
.../sparql/expr/nodevalue/NodeValueSortKey.java | 31 ++++++++++++++++++--
.../expr/nodevalue/TestNodeValueSortKey.java | 12 ++++++++
3 files changed, 44 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/3b12f834/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
index 7721910..e84a6b5 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
@@ -27,10 +27,8 @@ import java.io.FileInputStream ;
import java.io.InputStream ;
import java.math.BigDecimal ;
import java.math.BigInteger ;
-import java.text.Collator;
import java.util.Calendar ;
import java.util.Iterator ;
-import java.util.Locale;
import java.util.Properties ;
import java.util.ServiceLoader ;
@@ -774,19 +772,10 @@ public abstract class NodeValue extends ExprNode
}
case VSPACE_SORTKEY :
{
- int cmp = 0;
- String c1 = nv1.getCollation();
- String c2 = nv2.getCollation();
- if (c1 != null && c2 != null && c1.equals(c2)) {
- // locales are parsed. Here we could think about caching if necessary
- Locale desiredLocale = Locale.forLanguageTag(c1);
- // collators are already stored in a concurrent map by the JVM, with <locale, softref<collator>>
- Collator collator = Collator.getInstance(desiredLocale);
- cmp = collator.compare(nv1.getString(), nv2.getString());
- } else {
- cmp = XSDFuncOp.compareString(nv1, nv2) ;
+ if (!(nv1 instanceof NodeValueSortKey) || !(nv2 instanceof NodeValueSortKey)) {
+ raise(new ExprNotComparableException("Can't compare (not node value sort keys) "+nv1+" and "+nv2)) ;
}
- return cmp;
+ return ((NodeValueSortKey) nv1).compareTo((NodeValueSortKey) nv2);
}
case VSPACE_BOOLEAN: return XSDFuncOp.compareBoolean(nv1, nv2) ;
@@ -978,7 +967,6 @@ public abstract class NodeValue extends ExprNode
public boolean getBoolean() { raise(new ExprEvalTypeException("Not a boolean: "+this)) ; return false ; }
public String getString() { raise(new ExprEvalTypeException("Not a string: "+this)) ; return null ; }
public String getLang() { raise(new ExprEvalTypeException("Not a string: "+this)) ; return null ; }
- public String getCollation() { raise(new ExprEvalTypeException("Not a sort key: "+this)) ; return null ; }
public BigInteger getInteger() { raise(new ExprEvalTypeException("Not an integer: "+this)) ; return null ; }
public BigDecimal getDecimal() { raise(new ExprEvalTypeException("Not a decimal: "+this)) ; return null ; }
http://git-wip-us.apache.org/repos/asf/jena/blob/3b12f834/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueSortKey.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueSortKey.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueSortKey.java
index 60204c7..e14adb9 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueSortKey.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueSortKey.java
@@ -18,8 +18,12 @@
package org.apache.jena.sparql.expr.nodevalue;
+import java.text.Collator;
+import java.util.Locale;
+
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.graph.Node_Literal;
import org.apache.jena.sparql.expr.NodeValue;
import org.apache.jena.sparql.util.FmtUtils;
@@ -27,7 +31,7 @@ import org.apache.jena.sparql.util.FmtUtils;
* A {@link NodeValue} that supports collation value for a string. This allows query values
* to be sorted following rules for a specific collation.
*/
-public class NodeValueSortKey extends NodeValue {
+public final class NodeValueSortKey extends NodeValue implements Comparable<NodeValueSortKey> {
/**
* Node value text.
@@ -64,11 +68,15 @@ public class NodeValueSortKey extends NodeValue {
return string;
}
- @Override
public String getCollation() {
return collation;
}
+ /**
+ * The node created by a NodeValueSortKey is a {@link Node_Literal}. This is used to represent
+ * the node value internally for comparison, and should no be expected to work in other cases.
+ * Users are not expected to extend it, or use in other functions.
+ */
@Override
protected Node makeNode() {
return NodeFactory.createLiteral(string);
@@ -88,4 +96,23 @@ public class NodeValueSortKey extends NodeValue {
return "'"+getString()+"'";
}
+ @Override
+ public int compareTo(NodeValueSortKey other) {
+ int cmp = 0;
+ if (other != null) {
+ String c1 = this.getCollation();
+ String c2 = other.getCollation();
+ if (c1 != null && c2 != null && c1.equals(c2)) {
+ // locales are parsed. Here we could think about caching if necessary
+ Locale desiredLocale = Locale.forLanguageTag(c1);
+ // collators are already stored in a concurrent map by the JVM, with <locale, softref<collator>>
+ Collator collator = Collator.getInstance(desiredLocale);
+ cmp = collator.compare(this.getString(), other.getString());
+ } else {
+ cmp = XSDFuncOp.compareString(this, other) ;
+ }
+ }
+ return cmp;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/jena/blob/3b12f834/jena-arq/src/test/java/org/apache/jena/sparql/expr/nodevalue/TestNodeValueSortKey.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/nodevalue/TestNodeValueSortKey.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/nodevalue/TestNodeValueSortKey.java
index 54d3dfe..3478745 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/nodevalue/TestNodeValueSortKey.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/nodevalue/TestNodeValueSortKey.java
@@ -71,4 +71,16 @@ public class TestNodeValueSortKey {
NodeValueSortKey nv = new NodeValueSortKey("Tutte", "it");
assertEquals("'Tutte'", nv.toString());
}
+
+ @Test
+ public void testCompareTo() {
+ final String languageTag = "pt";
+ NodeValueSortKey nv = new NodeValueSortKey("Bonito", languageTag);
+ assertEquals(0, nv.compareTo(null));
+ assertEquals(1, nv.compareTo(new NodeValueSortKey("Bonita", languageTag)));
+ assertEquals(-1, nv.compareTo(new NodeValueSortKey("Bonitos", languageTag)));
+ // comparing string, regardless of the collations
+ assertEquals(1, nv.compareTo(new NodeValueSortKey("Bonita", "es")));
+ assertEquals(0, nv.compareTo(new NodeValueSortKey("Bonito", "es")));
+ }
}