Remove 32K limit from queries with collection parameters
[cps.git] / cps-ri / src / main / java / org / onap / cps / spi / repository / FragmentRepository.java
index d486a39..d25832b 100755 (executable)
@@ -37,8 +37,7 @@ import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;\r
 \r
 @Repository\r
-public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>, FragmentRepositoryCpsPathQuery,\r
-        FragmentNativeRepository {\r
+public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>, FragmentRepositoryCpsPathQuery {\r
 \r
     Optional<FragmentEntity> findByAnchorAndXpath(AnchorEntity anchorEntity, String xpath);\r
 \r
@@ -52,13 +51,39 @@ public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>,
     @Query("SELECT f FROM FragmentEntity f WHERE anchor = :anchor")\r
     List<FragmentExtract> findAllExtractsByAnchor(@Param("anchor") AnchorEntity anchorEntity);\r
 \r
-    List<FragmentEntity> findAllByAnchorAndXpathIn(AnchorEntity anchorEntity, Collection<String> xpath);\r
+    @Query(value = "SELECT * FROM fragment WHERE xpath = ANY (:xpaths)", nativeQuery = true)\r
+    List<FragmentEntity> findAllByXpathIn(@Param("xpaths") String[] xpath);\r
 \r
-    List<FragmentEntity> findAllByXpathIn(Collection<String> xpath);\r
+    default List<FragmentEntity> findAllByXpathIn(final Collection<String> xpaths) {\r
+        return findAllByXpathIn(xpaths.toArray(new String[0]));\r
+    }\r
+\r
+    @Modifying\r
+    @Query(value = "DELETE FROM fragment WHERE anchor_id = ANY (:anchorIds)", nativeQuery = true)\r
+    void deleteByAnchorIdIn(@Param("anchorIds") int[] anchorIds);\r
+\r
+    default void deleteByAnchorIn(final Collection<AnchorEntity> anchorEntities) {\r
+        deleteByAnchorIdIn(anchorEntities.stream().map(AnchorEntity::getId).mapToInt(id -> id).toArray());\r
+    }\r
 \r
     @Modifying\r
-    @Query("DELETE FROM FragmentEntity WHERE anchor IN (:anchors)")\r
-    void deleteByAnchorIn(@Param("anchors") Collection<AnchorEntity> anchorEntities);\r
+    @Query(value = "DELETE FROM fragment WHERE anchor_id = :anchorId AND xpath = ANY (:xpaths)", nativeQuery = true)\r
+    void deleteByAnchorIdAndXpaths(@Param("anchorId") int anchorId, @Param("xpaths") String[] xpaths);\r
+\r
+    default void deleteByAnchorIdAndXpaths(final int anchorId, final Collection<String> xpaths) {\r
+        deleteByAnchorIdAndXpaths(anchorId, xpaths.toArray(new String[0]));\r
+    }\r
+\r
+    @Modifying\r
+    @Query(value = "DELETE FROM fragment f WHERE anchor_id = :anchorId AND xpath LIKE ANY (:xpathPatterns)",\r
+        nativeQuery = true)\r
+    void deleteByAnchorIdAndXpathLikeAny(@Param("anchorId") int anchorId,\r
+                                         @Param("xpathPatterns") String[] xpathPatterns);\r
+\r
+    default void deleteListsByAnchorIdAndXpaths(int anchorId, Collection<String> xpaths) {\r
+        final String[] listXpathPatterns = xpaths.stream().map(xpath -> xpath + "[%").toArray(String[]::new);\r
+        deleteByAnchorIdAndXpathLikeAny(anchorId, listXpathPatterns);\r
+    }\r
 \r
     @Query("SELECT f FROM FragmentEntity f WHERE anchor = :anchor"\r
         + " AND (xpath = :parentXpath OR xpath LIKE CONCAT(:parentXpath,'/%'))")\r
@@ -80,9 +105,15 @@ public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>,
     List<FragmentExtract> quickFindWithDescendants(@Param("anchorId") int anchorId,\r
                                                    @Param("xpathRegex") String xpathRegex);\r
 \r
-    @Query("SELECT xpath FROM FragmentEntity WHERE anchor = :anchor AND xpath IN :xpaths")\r
-    List<String> findAllXpathByAnchorAndXpathIn(@Param("anchor") AnchorEntity anchorEntity,\r
-                                                @Param("xpaths") Collection<String> xpaths);\r
+    @Query(value = "SELECT xpath FROM fragment WHERE anchor_id = :anchorId AND xpath = ANY (:xpaths)",\r
+        nativeQuery = true)\r
+    List<String> findAllXpathByAnchorIdAndXpathIn(@Param("anchorId") int anchorId,\r
+                                                  @Param("xpaths") String[] xpaths);\r
+\r
+    default List<String> findAllXpathByAnchorAndXpathIn(final AnchorEntity anchorEntity,\r
+                                                        final Collection<String> xpaths) {\r
+        return findAllXpathByAnchorIdAndXpathIn(anchorEntity.getId(), xpaths.toArray(new String[0]));\r
+    }\r
 \r
     boolean existsByAnchorAndXpathStartsWith(AnchorEntity anchorEntity, String xpath);\r
 \r
@@ -93,7 +124,7 @@ public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>,
         = "WITH RECURSIVE parent_search AS ("\r
         + "  SELECT id, 0 AS depth "\r
         + "    FROM fragment "\r
-        + "   WHERE anchor_id = :anchorId AND xpath IN :xpaths "\r
+        + "   WHERE anchor_id = :anchorId AND xpath = ANY (:xpaths) "\r
         + "   UNION "\r
         + "  SELECT c.id, depth + 1 "\r
         + "    FROM fragment c INNER JOIN parent_search p ON c.parent_id = p.id"\r
@@ -104,9 +135,14 @@ public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>,
         nativeQuery = true\r
     )\r
     List<FragmentExtract> findExtractsWithDescendants(@Param("anchorId") int anchorId,\r
-                                                      @Param("xpaths") Collection<String> xpaths,\r
+                                                      @Param("xpaths") String[] xpaths,\r
                                                       @Param("maxDepth") int maxDepth);\r
 \r
+    default List<FragmentExtract> findExtractsWithDescendants(final int anchorId, final Collection<String> xpaths,\r
+                                                              final int maxDepth) {\r
+        return findExtractsWithDescendants(anchorId, xpaths.toArray(new String[0]), maxDepth);\r
+    }\r
+\r
     @Query(value = "SELECT id, anchor_id AS anchorId, xpath, parent_id AS parentId,"\r
             + " CAST(attributes AS TEXT) AS attributes"\r
             + " FROM FRAGMENT WHERE xpath ~ :xpathRegex",\r