Passar para o conteúdo principal

Otimização de código para buscar dados em vários níveis (expands)

João Pedro Ledo avatar
Escrito por João Pedro Ledo
Atualizado há mais de 3 anos

INTRODUÇÃO
Muitas vezes é necessário buscar dados de várias entidades distintas em uma mesma consulta para tratá-los para trabalhar com automações e integrações, o problema é que trazer dados de diferentes fontes pode ser uma operação pesada e causar Timeout em sua requisição.

Vamos pegar como exemplo o seguinte cenário: queremos buscar a última revisão de uma proposta cujo negócio foi Ganho e queremos trazer dados detalhados de:

  1. Proposta, incluindo os Campos customizados

  2. Cliente relacionado, incluindo seus Marcadores e Campos customizados.

  3. Negócio incluindo os Marcadores

  4. Responsável pelo Negócio

  5. Produtos incluindo oc Campos customizados e os Opcionais (e também seus Campos customizados)



DESAFIO
O problema é que para que esta consulta seja executada, a API do Ploomes tem que percorrer entidades em vários níveis para encontrar todos os dados necessários, e esta operação será realizada para cada resultado que corresponda aos parâmetros da busca. Imagine que o filtro desta consulta encontre 15 resultados em uma base de 1.000 Negócios, para cada um dos resultados seria necessário percorrer os diferentes níveis e muito provavelmente a operação sofreria um Timeout (estouro de tempo de requisição) antes de ser completa e os dados desejados não serão retornados.



SOLUÇÃO
A solução para este caso é bastante simples: fazer o filtro buscando todos os selecionando apenas o ID da entidade, e depois iterar sobre os resultados buscando informações complementares. Então a mesma operação seria dividida em duas etapas. Na primeira, seria feito somente o seguinte:

O quote["Id"] destacado acima representa o ID da proposta da vez dentro do Loop. Embora ainda estejamos fazendo vários Expands e trazendo as mesmas informações da consulta não otimizada, iterando assim a busca fica extremamente mais rápida porque estamos dizendo para a API que queremos um ID específico.

Respondeu à sua pergunta?