Versions Compared

Key

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

...

[
{
 






























#scenarioBody StructuresResponse Body Example
1without anchor name

[{data-tree1},..,{data-tree-n}]


Code Block
languagexml
titleExample
collapsetrue



2anchor name per data node


Code Block
languagexml
titleexample
[
{
  "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"

}

]


3list of data nodes per anchor 


Code Block
languagexml
titleexample
collapsetrue
[
{
  
{
"anchor01": [
{
 
"test:bookstore": {


    "bookstore-name": "Chapters",


    "categories": [


      {


        "code": 1,


        "name": "SciFi"


      },


      {


        "code": 2,


        "name": "kids"


      }


    ]


 
}
 },

{

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


    "categories": [


      {


        "code":
1
 10,


        "name": "SciFi"


      },


      {


        "code":
2
 20,


        "name": "kids"


      }


    ]


  }

}
,

{

  "
test:bookstore2
anchorName":
{
    "bookstore-name": "Chapters2",
    "categories": [
      {
        "code": 10,
        "name": "SciFi"
      },
      {
        "code": 20,
        "name": "kids"
      }
    ]
  }
}
]
}
 "anchor02"
}
]


Required Code Changes

file
openapi.yml

add new endpoint:

Code Block
languagejava
titleNew endpoint
/v2/dataspaces/{dataspace-name}/nodes/query:
  $ref: 'cpsQueryV2.yml#/nodesByDataspaceAndCpsPath'

cpsQueryV2.yml


Code Block
languagexml
titlecpsQueryV2.yml
linenumberstrue
collapsetrue
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


Code Block
languagejava
titleFragmentRepositoryCpsPathQueryImpl.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;
}


...