Compare commits

..

7 Commits

Author SHA1 Message Date
95600551a7 version: 1.0.172 2026-07-07 12:45:00 -04:00
c18a8c1561 remove icon from sidebar 2026-07-07 12:44:49 -04:00
8ed588ca61 version: 1.0.171 2026-07-07 12:42:56 -04:00
edd0dd4763 jspg cleanup 2026-07-07 12:42:05 -04:00
abf1d12e43 test: mock matcher understands UNION existence reads; revive dead update-path mocks
parse_and_match_mocks matched mock.type against only the first FROM table —
always 'entity' for hierarchy existence reads — so every merger update-case
mock was silently inert and those cases snapshotted the create path. Now each
UNION arm is matched independently (a mock matching any arm returns once,
mirroring UNION dedup) and the type check accepts any FROM/JOIN table.

Regenerated the five revived cases (their snapshots now show real update /
no-op replace / archive semantics) and added the two previously untestable
probe-disagreement cases: same-row dedup (updates, no error) and id-vs-lookup
conflict (TOO_MANY_LOOKUP_ROWS).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:21 -04:00
a885713563 version: 1.0.170 2026-07-06 13:05:16 -04:00
d9b4f417f6 merger existence read: UNION the id and lk-lookup probes instead of OR-ing them across the hierarchy join — the OR is un-indexable and full-scans the subtype table on every child merge (one scan per relationship-edge write; surfaced by Castleberry onboarding); each UNION arm uses its own index (pk / lk_) and dedup preserves TOO_MANY_LOOKUP_ROWS semantics
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 20:52:29 -04:00
31 changed files with 547 additions and 627 deletions

View File

