You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by an...@apache.org on 2014/11/17 12:13:34 UTC

svn commit: r1640142 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManager.java oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/UserQueryTest.java

Author: angela
Date: Mon Nov 17 11:13:33 2014
New Revision: 1640142

URL: http://svn.apache.org/r1640142
Log:
OAK-2266 : UserQueryManager: Sort Ignore Case Reversed

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManager.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/UserQueryTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManager.java?rev=1640142&r1=1640141&r2=1640142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManager.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManager.java Mon Nov 17 11:13:33 2014
@@ -117,11 +117,13 @@ public class UserQueryManager {
 
         if (sortCol != null) {
             boolean ignoreCase = builder.getSortIgnoreCase();
-            statement.append(" order by ")
-                    .append(ignoreCase ? "" : "fn:lower-case(")
-                    .append(sortCol)
-                    .append(ignoreCase ? " " : ") ")
-                    .append(sortDir.getDirection());
+            statement.append(" order by ");
+            if (ignoreCase) {
+                statement.append("fn:lower-case(").append(sortCol).append(')');
+            } else {
+                statement.append(sortCol);
+            }
+            statement.append(' ').append(sortDir.getDirection());
         }
 
         final String groupId = builder.getGroupID();

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/UserQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/UserQueryTest.java?rev=1640142&r1=1640141&r2=1640142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/UserQueryTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/UserQueryTest.java Mon Nov 17 11:13:33 2014
@@ -28,8 +28,8 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 
 import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterators;
-import com.google.common.collect.Lists;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.api.security.user.Query;
@@ -111,10 +111,10 @@ public class UserQueryTest extends Abstr
 
         User jackrabbit = createUser("jackrabbit", "carrots", 2500, true);
         User deer = createUser("deer", "leaves", 120000, true);
-        User opposum = createUser("opposum", "fruit", 1200, true);
+        User opossum = createUser("opossum", "fruit", 1200, true);
         kangaroo = createUser("kangaroo", "grass", 90000, true);
         elephant = createUser("elephant", "leaves", 5000000, true);
-        addMembers(mammals, jackrabbit, deer, opposum, kangaroo, elephant);
+        addMembers(mammals, jackrabbit, deer, opossum, kangaroo, elephant);
 
         User lemur = createUser("lemur", "nectar", 1100, true);
         User gibbon = createUser("gibbon", "meat", 20000, true);
@@ -140,17 +140,23 @@ public class UserQueryTest extends Abstr
         setProperty("poisonous", vf.createValue(true), blackWidow, bee, poisonDartFrog);
         setProperty("poisonous", vf.createValue(false), turtle, lemur);
         setProperty("hasWings", vf.createValue(false), blackWidow, gardenSpider, jumpingSpider, ant,
-                jackrabbit, deer, opposum, kangaroo, elephant, lemur, gibbon, crocodile, turtle, lizard,
+                jackrabbit, deer, opossum, kangaroo, elephant, lemur, gibbon, crocodile, turtle, lizard,
                 salamander, goldenToad, poisonDartFrog);
         setProperty("color", vf.createValue("black"), blackWidow, gardenSpider, ant, fly, lizard, salamander);
-        setProperty("color", vf.createValue("WHITE"), opposum, goose, pelican, dove);
+        setProperty("color", vf.createValue("WHITE"), opossum, goose, pelican, dove);
         setProperty("color", vf.createValue("gold"), goldenToad);
         setProperty("numberOfLegs", vf.createValue(2), kangaroo, gibbon, kestrel, goose, dove);
-        setProperty("numberOfLegs", vf.createValue(4), jackrabbit, deer, opposum, elephant, lemur, crocodile,
+        setProperty("numberOfLegs", vf.createValue(4), jackrabbit, deer, opossum, elephant, lemur, crocodile,
                 turtle, lizard, salamander, goldenToad, poisonDartFrog);
         setProperty("numberOfLegs", vf.createValue(6), ant, bee, fly);
         setProperty("numberOfLegs", vf.createValue(8), blackWidow, gardenSpider, jumpingSpider);
 
+        // testing ignore-case with sort order
+        setProperty("continent", vf.createValue("africa"), lemur, gibbon);
+        setProperty("continent", vf.createValue("Africa"), elephant);
+        setProperty("continent", vf.createValue("australia"), kangaroo);
+        setProperty("continent", vf.createValue("America"), opossum);
+
         elephant.getImpersonation().grantImpersonation(jackrabbit.getPrincipal());
 
         authorizables.addAll(users);
@@ -676,12 +682,12 @@ public class UserQueryTest extends Abstr
     }
 
     @Test
-    public void testSortOrder1() throws RepositoryException {
+    public void testSortOrderIgnoreCaseDescending() throws RepositoryException {
         Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() {
             public <T> void build(QueryBuilder<T> builder) {
                 builder.setCondition(builder.
                         exists("@color"));
-                builder.setSortOrder("@color", QueryBuilder.Direction.DESCENDING);
+                builder.setSortOrder("@color", QueryBuilder.Direction.DESCENDING, true);
             }
         });
 
@@ -698,12 +704,34 @@ public class UserQueryTest extends Abstr
     }
 
     @Test
-    public void testSortOrder2() throws RepositoryException {
+    public void testSortOrderRespectCaseDescending() throws RepositoryException {
+        Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() {
+            public <T> void build(QueryBuilder<T> builder) {
+                builder.setCondition(builder.
+                        exists("@color"));
+                builder.setSortOrder("@color", QueryBuilder.Direction.DESCENDING, false);
+            }
+        });
+
+        assertTrue(result.hasNext());
+        String prev = null;
+        while (result.hasNext()) {
+            Authorizable authorizable = result.next();
+            Value[] color = authorizable.getProperty("color");
+            assertNotNull(color);
+            assertEquals(1, color.length);
+            assertTrue(prev == null || prev.compareTo(color[0].getString()) >= 0);
+            prev = color[0].getString();
+        }
+    }
+
+    @Test
+    public void testSortOrderRespectCaseAscendingDoubleValue() throws RepositoryException {
         Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() {
             public <T> void build(QueryBuilder<T> builder) {
                 builder.setCondition(builder.
                         exists("profile/@weight"));
-                builder.setSortOrder("profile/@weight", QueryBuilder.Direction.ASCENDING, true);
+                builder.setSortOrder("profile/@weight", QueryBuilder.Direction.ASCENDING, false);
             }
         });
 
@@ -719,6 +747,54 @@ public class UserQueryTest extends Abstr
         }
     }
 
+    /**
+     * @see <a href="https://issues.apache.org/jira/browse/OAK-2266">OAK-2266</a>
+     */
+    @Test
+    public void testSortOrderIgnoreCaseAscending() throws Exception {
+        Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() {
+            public <T> void build(QueryBuilder<T> builder) {
+                builder.setCondition(builder.exists("@continent"));
+                builder.setSortOrder("@continent", QueryBuilder.Direction.ASCENDING, true);
+            }
+        });
+
+        Iterator<String> continents = ImmutableList.of("africa", "america", "australia").iterator();
+        String expected = continents.next();
+        while (result.hasNext()) {
+            Authorizable a = result.next();
+            String continent = a.getProperty("continent")[0].getString().toLowerCase();
+            if (!continent.equals(expected)) {
+                expected = continents.next();
+                assertEquals(expected, continent);
+            }
+        }
+    }
+
+    /**
+     * @see <a href="https://issues.apache.org/jira/browse/OAK-2266">OAK-2266</a>
+     */
+    @Test()
+    public void testSortOrderRespectCaseAscending() throws Exception {
+        Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() {
+            public <T> void build(QueryBuilder<T> builder) {
+                builder.setCondition(builder.exists("@continent"));
+                builder.setSortOrder("@continent", QueryBuilder.Direction.ASCENDING, false);
+            }
+        });
+
+        Iterator<String> continents = ImmutableList.of("Africa", "America", "africa", "australia").iterator();
+        String expected = continents.next();
+        while (result.hasNext()) {
+            Authorizable a = result.next();
+            String continent = a.getProperty("continent")[0].getString();
+            if (!continent.equals(expected)) {
+                expected = continents.next();
+                assertEquals(expected, continent);
+            }
+        }
+    }
+
     @Test
     public void testOffset() throws RepositoryException {
         long[] offsets = {2, 0, 3, 0, 100000};
@@ -777,7 +853,7 @@ public class UserQueryTest extends Abstr
                 public <T> void build(QueryBuilder<T> builder) {
                     builder.setCondition(builder.
                             eq("profile/@cute", vf.createValue(true)));
-                    builder.setSortOrder("profile/@weight", QueryBuilder.Direction.ASCENDING, true);
+                    builder.setSortOrder("profile/@weight", QueryBuilder.Direction.ASCENDING, false);
                     builder.setLimit(vf.createValue(1000.0), count);
                 }
             });