Filtered Stats Plan

Filtered Stats Plan

Additive Multi-Metric Extension

The canonical praxis.stats contract is being expanded additively for group-by and timeseries.

Current platform intent for this extension:

Contexto

O praxis-metadata-starter já centraliza a superfície canônica de leitura para recursos genéricos:

Essas operações resolvem listagem, paginação, locate e projeções leves, mas a plataforma ainda não oferece uma forma canônica de consultar KPIs e agregações sobre o mesmo conjunto filtrado.

Na prática, isso empurra apps consumidores para uma das alternativas erradas:

Direção de Plataforma

A solução correta de plataforma é incorporar uma família canônica de estatísticas filtradas no praxis-metadata-starter, reaproveitando a mesma semântica de filtro já usada em /filter.

O objetivo não é criar uma DSL analítica universal. O objetivo é suportar o caso canônico de produto:

com:

Estado Atual do V1

O plano abaixo já está parcialmente implementado no starter.

Status atual da superfície:

Governança atual:

Restrições deliberadas ainda vigentes:

Superfície Canônica Proposta

Endpoints

Todos devem operar sobre o mesmo universo filtrado pelo FD extends GenericFilterDTO.

Regra de Design

O frontend não deve mandar uma consulta analítica arbitrária no estilo SQL ou Elasticsearch. O starter deve aceitar apenas requests tipados, pequenos e governados.

Escopo Seguro do V1

Incluído

Excluído

Contratos Canônicos

Além do contrato HTTP dos endpoints, o starter agora também consegue refletir exemplos operacionais no catálogo derivado de /schemas/filtered:

Esse bloco é derivado dos examples/example publicados no OpenAPI da operação e serve para catálogos, playgrounds e frontends metadata-driven que precisem exibir exemplos prontos de uso sem manter documentação paralela.

Observações de contrato:

1. Group By

Endpoint:

Request canônico:

Semântica mínima:

Exemplo conceitual:

{
  "filter": {
    "status": "ATIVO"
  },
  "field": "departamentoId",
  "metric": {
    "operation": "count"
  },
  "limit": 10,
  "orderBy": "value_desc"
}

2. Timeseries

Endpoint:

Request canônico:

Semântica mínima:

3. Distribution

Endpoint:

Request canônico:

Semântica mínima:

Respostas Canônicas

O v1 deve ter DTOs explícitos para evitar payloads ambíguos.

GroupByResponse

Cada bucket:

TimeSeriesResponse

Cada ponto:

Contrato JSON estabilizado:

Exemplo:

{
  "field": "createdOn",
  "granularity": "DAY",
  "metric": {
    "operation": "SUM",
    "field": "salary"
  },
  "points": [
    {
      "start": "2026-03-01",
      "end": "2026-03-01",
      "label": "2026-03-01",
      "value": 25.0,
      "count": 2
    }
  ]
}

DistributionResponse

Cada bucket:

Governança de Capability

Stats não devem ser implicitamente suportadas por todo recurso.

O starter já possui ResourceCapabilities. O caminho correto é estender essa família com capacidades específicas para stats, por exemplo:

No nível do service, a capability precisa distinguir pelo menos:

Governança de Campos e Métricas

O ponto mais importante do desenho é impedir agregação arbitrária.

O v1 precisa de uma camada canônica para declarar:

Isso pode ser modelado com um registry explícito por recurso, por exemplo:

Exemplos de regras:

Reuso da Infraestrutura Atual

O starter já tem a peça mais valiosa: a tradução de FD -> Specification<E>.

O fluxo recomendado do v1 é:

  1. receber request tipado de stats
  2. gerar Specification<E> a partir do filter
  3. resolver o campo canônico para property path JPA governado
  4. montar a agregação com Criteria API
  5. adaptar o resultado para DTO canônico

Isso evita:

Papel de Cada Camada

DTOs

Service Base

Executor Analítico

Controller Base

Arquitetura Recomendada do V1

1. Começar por count

O primeiro ganho de produto vem de:

Métricas numéricas adicionais entram apenas se o campo estiver explicitamente governado.

Status:

2. Reutilizar Criteria API

