You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by da...@apache.org on 2015/06/03 22:43:36 UTC

deltaspike git commit: Fixed: DELTASPIKE-911 Criteria API - Add support for accept multiple columns in orderBy

Repository: deltaspike
Updated Branches:
  refs/heads/master 1c2d45cd0 -> 4b0168dbf


Fixed: DELTASPIKE-911 Criteria API - Add support for accept multiple columns in orderBy


Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/4b0168db
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/4b0168db
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/4b0168db

Branch: refs/heads/master
Commit: 4b0168dbf7dc273a6b480a92b3821923e29f0ccb
Parents: 1c2d45c
Author: Daniel Cunha (soro) <da...@gmail.com>
Authored: Tue May 26 16:52:14 2015 -0300
Committer: Daniel Cunha (soro) <da...@apache.org>
Committed: Wed Jun 3 17:42:51 2015 -0300

----------------------------------------------------------------------
 .../data/impl/criteria/QueryCriteria.java       | 11 ++-
 .../data/impl/criteria/processor/OrderBy.java   | 83 +++++++++++++++++---
 .../data/impl/criteria/CriteriaTest.java        | 16 +++-
 .../test/service/SimpleCriteriaRepository.java  |  7 ++
 4 files changed, 103 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4b0168db/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/QueryCriteria.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/QueryCriteria.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/QueryCriteria.java
index 79ffbed..89e6b42 100644
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/QueryCriteria.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/QueryCriteria.java
@@ -81,6 +81,7 @@ public class QueryCriteria<C, R> implements Criteria<C, R>
     private final boolean ignoreNull = true;
     private boolean distinct = false;
 
+    private final OrderBy orderByProcessor = new OrderBy();
     private final List<PredicateBuilder<C>> builders = new LinkedList<PredicateBuilder<C>>();
     private final List<QueryProcessor<C>> processors = new LinkedList<QueryProcessor<C>>();
     private final List<QuerySelection<? super C, ?>> selections = new LinkedList<QuerySelection<? super C, ?>>();
@@ -241,14 +242,14 @@ public class QueryCriteria<C, R> implements Criteria<C, R>
     @Override
     public <P> Criteria<C, R> orderAsc(SingularAttribute<? super C, P> att)
     {
-        add(new OrderBy<C, P>(att, OrderDirection.ASC));
+        addOrderBy(att, OrderDirection.ASC);
         return this;
     }
 
     @Override
     public <P> Criteria<C, R> orderDesc(SingularAttribute<? super C, P> att)
     {
-        add(new OrderBy<C, P>(att, OrderDirection.DESC));
+        addOrderBy(att, OrderDirection.DESC);
         return this;
     }
 
