Maneira eficiente de obter a lista de EntityModel (Java, DXA 2.0)

Oct 28 2020

Temos uma página que consulta entidades com determinados critérios.

A maneira como o implementamos é obtendo uma lista de IDs de entidade, fazendo um loop dos IDs, recuperando o modelo de entidade por ID e adicionando-o à 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)
});

Isso funciona, no entanto, do ponto de vista do desempenho, é muito lento porque precisa chamar contentProvider.getEntityModel(...)cada ID.

Existe uma solução melhor para isso? Talvez uma API de DXA que gere uma lista de EntityModel?

Respostas

Velmurugan Nov 03 2020 at 06:06

Use a API CIL abaixo para buscar conteúdo DCP múltiplo por meio de uma única chamada. O exemplo abaixo é baseado na API semelhante ao .NET, também disponível em 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 ajude.