From 9c1b2d8e1f6b707f56016867e8d98f2f47e4ab57 Mon Sep 17 00:00:00 2001 From: markquintontulloch Date: Tue, 27 Feb 2024 16:48:02 +0000 Subject: [PATCH] Rewrite findFilteredIds method --- .../curation_api/dao/base/BaseSQLDAO.java | 191 +++++++++--------- 1 file changed, 91 insertions(+), 100 deletions(-) diff --git a/src/main/java/org/alliancegenome/curation_api/dao/base/BaseSQLDAO.java b/src/main/java/org/alliancegenome/curation_api/dao/base/BaseSQLDAO.java index 0c3d69e0f..5e1bc9ab7 100644 --- a/src/main/java/org/alliancegenome/curation_api/dao/base/BaseSQLDAO.java +++ b/src/main/java/org/alliancegenome/curation_api/dao/base/BaseSQLDAO.java @@ -98,16 +98,98 @@ public E find(Long id) { } } + private List buildRestrictions(Root root, Map params, Logger.Level level) { + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + List restrictions = new ArrayList<>(); + + for (String key : params.keySet()) { + Path column = null; + Log.log(level, "Key: " + key); + if (key.contains(".")) { + String[] objects = key.split("\\."); + for (String s : objects) { + Log.log(level, "Looking up: " + s); + if (column != null) { + Log.log(level, "Looking up via column: " + s); + Path pathColumn = column.get(s); + if (pathColumn.getJavaType().equals(List.class)) { + column = ((Join) column).join(s); + } else { + column = pathColumn; + } + } else { + Log.log(level, "Looking up via root: " + s); + column = root.get(s); + if (column.getJavaType().equals(List.class)) + column = root.join(s); + } + + Log.log(level, "Column Alias: " + column.getAlias() + " Column Java Type: " + column.getJavaType() + " Column Model: " + column.getModel() + " Column Parent Path Alias: " + column.getParentPath().getAlias()); + } + } else { + Log.log(level, "Looking up via root: " + key); + column = root.get(key); + // Don't need to join to these tables if value is null, the isEmpty will catch the condition later + Object value = params.get(key); + if(value != null) { + if (column instanceof SqmPluralValuedSimplePath) + column = root.join(key); + } + } + + Log.log(level, "Column Alias: " + column.getAlias() + " Column Java Type: " + column.getJavaType() + " Column Model: " + column.getModel() + " Column Parent Path Alias: " + column.getParentPath().getAlias()); + + Object value = params.get(key); + + if(value == null) { + restrictions.add(builder.isEmpty(root.get(key))); + } else if (value instanceof Integer) { + Log.log(level, "Integer Type: " + value); + Integer desiredValue = (Integer) value; + restrictions.add(builder.equal(column, desiredValue)); + } else if (value instanceof Enum) { + Log.log(level, "Enum Type: " + value); + restrictions.add(builder.equal(column, value)); + } else if (value instanceof Long) { + Log.log(level, "Long Type: " + value); + Long desiredValue = (Long) value; + restrictions.add(builder.equal(column, desiredValue)); + } else if (value instanceof Boolean) { + Log.log(level, "Boolean Type: " + value); + Boolean desiredValue = (Boolean) value; + restrictions.add(builder.equal(column, desiredValue)); + } else if (value instanceof String) { + Log.log(level, "String Type: " + value); + String desiredValue = (String) value; + restrictions.add(builder.equal(column, desiredValue)); + } else { + // Not sure what to do here as we have a non supported value + Log.info("Unsupprted Value: " + value); + } + } + + return restrictions; + } + public List findFilteredIds(Map params) { - List primaryKeys = new ArrayList<>(); - SearchResponse results = findByParams(params); - for (E entity : results.getResults()) { - Long pk = returnId(entity); - if (pk != null) - primaryKeys.add(pk); + Logger.Level level = Level.DEBUG; + if(params.containsKey("debug")) { + level = params.remove("debug").equals("true") ? Level.INFO : Level.DEBUG; } - return primaryKeys; + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery(Long.class); + Root root = query.from(myClass); + + List restrictions = buildRestrictions(root, params, level); + + query.orderBy(builder.asc(root.get("id"))); + query.where(builder.and(restrictions.toArray(new Predicate[0]))); + query.select(root.get("id")); + + List filteredIds = entityManager.createQuery(query).getResultList(); + + return filteredIds; } public SearchResponse findAllIds() { @@ -492,99 +574,8 @@ public SearchResponse findByParams(Pagination pagination, Map Root countRoot = countQuery.from(myClass); // System.out.println("Root: " + root); - List restrictions = new ArrayList<>(); - List countRestrictions = new ArrayList<>(); - - for (String key : params.keySet()) { - Path column = null; - Path countColumn = null; - Log.log(level, "Key: " + key); - if (key.contains(".")) { - String[] objects = key.split("\\."); - for (String s : objects) { - Log.log(level, "Looking up: " + s); - if (column != null) { - Log.log(level, "Looking up via column: " + s); - Path pathColumn = column.get(s); - if (pathColumn.getJavaType().equals(List.class)) { - column = ((Join) column).join(s); - } else { - column = pathColumn; - } - Path pathCountColumn = countColumn.get(s); - if (pathCountColumn.getJavaType().equals(List.class)) { - countColumn = ((Join) countColumn).join(s); - } else { - countColumn = pathCountColumn; - } - } else { - Log.log(level, "Looking up via root: " + s); - column = root.get(s); - if (column.getJavaType().equals(List.class)) { - column = root.join(s); - } - countColumn = countRoot.get(s); - if (countColumn.getJavaType().equals(List.class)) { - countColumn = countRoot.join(s); - } - } - - Log.log(level, "Column Alias: " + column.getAlias() + " Column Java Type: " + column.getJavaType() + " Column Model: " + column.getModel() + " Column Parent Path Alias: " + column.getParentPath().getAlias()); - Log.log(level, "Count Column Alias: " + countColumn.getAlias() + " Count Column Java Type: " + countColumn.getJavaType() + " Count Column Model: " + countColumn.getModel() + " Count Column Parent Path Alias: " + countColumn.getParentPath().getAlias()); - } - } else { - Log.log(level, "Looking up via root: " + key); - column = root.get(key); - countColumn = countRoot.get(key); - // Don't need to join to these tables if value is null, the isEmpty will catch the condition later - Object value = params.get(key); - if(value != null) { - if (column instanceof SqmPluralValuedSimplePath) { - column = root.join(key); - } - if (countColumn instanceof SqmPluralValuedSimplePath) { - countColumn = countRoot.join(key); - } - } - } - - Log.log(level, "Column Alias: " + column.getAlias() + " Column Java Type: " + column.getJavaType() + " Column Model: " + column.getModel() + " Column Parent Path Alias: " + column.getParentPath().getAlias()); - Log.log(level, "Count Column Alias: " + countColumn.getAlias() + " Count Column Java Type: " + countColumn.getJavaType() + " Count Column Model: " + countColumn.getModel() + " Count Column Parent Path Alias: " + countColumn.getParentPath().getAlias()); - - Object value = params.get(key); - - if(value == null) { - restrictions.add(builder.isEmpty(root.get(key))); - countRestrictions.add(builder.isEmpty(countRoot.get(key))); - } else if (value instanceof Integer) { - Log.log(level, "Integer Type: " + value); - Integer desiredValue = (Integer) value; - restrictions.add(builder.equal(column, desiredValue)); - countRestrictions.add(builder.equal(countColumn, desiredValue)); - } else if (value instanceof Enum) { - Log.log(level, "Enum Type: " + value); - restrictions.add(builder.equal(column, value)); - countRestrictions.add(builder.equal(countColumn, value)); - } else if (value instanceof Long) { - Log.log(level, "Long Type: " + value); - Long desiredValue = (Long) value; - restrictions.add(builder.equal(column, desiredValue)); - countRestrictions.add(builder.equal(countColumn, desiredValue)); - } else if (value instanceof Boolean) { - Log.log(level, "Boolean Type: " + value); - Boolean desiredValue = (Boolean) value; - restrictions.add(builder.equal(column, desiredValue)); - countRestrictions.add(builder.equal(countColumn, desiredValue)); - } else if (value instanceof String) { - Log.log(level, "String Type: " + value); - String desiredValue = (String) value; - restrictions.add(builder.equal(column, desiredValue)); - countRestrictions.add(builder.equal(countColumn, desiredValue)); - } else { - // Not sure what to do here as we have a non supported value - Log.info("Unsupprted Value: " + value); - } - } + List restrictions = buildRestrictions(root, params, level); + List countRestrictions = buildRestrictions(countRoot, params, level); if (orderByField != null) { query.orderBy(builder.asc(root.get(orderByField)));