Skip to content

Achata JSON do multi_format_api com underscore para colunas compatíveis com DuckDB#91

Merged
gabrielbressan-tfy merged 1 commit into
mainfrom
fix/multi-format-api-underscore-column-separator
Jul 9, 2026
Merged

Achata JSON do multi_format_api com underscore para colunas compatíveis com DuckDB#91
gabrielbressan-tfy merged 1 commit into
mainfrom
fix/multi-format-api-underscore-column-separator

Conversation

@gabrielbressan-tfy

Copy link
Copy Markdown
Collaborator

Contexto

O handler multi_format_api explode o array de registros de uma resposta JSON em linhas e achata os objetos aninhados em colunas. O achatamento usava separador de ponto (json_normalize(sep='.')), gerando nomes como day.c, prevDay.c.

Esses nomes são inutilizáveis no caminho de consulta do MindsDB. A projeção é executada via DuckDB, e um nome com ponto é interpretado como qualificador de struct/tabela (coluna c de day) em vez de uma coluna chamada literalmente day.c. Nenhuma forma de citação resolve: aspas duplas viram literais de string e crases são removidas no rewrite antes da execução. Resultado observado em staging: Binder Error: Referenced column "c" not found.

O que foi implementado

Troca o separador do json_normalize de ponto para underscore no caminho JSON, alinhando ao caminho XML que já fazia isso. Campos aninhados passam a virar day_c, prevDay_c, lastQuote_P — identificadores simples e selecionáveis diretamente, sem ambiguidade de citação.

A mudança cobre tanto a explosão de registros quanto o fallback de objeto único (auto_explode desligado), para manter a convenção consistente.

Arquitetura e decisões

  • Correção mínima e local: apenas o separador. A detecção do array de registros, o reattach de escalares de topo e o resto do pipeline permanecem inalterados.
  • Underscore é a convenção que o próprio handler já adota no XML, então o comportamento fica uniforme entre formatos.

Pontos de atenção para review

  • Mudança de shape observável: consumidores que referenciavam colunas achatadas por nome com ponto passam a usar underscore.
  • Validado com o snapshot real de mercado (~13k tickers): saída com 12.962 linhas e colunas day_c/prevDay_c/lastQuote_P, sem nomes com ponto.
  • Do lado do mktplace, as instruções do conector e os prompts de SQL foram alinhados a esse formato em PR separada.

🤖 Generated with Claude Code

json_normalize used a dot separator, producing columns like `day.c`. MindsDB
runs projections through DuckDB, where a dotted name is parsed as a struct/table
qualifier (column `c` of `day`) instead of a column literally named "day.c" —
and no quoting form (backticks/double quotes) survives that rewrite, so the
column becomes unselectable. Switch to sep='_' (matching the XML path) so nested
fields flatten to day_c / prevDay_c, which are plain, selectable identifiers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@gabrielbressan-tfy gabrielbressan-tfy marked this pull request as ready for review July 9, 2026 14:50
@gabrielbressan-tfy gabrielbressan-tfy merged commit 5b66481 into main Jul 9, 2026
3 of 5 checks passed
@gabrielbressan-tfy gabrielbressan-tfy deleted the fix/multi-format-api-underscore-column-separator branch July 9, 2026 14:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant