From cdc50fae90312f747f702d8b6f74c2f68fc664a9 Mon Sep 17 00:00:00 2001
From: Tom Vahlman <tom@dsv.su.se>
Date: Sat, 14 Apr 2012 11:18:02 +0200
Subject: [PATCH] The sorting SQL:s now returns the same number of employees
 when sorting on keyword as returned when sorting on last name.

---
 .../springdata/repos/SupervisorRepo.java      | 22 ++------------
 .../serviceimpls/SupervisorServiceImpl.java   | 29 +++++++++----------
 2 files changed, 16 insertions(+), 35 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/springdata/repos/SupervisorRepo.java b/src/main/java/se/su/dsv/scipro/springdata/repos/SupervisorRepo.java
index d825066ddd..3c588bfcd2 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/repos/SupervisorRepo.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/repos/SupervisorRepo.java
@@ -16,7 +16,7 @@ import java.util.List;
  */
 @Transactional ( readOnly = true )
 public interface SupervisorRepo extends JpaRepository<Employee, Long>, QueryDslPredicateExecutor<Employee> {
-             // select employeeFull from Employee employeeFull where employeeFull.id in (
+
 	@Query ("select employee.id " +
             "from Employee employee " +
                 "join employee.keywords.keywords keywords " +
@@ -27,21 +27,14 @@ public interface SupervisorRepo extends JpaRepository<Employee, Long>, QueryDslP
             @Param("keywordTypeName")
             String keywordTypeName);
 
-    // hämtar employees med keywords där typen är type name... men en employee kan ha keywords av flera olika type names
+// dessa två metoder hämtar employees med keywords där typen är type name... men en employee kan ha keywords av flera olika type names
 
     @Query ("select employee.id " +
             "from Employee employee " +
             "join employee.keywords.keywords keywords " +
             "where keywords.type.name = :keywordTypeName " +
             "group by employee.id " +
-            //"order by size(employee.keywords.keywords) asc ")
             "order by size(employee.keywords.keywords) asc ")
-                      // sum(keywords.type.name = :keywordTypeName)
-    /*@Query ("select employeeFull from Employee employeeFull where employeeFull.id in (" +
-            "select employee.id from Employee employee inner join employee.keywords.keywords keywords " +
-            "where keywords.type.name = :keywordTypeName " + //and keywords.deleted = false and employee.deleted = false)) " +
-            "group by employee.id " +
-            "order by size(employeeFull.keywords.keywords) asc)")*/
 //"CASE ':ascending' WHEN 'true' THEN (size(employeeFull.keywords.keywords) asc " +
 //"ELSE size(employeeFull.keywords.keywords) desc END" +
 //"ELSE employeeFull.keywords.keywords.size desc " +
@@ -49,16 +42,5 @@ public interface SupervisorRepo extends JpaRepository<Employee, Long>, QueryDslP
     public List<Long> findSupervisorsOrderedByNumKeywordsAscending(
             @Param("keywordTypeName")
             String keywordTypeName);
-
-   /* public List<Employee> findSupervisorsOrderedByNumKeywords(String keywordTypeName, Boolean asc) {
-        switch (asc) {
-            case Direction.ASC:
-                return findSupervisorsOrderedByNumKeywordsAscending(keywordTypeName);
-            case Direction.DESC:
-            default:
-                return findSupervisorsOrderedByNumKeywordsAscending(keywordTypeName);
-        }
-        return findSupervisorsOrderedByNumKeywordsAscending(keywordTypeName);
-    }*/
 }
 
diff --git a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/SupervisorServiceImpl.java b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/SupervisorServiceImpl.java
index e039f044f7..fa721fbc76 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/SupervisorServiceImpl.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/SupervisorServiceImpl.java
@@ -38,14 +38,9 @@ public class SupervisorServiceImpl extends AbstractQueryService<Employee, Long>
 
     @Override
     public List<Employee> findAllEmployees(org.springframework.data.domain.Sort orders) {
-        return supervisorRepo.findAll(orders);            // 218 st
+        return supervisorRepo.findAll(orders);            // // 120414: the list should return 218 employees
     }
 
-   /* @Override
-    public List<Employee> findSupervisorsOrderedByNumKeywords(String keywordTypeName, Sort.Direction sortDirection) {
-        return supervisorRepo.findSupervisorsOrderedByNumKeywords(keywordTypeName, sortDirection);
-    }*/
-
     @Override
     public List<Employee> findSupervisorsOrderedByNumKeywordsDescending(String keywordTypeName) {
         List<Long> employeeIDs = new ArrayList<Long>();
@@ -77,12 +72,12 @@ public class SupervisorServiceImpl extends AbstractQueryService<Employee, Long>
         List<Employee> employeeList = new ArrayList<Employee>();
         if(direction.equalsIgnoreCase("desc")) {
             employeeList.addAll(getEmployeesThatHaveKeywords(keywordTypeName, direction));
-            employeeList.addAll(getEmployeesWithoutKeywords());
+            employeeList.addAll(getEmployeesWithoutKeywords(keywordTypeName));
         } else {
-            employeeList.addAll(getEmployeesWithoutKeywords());
+            employeeList.addAll(getEmployeesWithoutKeywords(keywordTypeName));
             employeeList.addAll(getEmployeesThatHaveKeywords(keywordTypeName, direction));
         }
-        return employeeList;  // totalt 129 st för regular men 156 st för area och 218 för last name (vilken innehåller både keywords Area och Regular)
+        return employeeList;  // 120414: the list should return 218 employees
     }
 
     private List<Employee> getEmployeesThatHaveKeywords(String keywordTypeName, String direction) {
@@ -109,7 +104,7 @@ public class SupervisorServiceImpl extends AbstractQueryService<Employee, Long>
     }
 
 
-    private List<Employee> getEmployeesWithoutKeywords() {
+    private List<Employee> getEmployeesWithoutKeywords(String keywordTypeName) {
         List<Employee> employeeList = new ArrayList<Employee>();
         String nativeSQL = "select  " +
                                     "role.id " +
@@ -119,12 +114,16 @@ public class SupervisorServiceImpl extends AbstractQueryService<Employee, Long>
                             "where " +
                                     "role.rolename = 'Employee' and " +
                                     "user.id = role.user_id and not exists " +
-                                    "(select " +
-                                            "1 " +
+                                    "(select 1 " +
                                      "from " +
-                                            "Employee_Keyword ek " +
+                                            "Employee_Keyword ek, " +
+                                            "Keyword k, " +
+                                            "KeywordType kt " +
                                      "where " +
-                                            "ek.role_id = role.id)  " +
+                                            "ek.role_id = role.id and " +
+                                            "k.id = ek.keywords_id and " +
+                                            "k.type_id = kt.id and " +
+                                            "kt.name= '" + keywordTypeName + "') " +
                                       "order by  " +
                                             "user.lastName asc ";
         return runQueryAddToList(employeeList, nativeSQL);
@@ -140,6 +139,6 @@ public class SupervisorServiceImpl extends AbstractQueryService<Employee, Long>
                 employeeList.add(employee);
             }
         }
-        return employeeList;        // 36 st   + 93 st
+        return employeeList;
     }
 }