Skip to content

feat: dialectes Firebird/ClickHouse/Redis/Cassandra + HSQLDB (pont JDBC) — v2.10.1#5

Merged
apolocine merged 7 commits into
mainfrom
feat/duckdb-dialect
Jun 13, 2026
Merged

feat: dialectes Firebird/ClickHouse/Redis/Cassandra + HSQLDB (pont JDBC) — v2.10.1#5
apolocine merged 7 commits into
mainfrom
feat/duckdb-dialect

Conversation

@apolocine

Copy link
Copy Markdown
Owner

Auteur : Dr Hamid MADANI drmdh@msn.com

Résumé

Campagne d'ajout de dialectes + 1re validation d'un dialecte « pont JDBC ». Porte @mostajs/orm à 17 dialectes annoncés, dont 14 dialectes SQL re-validés 20/20 en live (sans Docker).

Contenu (5 commits)

Commit Apport
1cda224 Firebird (OLTP) — node-firebird (Srp+wireCrypt), boolean→SMALLINT, text/json→VARCHAR(4000), pagination ROWS m TO n, role RDB$ADMIN. Validé live 20/20.
172d05a ClickHouse (OLAP) — @clickhouse/client, MergeTree, params typés {pN:Type}, UPDATE/DELETE → mutations mutations_sync=2. Validé live 20/20.
e96ac69 Redis (NoSQL doc) — ioredis, stockage RedisJSON + requêtes RediSearch (FT.CREATE/FT.SEARCH). Validé live 20/20.
e968a48 Cassandra (wide-column CQL) — cassandra-driver, ALLOW FILTERING auto, upsert natif, WHERE 1=1 retiré. Validé live 20/20.
d480ac6 Fix count() (casse alias cnt/CNT) + HSQLDB validé via pont JDBC + SQL Server (connexion URL + NVARCHAR(255)).

Fix notable — count() insensible à la casse de l'alias

SELECT COUNT(*) as cnt : HSQLDB/Oracle plient l'alias non-quoté en MAJUSCULES, et le pont JDBC renvoie la clé brute. Lecture désormais cnt ?? CNT ?? première valeur. Non-régression vérifiée 20/20 sur les 14 dialectes SQL (5 in-process + 9 serveurs natifs).

Validation live (20/20 chacun)

PostgreSQL · SQL Server 2022 · MySQL · MariaDB · Oracle XE · CockroachDB · MongoDB · Firebird · ClickHouse · Redis · Cassandra · Firestore (émulateur) · HSQLDB (pont JDBC) · DuckDB · SQLite · sql.js · pglite

Publié sur npm : @mostajs/orm@2.10.1.

…amia)

Dialecte `firebird` (AbstractSqlDialect + quirks) pour Firebird 3.0+. Driver pur-JS
node-firebird (peer optionnel). Connexion serveur ; id UUID pré-généré.

Quirks gérés :
- pagination ROWS m TO n (pas de LIMIT/OFFSET) ;
- boolean → SMALLINT 0/1 (node-firebird binde les booléens en '1'/'0' → BOOLEAN natif
  lève -303) ;
- text/json/array → VARCHAR(4000) (node-firebird hange à la lecture des BLOB sur wire
  chiffré) ;
- DROP TABLE multi-passes (ni IF EXISTS ni CASCADE) ;
- introspection RDB$RELATIONS/RDB$RELATION_FIELDS ;
- auth Srp + wireCrypt forcés (négociation auto du driver plante) ;
- insensible-casse via UPPER(col) LIKE UPPER(?).

Câblage : DialectType, DIALECT_LOADERS, DIALECT_CONFIGS, peerDependencies (optionnel).
Release 2.7.0 : CHANGELOG, llms.txt, README (16 bases).

Validé LIVE sur firebird3.0-server natif (sans Docker) : test-sgbd 20/20. Limites :
texte/JSON ≤ 4000 car. ; affected-rows approximatif (non exposé par le driver).

Author: Dr Hamid MADANI <drmdh@msn.com>
…r amia)

Dialecte `clickhouse` (AbstractSqlDialect + quirks) pour ClickHouse (MergeTree, HTTP).
Driver officiel @clickhouse/client (peer optionnel). Scope append/analytique.

Quirks gérés :
- generateCreateTable → ENGINE = MergeTree() ORDER BY id ;
- paramètres typés {pN:Type} (conversion des `?` positionnels) ;
- colonnes Nullable(T) (sauf id) ;
- UPDATE/DELETE → mutations ALTER TABLE … UPDATE/DELETE rendues SYNCHRONES via
  mutations_sync=2 (read-after-write fiable) ;
- dates 'YYYY-MM-DD HH:MM:SS' (sentinel 'now' géré) ;
- ILIKE pour l'insensible-casse ; pas de CREATE INDEX.

Câblage : DialectType, DIALECT_LOADERS, DIALECT_CONFIGS, peerDependencies (optionnel).
Release 2.8.0 : CHANGELOG, llms.txt, README (17 bases).

Validé LIVE sur clickhouse-server natif (sans Docker, amia) : test-sgbd 20/20.
Limites : unicité non garantie ; mutations coûteuses (réserver à l'analytique).

Author: Dr Hamid MADANI <drmdh@msn.com>
…lidé live amia)

