You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2019/10/10 08:56:24 UTC

[syncope] branch master updated (5d2e3e4 -> 2bff895)

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git.


    from 5d2e3e4  NOJIRA: Update developer info in pom.xml
     new 92b8519  [SYNCOPE-1502]: find anytos in single query
     new 2bff895  [SYNCOPE-1502] Adjustments to comply with code rules, checked with PostgreSQL, MySQL, PostgreSQL JSONB and Elasticsearch

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../syncope/core/persistence/api/dao/AnyDAO.java   |  2 ++
 .../jpa/dao/AbstractJPAJSONAnySearchDAO.java       |  5 ----
 .../persistence/jpa/dao/MyJPAJSONAnySearchDAO.java | 26 +++++++++++++++++
 .../persistence/jpa/dao/PGJPAJSONAnySearchDAO.java |  3 +-
 .../core/persistence/jpa/dao/AbstractAnyDAO.java   | 12 ++++++++
 .../persistence/jpa/dao/AbstractAnySearchDAO.java  | 34 ++++++++--------------
 .../core/persistence/jpa/dao/JPAAnySearchDAO.java  | 31 +++++++++-----------
 7 files changed, 67 insertions(+), 46 deletions(-)


[syncope] 02/02: [SYNCOPE-1502] Adjustments to comply with code rules, checked with PostgreSQL, MySQL, PostgreSQL JSONB and Elasticsearch

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit 2bff895d5ecdcf2f1beab202b4ee818243faf654
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Thu Oct 10 09:36:15 2019 +0200

    [SYNCOPE-1502] Adjustments to comply with code rules, checked with PostgreSQL, MySQL, PostgreSQL JSONB and Elasticsearch
---
 .../jpa/dao/AbstractJPAJSONAnySearchDAO.java       |  5 ----
 .../persistence/jpa/dao/MyJPAJSONAnySearchDAO.java | 26 +++++++++++++++++
 .../persistence/jpa/dao/PGJPAJSONAnySearchDAO.java |  3 +-
 .../core/persistence/jpa/dao/AbstractAnyDAO.java   |  6 ++--
 .../persistence/jpa/dao/AbstractAnySearchDAO.java  | 33 ++++++----------------
 .../core/persistence/jpa/dao/JPAAnySearchDAO.java  | 29 +++++++++----------
 6 files changed, 52 insertions(+), 50 deletions(-)

diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAnySearchDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAnySearchDAO.java
index 7dbf95d..02f516f 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAnySearchDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAnySearchDAO.java
@@ -18,16 +18,11 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
-import org.apache.commons.lang3.time.FastDateFormat;
-import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.dao.search.AttributeCond;
 
 abstract class AbstractJPAJSONAnySearchDAO extends JPAAnySearchDAO {
 
-    protected static final FastDateFormat DATE_FORMAT =
-            FastDateFormat.getInstance(SyncopeConstants.DEFAULT_DATE_PATTERN);
-
     @Override
     SearchSupport buildSearchSupport(final AnyTypeKind kind) {
         return new SearchSupport(kind);
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java
index bb48eda..404b292 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java
@@ -37,6 +37,32 @@ import org.apache.syncope.core.persistence.api.entity.JSONPlainAttr;
 public class MyJPAJSONAnySearchDAO extends AbstractJPAJSONAnySearchDAO {
 
     @Override
+    protected String buildAdminRealmsFilter(
+            final Set<String> realmKeys,
+            final SearchSupport svs,
+            final List<Object> parameters) {
+
+        StringBuilder adminRealmsFilter = new StringBuilder("u.any_id IN (").
+                append("SELECT any_id FROM ").append(svs.field().name).
+                append(" WHERE realm_id IN (SELECT id AS realm_id FROM Realm");
+
+        boolean firstRealm = true;
+        for (String realmKey : realmKeys) {
+            if (firstRealm) {
+                adminRealmsFilter.append(" WHERE");
+                firstRealm = false;
+            } else {
+                adminRealmsFilter.append(" OR");
+            }
+            adminRealmsFilter.append(" id=?").append(setParameter(parameters, realmKey));
+        }
+
+        adminRealmsFilter.append("))");
+
+        return adminRealmsFilter.toString();
+    }
+
+    @Override
     protected void processOBS(
             final SearchSupport svs,
             final Set<String> involvedPlainAttrs,
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java
index 3eef640..cbcf252 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java
@@ -34,6 +34,7 @@ import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 import org.apache.syncope.core.persistence.api.entity.JSONPlainAttr;
+import org.apache.syncope.core.provisioning.api.utils.FormatUtils;
 
 public class PGJPAJSONAnySearchDAO extends AbstractJPAJSONAnySearchDAO {
 
@@ -156,7 +157,7 @@ public class PGJPAJSONAnySearchDAO extends AbstractJPAJSONAnySearchDAO {
                 String value = cond.getExpression();
                 if (schema.getType() == AttrSchemaType.Date) {
                     try {
-                        value = String.valueOf(DATE_FORMAT.parse(value).getTime());
+                        value = String.valueOf(FormatUtils.parseDate(value).getTime());
                     } catch (ParseException e) {
                         LOG.error("Could not parse {} as date", value, e);
                     }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
index fd3da0c..496b609 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
@@ -154,10 +154,10 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
 
     @Transactional(readOnly = true)
     @Override
-    public List<A> findByKeys(List<String> keys) {
+    public List<A> findByKeys(final List<String> keys) {
         Class<A> entityClass = anyUtils().anyClass();
-        TypedQuery<A> query = entityManager()
-                .createQuery("SELECT e FROM " + entityClass.getSimpleName() + " e WHERE e.id IN (:keys)", entityClass);
+        TypedQuery<A> query = entityManager().createQuery(
+                "SELECT e FROM " + entityClass.getSimpleName() + " e WHERE e.id IN (:keys)", entityClass);
         query.setParameter("keys", keys);
         return query.getResultList();
     }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
index d1677e1..81624a5 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
@@ -20,11 +20,8 @@ package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
-import java.util.ArrayList;
 import java.util.Optional;
 import java.util.List;
-import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 import javax.validation.ValidationException;
@@ -299,32 +296,18 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
         return memberKey;
     }
 
+    @SuppressWarnings("unchecked")
     protected <T extends Any<?>> List<T> buildResult(final List<Object> raw, final AnyTypeKind kind) {
-        List<String> orderedAnyKeys = extractSortedAnyKeys(raw);
-        return constructSortedAnyTOsBySortedKeys(findAnyTOs(kind, orderedAnyKeys), orderedAnyKeys, kind);
-    }
+        List<String> keys = raw.stream().
+                map(key -> key instanceof Object[] ? (String) ((Object[]) key)[0] : ((String) key)).
+                collect(Collectors.toList());
 
-    private List<String> extractSortedAnyKeys(List<Object> raw) {
-        return raw.stream().map(anyKey -> anyKey instanceof Object[]
-                ? (String) ((Object[]) anyKey)[0]
-                : ((String) anyKey))
-                .collect(Collectors.toList());
-    }
+        List<Any<?>> anys = anyUtilsFactory.getInstance(kind).dao().findByKeys(keys);
 
-    @SuppressWarnings("unchecked")
-    private <T extends Any<?>> List<T> findAnyTOs(AnyTypeKind kind, List<String> orderedAnyKeys) {
-        return new ArrayList<>((List<T>) anyUtilsFactory.getInstance(kind).dao().findByKeys(orderedAnyKeys));
-    }
+        keys.stream().filter(key -> !anys.stream().anyMatch(any -> key.equals(any.getKey()))).
+                forEach(key -> LOG.error("Could not find {} with id {}, even if returned by native query", kind, key));
 
-    private <T extends Any<?>> List<T> constructSortedAnyTOsBySortedKeys(List<T> anyTOs,
-            List<String> sortedAnyKeys, AnyTypeKind kind) {
-        Map<String, T> anyMap = anyTOs.stream().collect(Collectors.toMap(T::getKey, anyTO -> anyTO));
-        return sortedAnyKeys.stream().map(key -> {
-            if (anyMap.get(key) == null) {
-                LOG.error("Could not find {} with id {}, even if returned by native query", kind, key);
-            }
-            return anyMap.get(key);
-        }).filter(Objects::nonNull).collect(Collectors.toList());
+        return (List<T>) anys;
     }
 
     @Override
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
index e3644aa..dfe23c8 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
@@ -64,6 +64,18 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
 
     protected static final String EMPTY_QUERY = "SELECT any_id FROM user_search WHERE 1=2";
 
+    protected String buildAdminRealmsFilter(
+            final Set<String> realmKeys,
+            final SearchSupport svs,
+            final List<Object> parameters) {
+
+        List<String> realmKeyArgs = realmKeys.stream().
+                map(realmKey -> "?" + setParameter(parameters, realmKey)).
+                collect(Collectors.toList());
+        return "u.any_id IN (SELECT any_id FROM " + svs.field().name
+                + " WHERE realm_id IN (" + StringUtils.join(realmKeyArgs, ", ") + "))";
+    }
+
     private Pair<String, Set<String>> getAdminRealmsFilter(
             final Set<String> adminRealms,
             final SearchSupport svs,
@@ -96,22 +108,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
                     map(Entity::getKey).collect(Collectors.toSet()));
         }
 
-        List<String> realmKeyArgs = getRealmKeySqlArgsAndFillParameters(parameters, realmKeys);
-
-        StringBuilder adminRealmFilter = new StringBuilder("u.any_id IN (").
-                append("SELECT any_id FROM ").append(svs.field().name)
-                .append(" WHERE realm_id IN (")
-                .append(StringUtils.join(realmKeyArgs, ", "))
-                .append("))");
-        return Pair.of(adminRealmFilter.toString(), dynRealmKeys);
-    }
-
-    private List<String> getRealmKeySqlArgsAndFillParameters(List<Object> parameters, Set<String> realmKeys) {
-        List<String> realmKeyArgs = new ArrayList<>();
-        for (String realmKey : realmKeys) {
-            realmKeyArgs.add("?" + setParameter(parameters, realmKey));
-        }
-        return realmKeyArgs;
+        return Pair.of(buildAdminRealmsFilter(realmKeys, svs, parameters), dynRealmKeys);
     }
 
     SearchSupport buildSearchSupport(final AnyTypeKind kind) {


[syncope] 01/02: [SYNCOPE-1502]: find anytos in single query

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit 92b8519b44e7bf76ea69eb3b38b35b8c28c3b550
Author: Dmitriy Brashevets <dm...@united-security-providers.ch>
AuthorDate: Wed Oct 9 12:25:39 2019 +0300

    [SYNCOPE-1502]: find anytos in single query
    
    - AnyTO objects are searched by keys retrieved from the search view using a single SQL query that contains IN condition
    - replacement of multiple OR-realm condition in the resulted SQL query that is executed to search entities in search views with IN clause.
---
 .../syncope/core/persistence/api/dao/AnyDAO.java   |  2 +
 .../core/persistence/jpa/dao/AbstractAnyDAO.java   | 12 ++++++
 .../persistence/jpa/dao/AbstractAnySearchDAO.java  | 45 +++++++++++++---------
 .../core/persistence/jpa/dao/JPAAnySearchDAO.java  | 26 ++++++-------
 4 files changed, 52 insertions(+), 33 deletions(-)

diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
index 787f1cb..fb888eb 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
@@ -37,6 +37,8 @@ public interface AnyDAO<A extends Any<?>> extends DAO<A> {
 
     String findKey(String name);
 
+    List<A> findByKeys(List<String> keys);
+
     Date findLastChange(String key);
 
     A authFind(String key);
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
index c8f9dbe..fd3da0c 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
@@ -31,6 +31,8 @@ import java.util.Set;
 import java.util.regex.Pattern;
 import javax.persistence.Query;
 import javax.persistence.TemporalType;
+import javax.persistence.TypedQuery;
+
 import org.apache.commons.jexl3.parser.Parser;
 import org.apache.commons.jexl3.parser.ParserConstants;
 import org.apache.commons.jexl3.parser.Token;
@@ -152,6 +154,16 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
 
     @Transactional(readOnly = true)
     @Override
+    public List<A> findByKeys(List<String> keys) {
+        Class<A> entityClass = anyUtils().anyClass();
+        TypedQuery<A> query = entityManager()
+                .createQuery("SELECT e FROM " + entityClass.getSimpleName() + " e WHERE e.id IN (:keys)", entityClass);
+        query.setParameter("keys", keys);
+        return query.getResultList();
+    }
+
+    @Transactional(readOnly = true)
+    @Override
     public A authFind(final String key) {
         if (key == null) {
             throw new NotFoundException("Null key");
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
index 04edad7..d1677e1 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
@@ -21,8 +21,10 @@ package org.apache.syncope.core.persistence.jpa.dao;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
-import java.util.List;
 import java.util.Optional;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 import javax.validation.ValidationException;
@@ -298,26 +300,31 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
     }
 
     protected <T extends Any<?>> List<T> buildResult(final List<Object> raw, final AnyTypeKind kind) {
-        List<T> result = new ArrayList<>();
+        List<String> orderedAnyKeys = extractSortedAnyKeys(raw);
+        return constructSortedAnyTOsBySortedKeys(findAnyTOs(kind, orderedAnyKeys), orderedAnyKeys, kind);
+    }
 
-        raw.stream().map(anyKey -> anyKey instanceof Object[]
+    private List<String> extractSortedAnyKeys(List<Object> raw) {
+        return raw.stream().map(anyKey -> anyKey instanceof Object[]
                 ? (String) ((Object[]) anyKey)[0]
-                : ((String) anyKey)).
-                forEachOrdered(actualKey -> {
-                    @SuppressWarnings("unchecked")
-                    T any = kind == AnyTypeKind.USER
-                            ? (T) userDAO.find(actualKey)
-                            : kind == AnyTypeKind.GROUP
-                                    ? (T) groupDAO.find(actualKey)
-                                    : (T) anyObjectDAO.find(actualKey);
-                    if (any == null) {
-                        LOG.error("Could not find {} with id {}, even if returned by native query", kind, actualKey);
-                    } else if (!result.contains(any)) {
-                        result.add(any);
-                    }
-                });
-
-        return result;
+                : ((String) anyKey))
+                .collect(Collectors.toList());
+    }
+
+    @SuppressWarnings("unchecked")
+    private <T extends Any<?>> List<T> findAnyTOs(AnyTypeKind kind, List<String> orderedAnyKeys) {
+        return new ArrayList<>((List<T>) anyUtilsFactory.getInstance(kind).dao().findByKeys(orderedAnyKeys));
+    }
+
+    private <T extends Any<?>> List<T> constructSortedAnyTOsBySortedKeys(List<T> anyTOs,
+            List<String> sortedAnyKeys, AnyTypeKind kind) {
+        Map<String, T> anyMap = anyTOs.stream().collect(Collectors.toMap(T::getKey, anyTO -> anyTO));
+        return sortedAnyKeys.stream().map(key -> {
+            if (anyMap.get(key) == null) {
+                LOG.error("Could not find {} with id {}, even if returned by native query", kind, key);
+            }
+            return anyMap.get(key);
+        }).filter(Objects::nonNull).collect(Collectors.toList());
     }
 
     @Override
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
index 6df44fb..e3644aa 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
@@ -96,24 +96,22 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
                     map(Entity::getKey).collect(Collectors.toSet()));
         }
 
+        List<String> realmKeyArgs = getRealmKeySqlArgsAndFillParameters(parameters, realmKeys);
+
         StringBuilder adminRealmFilter = new StringBuilder("u.any_id IN (").
-                append("SELECT any_id FROM ").append(svs.field().name).
-                append(" WHERE realm_id IN (SELECT id AS realm_id FROM Realm");
+                append("SELECT any_id FROM ").append(svs.field().name)
+                .append(" WHERE realm_id IN (")
+                .append(StringUtils.join(realmKeyArgs, ", "))
+                .append("))");
+        return Pair.of(adminRealmFilter.toString(), dynRealmKeys);
+    }
 
-        boolean firstRealm = true;
+    private List<String> getRealmKeySqlArgsAndFillParameters(List<Object> parameters, Set<String> realmKeys) {
+        List<String> realmKeyArgs = new ArrayList<>();
         for (String realmKey : realmKeys) {
-            if (firstRealm) {
-                adminRealmFilter.append(" WHERE");
-                firstRealm = false;
-            } else {
-                adminRealmFilter.append(" OR");
-            }
-            adminRealmFilter.append(" id=?").append(setParameter(parameters, realmKey));
+            realmKeyArgs.add("?" + setParameter(parameters, realmKey));
         }
-
-        adminRealmFilter.append("))");
-
-        return Pair.of(adminRealmFilter.toString(), dynRealmKeys);
+        return realmKeyArgs;
     }
 
     SearchSupport buildSearchSupport(final AnyTypeKind kind) {