Skip to content

Commit

Permalink
fix(core): fix bulk-inserting entities with nullable embedded arrays
Browse files Browse the repository at this point in the history
  • Loading branch information
B4nan committed Mar 5, 2024
1 parent 1cbead6 commit f16551e
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 10 deletions.
2 changes: 1 addition & 1 deletion packages/knex/src/AbstractSqlDriver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -481,7 +481,7 @@ export abstract class AbstractSqlDriver<Connection extends AbstractSqlConnection
let value = row[prop.name];

if (prop.kind === ReferenceKind.EMBEDDED && prop.object) {
if (prop.array) {
if (prop.array && value) {
for (let i = 0; i < (value as Dictionary[]).length; i++) {
const item = (value as Dictionary[])[i];
value[i] = this.mapDataToFieldNames(item, false, prop.embeddedProps, options.convertCustomTypes);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`embedded entities in postgresql schema: embeddables 1 1`] = `
"create table "user" ("id" serial primary key, "email" varchar(255) not null, "address1_street" varchar(255) null, "address1_number" double precision not null, "address1_rank" real null, "address1_postal_code" varchar(255) null, "address1_city" varchar(255) null, "address1_country" varchar(255) null, "addr_street" varchar(255) null, "addr_postal_code" varchar(255) null, "addr_city" varchar(255) null, "addr_country" varchar(255) null, "street" varchar(255) null, "number" double precision not null, "rank" real null, "postal_code" varchar(255) null, "city" varchar(255) null, "country" varchar(255) null, "address4" jsonb not null, "addresses" jsonb not null, "after" int null);
"create table "user" ("id" serial primary key, "email" varchar(255) not null, "address1_street" varchar(255) null, "address1_number" double precision not null, "address1_rank" real null, "address1_postal_code" varchar(255) null, "address1_city" varchar(255) null, "address1_country" varchar(255) null, "addr_street" varchar(255) null, "addr_postal_code" varchar(255) null, "addr_city" varchar(255) null, "addr_country" varchar(255) null, "street" varchar(255) null, "number" double precision not null, "rank" real null, "postal_code" varchar(255) null, "city" varchar(255) null, "country" varchar(255) null, "address4" jsonb not null, "addresses" jsonb null, "after" int null);
alter table "user" add constraint "user_email_unique" unique ("email");
create table "foo" ("id" serial primary key, "user_id" int not null);
Expand Down
25 changes: 17 additions & 8 deletions tests/features/embeddables/embedded-entities.postgres.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@ class User {
@Embedded({ object: true })
address4: Address1 = new Address1();

@Embedded(() => Address1, { array: true })
addresses: Address1[] = [];
@Embedded(() => Address1, { array: true, nullable: true })
addresses: Address1[] | null = [];

@Property({ nullable: true })
after?: number; // property after embeddables to verify order props in resulting schema
Expand Down Expand Up @@ -188,20 +188,20 @@ describe('embedded entities in postgresql', () => {

orm.em.assign(user, { addresses: [address1] });
expect(user.addresses).toEqual([address1]);
expect(user.addresses[0]).toBeInstanceOf(Address1);
expect(user.addresses![0]).toBeInstanceOf(Address1);

orm.em.assign(user, { addresses: [address1] });
expect(user.addresses).toEqual([address1]);
expect(user.addresses[0]).toBeInstanceOf(Address1);
expect(user.addresses![0]).toBeInstanceOf(Address1);

orm.em.assign(user, { addresses: [address2] });
expect(user.addresses).toEqual([address2]);
expect(user.addresses[0]).toBeInstanceOf(Address1);
expect(user.addresses![0]).toBeInstanceOf(Address1);

orm.em.assign(user, { addresses: address1 }); // push to existing array
expect(user.addresses).toEqual([address2, address1]);
expect(user.addresses[0]).toBeInstanceOf(Address1);
expect(user.addresses[1]).toBeInstanceOf(Address1);
expect(user.addresses![0]).toBeInstanceOf(Address1);
expect(user.addresses![1]).toBeInstanceOf(Address1);
expect(user.addresses).toHaveLength(2);
});

Expand Down Expand Up @@ -491,7 +491,7 @@ describe('embedded entities in postgresql', () => {
});

test('array operators', async () => {
await createUser();
createUser();
const qb = orm.em.createQueryBuilder(User).select('*').where({
addresses: { $contains: [{ street: 'Downing street 13A' }] },
});
Expand All @@ -515,4 +515,13 @@ describe('embedded entities in postgresql', () => {
]);
});

test('nullable array property', async () => {
const user1 = createUser();
const user2 = createUser();
user1.addresses = null;
await orm.em.flush();
expect(user1.addresses).toBeNull();
expect(user2.addresses).toHaveLength(2);
});

});

0 comments on commit f16551e

Please sign in to comment.