Versions Compared

Key

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

...

parameter namein isRequired
dataspace-namepathyes
cps-pathqueryyes

response :

we can have below responses 

scenarioresponse bodyDecision 
without anchor name
[
{
 

...

"test:bookstore":

...

{
 

...

 

...

"bookstore-name":

...

"Chapters",
 

...

 

...

"categories":

...

[
 

...

 

...

 

...

{
 

...

 

...

 

...

 

...

"code":

...

1,
 

...

 

...

 

...

 

...

"name":

...

"SciFi"
 

...

 

...

 

...

},
 

...

 

...

 

...

{
 

...

 

...

 

...

 

...

"code":

...

2,
 

...

 

...

 

...

 

...

"name":

...

"kids"
 

...

 

...

 

...

}
 

...

 

...

]
 

...

}
},
{
  "test:bookstore2":

...

{
 

...

 

...

"bookstore-name":

...

"Chapters2",
 

...

 

...

"categories":

...

[
 

...

 

...

 

...

{
 

...

 

...

 

...

 

...

"code":

...

10,
 

...

 

...

 

...

 

...

"name":

...

"SciFi"
      },
      {
        "code": 20,
        "name": "kids"
 

...

 

...

 

...

}
 

...

 

...

]
 

...

}
}
]

...


anchor

...

name

...

per data node[
{
  "test:bookstore": {
    "bookstore-name": "Chapters",
    "categories": [
      {
        "code": 1,
        "name": "SciFi"
      },
      {
        "code": 2,
        "name": "kids"
      }
    ]
  },
  "anchorName": "anchor01"
},
{
  "test:bookstore2": {
    "bookstore-name": "Chapters2",
    "categories": [
      {
        "code": 10,
        "name": "SciFi"
      },
      {
        "code": 20,
        "name": "kids"
      }
    ]
  },
  "anchorName": "anchor02"
}
]

list of data nodes per anchor {
"anchor01": [
{
  "test:bookstore": {
    "bookstore-name": "Chapters",
    "categories": [
      {
        "code": 1,
        "name": "SciFi"
      },
      {
        "code": 2,
        "name": "kids"
      }
    ]
  }
},
{
  "test:bookstore2": {
    "bookstore-name": "Chapters2",
    "categories": [
      {
        "code": 10,
        "name": "SciFi"
      },
      {
        "code": 20,
        "name": "kids"
      }
    ]
  }
}
],
"anchor02": [
{
  "test:bookstore": {
    "bookstore-name": "Chapters",
    "categories": [
      {
        "code": 1,
        "name": "SciFi"
      },
      {
        "code": 2,
        "name": "kids"
      }
    ]
  }
},
{
  "test:bookstore2": {
    "bookstore-name": "Chapters2",
    "categories": [
      {
        "code": 10,
        "name": "SciFi"
      },
      {
        "code": 20,
        "name": "kids"
      }
    ]
  }
}
]
}



code changes as below:
file
openapi.yml

add new endpoint:

/v2/dataspaces/{dataspace-name}/nodes/query:
$ref: 'cpsQueryV2.yml#/nodesByDataspaceAndCpsPath'
cpsQueryV2.yml
nodesByDataspaceAndCpsPath:
get:
description: Query data nodes for all anchors of a given dataspace using CPS path
tags:
- cps-query
summary: Query data nodes across all anchors
operationId: getNodesByDataspaceAndCpsPath
parameters:
- $ref: 'components.yml#/components/parameters/dataspaceNameInPath'
- $ref: 'components.yml#/components/parameters/cpsPathInQuery'
- $ref: 'components.yml#/components/parameters/descendantsInQuery'
responses:
'200':
description: OK
content:
application/json:
schema:
type: array
examples:
dataSample:
$ref: 'components.yml#/components/examples/dataSample'
'400':
$ref: 'components.yml#/components/responses/BadRequest'
'401':
$ref: 'components.yml#/components/responses/Unauthorized'
'403':
$ref: 'components.yml#/components/responses/Forbidden'
'500':
$ref: 'components.yml#/components/responses/InternalServerError'
x-codegen-request-body-name: xpath
FragmentRepositoryCpsPathQueryImpl.java
@Override
@Transactional
public List<FragmentEntity> findByCpsPath(final CpsPathQuery cpsPathQuery) {
final StringBuilder sqlStringBuilder = new StringBuilder("SELECT * FROM FRAGMENT");
final Map<String, Object> queryParameters = new HashMap<>();
sqlStringBuilder.append(" WHERE xpath ~ :xpathRegex");
final String xpathRegex = getXpathSqlRegex(cpsPathQuery);
queryParameters.put("xpathRegex", xpathRegex);
if (cpsPathQuery.hasLeafConditions()) {
sqlStringBuilder.append(" AND attributes @> :leafDataAsJson\\:\\:jsonb");
queryParameters.put("leafDataAsJson", jsonObjectMapper.asJsonString(
cpsPathQuery.getLeavesData()));
}

addTextFunctionCondition(cpsPathQuery, sqlStringBuilder, queryParameters);
final Query query = entityManager.createNativeQuery(sqlStringBuilder.toString(), FragmentEntity.class);
setQueryParameters(query, queryParameters);
final List<FragmentEntity> fragmentEntities = query.getResultList();
log.debug("Fetched {} fragment entities by anchor and cps path.", fragmentEntities.size());
return fragmentEntities;
}


...