Subject: [PATCH] optimize assignCategoryInfoAsMetaData instead of loading all category display names in a map, access the category nodes directly to retrieve the display name --- Index: community/taxonomy/addon/frontend/src/main/java/org/onehippo/taxonomy/plugin/api/TaxonomyFieldTypeUtils.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/community/taxonomy/addon/frontend/src/main/java/org/onehippo/taxonomy/plugin/api/TaxonomyFieldTypeUtils.java b/community/taxonomy/addon/frontend/src/main/java/org/onehippo/taxonomy/plugin/api/TaxonomyFieldTypeUtils.java --- a/community/taxonomy/addon/frontend/src/main/java/org/onehippo/taxonomy/plugin/api/TaxonomyFieldTypeUtils.java (revision b9f4d01b9d1011ace7209b238cdef2e798fad7bc) +++ b/community/taxonomy/addon/frontend/src/main/java/org/onehippo/taxonomy/plugin/api/TaxonomyFieldTypeUtils.java (date 1686839152141) @@ -70,21 +70,7 @@ return fieldValues; } - try { - Locale defaultLocale = null; - - if (publishedNode.hasProperty(HIPPOTAXONOMY_DEFAULT_LOCALE)) { - defaultLocale = TaxonomyUtil.toLocale(publishedNode.getProperty(HIPPOTAXONOMY_DEFAULT_LOCALE).getString()); - } - - final Map categoryInfoMap = new HashMap<>(); - // TODO getCategories loads all category info into a map by recursion, but we needs only a few. - // We can optimize by using getCategoryNode() to directly get to the category node - getCategories(publishedNode, locale, defaultLocale, categoryInfoMap, new ArrayList<>()); - assignCategoryInfoAsMetaData(fieldValues, categoryInfoMap); - } catch (final RepositoryException e) { - throw new RuntimeException(e); - } + assignCategoryInfoAsMetaData(publishedNode, fieldValues, locale); return fieldValues; } @@ -154,18 +140,33 @@ return null; } - private static void assignCategoryInfoAsMetaData(final @Nonnull List fieldValues, - final @Nonnull Map categoryInfoMap) { + private static void assignCategoryInfoAsMetaData(final @Nonnull Node publishedTaxonomyNode, + final @Nonnull List fieldValues, + final @Nonnull Locale locale) { + Locale defaultLocale = null; + + try { + if (publishedTaxonomyNode.hasProperty(HIPPOTAXONOMY_DEFAULT_LOCALE)) { + defaultLocale = TaxonomyUtil.toLocale(publishedTaxonomyNode.getProperty(HIPPOTAXONOMY_DEFAULT_LOCALE).getString()); + } - for (final FieldValue fieldValue : fieldValues) { - Map metadata = fieldValue.getMetadata(); + for (final FieldValue fieldValue : fieldValues) { + Map metadata = fieldValue.getMetadata(); - if (metadata == null) { - metadata = new HashMap<>(); - fieldValue.setMetadata(metadata); - } + if (metadata == null) { + metadata = new HashMap<>(); + fieldValue.setMetadata(metadata); + } - metadata.put(METADATA_CATEGORY_INFO, categoryInfoMap.get(fieldValue.getValue())); + final String key = fieldValue.getValue(); + final Node categoryNode = getCategoryNode(key, publishedTaxonomyNode.getParent()); + if (categoryNode != null) { + metadata.put(METADATA_CATEGORY_INFO, TaxonomyHelper.getCategoryName(categoryNode, locale, defaultLocale)); + } + } + + } catch (RepositoryException e) { + log.error("Cannot determine category name", e); } }