---
# System prepended metadata

title: Análise para possibilitar a pesquisa com base nos campos customizados

---

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