+ @Override
+ public Set<String> queryCmHandleIdsForInventory(
+ final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
+
+ if (cmHandleQueryServiceParameters.getCmHandleQueryParameters().isEmpty()) {
+ return getAllCmHandleIds();
+ }
+
+ final Map<String, NcmpServiceCmHandle> publicPropertiesQueryResult = queryCmHandlesByPublicProperties(
+ cmHandleQueryServiceParameters);
+ if (publicPropertiesQueryResult != null && publicPropertiesQueryResult.isEmpty()) {
+ return Collections.emptySet();
+ }
+
+ final Map<String, NcmpServiceCmHandle> privatePropertiesQueryResult = queryCmHandlesByPrivateProperties(
+ cmHandleQueryServiceParameters);
+ if (privatePropertiesQueryResult != null && privatePropertiesQueryResult.isEmpty()) {
+ return Collections.emptySet();
+ }
+
+ final Map<String, NcmpServiceCmHandle> dmiPropertiesQueryResult = queryCmHandlesByDmiPlugin(
+ cmHandleQueryServiceParameters);
+ if (dmiPropertiesQueryResult != null && dmiPropertiesQueryResult.isEmpty()) {
+ return Collections.emptySet();
+ }
+
+ final Map<String, NcmpServiceCmHandle> combinedResult =
+ combineQueryResults(publicPropertiesQueryResult, privatePropertiesQueryResult, dmiPropertiesQueryResult);
+
+ return combinedResult.keySet();
+ }
+
+ private Map<String, NcmpServiceCmHandle> queryCmHandlesByDmiPlugin(
+ final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
+ final Map<String, String> dmiPropertyQueryPairs =
+ getPropertyPairs(cmHandleQueryServiceParameters.getCmHandleQueryParameters(),
+ InventoryQueryConditions.CM_HANDLE_WITH_DMI_PLUGIN.getName());
+ if (dmiPropertyQueryPairs.isEmpty()) {
+ return NO_QUERY_TO_EXECUTE;
+ }
+
+ final String dmiPluginIdentifierValue = dmiPropertyQueryPairs.get(
+ PropertyType.DMI_PLUGIN.getYangContainerName());
+
+ final Set<NcmpServiceCmHandle> cmHandlesByDmiPluginIdentifier = cmHandleQueries
+ .getCmHandlesByDmiPluginIdentifier(dmiPluginIdentifierValue);
+
+ return cmHandlesByDmiPluginIdentifier.stream()
+ .collect(Collectors.toMap(NcmpServiceCmHandle::getCmHandleId, cmH -> cmH));
+ }
+
+ private Map<String, NcmpServiceCmHandle> queryCmHandlesByPrivateProperties(
+ final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
+
+ final Map<String, String> privatePropertyQueryPairs =
+ getPropertyPairs(cmHandleQueryServiceParameters.getCmHandleQueryParameters(),
+ InventoryQueryConditions.HAS_ALL_ADDITIONAL_PROPERTIES.getName());
+
+ return privatePropertyQueryPairs.isEmpty()
+ ? NO_QUERY_TO_EXECUTE
+ : cmHandleQueries.queryCmHandleAdditionalProperties(privatePropertyQueryPairs);
+ }
+
+ private Map<String, NcmpServiceCmHandle> queryCmHandlesByPublicProperties(
+ final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
+
+ final Map<String, String> publicPropertyQueryPairs =
+ getPropertyPairs(cmHandleQueryServiceParameters.getCmHandleQueryParameters(),
+ CmHandleQueryConditions.HAS_ALL_PROPERTIES.getConditionName());
+
+ return publicPropertyQueryPairs.isEmpty()
+ ? NO_QUERY_TO_EXECUTE
+ : cmHandleQueries.queryCmHandlePublicProperties(publicPropertyQueryPairs);
+ }
+
+ private Map<String, NcmpServiceCmHandle> combineQueryResults(
+ final Map<String, NcmpServiceCmHandle> publicPropertiesQueryResult,
+ final Map<String, NcmpServiceCmHandle> privatePropertiesQueryResult,
+ final Map<String, NcmpServiceCmHandle> dmiPropertiesQueryResult) {
+
+ final Map<String, NcmpServiceCmHandle> propertiesCombinedResult = cmHandleQueries
+ .combineCmHandleQueries(publicPropertiesQueryResult, privatePropertiesQueryResult);
+ return cmHandleQueries
+ .combineCmHandleQueries(propertiesCombinedResult, dmiPropertiesQueryResult);
+ }
+