Revert "Migrate CPS to Spring-boot 3.0"
[cps.git] / cps-ri / src / main / java / org / onap / cps / spi / repository / FragmentRepository.java
index 82c422f..e38fc2f 100755 (executable)
@@ -29,8 +29,8 @@ import java.util.Optional;
 import org.onap.cps.spi.entities.AnchorEntity;\r
 import org.onap.cps.spi.entities.DataspaceEntity;\r
 import org.onap.cps.spi.entities.FragmentEntity;\r
-import org.onap.cps.spi.entities.FragmentExtract;\r
 import org.onap.cps.spi.exceptions.DataNodeNotFoundException;\r
+import org.onap.cps.spi.utils.EscapeUtils;\r
 import org.springframework.data.jpa.repository.JpaRepository;\r
 import org.springframework.data.jpa.repository.Modifying;\r
 import org.springframework.data.jpa.repository.Query;\r
@@ -38,7 +38,8 @@ 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
+public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>, FragmentRepositoryCpsPathQuery,\r
+        FragmentPrefetchRepository {\r
 \r
     Optional<FragmentEntity> findByAnchorAndXpath(AnchorEntity anchorEntity, String xpath);\r
 \r
@@ -47,13 +48,27 @@ public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>,
             new DataNodeNotFoundException(anchorEntity.getDataspace().getName(), anchorEntity.getName(), xpath));\r
     }\r
 \r
-    List<FragmentEntity> findByAnchorIdAndXpathIn(long anchorId, String[] xpaths);\r
+    @Query(value = "SELECT * FROM fragment WHERE anchor_id = :anchorId AND xpath = ANY (:xpaths)",\r
+            nativeQuery = true)\r
+    List<FragmentEntity> findByAnchorIdAndXpathIn(@Param("anchorId") long anchorId,\r
+                                                  @Param("xpaths") String[] xpaths);\r
 \r
     default List<FragmentEntity> findByAnchorAndXpathIn(final AnchorEntity anchorEntity,\r
                                                         final Collection<String> xpaths) {\r
         return findByAnchorIdAndXpathIn(anchorEntity.getId(), xpaths.toArray(new String[0]));\r
     }\r
 \r
+    @Query(value = "SELECT * FROM fragment WHERE anchor_id = :anchorId \n"\r
+            + "AND xpath LIKE :escapedXpath||'[@%]' AND xpath NOT LIKE :escapedXpath||'[@%]/%[@%]'",\r
+            nativeQuery = true)\r
+    List<FragmentEntity> findListByAnchorIdAndEscapedXpath(@Param("anchorId") long anchorId,\r
+                                                           @Param("escapedXpath") String escapedXpath);\r
+\r
+    default List<FragmentEntity> findListByAnchorAndXpath(final AnchorEntity anchorEntity, final String xpath) {\r
+        final String escapedXpath = EscapeUtils.escapeForSqlLike(xpath);\r
+        return findListByAnchorIdAndEscapedXpath(anchorEntity.getId(), escapedXpath);\r
+    }\r
+\r
     @Query(value = "SELECT fragment.* FROM fragment JOIN anchor ON anchor.id = fragment.anchor_id "\r
         + "WHERE dataspace_id = :dataspaceId AND xpath = ANY (:xpaths)", nativeQuery = true)\r
     List<FragmentEntity> findByDataspaceIdAndXpathIn(@Param("dataspaceId") int dataspaceId,\r
@@ -64,10 +79,13 @@ public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>,
         return findByDataspaceIdAndXpathIn(dataspaceEntity.getId(), xpaths.toArray(new String[0]));\r
     }\r
 \r
-    boolean existsByAnchorId(long anchorId);\r
+    @Query(value = "SELECT * FROM fragment WHERE anchor_id IN (:anchorIds)"\r
+            + " AND xpath = ANY (:xpaths)", nativeQuery = true)\r
+    List<FragmentEntity> findByAnchorIdsAndXpathIn(@Param("anchorIds") Long[] anchorIds,\r
+                                                   @Param("xpaths") String[] xpaths);\r
 \r
-    @Query("SELECT f FROM FragmentEntity f WHERE anchor = :anchor")\r
-    List<FragmentExtract> findAllExtractsByAnchor(@Param("anchor") AnchorEntity anchorEntity);\r
+    @Query(value = "SELECT * FROM fragment WHERE anchor_id = :anchorId LIMIT 1", nativeQuery = true)\r
+    Optional<FragmentEntity> findOneByAnchorId(@Param("anchorId") long anchorId);\r
 \r
     @Modifying\r
     @Query(value = "DELETE FROM fragment WHERE anchor_id = ANY (:anchorIds)", nativeQuery = true)\r
