Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

'depth' query parameter added in below URLsNotesDecision
URL: http://<IP:PORT>/v1/dataspaces/{dataspace-name}/anchors/{anchor-name}/node?xpath=/&include-descendants=true&depth=1
  1. depth is an optional query parameter or mandatory 
  2. how to handle include-descendants query parameter? can we remove this parameter and use only depth parameter.  depth = -1 is same as include-descendants= true 
  3. depth values treated as below
    1. -1 : all descendants 
    2. 0 : no descendants
    3. 1, 2, 3, ... : number or descendants  

URL: http://<IP:PORT>/v1/dataspaces/{dataspace-name}/anchors/{anchor-name}/nodes/query?cps-path=/&include-descendents=true&depth=1





Implementations: 


changes files changes/notesDecision
cpsData.yml
nodeByDataspaceAndAnchor:
get:
...
      - $ref: 'components.yml#/components/parameters/depthInQuery'
...

cpsQuery.yml
nodesByDataspaceAndAnchorAndCpsPath:
get:
...
- $ref: 'components.yml#/components/parameters/depthInQuery'
...

components.yml
depthInQuery:
name: depth
in: query
description: depth parameter for large query outputs
required: false
schema:
type: string
default: all
example: 1

FetchDescendantsOption.java

We Need to change this class to accept for any other depth values except -1, 0 and 1.  

Do we need to change FetchDescendantsOption to support multiple depths or add depth as separate argument along

with FetchDescendantsOption

CpsDataPersistenceServiceImpl.java
change in "queryDataNodes" method 

FragmentRepository.java
@Query(value = "SELECT id, anchor_id AS anchorId, xpath, parent_id AS parentId,"
+ " CAST(attributes AS TEXT) AS attributes"
+ " FROM FRAGMENT WHERE anchor_id = :anchorId"
+ " AND ( xpath = :parentXpath OR xpath LIKE CONCAT(:parentXpath,'/%') )",
nativeQuery = true)
List<FragmentExtract> findByAnchorIdAndParentXpath(@Param("anchorId") int anchorId,
@Param("parentXpath") String parentXpath,
@Param("depth") Integer depth);
we need to change query to support depth or we can query all fragments and then select fragment data till given depth value(in below code). 
FragmentEntityArranger.java
private static FragmentEntity reuniteChildrenWithTheirParents(final Map<Long, 
FragmentEntity> fragmentEntityPerId, Integer depth) {
final Collection<FragmentEntity> fragmentEntitiesWithoutParentInResultSet = new HashSet<>();
for (final FragmentEntity fragmentEntity : fragmentEntityPerId.values()) {
final FragmentEntity parentFragmentEntity = fragmentEntityPerId.get(fragmentEntity.getParentId());
if (parentFragmentEntity == null) {
fragmentEntitiesWithoutParentInResultSet.add(fragmentEntity);
} else {
parentFragmentEntity.getChildFragments().add(fragmentEntity);
}
}
return fragmentEntitiesWithoutParentInResultSet.stream().findFirst().orElse(null);
}
we can reunite children as per given depth value.