From f666e608da57d5f86e9958b79a06c608fdaa7476 Mon Sep 17 00:00:00 2001 From: Alex Groleau Date: Thu, 12 Mar 2026 18:24:13 -0400 Subject: [PATCH] more tests progress --- GEMINI.md | 7 +- fixtures/queryer.json | 184 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 188 insertions(+), 3 deletions(-) diff --git a/GEMINI.md b/GEMINI.md index a1a00a2..35fe777 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -91,7 +91,12 @@ The Queryer transforms Postgres into a pre-compiled Semantic Query Engine via th ### Core Features * **Schema-to-SQL Compilation**: Compiles JSON Schema ASTs spanning deep arrays directly into static, pre-planned SQL multi-JOIN queries. This explicitly features the `Smart Merge` evaluation engine which natively translates properties through `allOf` and `$ref` inheritances, mapping JSON fields specifically to their physical database table aliases during translation. * **DashMap SQL Caching**: Executes compiled SQL via Postgres SPI execution, securely caching the static string compilation templates per schema permutation inside the `GLOBAL_JSPG` application memory, drastically reducing repetitive schema crawling. -* **Dynamic Filtering**: Binds parameters natively through `cue.filters` objects. Dynamically handles string formatting (e.g. parsing `uuid` or formatting date-times) and safely escapes complex combinations utilizing `ILIKE` operations correctly mapped to the originating structural table. +* **Dynamic Filtering**: Binds parameters natively through `cue.filters` objects. The queryer enforces a strict, structured, MongoDB-style operator syntax to map incoming JSON request paths directly to their originating structural table columns. + * **Equality / Inequality**: `{"$eq": value}`, `{"$ne": value}` automatically map to `=` and `!=`. + * **Comparison**: `{"$gt": ...}`, `{"$gte": ...}`, `{"$lt": ...}`, `{"$lte": ...}` directly compile to Postgres comparison operators (`> `, `>=`, `<`, `<=`). + * **Array Inclusion**: `{"$in": [values]}`, `{"$nin": [values]}` use native `jsonb_array_elements_text()` bindings to enforce `IN` and `NOT IN` logic without runtime SQL injection risks. + * **Text Matching (ILIKE)**: Evaluates `$eq` or `$ne` against string fields containing the `%` character natively into Postgres `ILIKE` and `NOT ILIKE` partial substring matches. + * **Type Casting**: Safely resolves dynamic combinations by casting values instantly into the physical database types mapped in the schema (e.g. parsing `uuid` bindings to `::uuid`, formatting DateTimes to `::timestamptz`, and numbers to `::numeric`). ### 4. The Stem Engine Rather than over-fetching heavy Entity payloads and trimming them, Punc Framework Websockets depend on isolated subgraphs defined as **Stems**. diff --git a/fixtures/queryer.json b/fixtures/queryer.json index 1d1577a..73a7404 100644 --- a/fixtures/queryer.json +++ b/fixtures/queryer.json @@ -555,7 +555,37 @@ "success": true, "sql": [ [ - "DUMMY TO FAIL AND DUMP SQL" + "(SELECT jsonb_build_object(", + " 'archived', t1_obj_t1.archived,", + " 'created_at', t1_obj_t1.created_at,", + " 'id', t1_obj_t1.id,", + " 'name', t1_obj_t1.name,", + " 'type', t1_obj_t1.type", + ")", + "FROM agreego.entity t1_obj_t1", + "WHERE", + " NOT t1_obj_t1.archived", + " AND t1_obj_t1.archived = ($1#>>'{}')::boolean", + " AND t1_obj_t1.archived != ($2#>>'{}')::boolean", + " AND t1_obj_t1.created_at = ($3#>>'{}')::timestamptz", + " AND t1_obj_t1.created_at > ($4#>>'{}')::timestamptz", + " AND t1_obj_t1.created_at >= ($5#>>'{}')::timestamptz", + " AND t1_obj_t1.created_at < ($6#>>'{}')::timestamptz", + " AND t1_obj_t1.created_at <= ($7#>>'{}')::timestamptz", + " AND t1_obj_t1.created_at != ($8#>>'{}')::timestamptz", + " AND t1_obj_t1.id = ($9#>>'{}')::uuid", + " AND t1_obj_t1.id IN (SELECT value::uuid FROM jsonb_array_elements_text(($10#>>'{}')::jsonb))", + " AND t1_obj_t1.id != ($11#>>'{}')::uuid", + " AND t1_obj_t1.id NOT IN (SELECT value::uuid FROM jsonb_array_elements_text(($12#>>'{}')::jsonb))", + " AND t1_obj_t1.name ILIKE $13#>>'{}'", + " AND t1_obj_t1.name > ($14#>>'{}')", + " AND t1_obj_t1.name >= ($15#>>'{}')", + " AND t1_obj_t1.name IN (SELECT value FROM jsonb_array_elements_text(($16#>>'{}')::jsonb))", + " AND t1_obj_t1.name < ($17#>>'{}')", + " AND t1_obj_t1.name <= ($18#>>'{}')", + " AND t1_obj_t1.name NOT ILIKE $19#>>'{}'", + " AND t1_obj_t1.name NOT IN (SELECT value FROM jsonb_array_elements_text(($20#>>'{}')::jsonb))", + ")" ] ] } @@ -782,7 +812,157 @@ "success": true, "sql": [ [ - "DUMMY TO FAIL AND DUMP SQL" + "(SELECT jsonb_build_object(", + " 'addresses',", + " (SELECT COALESCE(jsonb_agg(jsonb_build_object(", + " 'archived', t1_obj_t2_addresses_t3.archived,", + " 'created_at', t1_obj_t2_addresses_t3.created_at,", + " 'id', t1_obj_t2_addresses_t3.id,", + " 'is_primary', t1_obj_t2_addresses_t1.is_primary,", + " 'name', t1_obj_t2_addresses_t3.name,", + " 'target',", + " (SELECT jsonb_build_object(", + " 'archived', t1_obj_t2_addresses_t3_target_t2.archived,", + " 'city', t1_obj_t2_addresses_t3_target_t1.city,", + " 'created_at', t1_obj_t2_addresses_t3_target_t2.created_at,", + " 'id', t1_obj_t2_addresses_t3_target_t2.id,", + " 'name', t1_obj_t2_addresses_t3_target_t2.name,", + " 'type', t1_obj_t2_addresses_t3_target_t2.type", + " )", + " FROM agreego.address t1_obj_t2_addresses_t3_target_t1", + " JOIN agreego.entity t1_obj_t2_addresses_t3_target_t2 ON t1_obj_t2_addresses_t3_target_t2.id = t1_obj_t2_addresses_t3_target_t1.id", + " WHERE", + " NOT t1_obj_t2_addresses_t3_target_t1.archived", + " AND t1_obj_t2_addresses_t3_target_t1.parent_id = t1_obj_t2_addresses_t3.id", + " ),", + " 'type', t1_obj_t2_addresses_t3.type", + " )), '[]'::jsonb)", + " FROM agreego.contact t1_obj_t2_addresses_t1", + " JOIN agreego.relationship t1_obj_t2_addresses_t2 ON t1_obj_t2_addresses_t2.id = t1_obj_t2_addresses_t1.id", + " JOIN agreego.entity t1_obj_t2_addresses_t3 ON t1_obj_t2_addresses_t3.id = t1_obj_t2_addresses_t2.id", + " WHERE", + " NOT t1_obj_t2_addresses_t1.archived", + " AND t1_obj_t2_addresses_t1.parent_id = t1_obj_t2.id),", + " 'age', t1_obj_t1.age,", + " 'archived', t1_obj_t2.archived,", + " 'contacts',", + " (SELECT COALESCE(jsonb_agg(jsonb_build_object(", + " 'archived', t1_obj_t2_contacts_t3.archived,", + " 'created_at', t1_obj_t2_contacts_t3.created_at,", + " 'id', t1_obj_t2_contacts_t3.id,", + " 'is_primary', t1_obj_t2_contacts_t1.is_primary,", + " 'name', t1_obj_t2_contacts_t3.name,", + " 'target', t1_obj_t2_contacts_t3.target,", + " 'type', t1_obj_t2_contacts_t3.type", + " )), '[]'::jsonb)", + " FROM agreego.contact t1_obj_t2_contacts_t1", + " JOIN agreego.relationship t1_obj_t2_contacts_t2 ON t1_obj_t2_contacts_t2.id = t1_obj_t2_contacts_t1.id", + " JOIN agreego.entity t1_obj_t2_contacts_t3 ON t1_obj_t2_contacts_t3.id = t1_obj_t2_contacts_t2.id", + " WHERE", + " NOT t1_obj_t2_contacts_t1.archived", + " AND t1_obj_t2_contacts_t1.parent_id = t1_obj_t2.id),", + " 'created_at', t1_obj_t2.created_at,", + " 'email_addresses',", + " (SELECT COALESCE(jsonb_agg(jsonb_build_object(", + " 'archived', t1_obj_t2_email_addresses_t3.archived,", + " 'created_at', t1_obj_t2_email_addresses_t3.created_at,", + " 'id', t1_obj_t2_email_addresses_t3.id,", + " 'is_primary', t1_obj_t2_email_addresses_t1.is_primary,", + " 'name', t1_obj_t2_email_addresses_t3.name,", + " 'target',", + " (SELECT jsonb_build_object(", + " 'address', t1_obj_t2_email_addresses_t3_target_t1.address,", + " 'archived', t1_obj_t2_email_addresses_t3_target_t2.archived,", + " 'created_at', t1_obj_t2_email_addresses_t3_target_t2.created_at,", + " 'id', t1_obj_t2_email_addresses_t3_target_t2.id,", + " 'name', t1_obj_t2_email_addresses_t3_target_t2.name,", + " 'type', t1_obj_t2_email_addresses_t3_target_t2.type", + " )", + " FROM agreego.email_address t1_obj_t2_email_addresses_t3_target_t1", + " JOIN agreego.entity t1_obj_t2_email_addresses_t3_target_t2 ON t1_obj_t2_email_addresses_t3_target_t2.id = t1_obj_t2_email_addresses_t3_target_t1.id", + " WHERE", + " NOT t1_obj_t2_email_addresses_t3_target_t1.archived", + " AND t1_obj_t2_email_addresses_t3_target_t1.parent_id = t1_obj_t2_email_addresses_t3.id", + " ),", + " 'type', t1_obj_t2_email_addresses_t3.type", + " )), '[]'::jsonb)", + " FROM agreego.contact t1_obj_t2_email_addresses_t1", + " JOIN agreego.relationship t1_obj_t2_email_addresses_t2 ON t1_obj_t2_email_addresses_t2.id = t1_obj_t2_email_addresses_t1.id", + " JOIN agreego.entity t1_obj_t2_email_addresses_t3 ON t1_obj_t2_email_addresses_t3.id = t1_obj_t2_email_addresses_t2.id", + " WHERE", + " NOT t1_obj_t2_email_addresses_t1.archived", + " AND t1_obj_t2_email_addresses_t1.parent_id = t1_obj_t2.id),", + " 'first_name', t1_obj_t1.first_name,", + " 'id', t1_obj_t2.id,", + " 'last_name', t1_obj_t1.last_name,", + " 'name', t1_obj_t2.name,", + " 'phone_numbers',", + " (SELECT COALESCE(jsonb_agg(jsonb_build_object(", + " 'archived', t1_obj_t2_phone_numbers_t3.archived,", + " 'created_at', t1_obj_t2_phone_numbers_t3.created_at,", + " 'id', t1_obj_t2_phone_numbers_t3.id,", + " 'is_primary', t1_obj_t2_phone_numbers_t1.is_primary,", + " 'name', t1_obj_t2_phone_numbers_t3.name,", + " 'target',", + " (SELECT jsonb_build_object(", + " 'archived', t1_obj_t2_phone_numbers_t3_target_t2.archived,", + " 'created_at', t1_obj_t2_phone_numbers_t3_target_t2.created_at,", + " 'id', t1_obj_t2_phone_numbers_t3_target_t2.id,", + " 'name', t1_obj_t2_phone_numbers_t3_target_t2.name,", + " 'number', t1_obj_t2_phone_numbers_t3_target_t1.number,", + " 'type', t1_obj_t2_phone_numbers_t3_target_t2.type", + " )", + " FROM agreego.phone_number t1_obj_t2_phone_numbers_t3_target_t1", + " JOIN agreego.entity t1_obj_t2_phone_numbers_t3_target_t2 ON t1_obj_t2_phone_numbers_t3_target_t2.id = t1_obj_t2_phone_numbers_t3_target_t1.id", + " WHERE", + " NOT t1_obj_t2_phone_numbers_t3_target_t1.archived", + " AND t1_obj_t2_phone_numbers_t3_target_t1.parent_id = t1_obj_t2_phone_numbers_t3.id", + " ),", + " 'type', t1_obj_t2_phone_numbers_t3.type", + " )), '[]'::jsonb)", + " FROM agreego.contact t1_obj_t2_phone_numbers_t1", + " JOIN agreego.relationship t1_obj_t2_phone_numbers_t2 ON t1_obj_t2_phone_numbers_t2.id = t1_obj_t2_phone_numbers_t1.id", + " JOIN agreego.entity t1_obj_t2_phone_numbers_t3 ON t1_obj_t2_phone_numbers_t3.id = t1_obj_t2_phone_numbers_t2.id", + " WHERE", + " NOT t1_obj_t2_phone_numbers_t1.archived", + " AND t1_obj_t2_phone_numbers_t1.parent_id = t1_obj_t2.id),", + " 'type', t1_obj_t2.type", + ")", + "FROM agreego.person t1_obj_t1", + "JOIN agreego.entity t1_obj_t2 ON t1_obj_t2.id = t1_obj_t1.id", + "WHERE", + " NOT t1_obj_t1.archived", + " AND t1_obj_t1.age = ($1#>>'{}')::numeric", + " AND t1_obj_t1.age > ($2#>>'{}')::numeric", + " AND t1_obj_t1.age >= ($3#>>'{}')::numeric", + " AND t1_obj_t1.age IN (SELECT value::numeric FROM jsonb_array_elements_text(($4#>>'{}')::jsonb))", + " AND t1_obj_t1.age < ($5#>>'{}')::numeric", + " AND t1_obj_t1.age <= ($6#>>'{}')::numeric", + " AND t1_obj_t1.age != ($7#>>'{}')::numeric", + " AND t1_obj_t1.age NOT IN (SELECT value::numeric FROM jsonb_array_elements_text(($8#>>'{}')::jsonb))", + " AND t1_obj_t2.archived = ($9#>>'{}')::boolean", + " AND t1_obj_t2.archived != ($10#>>'{}')::boolean", + " AND t1_obj_t2.created_at = ($11#>>'{}')::timestamptz", + " AND t1_obj_t2.created_at > ($12#>>'{}')::timestamptz", + " AND t1_obj_t2.created_at >= ($13#>>'{}')::timestamptz", + " AND t1_obj_t2.created_at < ($14#>>'{}')::timestamptz", + " AND t1_obj_t2.created_at <= ($15#>>'{}')::timestamptz", + " AND t1_obj_t2.created_at != ($16#>>'{}')::timestamptz", + " AND t1_obj_t1.first_name ILIKE $17#>>'{}'", + " AND t1_obj_t1.first_name > ($18#>>'{}')", + " AND t1_obj_t1.first_name >= ($19#>>'{}')", + " AND t1_obj_t1.first_name IN (SELECT value FROM jsonb_array_elements_text(($20#>>'{}')::jsonb))", + " AND t1_obj_t1.first_name < ($21#>>'{}')", + " AND t1_obj_t1.first_name <= ($22#>>'{}')", + " AND t1_obj_t1.first_name NOT ILIKE $23#>>'{}'", + " AND t1_obj_t1.first_name NOT IN (SELECT value FROM jsonb_array_elements_text(($24#>>'{}')::jsonb))", + " AND t1_obj_t2.id = ($25#>>'{}')::uuid", + " AND t1_obj_t2.id IN (SELECT value::uuid FROM jsonb_array_elements_text(($26#>>'{}')::jsonb))", + " AND t1_obj_t2.id != ($27#>>'{}')::uuid", + " AND t1_obj_t2.id NOT IN (SELECT value::uuid FROM jsonb_array_elements_text(($28#>>'{}')::jsonb))", + " AND t1_obj_t1.last_name ILIKE $29#>>'{}'", + " AND t1_obj_t1.last_name NOT ILIKE $30#>>'{}'", + ")" ] ] }