# Análise para possibilitar a pesquisa com base nos campos customizados ## Motivação Atualmente não é possível pesquisar/filtrar registros com base nos campos customizados com a `Restquery`. ## Solução Utilizar o mecanismo de `CQRS` para que seja possível a consulta com base nos campos customizados do `App Builder` juntamento com os campos `standard`. ## Escopo Atender inicialmente apenas a importação CSV, utilizando-se de filtros básicos como: `and`, `or`, `equals`, `in` e `like`. Não tendo necessidade de se preocupar no momento com grupos de condicionais. <br/> ## Proposta 1 <img src="images/Proposta 1.png"/> ### Considerações Esta proposta tem como objetivo de criação de uma lib para realizar a conversão de `Restquery` para a `BQL`. Para isso deverá ser considerado todos os recursos que a `Restquery` suporta e converter para os recursos da `BQL`. Necessidade de considerar um compilador para fazer o parse da expressão e converter em `BQL`. <br/> ## Proposta 2 <img src="images/Proposta 2.png"/> ### Considerações Neste proposta, a responsabilidade seria apenas do front para a criação da `BQL`. Seria necessário a criação de um componente semelhante ao que já existe hoje para a criação da `Restquery`. A requisição seria redirecionada diretamente para o `CQRS`. <br/> ## Proposta 3 <img src="images/Proposta 3.png"/> ### Considerações Assim como o Router do `App Builder`, esta proposta tem como objetivo a criação de um novo microserviço que receberá o redirecionamento de requisição feita pelo `Heimdall`. Com base em um atributo que poderiamos definir no `Header` da requisição, podemos dizer que queremos utilizar o recurso de CQRS quando informado. Desta forma, este novo serviço receberá a requisição e extrair as informações para posteriormente enviar ao `CQRS`. Esta extração conta com a utilização da ideia da proposta 1, de converter `Restquery` em `BQL`. <br/> ## Proposta 4 <img src="images/Proposta 4.png"/> ### Considerações Por fim, esta proposta tem como objetivo a implementação de um mecanismo simples de criação da `BQL` com base nas informações cadastradas na importação csv, não tendo a necessidade de conversão da `Restquery`. <br/> ## Considerações Finais - Conforme o problema apresentado para solucionar apenas para o projeto de importação CSV no momento, identifiquei que a necessidade de conversão de `Restquery` para `BQL` não será necessária, tendo a [Proposta 4](#proposta-4) como decisão. - O recurso de `distinct` na `BQL` não é suportado atualmente. Mas pode ser utilizado como solução de contorno a instrução `groupBy`. <br/> ### Contrato de pesquisa que deve ser considerado para importação CSV ```JSON { "select": [ { "column": "id" }, { "column": "name" } ], "from": [{ "table": "customer_customers" }], "where": { "and": [{ "equals": { "left": { "column": "code" }, "right": { "literal": 2004 } } }, { "equals": { "left": { "column": "code" }, "right": { "literal": 2003 } } }, { "in": { "column": "id", "values": [ "9e5ea296-ebd1-449b-b549-0e36b02d7e20" ] } }, { "like": { "column": "name", "pattern": "João" } }, { "ilike": { "column": "name", "pattern": "João" } } ] }, "offset": 0, "limit": 25 } ``` > O campo `offset` representa a paginação, da mesma forma que existe o campo `{page=0}` na `Restquery`. > O campo `limit` representa a quantidade de registros por página, da mesma forma que existe o campo `{pageSize=25}` na `Restquery`.