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:
Proposta, incluindo os Campos customizados
Cliente relacionado, incluindo seus Marcadores e Campos customizados.
Negócio incluindo os Marcadores
Responsável pelo Negócio
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:
Uma vez encontrado a listagem (Array de JSON) que correspondem à pesquisa, percorrer cada um deles (loop) expandindo a hierarquia e selecionando então todos os dados necessários, como mostrado a seguir:
https://public-api2.ploomes.com/Quotes?$filter=Id+eq+" + quote["Id"] + "&$select=Id,Amount,QuoteNumber,Date,ExpirationDate,DeliveryTime&$expand=Contact($select=Id;$expand=Tags($select=Tag;$expand=Tag($select=Name)),OtherProperties),Deal($select=Id;$expand=Owner($select=Name,Email),Tags($select=Tag;$expand=Tag($select=Name))),Products($select=Product,Quantity;$expand=Parts($expand=Product($select=Code),OtherProperties),Product($select=Code),OtherProperties),OtherProperties($expand=ObjectValue)&$orderby=Id
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.