@ -72,8 +72,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"limit": "1",
"count": "0"
"count": "0",
"limit": "1"
},
"details": {
"path": "",
@ -177,8 +177,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"limit": "1",
"count": "0"
"count": "0",
"limit": "1"
},
"details": {
"path": "",
@ -227,8 +227,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"count": "0",
"limit": "1"
"limit": "1",
"count": "0"
},
"details": {
"path": "",
@ -268,8 +268,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"count": "0",
"limit": "1"
"limit": "1",
"count": "0"
},
"details": {
"path": "",
@ -384,8 +384,8 @@
{
"code": "MULTIPLE_OF_VIOLATED",
"values": {
"value": "9",
"multiple_of": "2"
"multiple_of": "2",
"value": "9"
},
"details": {
"path": "2",
@ -443,8 +443,8 @@
{
"code": "MULTIPLE_OF_VIOLATED",
"values": {
"multiple_of": "2",
"value": "5"
"value": "5",
"multiple_of": "2"
},
"details": {
"path": "1",

View File

@ -62,8 +62,8 @@
"code": "EDGE_MISSING",
"values": {
"parent_type": "org",
"child_type": "user",
"property_name": "missing_users"
"property_name": "missing_users",
"child_type": "user"
},
"details": {
"path": "full.org/missing_users",
@ -151,9 +151,9 @@
{
"code": "EDGE_MISSING",
"values": {
"property_name": "children",
"child_type": "child",
"parent_type": "parent",
"child_type": "child"
"property_name": "children"
},
"details": {
"path": "full.parent/children",
@ -254,9 +254,9 @@
{
"code": "AMBIGUOUS_TYPE_RELATIONS",
"values": {
"parent_type": "invoice",
"child_type": "activity",
"property_name": "activities",
"parent_type": "invoice"
"property_name": "activities"
},
"details": {
"path": "full.invoice/activities",
@ -390,9 +390,9 @@
{
"code": "AMBIGUOUS_TYPE_RELATIONS",
"values": {
"property_name": "ambiguous_edge",
"parent_type": "actor",
"child_type": "junction",
"parent_type": "actor"
"property_name": "ambiguous_edge"
},
"details": {
"path": "full.actor/ambiguous_edge",
@ -470,8 +470,8 @@
{
"code": "DATABASE_TYPE_PARSE_FAILED",
"values": {
"type": "failure",
"reason": "invalid type: sequence, expected a string"
"reason": "invalid type: sequence, expected a string",
"type": "failure"
},
"details": {
"context": "failure"

View File

@ -65,8 +65,8 @@
{
"code": "DEPENDENCY_MISSING",
"values": {
"required_property": "foo",
"property_name": "bar"
"property_name": "bar",
"required_property": "foo"
},
"details": {
"path": "",
@ -276,8 +276,8 @@
{
"code": "DEPENDENCY_MISSING",
"values": {
"required_property": "foo",
"property_name": "quux"
"property_name": "quux",
"required_property": "foo"
},
"details": {
"path": "",
@ -287,8 +287,8 @@
{
"code": "DEPENDENCY_MISSING",
"values": {
"required_property": "bar",
"property_name": "quux"
"property_name": "quux",
"required_property": "bar"
},
"details": {
"path": "",
@ -362,8 +362,8 @@
{
"code": "DEPENDENCY_MISSING",
"values": {
"required_property": "foo\rbar",
"property_name": "foo\nbar"
"property_name": "foo\nbar",
"required_property": "foo\rbar"
},
"details": {
"path": "",
@ -829,8 +829,8 @@
{
"code": "MIN_PROPERTIES_VIOLATED",
"values": {
"count": "2",
"limit": "4"
"limit": "4",
"count": "2"
},
"details": {
"path": "",

View File

@ -128,8 +128,8 @@
{
"code": "PATTERN_VIOLATED",
"values": {
"value": "abcd",
"pattern": "^[a-z]{3}$"
"pattern": "^[a-z]{3}$",
"value": "abcd"
},
"details": {
"path": "keys/abcd",

View File

@ -56,8 +56,8 @@
{
"code": "EXCLUSIVE_MAXIMUM_VIOLATED",
"values": {
"limit": "3",
"value": "3.5"
"value": "3.5",
"limit": "3"
},
"details": {
"path": "",

View File

@ -34,8 +34,8 @@
{
"code": "EXCLUSIVE_MINIMUM_VIOLATED",
"values": {
"value": "1.1",
"limit": "1.1"
"limit": "1.1",
"value": "1.1"
},
"details": {
"path": "",

View File

@ -87,34 +87,6 @@
"type": "string"
}
}
},
"schedule": {
"type": [
"opening_hours",
"null"
]
}
}
},
"season": {
"type": "object",
"properties": {
"label": {
"type": "string"
}
}
},
"opening_hours": {
"type": "object",
"properties": {
"open": {
"type": "string"
},
"seasons": {
"type": "array",
"items": {
"type": "season"
}
}
}
}
@ -290,7 +262,6 @@
"uuid_field",
"tags",
"ad_hoc",
"schedule",
"$and",
"$or"
],
@ -306,7 +277,6 @@
"uuid_field",
"tags",
"ad_hoc",
"schedule",
"$and",
"$or"
],
@ -328,7 +298,6 @@
"uuid_field",
"tags",
"ad_hoc",
"schedule",
"$and",
"$or"
],
@ -397,12 +366,6 @@
"string.condition",
"null"
]
},
"schedule": {
"type": [
"opening_hours.filter",
"null"
]
}
},
"type": "filter"
@ -520,63 +483,7 @@
]
}
}
},
"opening_hours": {},
"season": {},
"opening_hours.filter": {
"type": "filter",
"compiledPropertyNames": [
"open",
"seasons",
"$and",
"$or"
],
"properties": {
"open": {
"type": [
"string.condition",
"null"
]
},
"seasons": {
"type": [
"season.filter",
"null"
]
},
"$and": {
"type": [
"array",
"null"
],
"items": {
"type": "opening_hours.filter",
"compiledPropertyNames": [
"open",
"seasons",
"$and",
"$or"
]
}
},
"$or": {
"type": [
"array",
"null"
],
"items": {
"type": "opening_hours.filter",
"compiledPropertyNames": [
"open",
"seasons",
"$and",
"$or"
]
}
}
}
},
"season.filter": {}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -70,8 +70,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"limit": "1",
"count": "0"
"count": "0",
"limit": "1"
},
"details": {
"path": "",
@ -144,8 +144,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"count": "2",
"limit": "1"
"limit": "1",
"count": "2"
},
"details": {
"path": "",

View File

@ -43,8 +43,8 @@
{
"code": "MAX_LENGTH_VIOLATED",
"values": {
"count": "3",
"limit": "2"
"limit": "2",
"count": "3"
},
"details": {
"path": "",
@ -109,8 +109,8 @@
{
"code": "MAX_LENGTH_VIOLATED",
"values": {
"count": "3",
"limit": "2"
"limit": "2",
"count": "3"
},
"details": {
"path": "",

View File

@ -139,8 +139,8 @@
{
"code": "MAX_PROPERTIES_VIOLATED",
"values": {
"count": "3",
"limit": "2"
"limit": "2",
"count": "3"
},
"details": {
"path": "",
@ -190,8 +190,8 @@
{
"code": "MAX_PROPERTIES_VIOLATED",
"values": {
"count": "1",
"limit": "0"
"limit": "0",
"count": "1"
},
"details": {
"path": "",
@ -234,8 +234,8 @@
{
"code": "MAX_PROPERTIES_VIOLATED",
"values": {
"limit": "2",
"count": "3"
"count": "3",
"limit": "2"
},
"details": {
"path": "",

View File

@ -43,8 +43,8 @@
{
"code": "MAXIMUM_VIOLATED",
"values": {
"limit": "3",
"value": "3.5"
"value": "3.5",
"limit": "3"
},
"details": {
"path": "",
@ -118,8 +118,8 @@
{
"code": "MAXIMUM_VIOLATED",
"values": {
"value": "300.5",
"limit": "300"
"limit": "300",
"value": "300.5"
},
"details": {
"path": "",

View File

@ -264,8 +264,8 @@
{
"code": "DEPENDENCY_MISSING",
"values": {
"required_property": "child_dep",
"property_name": "trigger"
"property_name": "trigger",
"required_property": "child_dep"
},
"details": {
"path": "",

View File

@ -1310,9 +1310,9 @@
[
"(SELECT to_jsonb(t1.*) || to_jsonb(t2.*) || to_jsonb(t3.*) || to_jsonb(t4.*)",
"FROM agreego.\"entity\" t1",
"JOIN agreego.\"organization\" t2 ON ",
"JOIN agreego.\"user\" t3 ON ",
"JOIN agreego.\"person\" t4 ON ",
"LEFT JOIN agreego.\"organization\" t2 ON t2.id = t1.id",
"LEFT JOIN agreego.\"user\" t3 ON t3.id = t1.id",
"LEFT JOIN agreego.\"person\" t4 ON t4.id = t1.id",
"WHERE",
" (\"first_name\" = 'LookupFirst'",
" AND \"last_name\" = 'LookupLast'",
@ -1463,12 +1463,18 @@
[
"(SELECT to_jsonb(t1.*) || to_jsonb(t2.*) || to_jsonb(t3.*) || to_jsonb(t4.*)",
"FROM agreego.\"entity\" t1",
"JOIN agreego.\"organization\" t2 ON ",
"JOIN agreego.\"user\" t3 ON ",
"JOIN agreego.\"person\" t4 ON ",
"LEFT JOIN agreego.\"organization\" t2 ON t2.id = t1.id",
"LEFT JOIN agreego.\"user\" t3 ON t3.id = t1.id",
"LEFT JOIN agreego.\"person\" t4 ON t4.id = t1.id",
"WHERE",
" t1.id = '{{uuid:data.id}}'",
" OR (\"first_name\" = 'LookupFirst'",
"UNION SELECT to_jsonb(t1.*) || to_jsonb(t2.*) || to_jsonb(t3.*) || to_jsonb(t4.*)",
"FROM agreego.\"entity\" t1",
"LEFT JOIN agreego.\"organization\" t2 ON t2.id = t1.id",
"LEFT JOIN agreego.\"user\" t3 ON t3.id = t1.id",
"LEFT JOIN agreego.\"person\" t4 ON t4.id = t1.id",
"WHERE",
" (\"first_name\" = 'LookupFirst'",
" AND \"last_name\" = 'LookupLast'",
" AND \"date_of_birth\" = '{{timestamp}}'",
" AND \"pronouns\" = 'they/them'))"
@ -1616,12 +1622,18 @@
[
"(SELECT to_jsonb(t1.*) || to_jsonb(t2.*) || to_jsonb(t3.*) || to_jsonb(t4.*)",
"FROM agreego.\"entity\" t1",
"JOIN agreego.\"organization\" t2 ON ",
"JOIN agreego.\"user\" t3 ON ",
"JOIN agreego.\"person\" t4 ON ",
"LEFT JOIN agreego.\"organization\" t2 ON t2.id = t1.id",
"LEFT JOIN agreego.\"user\" t3 ON t3.id = t1.id",
"LEFT JOIN agreego.\"person\" t4 ON t4.id = t1.id",
"WHERE",
" t1.id = '{{uuid:data.id}}'",
" OR (\"first_name\" = 'LookupFirst'",
"UNION SELECT to_jsonb(t1.*) || to_jsonb(t2.*) || to_jsonb(t3.*) || to_jsonb(t4.*)",
"FROM agreego.\"entity\" t1",
"LEFT JOIN agreego.\"organization\" t2 ON t2.id = t1.id",
"LEFT JOIN agreego.\"user\" t3 ON t3.id = t1.id",
"LEFT JOIN agreego.\"person\" t4 ON t4.id = t1.id",
"WHERE",
" (\"first_name\" = 'LookupFirst'",
" AND \"last_name\" = 'LookupLast'",
" AND \"date_of_birth\" = '{{timestamp}}'",
" AND \"pronouns\" = 'they/them'))"
@ -1759,9 +1771,9 @@
[
"(SELECT to_jsonb(t1.*) || to_jsonb(t2.*) || to_jsonb(t3.*) || to_jsonb(t4.*)",
"FROM agreego.\"entity\" t1",
"JOIN agreego.\"organization\" t2 ON ",
"JOIN agreego.\"user\" t3 ON ",
"JOIN agreego.\"person\" t4 ON ",
"LEFT JOIN agreego.\"organization\" t2 ON t2.id = t1.id",
"LEFT JOIN agreego.\"user\" t3 ON t3.id = t1.id",
"LEFT JOIN agreego.\"person\" t4 ON t4.id = t1.id",
"WHERE",
" t1.id = '{{uuid:mocks.0.id}}')"
],
@ -1882,9 +1894,9 @@
[
"(SELECT to_jsonb(t1.*) || to_jsonb(t2.*) || to_jsonb(t3.*) || to_jsonb(t4.*)",
"FROM agreego.\"entity\" t1",
"JOIN agreego.\"organization\" t2 ON ",
"JOIN agreego.\"user\" t3 ON ",
"JOIN agreego.\"person\" t4 ON ",
"LEFT JOIN agreego.\"organization\" t2 ON t2.id = t1.id",
"LEFT JOIN agreego.\"user\" t3 ON t3.id = t1.id",
"LEFT JOIN agreego.\"person\" t4 ON t4.id = t1.id",
"WHERE",
" t1.id = '123')"
],
@ -2221,10 +2233,14 @@
[
"(SELECT to_jsonb(t1.*) || to_jsonb(t2.*)",
"FROM agreego.\"entity\" t1",
"JOIN agreego.\"order\" t2 ON ",
"LEFT JOIN agreego.\"order\" t2 ON t2.id = t1.id",
"WHERE",
" t1.id = 'abc'",
" OR (\"id\" = 'abc'))"
"UNION SELECT to_jsonb(t1.*) || to_jsonb(t2.*)",
"FROM agreego.\"entity\" t1",
"LEFT JOIN agreego.\"order\" t2 ON t2.id = t1.id",
"WHERE",
" (\"id\" = 'abc'))"
],
[
"INSERT INTO agreego.\"entity\" (",
@ -3024,9 +3040,9 @@
[
"(SELECT to_jsonb(t1.*) || to_jsonb(t2.*) || to_jsonb(t3.*) || to_jsonb(t4.*)",
"FROM agreego.\"entity\" t1",
"JOIN agreego.\"organization\" t2 ON ",
"JOIN agreego.\"user\" t3 ON ",
"JOIN agreego.\"person\" t4 ON ",
"LEFT JOIN agreego.\"organization\" t2 ON t2.id = t1.id",
"LEFT JOIN agreego.\"user\" t3 ON t3.id = t1.id",
"LEFT JOIN agreego.\"person\" t4 ON t4.id = t1.id",
"WHERE",
" t1.id = 'abc-archived')"
],
@ -3377,7 +3393,7 @@
[
"(SELECT to_jsonb(t1.*) || to_jsonb(t2.*)",
"FROM agreego.\"entity\" t1",
"JOIN agreego.\"order_line\" t2 ON ",
"LEFT JOIN agreego.\"order_line\" t2 ON t2.id = t1.id",
"WHERE",
" t1.id = '{{uuid:data.lines.0.id}}')"
],
@ -3501,10 +3517,14 @@
[
"(SELECT to_jsonb(t1.*) || to_jsonb(t2.*)",
"FROM agreego.\"entity\" t1",
"JOIN agreego.\"invoice\" t2 ON ",
"LEFT JOIN agreego.\"invoice\" t2 ON t2.id = t1.id",
"WHERE",
" t1.id = '{{uuid:data.id}}'",
" OR (\"id\" = '{{uuid:data.id}}'))"
"UNION SELECT to_jsonb(t1.*) || to_jsonb(t2.*)",
"FROM agreego.\"entity\" t1",
"LEFT JOIN agreego.\"invoice\" t2 ON t2.id = t1.id",
"WHERE",
" (\"id\" = '{{uuid:data.id}}'))"
],
[
"INSERT INTO agreego.\"entity\" (",
@ -3618,7 +3638,7 @@
[
"(SELECT to_jsonb(t1.*) || to_jsonb(t2.*)",
"FROM agreego.\"entity\" t1",
"JOIN agreego.\"account\" t2 ON ",
"LEFT JOIN agreego.\"account\" t2 ON t2.id = t1.id",
"WHERE",
" t1.id = '{{uuid:data.id}}')"
],

View File

@ -67,8 +67,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"limit": "1",
"count": "0"
"count": "0",
"limit": "1"
},
"details": {
"path": "",
@ -91,8 +91,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"limit": "1",
"count": "0"
"count": "0",
"limit": "1"
},
"details": {
"path": "",
@ -218,8 +218,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"limit": "2",
"count": "1"
"count": "1",
"limit": "2"
},
"details": {
"path": "",
@ -357,8 +357,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"count": "0",
"limit": "2"
"limit": "2",
"count": "0"
},
"details": {
"path": "",
@ -381,8 +381,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"limit": "2",
"count": "1"
"count": "1",
"limit": "2"
},
"details": {
"path": "",
@ -407,8 +407,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"limit": "2",
"count": "3"
"count": "3",
"limit": "2"
},
"details": {
"path": "",
@ -463,8 +463,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"count": "0",
"limit": "3"
"limit": "3",
"count": "0"
},
"details": {
"path": "",
@ -487,8 +487,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"count": "1",
"limit": "3"
"limit": "3",
"count": "1"
},
"details": {
"path": "",
@ -513,8 +513,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"count": "3",
"limit": "1"
"limit": "1",
"count": "3"
},
"details": {
"path": "",
@ -538,8 +538,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"limit": "3",
"count": "2"
"count": "2",
"limit": "3"
},
"details": {
"path": "",
@ -549,8 +549,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"limit": "1",
"count": "2"
"count": "2",
"limit": "1"
},
"details": {
"path": "",
@ -657,8 +657,8 @@
{
"code": "CONTAINS_VIOLATED",
"values": {
"count": "2",
"limit": "1"
"limit": "1",
"count": "2"
},
"details": {
"path": "",

View File

@ -48,8 +48,8 @@
{
"code": "MIN_ITEMS_VIOLATED",
"values": {
"limit": "1",
"count": "0"
"count": "0",
"limit": "1"
},
"details": {
"path": "",
@ -108,8 +108,8 @@
{
"code": "MIN_ITEMS_VIOLATED",
"values": {
"count": "0",
"limit": "1"
"limit": "1",
"count": "0"
},
"details": {
"path": "",

View File

@ -43,8 +43,8 @@
{
"code": "MINIMUM_VIOLATED",
"values": {
"value": "0.6",
"limit": "1.1"
"limit": "1.1",
"value": "0.6"
},
"details": {
"path": "",
@ -127,8 +127,8 @@
{
"code": "MINIMUM_VIOLATED",
"values": {
"value": "-2.0001",
"limit": "-2"
"limit": "-2",
"value": "-2.0001"
},
"details": {
"path": "",

View File

@ -100,8 +100,8 @@
{
"code": "MULTIPLE_OF_VIOLATED",
"values": {
"multiple_of": "1.5",
"value": "35"
"value": "35",
"multiple_of": "1.5"
},
"details": {
"path": "",
@ -148,8 +148,8 @@
{
"code": "MULTIPLE_OF_VIOLATED",
"values": {
"value": "0.00751",
"multiple_of": "0.0001"
"multiple_of": "0.0001",
"value": "0.00751"
},
"details": {
"path": "",

View File

@ -156,8 +156,8 @@
{
"code": "MAXIMUM_VIOLATED",
"values": {
"value": "60",
"limit": "50"
"limit": "50",
"value": "60"
},
"details": {
"path": "max",

View File

@ -34,8 +34,8 @@
{
"code": "PATTERN_VIOLATED",
"values": {
"pattern": "^a*$",
"value": "abc"
"value": "abc",
"pattern": "^a*$"
},
"details": {
"path": "",

View File

@ -148,8 +148,8 @@
{
"code": "NO_FAMILY_MATCH",
"values": {
"discriminator": "type",
"value": "alien"
"value": "alien",
"discriminator": "type"
},
"details": {
"path": "",
@ -284,8 +284,8 @@
{
"code": "NO_FAMILY_MATCH",
"values": {
"discriminator": "type",
"value": "bot"
"value": "bot",
"discriminator": "type"
},
"details": {
"path": "",

View File

@ -43,8 +43,8 @@
{
"code": "MAX_LENGTH_VIOLATED",
"values": {
"limit": "3",
"count": "6"
"count": "6",
"limit": "3"
},
"details": {
"path": "",
@ -431,8 +431,8 @@
{
"code": "MAX_LENGTH_VIOLATED",
"values": {
"count": "6",
"limit": "3"
"limit": "3",
"count": "6"
},
"details": {
"path": "",

View File

@ -1293,8 +1293,8 @@
" 'age', person_3.age",
" )",
" FROM agreego.entity entity_1",
" JOIN agreego.organization organization_2 ON organization_2.id = entity_1.id",
" JOIN agreego.person person_3 ON person_3.id = organization_2.id",
" JOIN agreego.organization organization_2",
" JOIN agreego.person person_3",
" WHERE",
" NOT entity_1.archived",
"))))"
@ -1336,15 +1336,15 @@
" 'number', phone_number_8.number",
" )",
" FROM agreego.entity entity_7",
" JOIN agreego.phone_number phone_number_8 ON phone_number_8.id = entity_7.id",
" JOIN agreego.phone_number phone_number_8",
" WHERE",
" NOT entity_7.archived",
" AND relationship_5.target_id = entity_7.id",
" )",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_4",
" JOIN agreego.relationship relationship_5 ON relationship_5.id = entity_4.id",
" JOIN agreego.contact contact_6 ON contact_6.id = relationship_5.id",
" JOIN agreego.relationship relationship_5",
" JOIN agreego.contact contact_6",
" WHERE",
" NOT entity_4.archived",
" AND relationship_5.target_type = 'phone_number'",
@ -1366,15 +1366,15 @@
" 'address', email_address_13.address",
" )",
" FROM agreego.entity entity_12",
" JOIN agreego.email_address email_address_13 ON email_address_13.id = entity_12.id",
" JOIN agreego.email_address email_address_13",
" WHERE",
" NOT entity_12.archived",
" AND relationship_10.target_id = entity_12.id",
" )",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_9",
" JOIN agreego.relationship relationship_10 ON relationship_10.id = entity_9.id",
" JOIN agreego.contact contact_11 ON contact_11.id = relationship_10.id",
" JOIN agreego.relationship relationship_10",
" JOIN agreego.contact contact_11",
" WHERE",
" NOT entity_9.archived",
" AND relationship_10.target_type = 'email_address'",
@ -1396,15 +1396,15 @@
" 'city', address_18.city",
" )",
" FROM agreego.entity entity_17",
" JOIN agreego.address address_18 ON address_18.id = entity_17.id",
" JOIN agreego.address address_18",
" WHERE",
" NOT entity_17.archived",
" AND relationship_15.target_id = entity_17.id",
" )",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_14",
" JOIN agreego.relationship relationship_15 ON relationship_15.id = entity_14.id",
" JOIN agreego.contact contact_16 ON contact_16.id = relationship_15.id",
" JOIN agreego.relationship relationship_15",
" JOIN agreego.contact contact_16",
" WHERE",
" NOT entity_14.archived",
" AND relationship_15.target_type = 'address'",
@ -1427,7 +1427,7 @@
" 'number', phone_number_23.number",
" )",
" FROM agreego.entity entity_22",
" JOIN agreego.phone_number phone_number_23 ON phone_number_23.id = entity_22.id",
" JOIN agreego.phone_number phone_number_23",
" WHERE",
" NOT entity_22.archived",
" AND relationship_20.target_id = entity_22.id",
@ -1441,7 +1441,7 @@
" 'address', email_address_25.address",
" )",
" FROM agreego.entity entity_24",
" JOIN agreego.email_address email_address_25 ON email_address_25.id = entity_24.id",
" JOIN agreego.email_address email_address_25",
" WHERE",
" NOT entity_24.archived",
" AND relationship_20.target_id = entity_24.id",
@ -1455,7 +1455,7 @@
" 'city', address_27.city",
" )",
" FROM agreego.entity entity_26",
" JOIN agreego.address address_27 ON address_27.id = entity_26.id",
" JOIN agreego.address address_27",
" WHERE",
" NOT entity_26.archived",
" AND relationship_20.target_id = entity_26.id",
@ -1464,16 +1464,16 @@
" END",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_19",
" JOIN agreego.relationship relationship_20 ON relationship_20.id = entity_19.id",
" JOIN agreego.contact contact_21 ON contact_21.id = relationship_20.id",
" JOIN agreego.relationship relationship_20",
" JOIN agreego.contact contact_21",
" WHERE",
" NOT entity_19.archived",
" AND relationship_20.source_id = entity_1.id",
" )",
" )",
" FROM agreego.entity entity_1",
" JOIN agreego.organization organization_2 ON organization_2.id = entity_1.id",
" JOIN agreego.person person_3 ON person_3.id = organization_2.id",
" JOIN agreego.organization organization_2",
" JOIN agreego.person person_3",
" WHERE",
" NOT entity_1.archived",
"))))"
@ -1586,7 +1586,7 @@
" 'number', phone_number_8.number",
" )",
" FROM agreego.entity entity_7",
" JOIN agreego.phone_number phone_number_8 ON phone_number_8.id = entity_7.id",
" JOIN agreego.phone_number phone_number_8",
" WHERE",
" NOT entity_7.archived",
" AND phone_number_8.number ILIKE $32 #>> '{}'",
@ -1594,8 +1594,8 @@
" )",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_4",
" JOIN agreego.relationship relationship_5 ON relationship_5.id = entity_4.id",
" JOIN agreego.contact contact_6 ON contact_6.id = relationship_5.id",
" JOIN agreego.relationship relationship_5",
" JOIN agreego.contact contact_6",
" WHERE",
" NOT entity_4.archived",
" AND relationship_5.target_type = 'phone_number'",
@ -1617,15 +1617,15 @@
" 'address', email_address_13.address",
" )",
" FROM agreego.entity entity_12",
" JOIN agreego.email_address email_address_13 ON email_address_13.id = entity_12.id",
" JOIN agreego.email_address email_address_13",
" WHERE",
" NOT entity_12.archived",
" AND relationship_10.target_id = entity_12.id",
" )",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_9",
" JOIN agreego.relationship relationship_10 ON relationship_10.id = entity_9.id",
" JOIN agreego.contact contact_11 ON contact_11.id = relationship_10.id",
" JOIN agreego.relationship relationship_10",
" JOIN agreego.contact contact_11",
" WHERE",
" NOT entity_9.archived",
" AND relationship_10.target_type = 'email_address'",
@ -1647,15 +1647,15 @@
" 'city', address_18.city",
" )",
" FROM agreego.entity entity_17",
" JOIN agreego.address address_18 ON address_18.id = entity_17.id",
" JOIN agreego.address address_18",
" WHERE",
" NOT entity_17.archived",
" AND relationship_15.target_id = entity_17.id",
" )",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_14",
" JOIN agreego.relationship relationship_15 ON relationship_15.id = entity_14.id",
" JOIN agreego.contact contact_16 ON contact_16.id = relationship_15.id",
" JOIN agreego.relationship relationship_15",
" JOIN agreego.contact contact_16",
" WHERE",
" NOT entity_14.archived",
" AND relationship_15.target_type = 'address'",
@ -1678,7 +1678,7 @@
" 'number', phone_number_23.number",
" )",
" FROM agreego.entity entity_22",
" JOIN agreego.phone_number phone_number_23 ON phone_number_23.id = entity_22.id",
" JOIN agreego.phone_number phone_number_23",
" WHERE",
" NOT entity_22.archived",
" AND relationship_20.target_id = entity_22.id",
@ -1692,7 +1692,7 @@
" 'address', email_address_25.address",
" )",
" FROM agreego.entity entity_24",
" JOIN agreego.email_address email_address_25 ON email_address_25.id = entity_24.id",
" JOIN agreego.email_address email_address_25",
" WHERE",
" NOT entity_24.archived",
" AND relationship_20.target_id = entity_24.id",
@ -1706,7 +1706,7 @@
" 'city', address_27.city",
" )",
" FROM agreego.entity entity_26",
" JOIN agreego.address address_27 ON address_27.id = entity_26.id",
" JOIN agreego.address address_27",
" WHERE",
" NOT entity_26.archived",
" AND relationship_20.target_id = entity_26.id",
@ -1715,8 +1715,8 @@
" END",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_19",
" JOIN agreego.relationship relationship_20 ON relationship_20.id = entity_19.id",
" JOIN agreego.contact contact_21 ON contact_21.id = relationship_20.id",
" JOIN agreego.relationship relationship_20",
" JOIN agreego.contact contact_21",
" WHERE",
" NOT entity_19.archived",
" AND contact_21.is_primary = ($11 #>> '{}')::BOOLEAN",
@ -1724,8 +1724,8 @@
" )",
" )",
" FROM agreego.entity entity_1",
" JOIN agreego.organization organization_2 ON organization_2.id = entity_1.id",
" JOIN agreego.person person_3 ON person_3.id = organization_2.id",
" JOIN agreego.organization organization_2",
" JOIN agreego.person person_3",
" WHERE",
" NOT entity_1.archived",
" AND person_3.age = ($1 #>> '{}')::NUMERIC",
@ -1787,15 +1787,15 @@
" 'address', email_address_5.address",
" )",
" FROM agreego.entity entity_4",
" JOIN agreego.email_address email_address_5 ON email_address_5.id = entity_4.id",
" JOIN agreego.email_address email_address_5",
" WHERE",
" NOT entity_4.archived",
" AND relationship_2.target_id = entity_4.id",
" )",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_1",
" JOIN agreego.relationship relationship_2 ON relationship_2.id = entity_1.id",
" JOIN agreego.contact contact_3 ON contact_3.id = relationship_2.id",
" JOIN agreego.relationship relationship_2",
" JOIN agreego.contact contact_3",
" WHERE",
" NOT entity_1.archived",
" AND relationship_2.target_type = 'email_address'",
@ -1832,8 +1832,8 @@
" 'age', person_5.age",
" )",
" FROM agreego.entity entity_3",
" JOIN agreego.organization organization_4 ON organization_4.id = entity_3.id",
" JOIN agreego.person person_5 ON person_5.id = organization_4.id",
" JOIN agreego.organization organization_4",
" JOIN agreego.person person_5",
" WHERE",
" NOT entity_3.archived",
" AND order_2.customer_id = person_5.id",
@ -1849,14 +1849,14 @@
" 'price', order_line_7.price",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_6",
" JOIN agreego.order_line order_line_7 ON order_line_7.id = entity_6.id",
" JOIN agreego.order_line order_line_7",
" WHERE",
" NOT entity_6.archived",
" AND order_line_7.order_id = order_2.id",
" )",
" )",
" FROM agreego.entity entity_1",
" JOIN agreego.order order_2 ON order_2.id = entity_1.id",
" JOIN agreego.order order_2",
" WHERE",
" NOT entity_1.archived",
"))))"
@ -1881,7 +1881,7 @@
" 'name', organization_2.name",
" )",
" FROM agreego.entity entity_1",
" JOIN agreego.organization organization_2 ON organization_2.id = entity_1.id",
" JOIN agreego.organization organization_2",
" WHERE",
" NOT entity_1.archived",
"))))"
@ -1910,8 +1910,8 @@
" 'role', bot_5.role",
" )",
" FROM agreego.entity entity_3",
" JOIN agreego.organization organization_4 ON organization_4.id = entity_3.id",
" JOIN agreego.bot bot_5 ON bot_5.id = organization_4.id",
" JOIN agreego.organization organization_4",
" JOIN agreego.bot bot_5",
" WHERE",
" NOT entity_3.archived",
" AND entity_3.id = entity_1.id",
@ -1925,7 +1925,7 @@
" 'name', organization_7.name",
" )",
" FROM agreego.entity entity_6",
" JOIN agreego.organization organization_7 ON organization_7.id = entity_6.id",
" JOIN agreego.organization organization_7",
" WHERE",
" NOT entity_6.archived",
" AND entity_6.id = entity_1.id",
@ -1942,8 +1942,8 @@
" 'age', person_10.age",
" )",
" FROM agreego.entity entity_8",
" JOIN agreego.organization organization_9 ON organization_9.id = entity_8.id",
" JOIN agreego.person person_10 ON person_10.id = organization_9.id",
" JOIN agreego.organization organization_9",
" JOIN agreego.person person_10",
" WHERE",
" NOT entity_8.archived",
" AND entity_8.id = entity_1.id",
@ -1951,7 +1951,7 @@
" ELSE NULL",
" END), '[]'::jsonb)",
" FROM agreego.entity entity_1",
" JOIN agreego.organization organization_2 ON organization_2.id = entity_1.id",
" JOIN agreego.organization organization_2",
" WHERE",
" NOT entity_1.archived",
"))))"
@ -1979,8 +1979,8 @@
" 'token', bot_5.token",
" )",
" FROM agreego.entity entity_3",
" JOIN agreego.organization organization_4 ON organization_4.id = entity_3.id",
" JOIN agreego.bot bot_5 ON bot_5.id = organization_4.id",
" JOIN agreego.organization organization_4",
" JOIN agreego.bot bot_5",
" WHERE",
" NOT entity_3.archived",
" AND entity_3.id = entity_1.id",
@ -1996,8 +1996,8 @@
" 'last_name', person_8.last_name",
" )",
" FROM agreego.entity entity_6",
" JOIN agreego.organization organization_7 ON organization_7.id = entity_6.id",
" JOIN agreego.person person_8 ON person_8.id = organization_7.id",
" JOIN agreego.organization organization_7",
" JOIN agreego.person person_8",
" WHERE",
" NOT entity_6.archived",
" AND entity_6.id = entity_1.id",
@ -2005,7 +2005,7 @@
" ELSE NULL",
" END",
" FROM agreego.entity entity_1",
" JOIN agreego.organization organization_2 ON organization_2.id = entity_1.id",
" JOIN agreego.organization organization_2",
" WHERE",
" NOT entity_1.archived",
"))))"
@ -2049,15 +2049,15 @@
" 'number', phone_number_10.number",
" )",
" FROM agreego.entity entity_9",
" JOIN agreego.phone_number phone_number_10 ON phone_number_10.id = entity_9.id",
" JOIN agreego.phone_number phone_number_10",
" WHERE",
" NOT entity_9.archived",
" AND relationship_7.target_id = entity_9.id",
" )",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_6",
" JOIN agreego.relationship relationship_7 ON relationship_7.id = entity_6.id",
" JOIN agreego.contact contact_8 ON contact_8.id = relationship_7.id",
" JOIN agreego.relationship relationship_7",
" JOIN agreego.contact contact_8",
" WHERE",
" NOT entity_6.archived",
" AND relationship_7.target_type = 'phone_number'",
@ -2079,15 +2079,15 @@
" 'address', email_address_15.address",
" )",
" FROM agreego.entity entity_14",
" JOIN agreego.email_address email_address_15 ON email_address_15.id = entity_14.id",
" JOIN agreego.email_address email_address_15",
" WHERE",
" NOT entity_14.archived",
" AND relationship_12.target_id = entity_14.id",
" )",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_11",
" JOIN agreego.relationship relationship_12 ON relationship_12.id = entity_11.id",
" JOIN agreego.contact contact_13 ON contact_13.id = relationship_12.id",
" JOIN agreego.relationship relationship_12",
" JOIN agreego.contact contact_13",
" WHERE",
" NOT entity_11.archived",
" AND relationship_12.target_type = 'email_address'",
@ -2109,15 +2109,15 @@
" 'city', address_20.city",
" )",
" FROM agreego.entity entity_19",
" JOIN agreego.address address_20 ON address_20.id = entity_19.id",
" JOIN agreego.address address_20",
" WHERE",
" NOT entity_19.archived",
" AND relationship_17.target_id = entity_19.id",
" )",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_16",
" JOIN agreego.relationship relationship_17 ON relationship_17.id = entity_16.id",
" JOIN agreego.contact contact_18 ON contact_18.id = relationship_17.id",
" JOIN agreego.relationship relationship_17",
" JOIN agreego.contact contact_18",
" WHERE",
" NOT entity_16.archived",
" AND relationship_17.target_type = 'address'",
@ -2140,7 +2140,7 @@
" 'number', phone_number_25.number",
" )",
" FROM agreego.entity entity_24",
" JOIN agreego.phone_number phone_number_25 ON phone_number_25.id = entity_24.id",
" JOIN agreego.phone_number phone_number_25",
" WHERE",
" NOT entity_24.archived",
" AND relationship_22.target_id = entity_24.id",
@ -2154,7 +2154,7 @@
" 'address', email_address_27.address",
" )",
" FROM agreego.entity entity_26",
" JOIN agreego.email_address email_address_27 ON email_address_27.id = entity_26.id",
" JOIN agreego.email_address email_address_27",
" WHERE",
" NOT entity_26.archived",
" AND relationship_22.target_id = entity_26.id",
@ -2168,7 +2168,7 @@
" 'city', address_29.city",
" )",
" FROM agreego.entity entity_28",
" JOIN agreego.address address_29 ON address_29.id = entity_28.id",
" JOIN agreego.address address_29",
" WHERE",
" NOT entity_28.archived",
" AND relationship_22.target_id = entity_28.id",
@ -2177,16 +2177,16 @@
" END",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_21",
" JOIN agreego.relationship relationship_22 ON relationship_22.id = entity_21.id",
" JOIN agreego.contact contact_23 ON contact_23.id = relationship_22.id",
" JOIN agreego.relationship relationship_22",
" JOIN agreego.contact contact_23",
" WHERE",
" NOT entity_21.archived",
" AND relationship_22.source_id = entity_3.id",
" )",
" )",
" FROM agreego.entity entity_3",
" JOIN agreego.organization organization_4 ON organization_4.id = entity_3.id",
" JOIN agreego.person person_5 ON person_5.id = organization_4.id",
" JOIN agreego.organization organization_4",
" JOIN agreego.person person_5",
" WHERE",
" NOT entity_3.archived",
" AND entity_3.id = entity_1.id",
@ -2194,7 +2194,7 @@
" ELSE NULL",
" END",
" FROM agreego.entity entity_1",
" JOIN agreego.organization organization_2 ON organization_2.id = entity_1.id",
" JOIN agreego.organization organization_2",
" WHERE",
" NOT entity_1.archived",
"))))"
@ -2230,15 +2230,15 @@
" 'age', person_5.age",
" )",
" FROM agreego.entity entity_3",
" JOIN agreego.organization organization_4 ON organization_4.id = entity_3.id",
" JOIN agreego.person person_5 ON person_5.id = organization_4.id",
" JOIN agreego.organization organization_4",
" JOIN agreego.person person_5",
" WHERE",
" NOT entity_3.archived",
" AND order_2.customer_id = person_5.id",
" )",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_1",
" JOIN agreego.order order_2 ON order_2.id = entity_1.id",
" JOIN agreego.order order_2",
" WHERE",
" NOT entity_1.archived",
"))))"
@ -2273,7 +2273,7 @@
" ELSE NULL",
" END), '[]'::jsonb)",
" FROM agreego.entity entity_1",
" JOIN agreego.widget widget_2 ON widget_2.id = entity_1.id",
" JOIN agreego.widget widget_2",
" WHERE",
" NOT entity_1.archived",
"))))"
@ -2306,7 +2306,7 @@
" 'price', invoice_line_4.price",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_3",
" JOIN agreego.invoice_line invoice_line_4 ON invoice_line_4.id = entity_3.id",
" JOIN agreego.invoice_line invoice_line_4",
" WHERE",
" NOT entity_3.archived",
" AND invoice_line_4.invoice_id = invoice_2.id",
@ -2317,7 +2317,7 @@
" 'metadata_nested_lines', invoice_2.metadata_nested_lines",
" )",
" FROM agreego.entity entity_1",
" JOIN agreego.invoice invoice_2 ON invoice_2.id = entity_1.id",
" JOIN agreego.invoice invoice_2",
" WHERE",
" NOT entity_1.archived",
"))))"
@ -2344,7 +2344,7 @@
" 'card_number', account_2.card_number",
" )",
" FROM agreego.entity entity_1",
" JOIN agreego.account account_2 ON account_2.id = entity_1.id",
" JOIN agreego.account account_2",
" WHERE",
" NOT entity_1.archived",
"))))"
@ -2381,8 +2381,8 @@
" 'role', bot_7.role",
" )",
" FROM agreego.entity entity_5",
" JOIN agreego.organization organization_6 ON organization_6.id = entity_5.id",
" JOIN agreego.bot bot_7 ON bot_7.id = organization_6.id",
" JOIN agreego.organization organization_6",
" JOIN agreego.bot bot_7",
" WHERE",
" NOT entity_5.archived",
" AND entity_5.id = entity_3.id",
@ -2396,7 +2396,7 @@
" 'name', organization_9.name",
" )",
" FROM agreego.entity entity_8",
" JOIN agreego.organization organization_9 ON organization_9.id = entity_8.id",
" JOIN agreego.organization organization_9",
" WHERE",
" NOT entity_8.archived",
" AND entity_8.id = entity_3.id",
@ -2413,8 +2413,8 @@
" 'age', person_12.age",
" )",
" FROM agreego.entity entity_10",
" JOIN agreego.organization organization_11 ON organization_11.id = entity_10.id",
" JOIN agreego.person person_12 ON person_12.id = organization_11.id",
" JOIN agreego.organization organization_11",
" JOIN agreego.person person_12",
" WHERE",
" NOT entity_10.archived",
" AND entity_10.id = entity_3.id",
@ -2422,14 +2422,14 @@
" ELSE NULL",
" END",
" FROM agreego.entity entity_3",
" JOIN agreego.organization organization_4 ON organization_4.id = entity_3.id",
" JOIN agreego.organization organization_4",
" WHERE",
" NOT entity_3.archived",
" AND order_2.counterparty_id = entity_3.id",
" )",
" )), '[]'::jsonb)",
" FROM agreego.entity entity_1",
" JOIN agreego.order order_2 ON order_2.id = entity_1.id",
" JOIN agreego.order order_2",
" WHERE",
" NOT entity_1.archived",
" AND order_2.counterparty_type IN ('bot', 'organization', 'person')",

View File

@ -139,8 +139,8 @@
{
"code": "MAX_LENGTH_VIOLATED",
"values": {
"count": "26",
"limit": "5"
"limit": "5",
"count": "26"
},
"details": {
"path": "email",

2
flows

Submodule flows updated: 0d9bd8644e...89748a246e

View File

@ -165,20 +165,8 @@ impl Schema {
} else if db.enums.contains_key(custom) {
Some(vec![format!("{}.condition", custom)])
} else {
// A named type gets a reference to its dynamically built .filter — either a
// Relational cross-boundary (table-backed) or a named value type, whose filter
// is likewise synthesized (see Database::compile_filters). A named type with no
// compilable structure gets no filter — omit it rather than dangle a reference.
let base = custom.split('.').next_back().unwrap_or(custom);
let has_value_filter = db
.schemas
.get(custom)
.map_or(false, |s| Database::is_value_filter_candidate(custom, s));
if db.types.contains_key(base) || has_value_filter {
// Assume anything else is a Relational cross-boundary that already has its own .filter dynamically built
Some(vec![format!("{}.filter", custom)])
} else {
None
}
}
}
}

View File

@ -262,23 +262,15 @@ impl Database {
}
}
/// Synthesizes Composed Filter References for all table-backed boundaries — and for
/// named non-table value types (schema-only objects, e.g. an operating-hours config),
/// so a property reference resolves to ONE named filter instead of inlining anonymous
/// per-path copies (which duplicate identical leaf type names for downstream codegen).
/// Synthesizes Composed Filter References for all table-backed boundaries.
fn compile_filters(&mut self, errors: &mut Vec<crate::drop::Error>) -> Vec<(String, String)> {
let mut filter_schemas = Vec::new();
let mut seen_value_ids = std::collections::HashSet::new();
for (type_name, type_def) in &self.types {
for (id, schema_arc) in &type_def.schemas {
// Run synthesis on structured table-backed boundaries and named value types.
// Exclude subschemas!
// Only run synthesis on actual structured, table-backed boundaries. Exclude subschemas!
let base_name = id.split('.').last().unwrap_or(id);
let is_table_backed = base_name == type_def.name;
let is_value_type = !is_table_backed
&& Self::is_value_filter_candidate(id, schema_arc)
&& seen_value_ids.insert(id.clone());
if (is_table_backed || is_value_type) && !id.contains('/') {
if is_table_backed && !id.contains('/') {
if let Some(filter_schema) = schema_arc.compile_filter(self, id, errors) {
filter_schemas.push((
type_name.clone(),
@ -301,20 +293,6 @@ impl Database {
filter_ids
}
/// A named non-table value type that earns its own synthesized filter: a bare-named
/// (dotless) schema-only object with compiled properties. The base `filter`/`condition`
/// schemas are infrastructure, not value types.
pub fn is_value_filter_candidate(id: &str, schema: &Arc<Schema>) -> bool {
!id.contains('.')
&& id != "filter"
&& id != "condition"
&& schema
.obj
.compiled_properties
.get()
.map_or(false, |props| !props.is_empty())
}
/// Synthesizes strong Enum Conditions mirroring the string.condition capabilities.
fn compile_conditions(&mut self) -> Vec<(String, String)> {
let mut enum_conditions = Vec::new();

View File

@ -28,6 +28,4 @@ pub struct Sidebar {
pub category: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub icon: Option<String>,
}

View File

@ -744,9 +744,15 @@ impl Merger {
return Ok(None);
}
let where_clause = format!("WHERE {}", where_parts.join(" OR "));
let final_sql = format!("{} {}", fetch_sql_template, where_clause);
let final_sql = if where_parts.len() == 1 {
format!("{} WHERE {}", fetch_sql_template, where_parts[0])
} else {
where_parts
.iter()
.map(|p| format!("{} WHERE {}", fetch_sql_template, p))
.collect::<Vec<_>>()
.join(" UNION ")
};
let fetched = match self.db.query(&final_sql, None) {
Ok(Value::Array(table)) => {

View File

@ -179,14 +179,35 @@ impl SqlFormatter {
}
fn format_query(&mut self, query: &Query) {
match &*query.body {
self.format_set_expr(&query.body);
}
fn format_set_expr(&mut self, set_expr: &SetExpr) {
match set_expr {
SetExpr::Select(select) => self.format_select(select),
SetExpr::Query(inner_query) => {
self.push_str("(");
self.format_query(inner_query);
self.push_str(")");
}
_ => self.push_str(&query.to_string()),
SetExpr::SetOperation { op, left, right, set_quantifier } => {
self.format_set_expr(left);
let op_str = match op {
sqlparser::ast::SetOperator::Union => "UNION",
sqlparser::ast::SetOperator::Intersect => "INTERSECT",
sqlparser::ast::SetOperator::Except => "EXCEPT",
_ => "UNION",
};
let quant_str = match set_quantifier {
sqlparser::ast::SetQuantifier::All => " ALL",
sqlparser::ast::SetQuantifier::Distinct => " DISTINCT",
sqlparser::ast::SetQuantifier::None => "",
_ => "",
};
self.push_line(&format!("{}{} ", op_str, quant_str));
self.format_set_expr(right);
}
_ => self.push_str(&set_expr.to_string()),
}
}
@ -236,20 +257,22 @@ impl SqlFormatter {
}
fn format_join(&mut self, join: &Join) {
let op = match &join.join_operator {
let op_str = match &join.join_operator {
JoinOperator::Inner(_) => "JOIN",
JoinOperator::LeftOuter(_) => "LEFT JOIN",
JoinOperator::Left(_) => "LEFT JOIN",
JoinOperator::Right(_) => "RIGHT JOIN",
_ => "JOIN",
};
self.push_str(&format!("{} {} ON ", op, join.relation));
self.push_str(&format!("{} {}", op_str, join.relation));
match &join.join_operator {
JoinOperator::Inner(JoinConstraint::On(expr)) => self.format_expr(expr),
JoinOperator::LeftOuter(JoinConstraint::On(expr)) => self.format_expr(expr),
JoinOperator::Join(JoinConstraint::On(expr)) => self.format_expr(expr),
_ => {
println!("FALLBACK JOIN OP: {:?}", join.join_operator);
JoinOperator::Inner(JoinConstraint::On(expr))
| JoinOperator::Left(JoinConstraint::On(expr))
| JoinOperator::Right(JoinConstraint::On(expr)) => {
self.push_str(" ON ");
self.format_expr(expr);
}
_ => {}
}
}

View File

@ -1 +1 @@
1.0.169
1.0.172