@@ -294,6 +295,7 @@ public class QueryCriteria<C, R> implements Criteria<C, R>
 
     void applyProcessors(CriteriaQuery<?> query, CriteriaBuilder builder, From<C, C> from)
     {
+        orderByProcessor.process(query, builder, from);
         for (QueryProcessor<C> proc : processors)
         {
             proc.process(query, builder, from);
@@ -335,6 +337,11 @@ public class QueryCriteria<C, R> implements Criteria<C, R>
         processors.add(proc);
     }
 
+    private void addOrderBy(SingularAttribute<? super C, ?> att, OrderDirection orderDirection)
+    {
+        orderByProcessor.add(att, orderDirection);
+    }
+
     private Selection<?>[] prepareSelections(CriteriaQuery<?> query, CriteriaBuilder builder, From<C, C> root)
     {
         List<Selection<?>> result = new ArrayList<Selection<?>>(selections.size());

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4b0168db/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/processor/OrderBy.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/processor/OrderBy.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/processor/OrderBy.java
index 8228320..2840c76 100644
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/processor/OrderBy.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/processor/OrderBy.java
@@ -20,34 +20,95 @@ package org.apache.deltaspike.data.impl.criteria.processor;
 
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Order;
 import javax.persistence.criteria.Path;
 import javax.persistence.metamodel.SingularAttribute;
 
 import org.apache.deltaspike.data.impl.builder.OrderDirection;
 
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
 public class OrderBy<P, V> implements QueryProcessor<P>
 {
 
-    private final SingularAttribute<? super P, V> att;
-    private final OrderDirection dir;
+    private final List<OrderByDefinition> orderByDefinitions = new ArrayList<OrderByDefinition>();
 
-    public OrderBy(SingularAttribute<? super P, V> att, OrderDirection dir)
+    public void add(SingularAttribute<? super P, V> att, OrderDirection dir)
     {
-        this.att = att;
-        this.dir = dir;
+        orderByDefinitions.add(new OrderByDefinition(att, dir));
     }
 
     @Override
     public <R> void process(CriteriaQuery<R> query, CriteriaBuilder builder, Path<P> path)
     {
-        switch (dir)
+        List<Order> orders = new ArrayList<Order>();
+        Iterator<OrderByDefinition> iterator = orderByDefinitions.iterator();
+        while (iterator.hasNext())
         {
-            case ASC:
-                query.orderBy(builder.asc(path.get(att)));
-                break;
-            default:
-                query.orderBy(builder.desc(path.get(att)));
+            OrderByDefinition orderByDefinition = iterator.next();
+            switch (orderByDefinition.getDir())
+            {
+                case ASC:
+                    orders.add(builder.asc(path.get(orderByDefinition.getAtt())));
+                    break;
+                default:
+                    orders.add(builder.desc(path.get(orderByDefinition.getAtt())));
+            }
         }
+        query.orderBy(orders);
     }
 
+    private class OrderByDefinition
+    {
+        private final SingularAttribute<? super P, V> att;
+        private final OrderDirection dir;
+
+        public OrderByDefinition(SingularAttribute<? super P, V> att, OrderDirection dir)
+        {
+            this.att = att;
+            this.dir = dir;
+        }
+
+        public SingularAttribute<? super P, V> getAtt()
+        {
+            return att;
+        }
+
+        public OrderDirection getDir()
+        {
+            return dir;
+        }
+
+        @Override
+        public boolean equals(Object o)
+        {
+            if (this == o)
+            {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass())
+            {
+                return false;
+            }
+
+            OrderByDefinition that = (OrderByDefinition) o;
+
+            if (att != null ? !att.equals(that.att) : that.att != null)
+            {
+                return false;
+            }
+            return dir == that.dir;
+
+        }
+
+        @Override
+        public int hashCode()
+        {
+            int result = att != null ? att.hashCode() : 0;
+            result = 31 * result + (dir != null ? dir.hashCode() : 0);
+            return result;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4b0168db/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java
index 44a3f32..3a459ff 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java
@@ -420,6 +420,21 @@ public class CriteriaTest extends TransactionalTestCase
         assertEquals(superName, result.getSuperName());
     }
 
+    @Test
+    public void should_apply_multiply_orderby()
+    {
+        // given
+        createSimple("a", 1);
+        createSimple("b", 2);
+
+        // when
+        final List<Simple> orderByNameAndCounter = repo.findOrderByNameAndCounter();
+
+        // then
+        assertEquals(new Integer(2), orderByNameAndCounter.get(0).getCounter());
+        assertEquals(new Integer(1), orderByNameAndCounter.get(1).getCounter());
+    }
+
     @Override
     protected EntityManager getEntityManager()
     {
@@ -434,5 +449,4 @@ public class CriteriaTest extends TransactionalTestCase
         entityManager.flush();
         return result;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4b0168db/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleCriteriaRepository.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleCriteriaRepository.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleCriteriaRepository.java
index 35c87fd..5273cf2 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleCriteriaRepository.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleCriteriaRepository.java
@@ -121,4 +121,11 @@ public abstract class SimpleCriteriaRepository extends AbstractEntityRepository<
                 .getResultList();
     }
 
+   public List<Simple> findOrderByNameAndCounter() {
+      return criteria()
+              .orderDesc(Simple_.counter)
+              .orderAsc(Simple_.name)
+              .getResultList();
+   }
+
 }