Roadmap de Filtros — Lotes 2 e 3

Roadmap de Filtros — Lotes 2 e 3

Este documento descreve planos de evolução do mecanismo de filtros após o Lote 1 (core) já implementado. O objetivo é ampliar expressividade mantendo compatibilidade, legibilidade e portabilidade JPA.

Lote 2 — Multicampo e Relação

Objetivo

Habilitar regras envolvendo dois campos (no mesmo root ou em relação) e existência de registros relacionados.

Operações alvo

Proposta de API (@Filterable)

Sem quebrar compatibilidade, estender a anotação com parâmetros opcionais: - otherField (String): caminho do outro campo (pode ser relation path) para FIELD_*_FIELD - rangeStartField, rangeEndField (String): caminhos para delimitar intervalos do campo B em RANGE_OVERLAP - existsRelation (String): caminho para a relação (join) em EXISTS_RELATION/NOT_EXISTS_RELATION - existsFilter (String, opcional): nome simbólico de um predicado simples a aplicar no filho (ex.: ativo=true ou referenciar outro campo do DTO)

Exemplos (DTO):

// precoPromocional < precoCheio
@Filterable(operation = FIELD_LT_FIELD, otherField = "precoCheio")
private BigDecimal precoPromocional;

// Sobreposição de intervalos: (vigencia: [inicio, fim]) ~ (campanha: [campanhaInicio, campanhaFim])
@Filterable(operation = RANGE_OVERLAP, rangeStartField = "campanhaInicio", rangeEndField = "campanhaFim")
private LocalDate vigenciaInicio; // Pares de campos: vigenciaInicio/vigenciaFim
private LocalDate vigenciaFim;

// Existe pelo menos um filho ativo
@Filterable(operation = EXISTS_RELATION, existsRelation = "itens")
private Boolean temItemAtivo; // true → EXISTS (join itens WHERE itens.ativo = true)

Padrão de implementação

Critérios de aceite do Lote 2

Riscos e mitigação

Lote 3 — Avançadas / Dialeto

Objetivo

Adicionar operadores/funcionalidades específicas de dialeto, mantendo portabilidade opcional via fallback.

Operações alvo e funções

Proposta técnica

Exemplo (@Filterable)

// UNACCENT + LIKE (PostgreSQL)
@Filterable(operation = LIKE, relation = "pessoa.nome", accentInsensitive = true)
private String nome;

// REGEX
@Filterable(operation = REGEX, relation = "pessoa.login")
private String loginRegex;

// JSON path equals
@Filterable(operation = JSON_PATH_EQUALS, relation = "payload")
private String jsonPath; // ex.: $.cliente.id == 123

Critérios de aceite do Lote 3

Riscos e mitigação

Entregas e ordem sugerida

  1. Lote 2 — FIELD_*_FIELD e RANGE_OVERLAP
  2. Lote 2 — EXISTS_RELATION/NOT_EXISTS_RELATION
  3. Lote 3 — UNACCENT/REGEX (strings)
  4. Lote 3 — JSON*
  5. Lote 3 — GEO*

Documentação correlata