diff --git a/fixtures/merger.json b/fixtures/merger.json index 8485093..3070b2b 100644 --- a/fixtures/merger.json +++ b/fixtures/merger.json @@ -606,6 +606,7 @@ " \"last_name\":\"Doe\",", " \"type\":\"person\" ", " }',", + " '{{uuid:person_1}}',", " '{{uuid}}',", " 'create',", " '{{timestamp}}',", @@ -1063,7 +1064,7 @@ " \"modified_at\":\"{{timestamp}}\",", " \"modified_by\":\"00000000-0000-0000-0000-000000000000\",", " \"order_id\":\"abc\",", - " \"price\":99.0,\",", + " \"price\":99.0,", " \"product\":\"Widget\",", " \"type\":\"order_line\"", " }", diff --git a/fixtures/queryer.json b/fixtures/queryer.json index b3723b1..8e37cc4 100644 --- a/fixtures/queryer.json +++ b/fixtures/queryer.json @@ -468,9 +468,14 @@ "success": true, "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)" + "(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)" ] ] } @@ -484,9 +489,14 @@ "success": true, "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)" + "(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)" ] ] } @@ -503,11 +513,17 @@ "success": true, "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.name ILIKE $2#>>'{}')" + "(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.name ILIKE $2#>>'{}')" ] ] } @@ -526,13 +542,19 @@ "success": true, "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.created_at = ($2#>>'{}')::timestamptz", - " AND t1_obj_t1.id = ($3#>>'{}')::UUID", - " AND t1_obj_t1.name ILIKE $4#>>'{}')" + "(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.created_at = ($2#>>'{}')::timestamptz", + " AND t1_obj_t1.id = ($3#>>'{}')::uuid", + " AND t1_obj_t1.name ILIKE $4#>>'{}')" ] ] } @@ -545,10 +567,18 @@ "success": true, "sql": [ [ - " (SELECT jsonb_build_object('age', t1_obj_t1.age, 'archived', t1_obj_t2.archived, 'created_at', t1_obj_t2.created_at, 'first_name', t1_obj_t1.first_name, 'id', t1_obj_t2.id, 'last_name', t1_obj_t1.last_name, 'name', t1_obj_t2.name, '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)" + "(SELECT jsonb_build_object(", + " 'age', t1_obj_t1.age,", + " 'archived', t1_obj_t2.archived,", + " 'created_at', t1_obj_t2.created_at,", + " 'first_name', t1_obj_t1.first_name,", + " 'id', t1_obj_t2.id,", + " 'last_name', t1_obj_t1.last_name,", + " 'name', t1_obj_t2.name,", + " '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)" ] ] } @@ -561,49 +591,118 @@ "success": true, "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)" + "(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)" ] ] } @@ -621,52 +720,122 @@ "success": true, "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_t2.archived = ($1#>>'{}')::boolean", - " AND t1_obj_t1.first_name ILIKE $2#>>'{}'", - " AND t1_obj_t1.last_name ILIKE $3#>>'{}')" + "(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_t2.archived = ($1#>>'{}')::boolean", + " AND t1_obj_t1.first_name ILIKE $2#>>'{}'", + " AND t1_obj_t1.last_name ILIKE $3#>>'{}')" ] ] } @@ -680,11 +849,17 @@ "success": true, "sql": [ [ - " (SELECT jsonb_build_object('archived', t1_obj_t3.archived, 'created_at', t1_obj_t3.created_at, 'id', t1_obj_t3.id, 'is_primary', t1_obj_t1.is_primary, 'name', t1_obj_t3.name, 'type', t1_obj_t3.type)", - " FROM agreego.contact t1_obj_t1", - " JOIN agreego.relationship t1_obj_t2 ON t1_obj_t2.id = t1_obj_t1.id", - " JOIN agreego.entity t1_obj_t3 ON t1_obj_t3.id = t1_obj_t2.id", - " WHERE NOT t1_obj_t1.archived)" + "(SELECT jsonb_build_object(", + " 'archived', t1_obj_t3.archived,", + " 'created_at', t1_obj_t3.created_at,", + " 'id', t1_obj_t3.id,", + " 'is_primary', t1_obj_t1.is_primary,", + " 'name', t1_obj_t3.name,", + " 'type', t1_obj_t3.type)", + "FROM agreego.contact t1_obj_t1", + "JOIN agreego.relationship t1_obj_t2 ON t1_obj_t2.id = t1_obj_t1.id", + "JOIN agreego.entity t1_obj_t3 ON t1_obj_t3.id = t1_obj_t2.id", + "WHERE NOT t1_obj_t1.archived)" ] ] } @@ -698,10 +873,16 @@ "success": true, "sql": [ [ - " (SELECT jsonb_build_object('archived', t1_obj_t2.archived, 'created_at', t1_obj_t2.created_at, 'id', t1_obj_t2.id, 'name', t1_obj_t2.name, 'number', t1_obj_t1.number, 'type', t1_obj_t2.type)", - " FROM agreego.phone_number t1_obj_t1", - " JOIN agreego.entity t1_obj_t2 ON t1_obj_t2.id = t1_obj_t1.id", - " WHERE NOT t1_obj_t1.archived)" + "(SELECT jsonb_build_object(", + " 'archived', t1_obj_t2.archived,", + " 'created_at', t1_obj_t2.created_at,", + " 'id', t1_obj_t2.id,", + " 'name', t1_obj_t2.name,", + " 'number', t1_obj_t1.number,", + " 'type', t1_obj_t2.type)", + "FROM agreego.phone_number t1_obj_t1", + "JOIN agreego.entity t1_obj_t2 ON t1_obj_t2.id = t1_obj_t1.id", + "WHERE NOT t1_obj_t1.archived)" ] ] } @@ -715,10 +896,16 @@ "success": true, "sql": [ [ - " (SELECT jsonb_build_object('address', t1_obj_t1.address, 'archived', t1_obj_t2.archived, 'created_at', t1_obj_t2.created_at, 'id', t1_obj_t2.id, 'name', t1_obj_t2.name, 'type', t1_obj_t2.type)", - " FROM agreego.email_address t1_obj_t1", - " JOIN agreego.entity t1_obj_t2 ON t1_obj_t2.id = t1_obj_t1.id", - " WHERE NOT t1_obj_t1.archived)" + "(SELECT jsonb_build_object(", + " 'address', t1_obj_t1.address,", + " 'archived', t1_obj_t2.archived,", + " 'created_at', t1_obj_t2.created_at,", + " 'id', t1_obj_t2.id,", + " 'name', t1_obj_t2.name,", + " 'type', t1_obj_t2.type)", + "FROM agreego.email_address t1_obj_t1", + "JOIN agreego.entity t1_obj_t2 ON t1_obj_t2.id = t1_obj_t1.id", + "WHERE NOT t1_obj_t1.archived)" ] ] } diff --git a/test_clean.rs b/test_clean.rs new file mode 100644 index 0000000..1383af7 --- /dev/null +++ b/test_clean.rs @@ -0,0 +1,20 @@ +use regex::Regex; + +fn main() { + let ws_re = Regex::new(r"\s+").unwrap(); + let clean_str = |s: &str| -> String { + let mut s = ws_re.replace_all(s, " ").into_owned(); + loop { + let last = s.clone(); + for token in ["(", ")", ",", "{", "}", "\"", "=", "'"] { + s = s.replace(&format!(" {}", token), token); + s = s.replace(&format!("{} ", token), token); + } + if s == last { break; } + } + s.trim().to_string() + }; + + let input = "INSERT INTO agreego.\"entity\" ( \"created_at\""; + println!("Expected: {}", clean_str(input)); +}