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")));
+    }
 }