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