OpenADS — M6 ADI: índices nos tipos ADT restantes
Projeto: openads2 (LOCAL-ONLY, fork Grok)
Branch base: feat/adt-adi-create-read-seek (M5 mergeado localmente)
Atualizado: 2026-06-22
Milestone local da trilha ADT/ADI — não confundir com M6 upstream (Data Dictionary).
1. Objetivo
Fechar criação + população + navegação + seek de índices .adi em tabelas .adt criadas pelo OpenADS, para os tipos ADT que o M5 não cobriu com índice:
| Tipo ADT | Código | Layout chave ADI |
|---|---|---|
| Date | 3 | 8 B total-order (JDN → pack_double_key) |
| Time | 13 | 8 B total-order (ms desde meia-noite) |
| Timestamp | 14 | 8 B total-order (JDN+ms combinados) |
| Money | 18 | 8 B total-order (IEEE754 LE → BE flipped) |
| Logical | 1 | 8 B total-order (falta hoje em encode_adt_key) |
Critério de pronto: cada tipo passa em teste doctest local (create → append → AdsCreateIndex61 → AdsGotoTop/AdsSkip ordem correta → AdsSeek exato).
2. Fora de escopo (M6)
| Item | Motivo | Milestone |
|---|---|---|
| CICHAR / CiChar | layout char-key 7 páginas + case-fold; leitura de fixtures SAP já parcial, create não certificado | M7 |
Descendente (ADS_DESCENDING) |
AdiIndex::descending() fixo false; sem bit on-disk ADI |
M7 |
Composto (ADS_COMPOUND / expr multi-campo) |
F-markers múltiplos, concat de componentes | M7 |
| Interop DLL SAP nativa | ADI OpenADS↔vendor = ERRO conhecido (CLASSIFICACAO_C_engine_vs_RE.LOCAL.md §6) |
nunca neste PR |
Fixtures testdata/pmsys/ |
copyright / quarentena | nunca neste PR |
tests/smoke/adt_sap_cross_* |
harness vendor | nunca neste PR |
3. Estado atual (pós-M5)
Verde (M5)
AdsCreateTable(ADS_ADT)+AdsCreateIndex61→.adinovo- Índice Character (tag char, 7 páginas) e Numeric/Integer (8 B, 6 páginas)
AdiIndex::insertpara tags numéricas ignoraevaluate_index_expre usakey_for_recno_()→encode_adt_key()(correto)- Testes:
abi_adi_create_test.cpp,abi_adt_scope_validation_test.cpp(tabela com Date/Time/… mas sem índice nesses campos)
Gap M6
// adi_index.cpp — encode_adt_key()
default:
return std::string(8, '\0'); // LOGICAL cai aqui → todas as chaves iguais
- DATE / TIME / TIMESTAMP / MONEY: código existe em
encode_adt_key, mas sem teste de create+seek - LOGICAL: não implementado
4. Entregas
| ID | Entrega | Arquivo(s) |
|---|---|---|
| M6.1 | encode_adt_key: caso ADT_TYPE_LOGICAL (byte on-disk 'T'/'F' ou 0/1 → chave 8 B ordenável) |
src/drivers/adi/adi_index.cpp |
| M6.2 | Revisar TIMESTAMP (4+4 LE) e DATE (JDN u32) — ajustar só se teste falhar | idem |
| M6.3 | Testes abi_adi_types_test.cpp: 5 TEST_CASE (um por tipo), padrão M5 |
tests/unit/ + CMakeLists.txt |
| M6.4 | Tag doctest M6 ADI para filtro CI local |
idem |
Padrão de teste (cada tipo)
AdsConnect60local, temp dirAdsCreateTablecom um campo indexável + chave auxiliar (ex.:Tag,Character,10para desempate visual)- Append 3 registros com valores fora de ordem
AdsCreateIndex61expressão = nome do campo (bare field)AdsSetIndexOrderByHandle+AdsGotoTop+AdsSkip→ ordem ascendente verificadaAdsSeekno valor médio → recno correto
Valores de referência (tabela tipos_idx.adt)
| Campo | Tipo | Valores append (ordem inserção ≠ ordem índice) |
|---|---|---|
Nasc |
Date | 20000615, 19991231, 19850315 |
Hora |
Time | 52200000 ms, 3600000 ms, 0 ms |
Criado |
Timestamp | 20251225120000, 20250621143000, 19990101120000 |
Saldo |
Money | 300.50, 100.00, 200.25 |
Ativo |
Logical | T, F, T |
Reutilizar helpers de abi_adt_scope_validation_test.cpp (set_field_str, AdsSetLogical, etc.).
5. Comando de validação
cmake --build build\plus-msvc-x86 --config Release --target openads_unit_tests
build\plus-msvc-x86\tests\openads_unit_tests.exe -tc="M6 ADI"
Sem serverd, sem Harbour, sem DLL vendor.
6. PR
- Título sugerido:
feat(adt): M6 ADI index keys for Date/Time/Timestamp/Money/Logical - Base:
feat/adt-adi-create-read-seek(oumainapós merge M5) - Diff esperado: ~1 arquivo engine + 1 arquivo teste + CMake — sem docs prose extras, sem smoke cross-vendor
7. M7 (próxima fatia — só referência)
- CICHAR create + seek case-insensitive
ADS_DESCENDINGpersistido no per-tag header ADI- Índice composto (
propertyID;EndDateetc.) - (Opcional) reabrir interop ADI se layout convergir — hoje bloqueado
8. Referências
- M5 testes:
tests/unit/abi_adi_create_test.cpp,abi_adt_scope_validation_test.cpp - Engine:
src/drivers/adi/adi_index.{h,cpp},src/abi/ace_exports.cpp(AdsCreateIndex61ramo.adi) - Plano geral ADT:
docs/PLANO_ADT_ADI_REAL.md(fase 2 = create; M6 = tipos de chave) - Gap interop:
CLASSIFICACAO_C_engine_vs_RE.LOCAL.md§6