From bfa342e41f7b9d2ac4c059bb72b71e3112da1452 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Wed, 8 Aug 2018 10:00:23 +0200
Subject: [PATCH] OO-3286: extends reach of the curriculum search to identifier
 of curriculum elements

---
 .../persistence/PersistenceHelper.java        | 17 -------
 .../commons/persistence/QueryBuilder.java     | 12 +++++
 .../curriculum/manager/CurriculumDAO.java     | 49 ++++++++++---------
 3 files changed, 39 insertions(+), 39 deletions(-)

diff --git a/src/main/java/org/olat/core/commons/persistence/PersistenceHelper.java b/src/main/java/org/olat/core/commons/persistence/PersistenceHelper.java
index 565cf024a18..24cc2a5755c 100644
--- a/src/main/java/org/olat/core/commons/persistence/PersistenceHelper.java
+++ b/src/main/java/org/olat/core/commons/persistence/PersistenceHelper.java
@@ -131,23 +131,6 @@ public class PersistenceHelper {
 		return true;
 	}
 	
-	public static boolean appendGroupBy(StringBuilder sb, String dbRef, SortKey... orderBy) {
-		boolean appended = false;
-		if(orderBy != null && orderBy.length > 0 && orderBy[0] != null) {
-			sb.append(" order by ");
-			for(SortKey sort:orderBy) {
-				sb.append(dbRef).append(".").append(sort.getKey());
-				if(sort.isAsc()) {
-					sb.append(" asc ");
-				} else {
-					sb.append(" desc ");
-				}
-				appended = true;
-			}
-		}
-		return appended;
-	}
-	
 	public static final void appendFuzzyLike(Appendable sb, String var, String key, String dbVendor) {
 		try {
 			if(dbVendor.equals("mysql")) {
diff --git a/src/main/java/org/olat/core/commons/persistence/QueryBuilder.java b/src/main/java/org/olat/core/commons/persistence/QueryBuilder.java
index 680db408ff6..8361f8b7802 100644
--- a/src/main/java/org/olat/core/commons/persistence/QueryBuilder.java
+++ b/src/main/java/org/olat/core/commons/persistence/QueryBuilder.java
@@ -177,6 +177,18 @@ public class QueryBuilder implements Appendable {
 		return this;
 	}
 	
+	public QueryBuilder likeFuzzy(String var, String key, String dbVendor) {
+		if(dbVendor.equals("mysql")) {
+			append(" ").append(var).append(" like :").append(key);
+		} else {
+			append(" lower(").append(var).append(") like :").append(key);
+		}
+		if(dbVendor.equals("oracle")) {
+			append(" escape '\\'");
+		}
+		return this;
+	}
+	
 	public QueryBuilder appendAsc(boolean asc) {
 		if(asc) {
 			sb.append(" asc");
diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java
index 0eee8855447..f46c918d904 100644
--- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java
+++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java
@@ -105,15 +105,14 @@ public class CurriculumDAO {
 	}
 	
 	public List<Curriculum> search(CurriculumSearchParameters params) {
-		StringBuilder sb = new StringBuilder(256);
+		QueryBuilder sb = new QueryBuilder(256);
 		sb.append("select cur from curriculum cur")
 		  .append(" ").append(params.getOrganisations().isEmpty() ? "left" : "inner").append(" join fetch cur.organisation organis")
 		  .append(" inner join fetch cur.group baseGroup");
 		
-		boolean where = false;
 		if(!params.getOrganisations().isEmpty()) {
-			where = PersistenceHelper.appendAnd(sb, where);
-			sb.append(" organis.key in (:organisationKeys)");
+			sb.and()
+			  .append(" organis.key in (:organisationKeys)");
 		}
 		
 		Long key = null;
@@ -123,11 +122,15 @@ public class CurriculumDAO {
 			ref = params.getSearchString();
 			fuzzyRef = PersistenceHelper.makeFuzzyQueryString(ref);
 			
-			where = PersistenceHelper.appendAnd(sb, where);
-			sb.append(" (cur.externalId=:ref or ");
-			PersistenceHelper.appendFuzzyLike(sb, "cur.displayName", "fuzzyRef", dbInstance.getDbVendor());
-			sb.append(" or ");
-			PersistenceHelper.appendFuzzyLike(sb, "cur.identifier", "fuzzyRef", dbInstance.getDbVendor());
+			sb.and()
+			  .append(" (cur.externalId=:ref or ")
+			  .likeFuzzy("cur.displayName", "fuzzyRef", dbInstance.getDbVendor())
+			  .append(" or ")
+			  .likeFuzzy("cur.identifier", "fuzzyRef", dbInstance.getDbVendor())
+			  .append(" or exists (select curEl.key from curriculumelement as curEl where")
+			  .append("  curEl.curriculum.key=cur.key and")
+			  .likeFuzzy("curEl.identifier", "fuzzyRef", dbInstance.getDbVendor())
+			  .append(")");
 			if(StringHelper.isLong(ref)) {
 				key = Long.valueOf(ref);
 				sb.append(" or cur.key=:curriculumKey");
@@ -136,8 +139,8 @@ public class CurriculumDAO {
 		}
 		
 		if(params.getManagerIdentity() != null) {
-			where = PersistenceHelper.appendAnd(sb, where);
-			sb.append("exists (select membership.key from bgroupmember as membership")
+			sb.and()
+			  .append("exists (select membership.key from bgroupmember as membership")
 			  .append("  where membership.identity.key=:managerKey")
 			  .append("  and (membership.group.key=baseGroup.key or organis.group.key=baseGroup.key)")
 			  .append("  and role in ('").append(CurriculumRoles.curriculummanager).append("')")
@@ -167,7 +170,7 @@ public class CurriculumDAO {
 	}
 	
 	public List<CurriculumInfos> searchWithInfos(CurriculumSearchParameters params) {
-		StringBuilder sb = new StringBuilder(256);
+		QueryBuilder sb = new QueryBuilder(512);
 		sb.append("select cur,")
 		  .append(" (select count(curElement.key) from curriculumelement curElement")
 		  .append("  where curElement.curriculum.key=cur.key")
@@ -176,10 +179,8 @@ public class CurriculumDAO {
 		  .append(" inner join fetch cur.group baseGroup")
 		  .append(" ").append(params.getOrganisations().isEmpty() ? "left" : "inner").append(" join fetch cur.organisation organis");
 		
-		boolean where = false;
 		if(!params.getOrganisations().isEmpty()) {
-			where = PersistenceHelper.appendAnd(sb, where);
-			sb.append(" organis.key in (:organisationKeys)");
+			sb.and().append(" organis.key in (:organisationKeys)");
 		}
 		
 		Long key = null;
@@ -189,11 +190,15 @@ public class CurriculumDAO {
 			ref = params.getSearchString();
 			fuzzyRef = PersistenceHelper.makeFuzzyQueryString(ref);
 			
-			where = PersistenceHelper.appendAnd(sb, where);
-			sb.append(" (cur.externalId=:ref or ");
-			PersistenceHelper.appendFuzzyLike(sb, "cur.displayName", "fuzzyRef", dbInstance.getDbVendor());
-			sb.append(" or ");
-			PersistenceHelper.appendFuzzyLike(sb, "cur.identifier", "fuzzyRef", dbInstance.getDbVendor());
+			sb.and()
+			  .append(" (cur.externalId=:ref or ")
+			  .likeFuzzy("cur.displayName", "fuzzyRef", dbInstance.getDbVendor())
+			  .append(" or ")
+			  .likeFuzzy("cur.identifier", "fuzzyRef", dbInstance.getDbVendor())
+			  .append(" or exists (select curEl.key from curriculumelement as curEl where")
+			  .append("  curEl.curriculum.key=cur.key and")
+			  .likeFuzzy("curEl.identifier", "fuzzyRef", dbInstance.getDbVendor())
+			  .append(")");
 			if(StringHelper.isLong(ref)) {
 				key = Long.valueOf(ref);
 				sb.append(" or cur.key=:curriculumKey");
@@ -202,8 +207,8 @@ public class CurriculumDAO {
 		}
 		
 		if(params.getManagerIdentity() != null) {
-			where = PersistenceHelper.appendAnd(sb, where);
-			sb.append("exists (select membership.key from bgroupmember as membership")
+			sb.and()
+			  .append("exists (select membership.key from bgroupmember as membership")
 			  .append("  where membership.identity.key=:managerKey")
 			  .append("  and (membership.group.key=baseGroup.key or membership.group.key=organis.group.key)")
 			  .append("  and role in ('").append(CurriculumRoles.curriculummanager).append("','").append(OrganisationRoles.administrator).append("','").append(OrganisationRoles.principal).append("')")
-- 
GitLab