You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oodt.apache.org by ri...@apache.org on 2012/03/26 18:22:41 UTC

svn commit: r1305428 - in /oodt/trunk: CHANGES.txt filemgr/src/main/java/org/apache/oodt/cas/filemgr/structs/query/QueryResultComparator.java filemgr/src/test/org/apache/oodt/cas/filemgr/structs/query/TestQueryResultComparator.java

Author: rickdn
Date: Mon Mar 26 16:22:40 2012
New Revision: 1305428

URL: http://svn.apache.org/viewvc?rev=1305428&view=rev
Log:
OODT-429 #resolve fixed  When comparator encounters null value, nulls appear last


Added:
    oodt/trunk/filemgr/src/test/org/apache/oodt/cas/filemgr/structs/query/TestQueryResultComparator.java
Modified:
    oodt/trunk/CHANGES.txt
    oodt/trunk/filemgr/src/main/java/org/apache/oodt/cas/filemgr/structs/query/QueryResultComparator.java

Modified: oodt/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/oodt/trunk/CHANGES.txt?rev=1305428&r1=1305427&r2=1305428&view=diff
==============================================================================
--- oodt/trunk/CHANGES.txt (original)
+++ oodt/trunk/CHANGES.txt Mon Mar 26 16:22:40 2012
@@ -4,6 +4,8 @@ Apache OODT Change Log
 Release 0.4: Current Development
 --------------------------------------------
 
+* OODT-429 filemgr query throws NPE when sorting by key with possibly empty values (rickdn)
+
 * OODT-427 filemgr query throws "String index out of range: -1" when some products have undefined
   metadata values (rickdn)
 

Modified: oodt/trunk/filemgr/src/main/java/org/apache/oodt/cas/filemgr/structs/query/QueryResultComparator.java
URL: http://svn.apache.org/viewvc/oodt/trunk/filemgr/src/main/java/org/apache/oodt/cas/filemgr/structs/query/QueryResultComparator.java?rev=1305428&r1=1305427&r2=1305428&view=diff
==============================================================================
--- oodt/trunk/filemgr/src/main/java/org/apache/oodt/cas/filemgr/structs/query/QueryResultComparator.java (original)
+++ oodt/trunk/filemgr/src/main/java/org/apache/oodt/cas/filemgr/structs/query/QueryResultComparator.java Mon Mar 26 16:22:40 2012
@@ -33,7 +33,7 @@ import java.util.Comparator;
 public class QueryResultComparator implements Comparator<QueryResult> {
 
     private String sortByMetKey;
-    
+
     public String getSortByMetKey() {
         return sortByMetKey;
     }
@@ -41,10 +41,18 @@ public class QueryResultComparator imple
     public void setSortByMetKey(String sortByMetKey) {
         this.sortByMetKey = sortByMetKey;
     }
-    
+
     public int compare(QueryResult qr1, QueryResult qr2) {
-        return qr1.getMetadata().getMetadata(this.sortByMetKey).compareTo(
-                qr2.getMetadata().getMetadata(sortByMetKey));
+        String m1 = qr1.getMetadata().getMetadata(sortByMetKey);
+        String m2 = qr2.getMetadata().getMetadata(sortByMetKey);
+        if (m1 == m2)
+            return 0;
+        // return null last, since they are the least interesting
+        if (m1 == null)
+            return 1;
+        if (m2 == null)
+            return -1;
+        return m1.compareTo(m2);
     }
 
 }

Added: oodt/trunk/filemgr/src/test/org/apache/oodt/cas/filemgr/structs/query/TestQueryResultComparator.java
URL: http://svn.apache.org/viewvc/oodt/trunk/filemgr/src/test/org/apache/oodt/cas/filemgr/structs/query/TestQueryResultComparator.java?rev=1305428&view=auto
==============================================================================
--- oodt/trunk/filemgr/src/test/org/apache/oodt/cas/filemgr/structs/query/TestQueryResultComparator.java (added)
+++ oodt/trunk/filemgr/src/test/org/apache/oodt/cas/filemgr/structs/query/TestQueryResultComparator.java Mon Mar 26 16:22:40 2012
@@ -0,0 +1,75 @@
+package org.apache.oodt.cas.filemgr.structs.query;
+
+import org.apache.oodt.cas.filemgr.metadata.CoreMetKeys;
+import org.apache.oodt.cas.filemgr.structs.Product;
+import org.apache.oodt.cas.metadata.Metadata;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public class TestQueryResultComparator extends TestCase {
+
+  private QueryResult qr1;
+  private QueryResult qr2;
+  private QueryResult qrfilename;
+  private QueryResult qrowners;
+  private QueryResult qrnull;
+  private QueryResult qrnull2;
+
+  @Override
+  protected void setUp() throws Exception {
+    Product p = new Product();
+    p.setProductId("TestProductID");
+    Metadata m = new Metadata();
+    m.addMetadata(CoreMetKeys.FILENAME, "datafile.dat");
+    m.addMetadata("Owners", Arrays.asList("Chad", "Cam"));
+    qr1 = new QueryResult(p, m);
+
+    Metadata m2 = new Metadata();
+    m2.addMetadata(CoreMetKeys.FILENAME, "textfile.dat");
+    m2.addMetadata("Owners", Arrays.asList("Bob", "Billy"));
+    qr2 = new QueryResult(p, m2);
+
+    Metadata filename = new Metadata();
+    filename.addMetadata(CoreMetKeys.FILENAME, "foo.txt");
+    qrfilename = new QueryResult(p, filename);
+
+    Metadata owners = new Metadata();
+    owners.addMetadata("Owners", Arrays.asList("Dave", "Dan"));
+    qrowners = new QueryResult(p, owners);
+
+    qrnull = new QueryResult(p, new Metadata());
+    qrnull2 = new QueryResult(p, new Metadata());
+  }
+
+  public void testCompare() {
+    List<QueryResult> list = Arrays.asList(qr1, qrowners, qrnull2, qr2, qrnull, qrfilename);
+    QueryResultComparator c = new QueryResultComparator();
+    c.setSortByMetKey(CoreMetKeys.FILENAME);
+
+    Collections.sort(list, c);
+    assertEquals(qr1, list.get(0));
+    assertEquals(qrfilename, list.get(1));
+    assertEquals(qr2, list.get(2));
+    List<QueryResult> sub = list.subList(3, list.size());
+    assertEquals(3, sub.size());
+    assertTrue(sub.contains(qrnull));
+    assertTrue(sub.contains(qrnull2));
+    assertTrue(sub.contains(qrowners));
+
+    c.setSortByMetKey("Owners");
+    Collections.sort(list, c);
+    assertEquals(qr2, list.get(0));
+    assertEquals(qr1, list.get(1));
+    assertEquals(qrowners, list.get(2));
+    sub = list.subList(3, list.size());
+    assertEquals(3, sub.size());
+    assertTrue(sub.contains(qrfilename));
+    assertTrue(sub.contains(qrnull));
+    assertTrue(sub.contains(qrnull2));
+  }
+
+}