@@ -92,8 +110,8 @@ public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>,
                                          @Param("xpathPatterns") String[] xpathPatterns);\r
 \r
     default void deleteListsByAnchorIdAndXpaths(long anchorId, Collection<String> xpaths) {\r
-        final String[] listXpathPatterns = xpaths.stream().map(xpath -> xpath + "[%").toArray(String[]::new);\r
-        deleteByAnchorIdAndXpathLikeAny(anchorId, listXpathPatterns);\r
+        deleteByAnchorIdAndXpathLikeAny(anchorId,\r
+                xpaths.stream().map(xpath -> EscapeUtils.escapeForSqlLike(xpath) + "[@%").toArray(String[]::new));\r
     }\r
 \r
     @Query(value = "SELECT xpath FROM fragment WHERE anchor_id = :anchorId AND xpath = ANY (:xpaths)",\r
@@ -108,51 +126,7 @@ public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>,
 \r
     boolean existsByAnchorAndXpathStartsWith(AnchorEntity anchorEntity, String xpath);\r
 \r
-    @Query("SELECT xpath FROM FragmentEntity WHERE anchor = :anchor AND parentId IS NULL")\r
-    List<String> findAllXpathByAnchorAndParentIdIsNull(@Param("anchor") AnchorEntity anchorEntity);\r
-\r
-    @Query(value\r
-        = "WITH RECURSIVE parent_search AS ("\r
-        + "  SELECT id, 0 AS depth "\r
-        + "    FROM fragment "\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
-        + "   WHERE depth < (SELECT CASE WHEN :maxDepth = -1 THEN " + Integer.MAX_VALUE + " ELSE :maxDepth END) "\r
-        + ") "\r
-        + "SELECT f.id, anchor_id AS anchorId, xpath, f.parent_id AS parentId, CAST(attributes AS TEXT) AS attributes "\r
-        + "FROM fragment f INNER JOIN parent_search p ON f.id = p.id",\r
-        nativeQuery = true\r
-    )\r
-    List<FragmentExtract> findExtractsWithDescendants(@Param("anchorId") long anchorId,\r
-                                                      @Param("xpaths") String[] xpaths,\r
-                                                      @Param("maxDepth") int maxDepth);\r
-\r
-    default List<FragmentExtract> findExtractsWithDescendants(final long anchorId, final Collection<String> xpaths,\r
-                                                              final int maxDepth) {\r
-        return findExtractsWithDescendants(anchorId, xpaths.toArray(new String[0]), maxDepth);\r
-    }\r
-\r
-    @Query(value\r
-        = "WITH RECURSIVE parent_search AS ("\r
-        + "  SELECT id, 0 AS depth "\r
-        + "    FROM fragment "\r
-        + "   WHERE id = ANY (:ids) "\r
-        + "   UNION "\r
-        + "  SELECT c.id, depth + 1 "\r
-        + "    FROM fragment c INNER JOIN parent_search p ON c.parent_id = p.id"\r
-        + "   WHERE depth < (SELECT CASE WHEN :maxDepth = -1 THEN " + Integer.MAX_VALUE + " ELSE :maxDepth END) "\r
-        + ") "\r
-        + "SELECT f.id, anchor_id AS anchorId, xpath, f.parent_id AS parentId, CAST(attributes AS TEXT) AS attributes "\r
-        + "FROM fragment f INNER JOIN parent_search p ON f.id = p.id",\r
-        nativeQuery = true\r
-    )\r
-    List<FragmentExtract> findExtractsWithDescendantsByIds(@Param("ids") long[] ids,\r
-                                                           @Param("maxDepth") int maxDepth);\r
-\r
-    default List<FragmentExtract> findExtractsWithDescendantsByIds(final Collection<Long> ids, final int maxDepth) {\r
-        return findExtractsWithDescendantsByIds(ids.stream().mapToLong(id -> id).toArray(), maxDepth);\r
-    }\r
+    @Query(value = "SELECT * FROM fragment WHERE anchor_id = :anchorId AND parent_id IS NULL", nativeQuery = true)\r
+    List<FragmentEntity> findRootsByAnchorId(@Param("anchorId") long anchorId);\r
 \r
 }\r