ref #1447 fix findIdenticalName function
authorAndreas Müller <a.mueller@bgbm.org>
Fri, 10 Jan 2020 11:08:41 +0000 (12:08 +0100)
committerAndreas Müller <a.mueller@bgbm.org>
Fri, 10 Jan 2020 11:38:05 +0000 (12:38 +0100)
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java

index 41909ca8df27ef8608665adeb90ba258f412bb94..dd9d9ffef5ea31a0cf9375e6355ce392e532f225 100755 (executable)
@@ -1379,59 +1379,69 @@ public class TaxonDaoHibernateImpl
         return taxonNames;
     }
 
-
-
-    /**
-     * Returns a map of nameCaches and names available for sec1 and sec2
-     * this is used for the merging of two instances into one
-     *
-     * @param secRef1
-     * @param secRef2
-     * return map
-     *
-     */
     @Override
     public Map<String, Map<UUID,Set<TaxonName>>> findIdenticalNamesNew(List<UUID> sourceRefUuids, List<String> propertyPaths){
+        Set<String> nameCacheCandidates = new HashSet<>();
+        try {
+            for (int i = 0; i<sourceRefUuids.size()-1;i++){
+                UUID sourceUuid1 = sourceRefUuids.get(i);
+                for (int j = i+1; j<sourceRefUuids.size();j++){
+                    UUID sourceUuid2 = sourceRefUuids.get(j);
+                    if (sourceUuid1.equals(sourceUuid2)){
+                        continue;  //just in case we have duplicates in the list
+                    }
 
-        Query query=getSession().createQuery(
-                  " SELECT DISTINCT n1.nameCache "
-                + " FROM TaxonName n1 JOIN n1.sources s1 JOIN s1.citation ref1 "
-                + " WHERE ref1.uuid IN (:sourceUuids ) AND  EXISTS ("
-                + "         FROM TaxonName n2 JOIN n2.sources s2 JOIN s2.citation ref2 "
-                + "         WHERE ref2.uuid IN (:sourceUuids ) AND ref1.uuid <> ref2.uuid "
-                + " ORDER BY n1.nameCache ");
-        query.setParameterList("sourceUuids", sourceRefUuids);
-
-        @SuppressWarnings("unchecked")
-        List<String> nameCacheCandidates = query.list();
-
-        Map<UUID, List<TaxonName>> duplicates = new HashMap<>();
-        for (UUID sourceUuid : sourceRefUuids){
-            query=getSession().createQuery("SELECT n "
-                    + " FROM TaxonName n JOIN n.sources s JOIN s.citation ref "
-                    + " WHERE ref.uuid = :sourceUuid AND n.nameCache IN (:nameCacheCandidates) "
-                    + " ORDER BY n.nameCache");
-            query.setParameter("sourceUuid", sourceUuid);
-            query.setParameterList("nameCacheCandidates", nameCacheCandidates);
-            @SuppressWarnings("unchecked")
-            List<TaxonName> sourceDuplicates = query.list();
-            defaultBeanInitializer.initializeAll(sourceDuplicates, propertyPaths);
+                    Query query = getSession().createQuery(
+                            " SELECT DISTINCT n1.nameCache "
+                          + " FROM TaxonName n1 JOIN n1.sources s1 JOIN s1.citation ref1 "
+                          +         " , TaxonName n2 JOIN n2.sources s2 JOIN s2.citation ref2 "
+                          + " WHERE  ref1.uuid = (:sourceUuid1) "
+                          + "       AND n1.id <> n2.id "
+                          + "       AND ref2.uuid IN (:sourceUuid2)"
+                          + "       AND ref1.uuid <> ref2.uuid "
+                          + "       AND n1.nameCache = n2.nameCache) "
+                          + " ORDER BY n1.nameCache ");
+                    query.setParameter("sourceUuid1", sourceUuid1);
+                    query.setParameter("sourceUuid2", sourceUuid2);
+
+                    @SuppressWarnings("unchecked")
+                    List<String> queryNameCacheCandidates = query.list();
+                    nameCacheCandidates.addAll(queryNameCacheCandidates);
+                }
+            }
 
-            duplicates.put(sourceUuid, sourceDuplicates);
-        }
+            Map<UUID, List<TaxonName>> duplicates = new HashMap<>();
+            for (UUID sourceUuid : sourceRefUuids){
+                Query query=getSession().createQuery("SELECT n "
+                        + " FROM TaxonName n JOIN n.sources s JOIN s.citation ref "
+                        + " WHERE ref.uuid = :sourceUuid AND n.nameCache IN (:nameCacheCandidates) "
+                        + " ORDER BY n.nameCache");
+                query.setParameter("sourceUuid", sourceUuid);
+                query.setParameterList("nameCacheCandidates", nameCacheCandidates);
+                @SuppressWarnings("unchecked")
+                List<TaxonName> sourceDuplicates = query.list();
+                defaultBeanInitializer.initializeAll(sourceDuplicates, propertyPaths);
+
+                 duplicates.put(sourceUuid, sourceDuplicates);
+            }
 
-        Map<String, Map<UUID,Set<TaxonName>>> result = new HashMap<>();
-        for (String nameCache: nameCacheCandidates) {
-            Map<UUID,Set<TaxonName>> uuidNameMap = new HashMap<>();
-            result.put(nameCache, uuidNameMap);
-            for(UUID sourceUuid: duplicates.keySet()){
-                Set<TaxonName> names = duplicates.get(sourceUuid).stream().filter(name->
-                        name.getNameCache().equals(nameCache)).collect(Collectors.toSet());
-                uuidNameMap.put(sourceUuid, names);
+            List<String> nameCacheCandidateList = new ArrayList<>(nameCacheCandidates);
+            Map<String, Map<UUID,Set<TaxonName>>> result = new HashMap<>();
+            for (String nameCache: nameCacheCandidateList) {
+                Map<UUID,Set<TaxonName>> uuidNameMap = new HashMap<>();
+                result.put(nameCache, uuidNameMap);
+                for(UUID sourceUuid: duplicates.keySet()){
+                    Set<TaxonName> names = duplicates.get(sourceUuid).stream().filter(name->
+                            name.getNameCache().equals(nameCache)).collect(Collectors.toSet());
+                    uuidNameMap.put(sourceUuid, names);
+                }
             }
-        }
 
-        return result;
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw e;
+        }
     }
 
     @Override