You are viewing an old version of this page. View the current version.
Compare with Current
View Page History
« Previous
Version 9
Next »
Requirement :
we need to search over data across multiple anchors for a given dataspace. for this requirement below changes are proposed
New endpoint : GET http://localhost:8883/cps/api/v2/dataspaces/{dataspace-name}/nodes/query
parameters:
parameter name | in | isRequired |
---|
dataspace-name | path | yes |
cps-path | query | yes |
response :
we can have below responses
scenario | response body | Decision |
---|
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; } |
|
|