Skip to content

Commit

Permalink
fix(core): ignore upsert with inlined embedded properties
Browse files Browse the repository at this point in the history
Closes #5500
  • Loading branch information
B4nan committed Apr 24, 2024
1 parent 508389e commit 7d2bed6
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 5 deletions.
8 changes: 5 additions & 3 deletions packages/core/src/utils/upsert-utils.ts
@@ -1,13 +1,15 @@
import type { EntityData, EntityMetadata } from '../typings';
import type { EntityData, EntityKey, EntityMetadata } from '../typings';
import type { UpsertOptions } from '../drivers/IDatabaseDriver';

/** @internal */
export function getOnConflictFields<T>(data: EntityData<T>, uniqueFields: (keyof T)[], options: UpsertOptions<T>): (keyof T)[] {
export function getOnConflictFields<T>(meta: EntityMetadata<T> | undefined, data: EntityData<T>, uniqueFields: (keyof T)[], options: UpsertOptions<T>): (keyof T)[] {
if (options.onConflictMergeFields) {
return options.onConflictMergeFields;
}

const keys = Object.keys(data).filter(f => !uniqueFields.includes(f as keyof T)) as (keyof T)[];
const keys = Object.keys(data).filter(f => {
return !uniqueFields.includes(f as keyof T) && !meta?.properties[f as EntityKey<T>]?.embeddable;
}) as (keyof T)[];

if (options.onConflictExcludeFields) {
return keys.filter(f => !options.onConflictExcludeFields!.includes(f));
Expand Down
4 changes: 2 additions & 2 deletions packages/knex/src/AbstractSqlDriver.ts
Expand Up @@ -606,7 +606,7 @@ export abstract class AbstractSqlDriver<Connection extends AbstractSqlConnection
.returning(returning);

if (!options.onConflictAction || options.onConflictAction === 'merge') {
const fields = getOnConflictFields(data, uniqueFields, options);
const fields = getOnConflictFields(meta, data, uniqueFields, options);
qb.merge(fields);
}

Expand Down Expand Up @@ -649,7 +649,7 @@ export abstract class AbstractSqlDriver<Connection extends AbstractSqlConnection
.returning(returning);

if (!options.onConflictAction || options.onConflictAction === 'merge') {
const fields = getOnConflictFields(data[0], uniqueFields, options);
const fields = getOnConflictFields(meta, data[0], uniqueFields, options);
qb.merge(fields);
}

Expand Down
11 changes: 11 additions & 0 deletions tests/features/upsert/upsert.test.ts
Expand Up @@ -519,6 +519,17 @@ describe.each(Utils.keys(options))('em.upsert [%s]', type => {
test('em.upsert(entity) with embeddable', async () => {
const testEntity = orm.em.create(FooBarWithEmbeddable, { fooBarEmbeddable: {} });

await orm.em.upsert(testEntity);
orm.em.clear();

expect(testEntity.id).toBeDefined();

await orm.em.upsert(FooBarWithEmbeddable, { id: testEntity.id, fooBarEmbeddable: {} });
});

test('em.upsertMany(entity) with embeddable', async () => {
const testEntity = orm.em.create(FooBarWithEmbeddable, { fooBarEmbeddable: {} });

await orm.em.upsert(testEntity);

expect(testEntity.id).toBeDefined();
Expand Down

0 comments on commit 7d2bed6

Please sign in to comment.