Update mergeEntityAssociations logic

- The intent behind this commit is to update the logic of
  the mergeEntityAssociations method.

- When we extract PDRs data to vector<entities>, according to
  DSP0248_1.2.0 Table 94, the first element in vector is
  `Container Entity`, and the others are `Contained Entity`.
  Therefore, for Contained Entity, their parent must be the first
  element(Container Entity), which does not need to be obtained from
  the getParent method, and only the first element Container Entity
  needs to be obtained from the getParent method(hosts-fru.json).

  This commit is dependant on the libpldm changes:
  https://gerrit.openbmc.org/c/openbmc/libpldm/+/60584

Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: I117a4fc465c8daabd72d5826fef788a03900e975
diff --git a/host-bmc/host_pdr_handler.cpp b/host-bmc/host_pdr_handler.cpp
index bcd3928..9409b30 100644
--- a/host-bmc/host_pdr_handler.cpp
+++ b/host-bmc/host_pdr_handler.cpp
@@ -55,6 +55,7 @@
     stateSensorHandler(eventsJsonsDir), entityTree(entityTree),
     bmcEntityTree(bmcEntityTree), instanceIdDb(instanceIdDb), handler(handler)
 {
+    mergedHostParents = false;
     fs::path hostFruJson(fs::path(HOST_JSONS_DIR) / fruJson);
     if (fs::exists(hostFruJson))
     {
@@ -115,6 +116,7 @@
                                                        entityTree);
                 this->sensorMap.clear();
                 this->responseReceived = false;
+                this->mergedHostParents = false;
             }
         }
         });
@@ -203,18 +205,6 @@
     }
     return PLDM_SUCCESS;
 }
-bool HostPDRHandler::getParent(EntityType type, pldm_entity& parent)
-{
-    auto found = parents.find(type);
-    if (found != parents.end())
-    {
-        parent.entity_type = found->second.entity_type;
-        parent.entity_instance_num = found->second.entity_instance_num;
-        return true;
-    }
-
-    return false;
-}
 
 void HostPDRHandler::mergeEntityAssociations(const std::vector<uint8_t>& pdr)
 {
@@ -226,21 +216,33 @@
 
     pldm_entity_association_pdr_extract(pdr.data(), pdr.size(), &numEntities,
                                         &entities);
-    for (size_t i = 0; i < numEntities; ++i)
+    if (numEntities > 0)
     {
-        pldm_entity parent{};
-        if (getParent(entities[i].entity_type, parent))
+        pldm_entity_node* pNode = nullptr;
+        if (!mergedHostParents)
         {
-            auto node = pldm_entity_association_tree_find_with_locality(
-                entityTree, &parent, true);
-            if (node)
-            {
-                pldm_entity_association_tree_add_entity(
-                    entityTree, &entities[i], 0xFFFF, node,
-                    entityPdr->association_type, false, true, 0xFFFF);
-                merged = true;
-            }
+            pNode = pldm_entity_association_tree_find_with_locality(
+                entityTree, &entities[0], false);
         }
+        else
+        {
+            pNode = pldm_entity_association_tree_find_with_locality(
+                entityTree, &entities[0], true);
+        }
+        if (!pNode)
+        {
+            return;
+        }
+
+        for (size_t i = 1; i < numEntities; ++i)
+        {
+            pldm_entity_association_tree_add_entity(
+                entityTree, &entities[i], entities[i].entity_instance_num,
+                pNode, entityPdr->association_type, true, true, 0xFFFF);
+            merged = true;
+        }
+
+        mergedHostParents = true;
     }
 
     if (merged)