+ Optional<FragmentEntity> findByDataspaceAndAnchorAndXpath(@NonNull DataspaceEntity dataspaceEntity,\r
+ @NonNull AnchorEntity anchorEntity,\r
+ @NonNull String xpath);\r
+\r
+ default FragmentEntity getByDataspaceAndAnchorAndXpath(@NonNull DataspaceEntity dataspaceEntity,\r
+ @NonNull AnchorEntity anchorEntity,\r
+ @NonNull String xpath) {\r
+ return findByDataspaceAndAnchorAndXpath(dataspaceEntity, anchorEntity, xpath)\r
+ .orElseThrow(() -> new DataNodeNotFoundException(dataspaceEntity.getName(), anchorEntity.getName(), xpath));\r
+ }\r
+\r
+ @Query(\r
+ value = "SELECT * FROM FRAGMENT WHERE anchor_id = :anchor AND dataspace_id = :dataspace AND parent_id is NULL",\r
+ nativeQuery = true)\r
+ List<FragmentEntity> findRootsByDataspaceAndAnchor(@Param("dataspace") int dataspaceId,\r
+ @Param("anchor") int anchorId);\r
+\r
+ default FragmentEntity findFirstRootByDataspaceAndAnchor(@NonNull DataspaceEntity dataspaceEntity,\r
+ @NonNull AnchorEntity anchorEntity) {\r
+ return findRootsByDataspaceAndAnchor(dataspaceEntity.getId(), anchorEntity.getId()).stream().findFirst()\r
+ .orElseThrow(() -> new DataNodeNotFoundException(dataspaceEntity.getName(), anchorEntity.getName()));\r
+ }\r
+\r
+ List<FragmentEntity> findAllByAnchorAndXpathIn(@NonNull AnchorEntity anchorEntity,\r
+ @NonNull Collection<String> xpath);\r
+\r
+ @Modifying\r
+ @Query("DELETE FROM FragmentEntity fe WHERE fe.anchor IN (:anchors)")\r
+ void deleteByAnchorIn(@NotNull @Param("anchors") Collection<AnchorEntity> anchorEntities);\r
+}\r