Não abrir uma camada de query arbitrária. Para o v1, o executor pode operar com:

3. Restringir o problema temporal

timeseries só deve aceitar campos temporais explicitamente elegíveis e um conjunto pequeno de granularidades.

4. Fazer distribution em dois modos

Backlog Arquivo por Arquivo

1. Contrato e tipos canônicos

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/StatsMetric.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/TimeSeriesGranularity.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/DistributionMode.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/dto/StatsMetricRequest.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/dto/GroupByStatsRequest.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/dto/TimeSeriesStatsRequest.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/dto/DistributionStatsRequest.java

Objetivo:

Tarefas:

Critério de aceite:

Novos arquivos em src/main/java/org/praxisplatform/uischema/stats/dto/response/...

Objetivo:

Tarefas:

Critério de aceite:

2. Capability e governança

src/main/java/org/praxisplatform/uischema/annotation/ResourceCapabilities.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/StatsSupportMode.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/StatsFieldDescriptor.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/StatsFieldRegistry.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/StatsEligibility.java

Objetivo:

Tarefas:

Critério de aceite:

3. Execução analítica

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/service/StatsQueryExecutor.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/service/jpa/JpaStatsQueryExecutor.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/service/jpa/StatsCriteriaSupport.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/service/jpa/TimeSeriesBucketExpressionFactory.java

Objetivo:

Tarefas:

Critério de aceite:

4. Integração no service base

src/main/java/org/praxisplatform/uischema/service/base/BaseCrudService.java

Objetivo:

Tarefas:

Critério de aceite:

src/main/java/org/praxisplatform/uischema/service/base/AbstractBaseCrudService.java

Objetivo:

Tarefas:

Critério de aceite:

src/main/java/org/praxisplatform/uischema/service/base/AbstractReadOnlyService.java

Objetivo:

Tarefas:

Critério de aceite:

5. Controller e exposição REST

src/main/java/org/praxisplatform/uischema/controller/base/AbstractCrudController.java

Objetivo:

Tarefas:

Critério de aceite:

src/main/java/org/praxisplatform/uischema/controller/base/AbstractReadOnlyController.java

Objetivo:

Tarefas:

Critério de aceite:

6. Auto-configuração

src/main/java/org/praxisplatform/uischema/configuration/OpenApiUiSchemaAutoConfiguration.java

Objetivo:

Tarefas:

Critério de aceite:

Novo arquivo: src/main/java/org/praxisplatform/uischema/stats/StatsProperties.java

Objetivo:

Tarefas:

Critério de aceite:

7. Catálogo e documentação automática

src/main/java/org/praxisplatform/uischema/controller/docs/ApiDocsController.java

Objetivo:

Tarefas:

Critério de aceite:

src/main/java/org/praxisplatform/uischema/controller/base/doc-files/endpoints-overview.html

Objetivo:

Tarefas:

Critério de aceite:

docs/technical/README.md

Objetivo:

Critério de aceite:

8. Testes no starter

Novo arquivo: src/test/java/org/praxisplatform/uischema/stats/StatsEligibilityTest.java

Objetivo:

Novo arquivo: src/test/java/org/praxisplatform/uischema/stats/service/jpa/JpaStatsQueryExecutorTest.java

Objetivo:

Cenários mínimos:

src/test/java/org/praxisplatform/uischema/controller/base/...

Objetivo:

9. Validação consumidora

praxis-api-quickstart/src/test/java/...

Objetivo:

Recursos candidatos iniciais:

Critério de aceite:

Ordem Recomendada de Execução

  1. enums e DTOs canônicos
  2. capability e registry de campos
  3. eligibility de stats
  4. executor JPA de group-by + count
  5. integração no service base
  6. endpoints no controller base
  7. catálogo/documentação automática
  8. timeseries + count
  9. distribution terms + count
  10. distribution histogram para campos numéricos elegíveis
  11. testes consumidores no quickstart
  12. documentação operacional final

Definition of Done do V1

O v1 só deve ser considerado pronto quando:

Riscos a Monitorar

Próxima Ação Recomendada

Começar pelo menor corte de plataforma com valor real:

Depois disso:

Só então ampliar para timeseries e distribution.