Manera eficiente de obtener la lista de EntityModel (Java, DXA 2.0)

Oct 28 2020

Tenemos una página que consulta entidades con ciertos criterios.

La forma en que lo implementamos es obteniendo una lista de ID de entidad, haciendo un ciclo de ID, recuperando el modelo de entidad por ID y añadiéndolo a la lista.

Pseudo código:

Query query = new Query(...);
// Get list of ids from query
List<String> ids = Arrays.asList(query.executeQuery());

final WebComponentMetaFactory cmf = new WebComponentMetaFactoryImpl(brokerQuery.getPublicationId());

// Get component meta
List<ComponentMeta> componentMetas = ids.stream().map(cmf::getMeta)
            .collect(Collectors.toList());

// Get entity model per component and add it to the list
componentMetas.forEach(meta -> {
   EntityModel entityModel = contentProvider.getEntityModel(meta.getId() + templateId, webRequestContext.getLocalization())
   list.add(entityModel)
});

Esto funciona, sin embargo, desde el punto de vista del rendimiento, es muy lento porque necesita solicitar contentProvider.getEntityModel(...)cada ID.

¿Existe una mejor solución para esto? ¿Quizás una API de DXA que genera una lista de EntityModel?

Respuestas

Velmurugan Nov 03 2020 at 06:06

Utilice esta API CIL a continuación para obtener contenido de DCP múltiple mediante una sola llamada. El ejemplo que se proporciona a continuación se basa en una API similar a .NET también disponible en Java.

string[] componentUris = query.ExecuteQuery();


            var components =
                componentUris
                    .Select(componentUri => { TcmUri uri = new TcmUri(componentUri); return (ComponentPresentation)new ComponentPresentationFactory(uri.PublicationId).FindAllComponentPresentations(componentUri)[0]; })
                    .Where(cp => cp != null)
                    .Select(cp => cp.Content)
                    .ToList();

Espero que ayude.