F1 (Java) Story 27 [Indexer]: Implement indexing respecting x-collaboration property
Description
When Indexer receives a message from "Record Changed V2" topic, the message contains x-collaboration property that points on record in a custom NS. The indexing logic for records in custom namespace should be implemented in compliance with the recuirements in the following ADR: ADR - Project & Workflow Services - Core Services Integration - Search Service Support
Acceptance criteria
- a specific indexing logic is implemented for indexing records lying in custom NSs.
Testing scenarios
- all necessary unit tests
- when a indexing a record in a custom NS, it should be indexed with "Collaboration" property set in the indexed document
Technical notes
Key points:
- For the new RecordChangedV2 event the same consumer entry point can be used, as the event body can be extended with new properties without code changes:
curl --location 'https://INDEXER/api/indexer/v2/_dps/task-handlers/index-worker' \
--header 'data-partition-id: osdu' \
--header 'correlation-id: 74c20433-544f-46e3-a215-c059b2ca6810' \
--data '{
"data": "[{\"id\":\"osdu:test-data--Integration:test1\",\"kind\":\"osdu:indexer:test-data--Integration:1.0.0\",\"op\":\"create\"}]",
"attributes": {
"account-id": "osdu",
"x-collaboration": "id={{collab-id}},application={{app-id}}"
}
}'
}
-
We should reuse existing indices from SOR, updating them as needed.
-
When we receive the RecordChangedV2 event we will push it into the index of SOR, with the same kind.
- Thus mappings will have the
collaboration-id
property in themeta
block. - Records from the SOR won't have values for that property
"collaboration-id": null
. - Records from the WIP context will have
"collaboration-id": "12345"
- Thus mappings will have the
-
Later in the Search service SOR and WIP records can be filtered by that property. Exist query, when searching in WIP context:
curl --location 'https://nice-etching-277309-system.es.us-central1.gcp.cloud.es.io:9243/osdu-test-test-search-2.0.0/_search' \
--header 'Housekeeping: yes' \
--header 'Content-Type: application/json' \
--data '{
"query": {
"exists": {
"field": "collaboration-id"
}
}
}'
Does not exist when searching in SOR:
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "collaboration-id"
}
}
}
}
}
- We do not need to update the Indexer
/index-worker
endpoint as it consumes a model that is suitable for RecordChanged V2 event, it has a map of attributes, where collaboration id could be added. - The entry point for updates could be IndexerServiceImpl.
-
RecordInfo does not have properties to hold
collaboration-id
. So here we need to decide whether we will update this model(or create a new one) to pass it further with collaboration-id or construct and injectSpring Bean
into context, produced only ifcollaboration-id
is present. We'll reuse existing methods, so deeper in the call stack we need to have info aboutcollaboration-id
somehow. - Do not forget that functionality should be controlled via Feature Flag, so supplement all respective methods with a flag check.
- The next place for updates is MappingService and it's method
syncIndexMappingIfRequired
. - Somewhere here we can inject
collaboration-id
property into the meta block. - Update ingested record metadata in getSourceMap method, add
collaboration-id
to the record meta.
Changes made for the feature BagOfWords
could be studied as they are somewhat similar. indexer-service!649 (diffs)
Record reindex:
Endpoint to update: https://community.opengroup.org/osdu/platform/system/indexer-service/-/blob/master/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/ReindexApi.java?ref_type=heads#L82
Required changes:
- Make sure that here we are requesting records from the Storage with
collaboration-id
https://community.opengroup.org/osdu/platform/system/indexer-service/-/blob/master/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/ReindexServiceImpl.java#L96 - Update this method to inject
collaboration-id
into a message: https://community.opengroup.org/osdu/platform/system/indexer-service/-/blob/master/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/ReindexServiceImpl.java#L128 - Later task will be forwarded to the
indexer-worker
endpoint, so from that point already implemented code should do the trick: https://community.opengroup.org/osdu/platform/system/indexer-service/-/blob/master/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/ReindexServiceImpl.java#L139 - No need to implement integration tests, as functionality cannot be tested that way as it is expected to have the same records available in Elasticsearch after reindexing.