Compare commits

..

3 Commits

Author SHA1 Message Date
9ef59422b8 version: 1.0.180 2026-07-14 16:03:01 -04:00
b49b216b36 fix(queryer): restrict polymorphic bounds compiler to forward edges only
Resolves a query compilation bug in JSPG where reverse/incoming polymorphic
edges (where edge.forward == false, e.g. pet ➡️ cover_attachment) mistakenly
appended the destination type constraint to the parent query's WHERE clause
(e.g., producing `entity_1.type = 'attachment'` on a pet entity query,
causing it to match 0 rows and return null).

- Modifies `compile_polymorphic_bounds` in `compiler.rs` to only compile
  type checks when `edge.forward` is true. For reverse edges, the parent's
  type check does not belong on the parent table and is already implicitly
  restricted by parent ID joins.
- Updates the `fk_attachment_attachable_entity` relation in the queryer test
  fixture to correctly model a two-column polymorphic relation, ensuring
  this code path is exercised by the unit test suite.
2026-07-14 16:02:41 -04:00
13b28387c2 doc update 2026-07-09 20:47:59 -04:00
4 changed files with 7 additions and 10 deletions

View File

@ -240,6 +240,7 @@ For example, given a general `attachment` table containing a `kind` column (e.g.
"type": "attachment", "type": "attachment",
"properties": { "properties": {
"kind": { "kind": {
"type": "string",
"const": "cover" "const": "cover"
} }
} }
@ -252,10 +253,7 @@ A parent entity can then define a relationship using this constrained schema und
"cover_attachment": { "cover_attachment": {
"properties": { "properties": {
"cover_attachment": { "cover_attachment": {
"type": [ "type": "cover.attachment"
"cover.attachment",
"null"
]
} }
} }
} }

View File

@ -2461,11 +2461,13 @@
"constraint": "fk_attachment_attachable_entity", "constraint": "fk_attachment_attachable_entity",
"source_type": "attachment", "source_type": "attachment",
"source_columns": [ "source_columns": [
"attachable_id" "attachable_id",
"attachable_type"
], ],
"destination_type": "entity", "destination_type": "entity",
"destination_columns": [ "destination_columns": [
"id" "id",
"type"
], ],
"prefix": "attachable" "prefix": "attachable"
} }

View File

@ -621,9 +621,6 @@ impl<'a> Compiler<'a> {
if edge.forward && relation.source_columns.len() > 1 { if edge.forward && relation.source_columns.len() > 1 {
poly_col = Some(&relation.source_columns[1]); // e.g., target_type poly_col = Some(&relation.source_columns[1]); // e.g., target_type
table_to_alias = &relation.source_type; // e.g., relationship table_to_alias = &relation.source_type; // e.g., relationship
} else if !edge.forward && relation.destination_columns.len() > 1 {
poly_col = Some(&relation.destination_columns[1]); // e.g., source_type
table_to_alias = &relation.destination_type; // e.g., relationship
} }
if let Some(col) = poly_col { if let Some(col) = poly_col {

View File

@ -1 +1 @@
1.0.179 1.0.180