Fix for recursive SQL returning extra level of descendants
[cps.git] / cps-ri / src / main / java / org / onap / cps / spi / repository / FragmentRepository.java
index a276318..82c422f 100755 (executable)
@@ -47,55 +47,58 @@ public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>,
             new DataNodeNotFoundException(anchorEntity.getDataspace().getName(), anchorEntity.getName(), xpath));\r
     }\r
 \r
-    List<FragmentEntity> findByAnchorIdAndXpathIn(int anchorId, String[] xpaths);\r
+    List<FragmentEntity> findByAnchorIdAndXpathIn(long anchorId, 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
-    List<FragmentEntity> findByDataspaceIdAndXpathIn(int dataspaceId, String[] xpaths);\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
+                                                     @Param("xpaths") String[] xpaths);\r
 \r
     default List<FragmentEntity> findByDataspaceAndXpathIn(final DataspaceEntity dataspaceEntity,\r
                                                            final Collection<String> xpaths) {\r
         return findByDataspaceIdAndXpathIn(dataspaceEntity.getId(), xpaths.toArray(new String[0]));\r
     }\r
 \r
-    boolean existsByAnchorId(int anchorId);\r
+    boolean existsByAnchorId(long anchorId);\r
 \r
     @Query("SELECT f FROM FragmentEntity f WHERE anchor = :anchor")\r
     List<FragmentExtract> findAllExtractsByAnchor(@Param("anchor") AnchorEntity anchorEntity);\r
 \r
     @Modifying\r
     @Query(value = "DELETE FROM fragment WHERE anchor_id = ANY (:anchorIds)", nativeQuery = true)\r
-    void deleteByAnchorIdIn(@Param("anchorIds") int[] anchorIds);\r
+    void deleteByAnchorIdIn(@Param("anchorIds") long[] anchorIds);\r
 \r
     default void deleteByAnchorIn(final Collection<AnchorEntity> anchorEntities) {\r
-        deleteByAnchorIdIn(anchorEntities.stream().map(AnchorEntity::getId).mapToInt(id -> id).toArray());\r
+        deleteByAnchorIdIn(anchorEntities.stream().map(AnchorEntity::getId).mapToLong(id -> id).toArray());\r
     }\r
 \r
     @Modifying\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
+    void deleteByAnchorIdAndXpaths(@Param("anchorId") long anchorId, @Param("xpaths") String[] xpaths);\r
 \r
-    default void deleteByAnchorIdAndXpaths(final int anchorId, final Collection<String> xpaths) {\r
+    default void deleteByAnchorIdAndXpaths(final long 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
+    void deleteByAnchorIdAndXpathLikeAny(@Param("anchorId") long anchorId,\r
                                          @Param("xpathPatterns") String[] xpathPatterns);\r
 \r
-    default void deleteListsByAnchorIdAndXpaths(int anchorId, Collection<String> xpaths) {\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
     }\r
 \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
+    List<String> findAllXpathByAnchorIdAndXpathIn(@Param("anchorId") long anchorId,\r
                                                   @Param("xpaths") String[] xpaths);\r
 \r
     default List<String> findAllXpathByAnchorAndXpathIn(final AnchorEntity anchorEntity,\r
@@ -116,17 +119,17 @@ public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>,
         + "   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
+        + "   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") int anchorId,\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 int anchorId, final Collection<String> xpaths,\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
@@ -139,7 +142,7 @@ public interface FragmentRepository extends JpaRepository<FragmentEntity, Long>,
         + "   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
+        + "   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