From f05ea41c3345263fdab83a86ac5721f8a6ef8d8d Mon Sep 17 00:00:00 2001
From: ZMai <zmai@slb.com>
Date: Thu, 8 Jun 2023 06:51:58 -0500
Subject: [PATCH] Cache the children's property configurations to avoid
 additonal search

---
 .../PropertyConfigurationsServiceImpl.java       | 16 +++++++---------
 .../PropertyConfigurationsServiceImplTest.java   |  9 ++++-----
 2 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/PropertyConfigurationsServiceImpl.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/PropertyConfigurationsServiceImpl.java
index 4b49a8c04..3f8d892bc 100644
--- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/PropertyConfigurationsServiceImpl.java
+++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/PropertyConfigurationsServiceImpl.java
@@ -775,17 +775,13 @@ public class PropertyConfigurationsServiceImpl implements PropertyConfigurations
             return;
         }
 
-        StringBuilder kindBuilder = new StringBuilder();
+        List<String> multiKinds = new ArrayList<>();
         for(String kind: childrenKinds) {
-            if(kindBuilder.length() > 0) {
-                kindBuilder.append(",");
-            }
-            kindBuilder.append(kind + "*");
+            String kindWithMajor = PropertyUtil.getKindWithMajor(kind) + "*.*";
+            multiKinds.add(kindWithMajor);
         }
-
-        final int limit = configurationProperties.getStorageRecordsByKindBatchSize();
         SearchRequest searchRequest = new SearchRequest();
-        searchRequest.setKind(kindBuilder.toString());
+        searchRequest.setKind(multiKinds);
         searchRequest.setQuery(query);
         searchRequest.setReturnedFields(Arrays.asList("kind", "id", "data." + ASSOCIATED_IDENTITIES_PROPERTY));
         List<RecordInfo> recordInfos = new ArrayList<>();
@@ -804,7 +800,7 @@ public class PropertyConfigurationsServiceImpl implements PropertyConfigurations
                 recordInfo.setOp(OperationType.update.getValue());
                 recordInfos.add(recordInfo);
 
-                if (recordInfos.size() >= limit) {
+                if (recordInfos.size() >= configurationProperties.getStorageRecordsByKindBatchSize()) {
                     createWorkerTask(ancestors, recordInfos);
                     recordInfos = new ArrayList<>();
                 }
@@ -879,6 +875,8 @@ public class PropertyConfigurationsServiceImpl implements PropertyConfigurations
             try {
                 String data = objectMapper.writeValueAsString(searchRecord.getData());
                 PropertyConfigurations configurations = objectMapper.readValue(data, PropertyConfigurations.class);
+                String kind = PropertyUtil.getKindWithMajor(configurations.getCode());
+                propertyConfigurationCache.put(kind, configurations);
                 configurationsList.add(configurations);
             } catch (JsonProcessingException e) {
                 jaxRsDpsLog.error("failed to deserialize PropertyConfigurations object", e);
diff --git a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/PropertyConfigurationsServiceImplTest.java b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/PropertyConfigurationsServiceImplTest.java
index b5783bf56..9a11d7a79 100644
--- a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/PropertyConfigurationsServiceImplTest.java
+++ b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/PropertyConfigurationsServiceImplTest.java
@@ -55,8 +55,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.powermock.api.mockito.PowerMockito.when;
@@ -186,13 +185,13 @@ public class PropertyConfigurationsServiceImplTest {
         searchResponse.setResults(results);
         searchResponse.setTotalCount(results.size());
         when(this.searchService.queryWithCursor(any())).thenReturn(searchResponse);
-
         String kind = "osdu:wks:master-data--Well:1.0.0";
         String code = "osdu:wks:master-data--Well:1.";
         PropertyConfigurations configuration = sut.getPropertyConfigurations(kind);
 
         ArgumentCaptor<PropertyConfigurations> argumentCaptor = ArgumentCaptor.forClass(PropertyConfigurations.class);
-        verify(this.propertyConfigurationCache, times(1)).put(any(), argumentCaptor.capture());
+        // If we mock the implementation of propertyConfigurationCache, it should be called once
+        verify(this.propertyConfigurationCache, times(2)).put(any(), argumentCaptor.capture());
         Assert.assertNotNull(configuration);
         Assert.assertEquals(code, configuration.getCode());
         Assert.assertEquals(code, argumentCaptor.getValue().getCode());
@@ -840,7 +839,7 @@ public class PropertyConfigurationsServiceImplTest {
                     // No result
                 }
             } else {
-                if(searchRequest.getKind().toString().equals("osdu:wks:master-data--Well:1.*")) {
+                if(searchRequest.getKind().toString().contains("osdu:wks:master-data--Well:1.")) {
                     // Return of searchUniqueParentIds(...)
                     SearchRecord searchRecord = new SearchRecord();
                     Map<String, Object> childDataMap = new HashMap<>();
-- 
GitLab