Dialecte `redis` (IDialect dédié, façon Mongo) sur Redis Stack. Driver ioredis.
Pas un cache KV : stockage documentaire + recherche serveur.

- Stockage RedisJSON : JSON.SET/GET, JSON.NUMINCRBY (increment atomique).
- Requêtes RediSearch : un index FT.CREATE par entité à l'initSchema ; FT.SEARCH avec
  traduction des filtres @mostajs ($eq/$ne/$gt/$gte/$lt/$lte/$in/$nin/$regex) → TAG/
  NUMERIC/TEXT ; SORTBY/LIMIT ; count via LIMIT 0 0 ; soft-delete via champ _deleted ;
  échappement des valeurs TAG (UUID).
- CRUD complet, relations M2O par lookup (JSON.GET), upsert, addToSet/pull.

Câblage : DialectType, DIALECT_LOADERS, DIALECT_CONFIGS, peerDependencies (optionnel).
Release 2.9.0 : CHANGELOG, llms.txt, README (18 bases) + note positionnement Redis.

Validé LIVE sur redis-stack-server natif (modules search + ReJSON, sans Docker, amia) :
test-sgbd 20/20.

Author: Dr Hamid MADANI <drmdh@msn.com>
…dé live amia 20/20)

Dialecte `cassandra` (AbstractSqlDialect + quirks CQL) pour Apache Cassandra.
Driver officiel cassandra-driver. VALIDÉ LIVE sur amia : test-sgbd 20/20.

Quirks CQL gérés :
- CREATE TABLE (id PRIMARY KEY) sans NOT NULL/UNIQUE/FK/DEFAULT ;
- ALLOW FILTERING auto sur les SELECT filtrés sur colonne non-clé ;
- WHERE 1=1 retiré (tautologie des filtres vides, refusée par CQL) ;
- LIMIT sans OFFSET ; pas d'ORDER BY arbitraire ; INSERT = upsert natif ;
- placeholders ? (prepared) ; system_schema.tables/columns ; Long → number.

Câblage : DialectType, DIALECT_LOADERS, DIALECT_CONFIGS, peerDependencies (optionnel).
Release 2.10.0 : CHANGELOG, llms.txt, README (19 bases + section « Live validation »
avec matrice 20/20 par dialecte).

NB infra : Cassandra 4.1 exige Java 11 (option JVM CMS retirée en Java 14+ → ne démarre
pas sous Java 17) ; libérer le port 9042 des zombies (fuser -k).

Author: Dr Hamid MADANI <drmdh@msn.com>
…ont JDBC) — 2.10.1

- count() : lit `cnt` puis `CNT`, et à défaut la première (et seule) valeur de la ligne.
  HSQLDB/Oracle plient l'alias non-quoté en MAJUSCULES, et le pont JDBC renvoie la clé
  brute sans la normaliser comme les drivers natifs. Non-régression vérifiée 20/20 sur
  les 14 dialectes SQL héritant d'AbstractSqlDialect : 5 locaux (sqlite, duckdb, sqljs,
  pglite, hsqldb) + 9 amia (postgres, cockroachdb, firebird, clickhouse, mssql, oracle,
  cassandra, mariadb, mysql).

- HSQLDB : 1er dialecte « pont JDBC » validé LIVE 20/20 (serveur HyperSQL 2.7 Java local,
  sans Docker ; le jar fait serveur ET driver JDBC, chargé depuis jar_files/ par le pont).

- SQL Server : connexion par URL `mssql://…` parsée en objet de config (node-mssql l'exige)
  + `string`→`NVARCHAR(255)` (UNIQUE interdit sur NVARCHAR(MAX)). Validé LIVE 20/20 sur
  mssql-server 2022 natif (apt, sans Docker).

Author: Dr Hamid MADANI <drmdh@msn.com>
Premier filet de non-régression rejouable en CI, SANS infrastructure : tout tourne
en mémoire sur les dialectes in-process (sqlite, sql.js, pglite, duckdb).

- vitest 4 + config (tests/**/*.test.ts, pool forks, timeouts).
- Helpers : createIsolatedDialect (hors singleton/env global) + BaseRepository,
  paramétrés sur les 4 dialectes in-process.
- tests/crud.test.ts : scénario complet ×4 dialectes (60 tests) — schéma, create,
  relations many-to-one, findById/findOne/findAll, count + count(filter) [couvre la
  régression de casse d'alias cnt/CNT], update, upsert (idempotent), pagination,
  delete/deleteMany.
- tests/transactions.test.ts : commit (persiste) & rollback (annule) via $transaction(cb)
  ×4 dialectes (8 tests).
- Scripts npm : test (vitest run), test:watch, typecheck (tsc --noEmit).
- CI GitHub Actions (.github/workflows/test.yml) : Node 20/22, typecheck + build + test
  (npm install — package-lock.json non versionné).

Total : 68 tests, ~6 s, zéro dépendance serveur.

Author: Dr Hamid MADANI <drmdh@msn.com>
test: suite de tests automatisés in-process + CI (vitest)
@apolocine apolocine merged commit 049d84d into main Jun 13, 2026
4 checks passed
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