# 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`.