typeorm 0.3.10-dev.a1960e1 → 0.3.10-dev.de15df1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/data-source/BaseDataSourceOptions.d.ts +4 -0
- package/browser/data-source/BaseDataSourceOptions.js.map +1 -1
- package/browser/decorator/options/RelationOptions.d.ts +5 -2
- package/browser/decorator/options/RelationOptions.js.map +1 -1
- package/browser/driver/aurora-mysql/AuroraMysqlConnectionOptions.d.ts +1 -0
- package/browser/driver/aurora-mysql/AuroraMysqlConnectionOptions.js.map +1 -1
- package/browser/driver/aurora-postgres/AuroraPostgresConnectionOptions.d.ts +1 -0
- package/browser/driver/aurora-postgres/AuroraPostgresConnectionOptions.js.map +1 -1
- package/browser/driver/better-sqlite3/BetterSqlite3ConnectionOptions.d.ts +1 -0
- package/browser/driver/better-sqlite3/BetterSqlite3ConnectionOptions.js.map +1 -1
- package/browser/driver/capacitor/CapacitorConnectionOptions.d.ts +1 -0
- package/browser/driver/capacitor/CapacitorConnectionOptions.js.map +1 -1
- package/browser/driver/cockroachdb/CockroachDriver.js +1 -0
- package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
- package/browser/driver/cordova/CordovaConnectionOptions.d.ts +1 -0
- package/browser/driver/cordova/CordovaConnectionOptions.js.map +1 -1
- package/browser/driver/expo/ExpoConnectionOptions.d.ts +1 -0
- package/browser/driver/expo/ExpoConnectionOptions.js.map +1 -1
- package/browser/driver/mongodb/MongoConnectionOptions.d.ts +0 -4
- package/browser/driver/mongodb/MongoConnectionOptions.js.map +1 -1
- package/browser/driver/mysql/MysqlDriver.js +1 -1
- package/browser/driver/mysql/MysqlDriver.js.map +1 -1
- package/browser/driver/nativescript/NativescriptConnectionOptions.d.ts +1 -0
- package/browser/driver/nativescript/NativescriptConnectionOptions.js.map +1 -1
- package/browser/driver/oracle/OracleDriver.js +2 -0
- package/browser/driver/oracle/OracleDriver.js.map +1 -1
- package/browser/driver/postgres/PostgresDriver.js +1 -0
- package/browser/driver/postgres/PostgresDriver.js.map +1 -1
- package/browser/driver/react-native/ReactNativeConnectionOptions.d.ts +1 -0
- package/browser/driver/react-native/ReactNativeConnectionOptions.js.map +1 -1
- package/browser/driver/sap/SapConnectionOptions.d.ts +1 -0
- package/browser/driver/sap/SapConnectionOptions.js.map +1 -1
- package/browser/driver/spanner/SpannerConnectionOptions.d.ts +1 -0
- package/browser/driver/spanner/SpannerConnectionOptions.js.map +1 -1
- package/browser/driver/sqlite/SqliteConnectionOptions.d.ts +1 -0
- package/browser/driver/sqlite/SqliteConnectionOptions.js.map +1 -1
- package/browser/driver/sqljs/SqljsConnectionOptions.d.ts +1 -0
- package/browser/driver/sqljs/SqljsConnectionOptions.js.map +1 -1
- package/browser/driver/sqljs/SqljsDriver.d.ts +1 -0
- package/browser/driver/sqljs/SqljsDriver.js +3 -1
- package/browser/driver/sqljs/SqljsDriver.js.map +1 -1
- package/browser/driver/sqljs/SqljsQueryRunner.js +3 -1
- package/browser/driver/sqljs/SqljsQueryRunner.js.map +1 -1
- package/browser/driver/sqlserver/SqlServerConnectionOptions.d.ts +1 -0
- package/browser/driver/sqlserver/SqlServerConnectionOptions.js.map +1 -1
- package/browser/entity-schema/EntitySchemaRelationOptions.d.ts +4 -2
- package/browser/entity-schema/EntitySchemaRelationOptions.js.map +1 -1
- package/browser/metadata/RelationMetadata.d.ts +4 -2
- package/browser/metadata/RelationMetadata.js.map +1 -1
- package/browser/persistence/subject-builder/OneToManySubjectBuilder.js +30 -27
- package/browser/persistence/subject-builder/OneToManySubjectBuilder.js.map +1 -1
- package/browser/query-builder/RelationIdLoader.js +15 -14
- package/browser/query-builder/RelationIdLoader.js.map +1 -1
- package/browser/query-builder/SelectQueryBuilder.js +1 -1
- package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
- package/commands/InitCommand.js +5 -5
- package/commands/InitCommand.js.map +1 -1
- package/data-source/BaseDataSourceOptions.d.ts +4 -0
- package/data-source/BaseDataSourceOptions.js.map +1 -1
- package/decorator/options/RelationOptions.d.ts +5 -2
- package/decorator/options/RelationOptions.js.map +1 -1
- package/driver/aurora-mysql/AuroraMysqlConnectionOptions.d.ts +1 -0
- package/driver/aurora-mysql/AuroraMysqlConnectionOptions.js.map +1 -1
- package/driver/aurora-postgres/AuroraPostgresConnectionOptions.d.ts +1 -0
- package/driver/aurora-postgres/AuroraPostgresConnectionOptions.js.map +1 -1
- package/driver/better-sqlite3/BetterSqlite3ConnectionOptions.d.ts +1 -0
- package/driver/better-sqlite3/BetterSqlite3ConnectionOptions.js.map +1 -1
- package/driver/capacitor/CapacitorConnectionOptions.d.ts +1 -0
- package/driver/capacitor/CapacitorConnectionOptions.js.map +1 -1
- package/driver/cockroachdb/CockroachDriver.js +1 -0
- package/driver/cockroachdb/CockroachDriver.js.map +1 -1
- package/driver/cordova/CordovaConnectionOptions.d.ts +1 -0
- package/driver/cordova/CordovaConnectionOptions.js.map +1 -1
- package/driver/expo/ExpoConnectionOptions.d.ts +1 -0
- package/driver/expo/ExpoConnectionOptions.js.map +1 -1
- package/driver/mongodb/MongoConnectionOptions.d.ts +0 -4
- package/driver/mongodb/MongoConnectionOptions.js.map +1 -1
- package/driver/mysql/MysqlDriver.js +1 -1
- package/driver/mysql/MysqlDriver.js.map +1 -1
- package/driver/nativescript/NativescriptConnectionOptions.d.ts +1 -0
- package/driver/nativescript/NativescriptConnectionOptions.js.map +1 -1
- package/driver/oracle/OracleDriver.js +2 -0
- package/driver/oracle/OracleDriver.js.map +1 -1
- package/driver/postgres/PostgresDriver.js +1 -0
- package/driver/postgres/PostgresDriver.js.map +1 -1
- package/driver/react-native/ReactNativeConnectionOptions.d.ts +1 -0
- package/driver/react-native/ReactNativeConnectionOptions.js.map +1 -1
- package/driver/sap/SapConnectionOptions.d.ts +1 -0
- package/driver/sap/SapConnectionOptions.js.map +1 -1
- package/driver/spanner/SpannerConnectionOptions.d.ts +1 -0
- package/driver/spanner/SpannerConnectionOptions.js.map +1 -1
- package/driver/sqlite/SqliteConnectionOptions.d.ts +1 -0
- package/driver/sqlite/SqliteConnectionOptions.js.map +1 -1
- package/driver/sqljs/SqljsConnectionOptions.d.ts +1 -0
- package/driver/sqljs/SqljsConnectionOptions.js.map +1 -1
- package/driver/sqljs/SqljsDriver.d.ts +1 -0
- package/driver/sqljs/SqljsDriver.js +3 -1
- package/driver/sqljs/SqljsDriver.js.map +1 -1
- package/driver/sqljs/SqljsQueryRunner.js +3 -1
- package/driver/sqljs/SqljsQueryRunner.js.map +1 -1
- package/driver/sqlserver/SqlServerConnectionOptions.d.ts +1 -0
- package/driver/sqlserver/SqlServerConnectionOptions.js.map +1 -1
- package/entity-schema/EntitySchemaRelationOptions.d.ts +4 -2
- package/entity-schema/EntitySchemaRelationOptions.js.map +1 -1
- package/metadata/RelationMetadata.d.ts +4 -2
- package/metadata/RelationMetadata.js.map +1 -1
- package/package.json +1 -1
- package/persistence/subject-builder/OneToManySubjectBuilder.js +30 -27
- package/persistence/subject-builder/OneToManySubjectBuilder.js.map +1 -1
- package/query-builder/RelationIdLoader.js +15 -14
- package/query-builder/RelationIdLoader.js.map +1 -1
- package/query-builder/SelectQueryBuilder.js +1 -1
- package/query-builder/SelectQueryBuilder.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/persistence/subject-builder/OneToManySubjectBuilder.ts"],"names":[],"mappings":"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","file":"OneToManySubjectBuilder.js","sourcesContent":["import { Subject } from \"../Subject\"\nimport { OrmUtils } from \"../../util/OrmUtils\"\nimport { ObjectLiteral } from \"../../common/ObjectLiteral\"\nimport { EntityMetadata } from \"../../metadata/EntityMetadata\"\nimport { RelationMetadata } from \"../../metadata/RelationMetadata\"\n\n/**\n * Builds operations needs to be executed for one-to-many relations of the given subjects.\n *\n * by example: post contains one-to-many relation with category in the property called \"categories\", e.g.\n * @OneToMany(type => Category, category => category.post) categories: Category[]\n * If user adds categories into the post and saves post we need to bind them.\n * This operation requires updation of category table since its owner of the relation and contains a join column.\n *\n * note: this class shares lot of things with OneToOneInverseSideOperationBuilder, so when you change this class\n * make sure to reflect changes there as well.\n */\nexport class OneToManySubjectBuilder {\n // ---------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------\n\n constructor(protected subjects: Subject[]) {}\n\n // ---------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds all required operations.\n */\n build(): void {\n this.subjects.forEach((subject) => {\n subject.metadata.oneToManyRelations.forEach((relation) => {\n // skip relations for which persistence is disabled\n if (relation.persistenceEnabled === false) return\n\n this.buildForSubjectRelation(subject, relation)\n })\n })\n }\n\n // ---------------------------------------------------------------------\n // Protected Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds operations for a given subject and relation.\n *\n * by example: subject is \"post\" entity we are saving here and relation is \"categories\" inside it here.\n */\n protected buildForSubjectRelation(\n subject: Subject,\n relation: RelationMetadata,\n ) {\n // prepare objects (relation id maps) for the database entity\n // by example: since subject is a post, we are expecting to get all post's categories saved in the database here,\n // particularly their relation ids, e.g. category ids stored in the database\n\n // in most cases relatedEntityDatabaseValues will contain only the entity key properties.\n // this is because subject.databaseEntity contains relations with loaded relation ids only.\n // however if the entity uses the afterLoad hook to calculate any properties, the fetched \"key object\" might include ADDITIONAL properties.\n // to handle such situations, we pass the data to relation.inverseEntityMetadata.getEntityIdMap to extract the key without any other properties.\n\n let relatedEntityDatabaseRelationIds: ObjectLiteral[] = []\n if (subject.databaseEntity) {\n // related entities in the database can exist only if this entity (post) is saved\n const relatedEntityDatabaseRelation: ObjectLiteral[] | undefined =\n relation.getEntityValue(subject.databaseEntity)\n if (relatedEntityDatabaseRelation) {\n relatedEntityDatabaseRelationIds =\n relatedEntityDatabaseRelation.map(\n (entity) =>\n relation.inverseEntityMetadata.getEntityIdMap(\n entity,\n )!,\n )\n }\n }\n\n // get related entities of persisted entity\n // by example: get categories from the passed to persist post entity\n let relatedEntities: ObjectLiteral[] = relation.getEntityValue(\n subject.entity!,\n )\n if (relatedEntities === null)\n // we treat relations set to null as removed, so we don't skip it\n relatedEntities = [] as ObjectLiteral[]\n if (relatedEntities === undefined)\n // if relation is undefined then nothing to update\n return\n\n // extract only relation ids from the related entities, since we only need them for comparison\n // by example: extract from categories only relation ids (category id, or let's say category title, depend on join column options)\n const relatedPersistedEntityRelationIds: ObjectLiteral[] = []\n relatedEntities.forEach((relatedEntity) => {\n // by example: relatedEntity is a category here\n let relationIdMap =\n relation.inverseEntityMetadata!.getEntityIdMap(relatedEntity) // by example: relationIdMap is category.id map here, e.g. { id: ... }\n\n // try to find a subject of this related entity, maybe it was loaded or was marked for persistence\n let relatedEntitySubject = this.subjects.find((subject) => {\n return subject.entity === relatedEntity\n })\n\n // if subject with entity was found take subject identifier as relation id map since it may contain extra properties resolved\n if (relatedEntitySubject)\n relationIdMap = relatedEntitySubject.identifier\n\n // if relationIdMap is undefined then it means user binds object which is not saved in the database yet\n // by example: if post contains categories which does not have ids yet (because they are new)\n // it means they are always newly inserted and relation update operation always must be created for them\n // it does not make sense to perform difference operation for them for both add and remove actions\n if (!relationIdMap) {\n // we decided to remove this error because it brings complications when saving object with non-saved entities\n // if (!relatedEntitySubject)\n // throw new TypeORMError(`One-to-many relation \"${relation.entityMetadata.name}.${relation.propertyPath}\" contains ` +\n // `entities which do not exist in the database yet, thus they cannot be bind in the database. ` +\n // `Please setup cascade insertion or save entities before binding it.`);\n if (!relatedEntitySubject) return\n\n // okay, so related subject exist and its marked for insertion, then add a new change map\n // by example: this will tell category to insert into its post relation our post we are working with\n // relatedEntitySubject is newly inserted CategorySubject\n // relation.inverseRelation is ManyToOne relation inside Category\n // subject is Post needs to be inserted into Category\n relatedEntitySubject.changeMaps.push({\n relation: relation.inverseRelation!,\n value: subject,\n })\n\n return\n }\n\n // check if this binding really exist in the database\n // by example: find our category if its already bind in the database\n const relationIdInDatabaseSubjectRelation =\n relatedEntityDatabaseRelationIds.find(\n (relatedDatabaseEntityRelationId) => {\n return OrmUtils.compareIds(\n relationIdMap,\n relatedDatabaseEntityRelationId,\n )\n },\n )\n\n // if relationIdMap DOES NOT exist in the subject's relation in the database it means its a new relation and we need to \"bind\" them\n // by example: this will tell category to insert into its post relation our post we are working with\n // relatedEntitySubject is newly inserted CategorySubject\n // relation.inverseRelation is ManyToOne relation inside Category\n // subject is Post needs to be inserted into Category\n if (!relationIdInDatabaseSubjectRelation) {\n // if there is no relatedEntitySubject then it means \"category\" wasn't persisted,\n // but since we are going to update \"category\" table (since its an owning side of relation with join column)\n // we create a new subject here:\n if (!relatedEntitySubject) {\n relatedEntitySubject = new Subject({\n metadata: relation.inverseEntityMetadata,\n parentSubject: subject,\n canBeUpdated: true,\n identifier: relationIdMap,\n })\n this.subjects.push(relatedEntitySubject)\n }\n\n relatedEntitySubject.changeMaps.push({\n relation: relation.inverseRelation!,\n value: subject,\n })\n }\n\n // if related entity has relation id then we add it to the list of relation ids\n // this list will be used later to compare with database relation ids to find a difference\n // what exist in this array and does not exist in the database are newly inserted relations\n // what does not exist in this array, but exist in the database are removed relations\n // removed relations are set to null from inverse side of relation\n relatedPersistedEntityRelationIds.push(relationIdMap)\n })\n\n // find what related entities were added and what were removed based on difference between what we save and what database has\n EntityMetadata.difference(\n relatedEntityDatabaseRelationIds,\n relatedPersistedEntityRelationIds,\n ).forEach((removedRelatedEntityRelationId) => {\n // by example: removedRelatedEntityRelationId is category that was bind in the database before, but now its unbind\n\n // todo: probably we can improve this in the future by finding entity with column those values,\n // todo: maybe it was already in persistence process. This is possible due to unique requirements of join columns\n // we create a new subject which operations will be executed in subject operation executor\n const removedRelatedEntitySubject = new Subject({\n metadata: relation.inverseEntityMetadata,\n parentSubject: subject,\n identifier: removedRelatedEntityRelationId,\n })\n\n if (\n !relation.inverseRelation ||\n relation.inverseRelation.orphanedRowAction === \"nullify\"\n ) {\n removedRelatedEntitySubject.canBeUpdated = true\n removedRelatedEntitySubject.changeMaps = [\n {\n relation: relation.inverseRelation!,\n value: null,\n },\n ]\n } else if (\n relation.inverseRelation.orphanedRowAction === \"delete\"\n ) {\n removedRelatedEntitySubject.mustBeRemoved = true\n } else if (\n relation.inverseRelation.orphanedRowAction === \"soft-delete\"\n ) {\n removedRelatedEntitySubject.canBeSoftRemoved = true\n }\n\n this.subjects.push(removedRelatedEntitySubject)\n })\n }\n}\n"],"sourceRoot":"../.."}
|
|
1
|
+
{"version":3,"sources":["../../src/persistence/subject-builder/OneToManySubjectBuilder.ts"],"names":[],"mappings":"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","file":"OneToManySubjectBuilder.js","sourcesContent":["import { Subject } from \"../Subject\"\nimport { OrmUtils } from \"../../util/OrmUtils\"\nimport { ObjectLiteral } from \"../../common/ObjectLiteral\"\nimport { EntityMetadata } from \"../../metadata/EntityMetadata\"\nimport { RelationMetadata } from \"../../metadata/RelationMetadata\"\n\n/**\n * Builds operations needs to be executed for one-to-many relations of the given subjects.\n *\n * by example: post contains one-to-many relation with category in the property called \"categories\", e.g.\n * @OneToMany(type => Category, category => category.post) categories: Category[]\n * If user adds categories into the post and saves post we need to bind them.\n * This operation requires updation of category table since its owner of the relation and contains a join column.\n *\n * note: this class shares lot of things with OneToOneInverseSideOperationBuilder, so when you change this class\n * make sure to reflect changes there as well.\n */\nexport class OneToManySubjectBuilder {\n // ---------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------\n\n constructor(protected subjects: Subject[]) {}\n\n // ---------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds all required operations.\n */\n build(): void {\n this.subjects.forEach((subject) => {\n subject.metadata.oneToManyRelations.forEach((relation) => {\n // skip relations for which persistence is disabled\n if (relation.persistenceEnabled === false) return\n\n this.buildForSubjectRelation(subject, relation)\n })\n })\n }\n\n // ---------------------------------------------------------------------\n // Protected Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds operations for a given subject and relation.\n *\n * by example: subject is \"post\" entity we are saving here and relation is \"categories\" inside it here.\n */\n protected buildForSubjectRelation(\n subject: Subject,\n relation: RelationMetadata,\n ) {\n // prepare objects (relation id maps) for the database entity\n // by example: since subject is a post, we are expecting to get all post's categories saved in the database here,\n // particularly their relation ids, e.g. category ids stored in the database\n\n // in most cases relatedEntityDatabaseValues will contain only the entity key properties.\n // this is because subject.databaseEntity contains relations with loaded relation ids only.\n // however if the entity uses the afterLoad hook to calculate any properties, the fetched \"key object\" might include ADDITIONAL properties.\n // to handle such situations, we pass the data to relation.inverseEntityMetadata.getEntityIdMap to extract the key without any other properties.\n\n let relatedEntityDatabaseRelationIds: ObjectLiteral[] = []\n if (subject.databaseEntity) {\n // related entities in the database can exist only if this entity (post) is saved\n const relatedEntityDatabaseRelation: ObjectLiteral[] | undefined =\n relation.getEntityValue(subject.databaseEntity)\n if (relatedEntityDatabaseRelation) {\n relatedEntityDatabaseRelationIds =\n relatedEntityDatabaseRelation.map(\n (entity) =>\n relation.inverseEntityMetadata.getEntityIdMap(\n entity,\n )!,\n )\n }\n }\n\n // get related entities of persisted entity\n // by example: get categories from the passed to persist post entity\n let relatedEntities: ObjectLiteral[] = relation.getEntityValue(\n subject.entity!,\n )\n if (relatedEntities === null)\n // we treat relations set to null as removed, so we don't skip it\n relatedEntities = [] as ObjectLiteral[]\n if (relatedEntities === undefined)\n // if relation is undefined then nothing to update\n return\n\n // extract only relation ids from the related entities, since we only need them for comparison\n // by example: extract from categories only relation ids (category id, or let's say category title, depend on join column options)\n const relatedPersistedEntityRelationIds: ObjectLiteral[] = []\n relatedEntities.forEach((relatedEntity) => {\n // by example: relatedEntity is a category here\n let relationIdMap =\n relation.inverseEntityMetadata!.getEntityIdMap(relatedEntity) // by example: relationIdMap is category.id map here, e.g. { id: ... }\n\n // try to find a subject of this related entity, maybe it was loaded or was marked for persistence\n let relatedEntitySubject = this.subjects.find((subject) => {\n return subject.entity === relatedEntity\n })\n\n // if subject with entity was found take subject identifier as relation id map since it may contain extra properties resolved\n if (relatedEntitySubject)\n relationIdMap = relatedEntitySubject.identifier\n\n // if relationIdMap is undefined then it means user binds object which is not saved in the database yet\n // by example: if post contains categories which does not have ids yet (because they are new)\n // it means they are always newly inserted and relation update operation always must be created for them\n // it does not make sense to perform difference operation for them for both add and remove actions\n if (!relationIdMap) {\n // we decided to remove this error because it brings complications when saving object with non-saved entities\n // if (!relatedEntitySubject)\n // throw new TypeORMError(`One-to-many relation \"${relation.entityMetadata.name}.${relation.propertyPath}\" contains ` +\n // `entities which do not exist in the database yet, thus they cannot be bind in the database. ` +\n // `Please setup cascade insertion or save entities before binding it.`);\n if (!relatedEntitySubject) return\n\n // okay, so related subject exist and its marked for insertion, then add a new change map\n // by example: this will tell category to insert into its post relation our post we are working with\n // relatedEntitySubject is newly inserted CategorySubject\n // relation.inverseRelation is ManyToOne relation inside Category\n // subject is Post needs to be inserted into Category\n relatedEntitySubject.changeMaps.push({\n relation: relation.inverseRelation!,\n value: subject,\n })\n\n return\n }\n\n // check if this binding really exist in the database\n // by example: find our category if its already bind in the database\n const relationIdInDatabaseSubjectRelation =\n relatedEntityDatabaseRelationIds.find(\n (relatedDatabaseEntityRelationId) => {\n return OrmUtils.compareIds(\n relationIdMap,\n relatedDatabaseEntityRelationId,\n )\n },\n )\n\n // if relationIdMap DOES NOT exist in the subject's relation in the database it means its a new relation and we need to \"bind\" them\n // by example: this will tell category to insert into its post relation our post we are working with\n // relatedEntitySubject is newly inserted CategorySubject\n // relation.inverseRelation is ManyToOne relation inside Category\n // subject is Post needs to be inserted into Category\n if (!relationIdInDatabaseSubjectRelation) {\n // if there is no relatedEntitySubject then it means \"category\" wasn't persisted,\n // but since we are going to update \"category\" table (since its an owning side of relation with join column)\n // we create a new subject here:\n if (!relatedEntitySubject) {\n relatedEntitySubject = new Subject({\n metadata: relation.inverseEntityMetadata,\n parentSubject: subject,\n canBeUpdated: true,\n identifier: relationIdMap,\n })\n this.subjects.push(relatedEntitySubject)\n }\n\n relatedEntitySubject.changeMaps.push({\n relation: relation.inverseRelation!,\n value: subject,\n })\n }\n\n // if related entity has relation id then we add it to the list of relation ids\n // this list will be used later to compare with database relation ids to find a difference\n // what exist in this array and does not exist in the database are newly inserted relations\n // what does not exist in this array, but exist in the database are removed relations\n // removed relations are set to null from inverse side of relation\n relatedPersistedEntityRelationIds.push(relationIdMap)\n })\n\n // find what related entities were added and what were removed based on difference between what we save and what database has\n if (relation.inverseRelation?.orphanedRowAction !== \"disable\") {\n EntityMetadata.difference(\n relatedEntityDatabaseRelationIds,\n relatedPersistedEntityRelationIds,\n ).forEach((removedRelatedEntityRelationId) => {\n // by example: removedRelatedEntityRelationId is category that was bind in the database before, but now its unbind\n\n // todo: probably we can improve this in the future by finding entity with column those values,\n // todo: maybe it was already in persistence process. This is possible due to unique requirements of join columns\n // we create a new subject which operations will be executed in subject operation executor\n const removedRelatedEntitySubject = new Subject({\n metadata: relation.inverseEntityMetadata,\n parentSubject: subject,\n identifier: removedRelatedEntityRelationId,\n })\n\n if (\n !relation.inverseRelation ||\n relation.inverseRelation.orphanedRowAction === \"nullify\"\n ) {\n removedRelatedEntitySubject.canBeUpdated = true\n removedRelatedEntitySubject.changeMaps = [\n {\n relation: relation.inverseRelation!,\n value: null,\n },\n ]\n } else if (\n relation.inverseRelation.orphanedRowAction === \"delete\"\n ) {\n removedRelatedEntitySubject.mustBeRemoved = true\n } else if (\n relation.inverseRelation.orphanedRowAction === \"soft-delete\"\n ) {\n removedRelatedEntitySubject.canBeSoftRemoved = true\n }\n\n this.subjects.push(removedRelatedEntitySubject)\n })\n }\n }\n}\n"],"sourceRoot":"../.."}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RelationIdLoader = void 0;
|
|
4
|
+
const DriverUtils_1 = require("../driver/DriverUtils");
|
|
4
5
|
/**
|
|
5
6
|
* Loads relation ids for the given entities.
|
|
6
7
|
*/
|
|
@@ -103,11 +104,11 @@ class RelationIdLoader {
|
|
|
103
104
|
relatedEntities.forEach((relatedEntity) => {
|
|
104
105
|
entityRelationIds.forEach((relationId) => {
|
|
105
106
|
const relatedEntityMatched = columns.every((column) => {
|
|
106
|
-
return column.compareEntityValue(relatedEntity, relationId[column.entityMetadata.name +
|
|
107
|
+
return column.compareEntityValue(relatedEntity, relationId[DriverUtils_1.DriverUtils.buildAlias(this.connection.driver, column.entityMetadata.name +
|
|
107
108
|
"_" +
|
|
108
109
|
relation.propertyPath.replace(".", "_") +
|
|
109
110
|
"_" +
|
|
110
|
-
column.propertyPath.replace(".", "_")]);
|
|
111
|
+
column.propertyPath.replace(".", "_"))]);
|
|
111
112
|
});
|
|
112
113
|
if (relatedEntityMatched) {
|
|
113
114
|
if (isMany) {
|
|
@@ -175,17 +176,17 @@ class RelationIdLoader {
|
|
|
175
176
|
const qb = this.connection.createQueryBuilder();
|
|
176
177
|
// select all columns from junction table
|
|
177
178
|
columns.forEach((column) => {
|
|
178
|
-
const columnName = column.referencedColumn.entityMetadata.name +
|
|
179
|
+
const columnName = DriverUtils_1.DriverUtils.buildAlias(this.connection.driver, column.referencedColumn.entityMetadata.name +
|
|
179
180
|
"_" +
|
|
180
|
-
column.referencedColumn.propertyPath.replace(".", "_");
|
|
181
|
+
column.referencedColumn.propertyPath.replace(".", "_"));
|
|
181
182
|
qb.addSelect(mainAlias + "." + column.propertyPath, columnName);
|
|
182
183
|
});
|
|
183
184
|
inverseColumns.forEach((column) => {
|
|
184
|
-
const columnName = column.referencedColumn.entityMetadata.name +
|
|
185
|
+
const columnName = DriverUtils_1.DriverUtils.buildAlias(this.connection.driver, column.referencedColumn.entityMetadata.name +
|
|
185
186
|
"_" +
|
|
186
187
|
relation.propertyPath.replace(".", "_") +
|
|
187
188
|
"_" +
|
|
188
|
-
column.referencedColumn.propertyPath.replace(".", "_");
|
|
189
|
+
column.referencedColumn.propertyPath.replace(".", "_"));
|
|
189
190
|
qb.addSelect(mainAlias + "." + column.propertyPath, columnName);
|
|
190
191
|
});
|
|
191
192
|
// add conditions for the given entities
|
|
@@ -351,17 +352,17 @@ class RelationIdLoader {
|
|
|
351
352
|
// select all columns we need
|
|
352
353
|
const qb = this.connection.createQueryBuilder();
|
|
353
354
|
relation.entityMetadata.primaryColumns.forEach((primaryColumn) => {
|
|
354
|
-
const columnName = primaryColumn.entityMetadata.name +
|
|
355
|
+
const columnName = DriverUtils_1.DriverUtils.buildAlias(this.connection.driver, primaryColumn.entityMetadata.name +
|
|
355
356
|
"_" +
|
|
356
|
-
primaryColumn.propertyPath.replace(".", "_");
|
|
357
|
+
primaryColumn.propertyPath.replace(".", "_"));
|
|
357
358
|
qb.addSelect(mainAlias + "." + primaryColumn.propertyPath, columnName);
|
|
358
359
|
});
|
|
359
360
|
relation.joinColumns.forEach((column) => {
|
|
360
|
-
const columnName = column.referencedColumn.entityMetadata.name +
|
|
361
|
+
const columnName = DriverUtils_1.DriverUtils.buildAlias(this.connection.driver, column.referencedColumn.entityMetadata.name +
|
|
361
362
|
"_" +
|
|
362
363
|
relation.propertyPath.replace(".", "_") +
|
|
363
364
|
"_" +
|
|
364
|
-
column.referencedColumn.propertyPath.replace(".", "_");
|
|
365
|
+
column.referencedColumn.propertyPath.replace(".", "_"));
|
|
365
366
|
qb.addSelect(mainAlias + "." + column.propertyPath, columnName);
|
|
366
367
|
});
|
|
367
368
|
// add condition for entities
|
|
@@ -440,17 +441,17 @@ class RelationIdLoader {
|
|
|
440
441
|
// select all columns we need
|
|
441
442
|
const qb = this.connection.createQueryBuilder();
|
|
442
443
|
relation.entityMetadata.primaryColumns.forEach((primaryColumn) => {
|
|
443
|
-
const columnName = primaryColumn.entityMetadata.name +
|
|
444
|
+
const columnName = DriverUtils_1.DriverUtils.buildAlias(this.connection.driver, primaryColumn.entityMetadata.name +
|
|
444
445
|
"_" +
|
|
445
446
|
relation.inverseRelation.propertyPath.replace(".", "_") +
|
|
446
447
|
"_" +
|
|
447
|
-
primaryColumn.propertyPath.replace(".", "_");
|
|
448
|
+
primaryColumn.propertyPath.replace(".", "_"));
|
|
448
449
|
qb.addSelect(mainAlias + "." + primaryColumn.propertyPath, columnName);
|
|
449
450
|
});
|
|
450
451
|
relation.joinColumns.forEach((column) => {
|
|
451
|
-
const columnName = column.referencedColumn.entityMetadata.name +
|
|
452
|
+
const columnName = DriverUtils_1.DriverUtils.buildAlias(this.connection.driver, column.referencedColumn.entityMetadata.name +
|
|
452
453
|
"_" +
|
|
453
|
-
column.referencedColumn.propertyPath.replace(".", "_");
|
|
454
|
+
column.referencedColumn.propertyPath.replace(".", "_"));
|
|
454
455
|
qb.addSelect(mainAlias + "." + column.propertyPath, columnName);
|
|
455
456
|
});
|
|
456
457
|
// add condition for entities
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/query-builder/RelationIdLoader.ts"],"names":[],"mappings":"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","file":"RelationIdLoader.js","sourcesContent":["import { RelationMetadata } from \"../metadata/RelationMetadata\"\nimport { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { SelectQueryBuilder } from \"./SelectQueryBuilder\"\n\n/**\n * Loads relation ids for the given entities.\n */\nexport class RelationIdLoader {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Loads relation ids of the given entity or entities.\n */\n load(\n relation: RelationMetadata,\n entityOrEntities: ObjectLiteral | ObjectLiteral[],\n relatedEntityOrRelatedEntities?: ObjectLiteral | ObjectLiteral[],\n ): Promise<any[]> {\n const entities = Array.isArray(entityOrEntities)\n ? entityOrEntities\n : [entityOrEntities]\n const relatedEntities = Array.isArray(relatedEntityOrRelatedEntities)\n ? relatedEntityOrRelatedEntities\n : relatedEntityOrRelatedEntities\n ? [relatedEntityOrRelatedEntities]\n : undefined\n\n // load relation ids depend of relation type\n if (relation.isManyToMany) {\n return this.loadForManyToMany(relation, entities, relatedEntities)\n } else if (relation.isManyToOne || relation.isOneToOneOwner) {\n return this.loadForManyToOneAndOneToOneOwner(\n relation,\n entities,\n relatedEntities,\n )\n } else {\n // if (relation.isOneToMany || relation.isOneToOneNotOwner) {\n return this.loadForOneToManyAndOneToOneNotOwner(\n relation,\n entities,\n relatedEntities,\n )\n }\n }\n\n /**\n * Loads relation ids of the given entities and groups them into the object with parent and children.\n *\n * todo: extract this method?\n */\n async loadManyToManyRelationIdsAndGroup<\n E1 extends ObjectLiteral,\n E2 extends ObjectLiteral,\n >(\n relation: RelationMetadata,\n entitiesOrEntities: E1 | E1[],\n relatedEntityOrEntities?: E2 | E2[],\n queryBuilder?: SelectQueryBuilder<any>,\n ): Promise<{ entity: E1; related?: E2 | E2[] }[]> {\n // console.log(\"relation:\", relation.propertyName);\n // console.log(\"entitiesOrEntities\", entitiesOrEntities);\n const isMany = relation.isManyToMany || relation.isOneToMany\n const entities: E1[] = Array.isArray(entitiesOrEntities)\n ? entitiesOrEntities\n : [entitiesOrEntities]\n\n if (!relatedEntityOrEntities) {\n relatedEntityOrEntities = await this.connection.relationLoader.load(\n relation,\n entitiesOrEntities,\n undefined,\n queryBuilder,\n )\n if (!relatedEntityOrEntities.length)\n return entities.map((entity) => ({\n entity: entity,\n related: isMany ? [] : undefined,\n }))\n }\n // const relationIds = await this.load(relation, relatedEntityOrEntities!, entitiesOrEntities);\n const relationIds = await this.load(\n relation,\n entitiesOrEntities,\n relatedEntityOrEntities,\n )\n // console.log(\"entities\", entities);\n // console.log(\"relatedEntityOrEntities\", relatedEntityOrEntities);\n // console.log(\"relationIds\", relationIds);\n\n const relatedEntities: E2[] = Array.isArray(relatedEntityOrEntities)\n ? relatedEntityOrEntities\n : [relatedEntityOrEntities!]\n\n let columns: ColumnMetadata[] = [],\n inverseColumns: ColumnMetadata[] = []\n if (relation.isManyToManyOwner) {\n columns = relation.junctionEntityMetadata!.inverseColumns.map(\n (column) => column.referencedColumn!,\n )\n inverseColumns = relation.junctionEntityMetadata!.ownerColumns.map(\n (column) => column.referencedColumn!,\n )\n } else if (relation.isManyToManyNotOwner) {\n columns = relation.junctionEntityMetadata!.ownerColumns.map(\n (column) => column.referencedColumn!,\n )\n inverseColumns =\n relation.junctionEntityMetadata!.inverseColumns.map(\n (column) => column.referencedColumn!,\n )\n } else if (relation.isManyToOne || relation.isOneToOneOwner) {\n columns = relation.joinColumns.map(\n (column) => column.referencedColumn!,\n )\n inverseColumns = relation.entityMetadata.primaryColumns\n } else if (relation.isOneToMany || relation.isOneToOneNotOwner) {\n columns = relation.inverseRelation!.entityMetadata.primaryColumns\n inverseColumns = relation.inverseRelation!.joinColumns.map(\n (column) => column.referencedColumn!,\n )\n } else {\n }\n\n return entities.map((entity) => {\n const group: { entity: E1; related?: E2 | E2[] } = {\n entity: entity,\n related: isMany ? [] : undefined,\n }\n\n const entityRelationIds = relationIds.filter((relationId) => {\n return inverseColumns.every((column) => {\n return column.compareEntityValue(\n entity,\n relationId[\n column.entityMetadata.name +\n \"_\" +\n column.propertyAliasName\n ],\n )\n })\n })\n if (!entityRelationIds.length) return group\n\n relatedEntities.forEach((relatedEntity) => {\n entityRelationIds.forEach((relationId) => {\n const relatedEntityMatched = columns.every((column) => {\n return column.compareEntityValue(\n relatedEntity,\n relationId[\n column.entityMetadata.name +\n \"_\" +\n relation.propertyPath.replace(\".\", \"_\") +\n \"_\" +\n column.propertyPath.replace(\".\", \"_\")\n ],\n )\n })\n if (relatedEntityMatched) {\n if (isMany) {\n ;(group.related as E2[]).push(relatedEntity)\n } else {\n group.related = relatedEntity\n }\n }\n })\n })\n return group\n })\n }\n\n /**\n * Loads relation ids of the given entities and maps them into the given entity property.\n async loadManyToManyRelationIdsAndMap(\n relation: RelationMetadata,\n entityOrEntities: ObjectLiteral|ObjectLiteral[],\n mapToEntityOrEntities: ObjectLiteral|ObjectLiteral[],\n propertyName: string\n ): Promise<void> {\n const relationIds = await this.loadManyToManyRelationIds(relation, entityOrEntities, mapToEntityOrEntities);\n const mapToEntities = mapToEntityOrEntities instanceof Array ? mapToEntityOrEntities : [mapToEntityOrEntities];\n const junctionMetadata = relation.junctionEntityMetadata!;\n const mainAlias = junctionMetadata.name;\n const columns = relation.isOwning ? junctionMetadata.inverseColumns : junctionMetadata.ownerColumns;\n const inverseColumns = relation.isOwning ? junctionMetadata.ownerColumns : junctionMetadata.inverseColumns;\n mapToEntities.forEach(mapToEntity => {\n mapToEntity[propertyName] = [];\n relationIds.forEach(relationId => {\n const match = inverseColumns.every(column => {\n return column.referencedColumn!.getEntityValue(mapToEntity) === relationId[mainAlias + \"_\" + column.propertyName];\n });\n if (match) {\n if (columns.length === 1) {\n mapToEntity[propertyName].push(relationId[mainAlias + \"_\" + columns[0].propertyName]);\n } else {\n const value = {};\n columns.forEach(column => {\n column.referencedColumn!.setEntityValue(value, relationId[mainAlias + \"_\" + column.propertyName]);\n });\n mapToEntity[propertyName].push(value);\n }\n }\n });\n });\n }*/\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Loads relation ids for the many-to-many relation.\n */\n protected loadForManyToMany(\n relation: RelationMetadata,\n entities: ObjectLiteral[],\n relatedEntities?: ObjectLiteral[],\n ) {\n const junctionMetadata = relation.junctionEntityMetadata!\n const mainAlias = junctionMetadata.name\n const columns = relation.isOwning\n ? junctionMetadata.ownerColumns\n : junctionMetadata.inverseColumns\n const inverseColumns = relation.isOwning\n ? junctionMetadata.inverseColumns\n : junctionMetadata.ownerColumns\n const qb = this.connection.createQueryBuilder()\n\n // select all columns from junction table\n columns.forEach((column) => {\n const columnName =\n column.referencedColumn!.entityMetadata.name +\n \"_\" +\n column.referencedColumn!.propertyPath.replace(\".\", \"_\")\n qb.addSelect(mainAlias + \".\" + column.propertyPath, columnName)\n })\n inverseColumns.forEach((column) => {\n const columnName =\n column.referencedColumn!.entityMetadata.name +\n \"_\" +\n relation.propertyPath.replace(\".\", \"_\") +\n \"_\" +\n column.referencedColumn!.propertyPath.replace(\".\", \"_\")\n qb.addSelect(mainAlias + \".\" + column.propertyPath, columnName)\n })\n\n // add conditions for the given entities\n let condition1 = \"\"\n if (columns.length === 1) {\n const values = entities.map((entity) =>\n columns[0].referencedColumn!.getEntityValue(entity),\n )\n const areAllNumbers = values.every(\n (value) => typeof value === \"number\",\n )\n\n if (areAllNumbers) {\n condition1 = `${mainAlias}.${\n columns[0].propertyPath\n } IN (${values.join(\", \")})`\n } else {\n qb.setParameter(\"values1\", values)\n condition1 =\n mainAlias +\n \".\" +\n columns[0].propertyPath +\n \" IN (:...values1)\" // todo: use ANY for postgres\n }\n } else {\n condition1 =\n \"(\" +\n entities\n .map((entity, entityIndex) => {\n return columns\n .map((column) => {\n const paramName =\n \"entity1_\" +\n entityIndex +\n \"_\" +\n column.propertyName\n qb.setParameter(\n paramName,\n column.referencedColumn!.getEntityValue(\n entity,\n ),\n )\n return (\n mainAlias +\n \".\" +\n column.propertyPath +\n \" = :\" +\n paramName\n )\n })\n .join(\" AND \")\n })\n .map((condition) => \"(\" + condition + \")\")\n .join(\" OR \") +\n \")\"\n }\n\n // add conditions for the given inverse entities\n let condition2 = \"\"\n if (relatedEntities) {\n if (inverseColumns.length === 1) {\n const values = relatedEntities.map((entity) =>\n inverseColumns[0].referencedColumn!.getEntityValue(entity),\n )\n const areAllNumbers = values.every(\n (value) => typeof value === \"number\",\n )\n\n if (areAllNumbers) {\n condition2 = `${mainAlias}.${\n inverseColumns[0].propertyPath\n } IN (${values.join(\", \")})`\n } else {\n qb.setParameter(\"values2\", values)\n condition2 =\n mainAlias +\n \".\" +\n inverseColumns[0].propertyPath +\n \" IN (:...values2)\" // todo: use ANY for postgres\n }\n } else {\n condition2 =\n \"(\" +\n relatedEntities\n .map((entity, entityIndex) => {\n return inverseColumns\n .map((column) => {\n const paramName =\n \"entity2_\" +\n entityIndex +\n \"_\" +\n column.propertyName\n qb.setParameter(\n paramName,\n column.referencedColumn!.getEntityValue(\n entity,\n ),\n )\n return (\n mainAlias +\n \".\" +\n column.propertyPath +\n \" = :\" +\n paramName\n )\n })\n .join(\" AND \")\n })\n .map((condition) => \"(\" + condition + \")\")\n .join(\" OR \") +\n \")\"\n }\n }\n\n // qb.from(junctionMetadata.target, mainAlias)\n // .where(condition1 + (condition2 ? \" AND \" + condition2 : \"\"));\n //\n // // execute query\n // const { values1, values2 } = qb.getParameters();\n // console.log(`I can do it`, { values1, values2 });\n // if (inverseColumns.length === 1 &&\n // columns.length === 1 &&\n // this.connection.driver instanceof SqliteDriver &&\n // (values1.length + values2.length) > 500 &&\n // values1.length === values2.length) {\n // console.log(`I can do it`);\n // return qb.getRawMany();\n //\n // } else {\n // return qb.getRawMany();\n // }\n\n // execute query\n const condition = [condition1, condition2]\n .filter((v) => v.length > 0)\n .join(\" AND \")\n return qb\n .from(junctionMetadata.target, mainAlias)\n .where(condition)\n .getRawMany()\n }\n\n /**\n * Loads relation ids for the many-to-one and one-to-one owner relations.\n */\n protected loadForManyToOneAndOneToOneOwner(\n relation: RelationMetadata,\n entities: ObjectLiteral[],\n relatedEntities?: ObjectLiteral[],\n ) {\n const mainAlias = relation.entityMetadata.targetName\n\n // console.log(\"entitiesx\", entities);\n // console.log(\"relatedEntitiesx\", relatedEntities);\n const hasAllJoinColumnsInEntity = relation.joinColumns.every(\n (joinColumn) => {\n return !!relation.entityMetadata.nonVirtualColumns.find(\n (column) => column === joinColumn,\n )\n },\n )\n if (relatedEntities && hasAllJoinColumnsInEntity) {\n let relationIdMaps: ObjectLiteral[] = []\n entities.forEach((entity) => {\n let relationIdMap: ObjectLiteral = {}\n relation.entityMetadata.primaryColumns.forEach(\n (primaryColumn) => {\n const key =\n primaryColumn.entityMetadata.name +\n \"_\" +\n primaryColumn.propertyPath.replace(\".\", \"_\")\n relationIdMap[key] =\n primaryColumn.getEntityValue(entity)\n },\n )\n\n relatedEntities.forEach((relatedEntity) => {\n relation.joinColumns.forEach((joinColumn) => {\n const entityColumnValue =\n joinColumn.getEntityValue(entity)\n const relatedEntityColumnValue =\n joinColumn.referencedColumn!.getEntityValue(\n relatedEntity,\n )\n if (\n entityColumnValue === undefined ||\n relatedEntityColumnValue === undefined\n )\n return\n\n if (entityColumnValue === relatedEntityColumnValue) {\n const key =\n joinColumn.referencedColumn!.entityMetadata\n .name +\n \"_\" +\n relation.propertyPath.replace(\".\", \"_\") +\n \"_\" +\n joinColumn.referencedColumn!.propertyPath.replace(\n \".\",\n \"_\",\n )\n relationIdMap[key] = relatedEntityColumnValue\n }\n })\n })\n if (\n Object.keys(relationIdMap).length ===\n relation.entityMetadata.primaryColumns.length +\n relation.joinColumns.length\n ) {\n relationIdMaps.push(relationIdMap)\n }\n })\n // console.log(\"relationIdMap\", relationIdMaps);\n // console.log(\"entities.length\", entities.length);\n if (relationIdMaps.length === entities.length)\n return Promise.resolve(relationIdMaps)\n }\n\n // select all columns we need\n const qb = this.connection.createQueryBuilder()\n relation.entityMetadata.primaryColumns.forEach((primaryColumn) => {\n const columnName =\n primaryColumn.entityMetadata.name +\n \"_\" +\n primaryColumn.propertyPath.replace(\".\", \"_\")\n qb.addSelect(\n mainAlias + \".\" + primaryColumn.propertyPath,\n columnName,\n )\n })\n relation.joinColumns.forEach((column) => {\n const columnName =\n column.referencedColumn!.entityMetadata.name +\n \"_\" +\n relation.propertyPath.replace(\".\", \"_\") +\n \"_\" +\n column.referencedColumn!.propertyPath.replace(\".\", \"_\")\n qb.addSelect(mainAlias + \".\" + column.propertyPath, columnName)\n })\n\n // add condition for entities\n let condition: string = \"\"\n if (relation.entityMetadata.primaryColumns.length === 1) {\n const values = entities.map((entity) =>\n relation.entityMetadata.primaryColumns[0].getEntityValue(\n entity,\n ),\n )\n const areAllNumbers = values.every(\n (value) => typeof value === \"number\",\n )\n\n if (areAllNumbers) {\n condition = `${mainAlias}.${\n relation.entityMetadata.primaryColumns[0].propertyPath\n } IN (${values.join(\", \")})`\n } else {\n qb.setParameter(\"values\", values)\n condition =\n mainAlias +\n \".\" +\n relation.entityMetadata.primaryColumns[0].propertyPath +\n \" IN (:...values)\" // todo: use ANY for postgres\n }\n } else {\n condition = entities\n .map((entity, entityIndex) => {\n return relation.entityMetadata.primaryColumns\n .map((column, columnIndex) => {\n const paramName =\n \"entity\" + entityIndex + \"_\" + columnIndex\n qb.setParameter(\n paramName,\n column.getEntityValue(entity),\n )\n return (\n mainAlias +\n \".\" +\n column.propertyPath +\n \" = :\" +\n paramName\n )\n })\n .join(\" AND \")\n })\n .map((condition) => \"(\" + condition + \")\")\n .join(\" OR \")\n }\n\n // execute query\n return qb\n .from(relation.entityMetadata.target, mainAlias)\n .where(condition)\n .getRawMany()\n }\n\n /**\n * Loads relation ids for the one-to-many and one-to-one not owner relations.\n */\n protected loadForOneToManyAndOneToOneNotOwner(\n relation: RelationMetadata,\n entities: ObjectLiteral[],\n relatedEntities?: ObjectLiteral[],\n ) {\n relation = relation.inverseRelation!\n\n if (\n relation.entityMetadata.primaryColumns.length ===\n relation.joinColumns.length\n ) {\n const sameReferencedColumns =\n relation.entityMetadata.primaryColumns.every((column) => {\n return relation.joinColumns.indexOf(column) !== -1\n })\n if (sameReferencedColumns) {\n return Promise.resolve(\n entities.map((entity) => {\n const result: ObjectLiteral = {}\n relation.joinColumns.forEach(function (joinColumn) {\n const value =\n joinColumn.referencedColumn!.getEntityValue(\n entity,\n )\n const joinColumnName =\n joinColumn.referencedColumn!.entityMetadata\n .name +\n \"_\" +\n joinColumn.referencedColumn!.propertyPath.replace(\n \".\",\n \"_\",\n )\n const primaryColumnName =\n joinColumn.entityMetadata.name +\n \"_\" +\n relation.inverseRelation!.propertyPath.replace(\n \".\",\n \"_\",\n ) +\n \"_\" +\n joinColumn.propertyPath.replace(\".\", \"_\")\n result[joinColumnName] = value\n result[primaryColumnName] = value\n })\n return result\n }),\n )\n }\n }\n\n const mainAlias = relation.entityMetadata.targetName\n\n // select all columns we need\n const qb = this.connection.createQueryBuilder()\n relation.entityMetadata.primaryColumns.forEach((primaryColumn) => {\n const columnName =\n primaryColumn.entityMetadata.name +\n \"_\" +\n relation.inverseRelation!.propertyPath.replace(\".\", \"_\") +\n \"_\" +\n primaryColumn.propertyPath.replace(\".\", \"_\")\n qb.addSelect(\n mainAlias + \".\" + primaryColumn.propertyPath,\n columnName,\n )\n })\n relation.joinColumns.forEach((column) => {\n const columnName =\n column.referencedColumn!.entityMetadata.name +\n \"_\" +\n column.referencedColumn!.propertyPath.replace(\".\", \"_\")\n qb.addSelect(mainAlias + \".\" + column.propertyPath, columnName)\n })\n\n // add condition for entities\n let condition: string = \"\"\n if (relation.joinColumns.length === 1) {\n const values = entities.map((entity) =>\n relation.joinColumns[0].referencedColumn!.getEntityValue(\n entity,\n ),\n )\n const areAllNumbers = values.every(\n (value) => typeof value === \"number\",\n )\n\n if (areAllNumbers) {\n condition = `${mainAlias}.${\n relation.joinColumns[0].propertyPath\n } IN (${values.join(\", \")})`\n } else {\n qb.setParameter(\"values\", values)\n condition =\n mainAlias +\n \".\" +\n relation.joinColumns[0].propertyPath +\n \" IN (:...values)\" // todo: use ANY for postgres\n }\n } else {\n condition = entities\n .map((entity, entityIndex) => {\n return relation.joinColumns\n .map((joinColumn, joinColumnIndex) => {\n const paramName =\n \"entity\" + entityIndex + \"_\" + joinColumnIndex\n qb.setParameter(\n paramName,\n joinColumn.referencedColumn!.getEntityValue(\n entity,\n ),\n )\n return (\n mainAlias +\n \".\" +\n joinColumn.propertyPath +\n \" = :\" +\n paramName\n )\n })\n .join(\" AND \")\n })\n .map((condition) => \"(\" + condition + \")\")\n .join(\" OR \")\n }\n\n // execute query\n return qb\n .from(relation.entityMetadata.target, mainAlias)\n .where(condition)\n .getRawMany()\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../../src/query-builder/RelationIdLoader.ts"],"names":[],"mappings":"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","file":"RelationIdLoader.js","sourcesContent":["import { RelationMetadata } from \"../metadata/RelationMetadata\"\nimport { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { SelectQueryBuilder } from \"./SelectQueryBuilder\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\n\n/**\n * Loads relation ids for the given entities.\n */\nexport class RelationIdLoader {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Loads relation ids of the given entity or entities.\n */\n load(\n relation: RelationMetadata,\n entityOrEntities: ObjectLiteral | ObjectLiteral[],\n relatedEntityOrRelatedEntities?: ObjectLiteral | ObjectLiteral[],\n ): Promise<any[]> {\n const entities = Array.isArray(entityOrEntities)\n ? entityOrEntities\n : [entityOrEntities]\n const relatedEntities = Array.isArray(relatedEntityOrRelatedEntities)\n ? relatedEntityOrRelatedEntities\n : relatedEntityOrRelatedEntities\n ? [relatedEntityOrRelatedEntities]\n : undefined\n\n // load relation ids depend of relation type\n if (relation.isManyToMany) {\n return this.loadForManyToMany(relation, entities, relatedEntities)\n } else if (relation.isManyToOne || relation.isOneToOneOwner) {\n return this.loadForManyToOneAndOneToOneOwner(\n relation,\n entities,\n relatedEntities,\n )\n } else {\n // if (relation.isOneToMany || relation.isOneToOneNotOwner) {\n return this.loadForOneToManyAndOneToOneNotOwner(\n relation,\n entities,\n relatedEntities,\n )\n }\n }\n\n /**\n * Loads relation ids of the given entities and groups them into the object with parent and children.\n *\n * todo: extract this method?\n */\n async loadManyToManyRelationIdsAndGroup<\n E1 extends ObjectLiteral,\n E2 extends ObjectLiteral,\n >(\n relation: RelationMetadata,\n entitiesOrEntities: E1 | E1[],\n relatedEntityOrEntities?: E2 | E2[],\n queryBuilder?: SelectQueryBuilder<any>,\n ): Promise<{ entity: E1; related?: E2 | E2[] }[]> {\n // console.log(\"relation:\", relation.propertyName);\n // console.log(\"entitiesOrEntities\", entitiesOrEntities);\n const isMany = relation.isManyToMany || relation.isOneToMany\n const entities: E1[] = Array.isArray(entitiesOrEntities)\n ? entitiesOrEntities\n : [entitiesOrEntities]\n\n if (!relatedEntityOrEntities) {\n relatedEntityOrEntities = await this.connection.relationLoader.load(\n relation,\n entitiesOrEntities,\n undefined,\n queryBuilder,\n )\n if (!relatedEntityOrEntities.length)\n return entities.map((entity) => ({\n entity: entity,\n related: isMany ? [] : undefined,\n }))\n }\n // const relationIds = await this.load(relation, relatedEntityOrEntities!, entitiesOrEntities);\n const relationIds = await this.load(\n relation,\n entitiesOrEntities,\n relatedEntityOrEntities,\n )\n // console.log(\"entities\", entities);\n // console.log(\"relatedEntityOrEntities\", relatedEntityOrEntities);\n // console.log(\"relationIds\", relationIds);\n\n const relatedEntities: E2[] = Array.isArray(relatedEntityOrEntities)\n ? relatedEntityOrEntities\n : [relatedEntityOrEntities!]\n\n let columns: ColumnMetadata[] = [],\n inverseColumns: ColumnMetadata[] = []\n if (relation.isManyToManyOwner) {\n columns = relation.junctionEntityMetadata!.inverseColumns.map(\n (column) => column.referencedColumn!,\n )\n inverseColumns = relation.junctionEntityMetadata!.ownerColumns.map(\n (column) => column.referencedColumn!,\n )\n } else if (relation.isManyToManyNotOwner) {\n columns = relation.junctionEntityMetadata!.ownerColumns.map(\n (column) => column.referencedColumn!,\n )\n inverseColumns =\n relation.junctionEntityMetadata!.inverseColumns.map(\n (column) => column.referencedColumn!,\n )\n } else if (relation.isManyToOne || relation.isOneToOneOwner) {\n columns = relation.joinColumns.map(\n (column) => column.referencedColumn!,\n )\n inverseColumns = relation.entityMetadata.primaryColumns\n } else if (relation.isOneToMany || relation.isOneToOneNotOwner) {\n columns = relation.inverseRelation!.entityMetadata.primaryColumns\n inverseColumns = relation.inverseRelation!.joinColumns.map(\n (column) => column.referencedColumn!,\n )\n } else {\n }\n\n return entities.map((entity) => {\n const group: { entity: E1; related?: E2 | E2[] } = {\n entity: entity,\n related: isMany ? [] : undefined,\n }\n\n const entityRelationIds = relationIds.filter((relationId) => {\n return inverseColumns.every((column) => {\n return column.compareEntityValue(\n entity,\n relationId[\n column.entityMetadata.name +\n \"_\" +\n column.propertyAliasName\n ],\n )\n })\n })\n if (!entityRelationIds.length) return group\n\n relatedEntities.forEach((relatedEntity) => {\n entityRelationIds.forEach((relationId) => {\n const relatedEntityMatched = columns.every((column) => {\n return column.compareEntityValue(\n relatedEntity,\n relationId[\n DriverUtils.buildAlias(\n this.connection.driver,\n column.entityMetadata.name +\n \"_\" +\n relation.propertyPath.replace(\n \".\",\n \"_\",\n ) +\n \"_\" +\n column.propertyPath.replace(\".\", \"_\"),\n )\n ],\n )\n })\n if (relatedEntityMatched) {\n if (isMany) {\n ;(group.related as E2[]).push(relatedEntity)\n } else {\n group.related = relatedEntity\n }\n }\n })\n })\n return group\n })\n }\n\n /**\n * Loads relation ids of the given entities and maps them into the given entity property.\n async loadManyToManyRelationIdsAndMap(\n relation: RelationMetadata,\n entityOrEntities: ObjectLiteral|ObjectLiteral[],\n mapToEntityOrEntities: ObjectLiteral|ObjectLiteral[],\n propertyName: string\n ): Promise<void> {\n const relationIds = await this.loadManyToManyRelationIds(relation, entityOrEntities, mapToEntityOrEntities);\n const mapToEntities = mapToEntityOrEntities instanceof Array ? mapToEntityOrEntities : [mapToEntityOrEntities];\n const junctionMetadata = relation.junctionEntityMetadata!;\n const mainAlias = junctionMetadata.name;\n const columns = relation.isOwning ? junctionMetadata.inverseColumns : junctionMetadata.ownerColumns;\n const inverseColumns = relation.isOwning ? junctionMetadata.ownerColumns : junctionMetadata.inverseColumns;\n mapToEntities.forEach(mapToEntity => {\n mapToEntity[propertyName] = [];\n relationIds.forEach(relationId => {\n const match = inverseColumns.every(column => {\n return column.referencedColumn!.getEntityValue(mapToEntity) === relationId[mainAlias + \"_\" + column.propertyName];\n });\n if (match) {\n if (columns.length === 1) {\n mapToEntity[propertyName].push(relationId[mainAlias + \"_\" + columns[0].propertyName]);\n } else {\n const value = {};\n columns.forEach(column => {\n column.referencedColumn!.setEntityValue(value, relationId[mainAlias + \"_\" + column.propertyName]);\n });\n mapToEntity[propertyName].push(value);\n }\n }\n });\n });\n }*/\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Loads relation ids for the many-to-many relation.\n */\n protected loadForManyToMany(\n relation: RelationMetadata,\n entities: ObjectLiteral[],\n relatedEntities?: ObjectLiteral[],\n ) {\n const junctionMetadata = relation.junctionEntityMetadata!\n const mainAlias = junctionMetadata.name\n const columns = relation.isOwning\n ? junctionMetadata.ownerColumns\n : junctionMetadata.inverseColumns\n const inverseColumns = relation.isOwning\n ? junctionMetadata.inverseColumns\n : junctionMetadata.ownerColumns\n const qb = this.connection.createQueryBuilder()\n\n // select all columns from junction table\n columns.forEach((column) => {\n const columnName = DriverUtils.buildAlias(\n this.connection.driver,\n column.referencedColumn!.entityMetadata.name +\n \"_\" +\n column.referencedColumn!.propertyPath.replace(\".\", \"_\"),\n )\n qb.addSelect(mainAlias + \".\" + column.propertyPath, columnName)\n })\n inverseColumns.forEach((column) => {\n const columnName = DriverUtils.buildAlias(\n this.connection.driver,\n column.referencedColumn!.entityMetadata.name +\n \"_\" +\n relation.propertyPath.replace(\".\", \"_\") +\n \"_\" +\n column.referencedColumn!.propertyPath.replace(\".\", \"_\"),\n )\n qb.addSelect(mainAlias + \".\" + column.propertyPath, columnName)\n })\n\n // add conditions for the given entities\n let condition1 = \"\"\n if (columns.length === 1) {\n const values = entities.map((entity) =>\n columns[0].referencedColumn!.getEntityValue(entity),\n )\n const areAllNumbers = values.every(\n (value) => typeof value === \"number\",\n )\n\n if (areAllNumbers) {\n condition1 = `${mainAlias}.${\n columns[0].propertyPath\n } IN (${values.join(\", \")})`\n } else {\n qb.setParameter(\"values1\", values)\n condition1 =\n mainAlias +\n \".\" +\n columns[0].propertyPath +\n \" IN (:...values1)\" // todo: use ANY for postgres\n }\n } else {\n condition1 =\n \"(\" +\n entities\n .map((entity, entityIndex) => {\n return columns\n .map((column) => {\n const paramName =\n \"entity1_\" +\n entityIndex +\n \"_\" +\n column.propertyName\n qb.setParameter(\n paramName,\n column.referencedColumn!.getEntityValue(\n entity,\n ),\n )\n return (\n mainAlias +\n \".\" +\n column.propertyPath +\n \" = :\" +\n paramName\n )\n })\n .join(\" AND \")\n })\n .map((condition) => \"(\" + condition + \")\")\n .join(\" OR \") +\n \")\"\n }\n\n // add conditions for the given inverse entities\n let condition2 = \"\"\n if (relatedEntities) {\n if (inverseColumns.length === 1) {\n const values = relatedEntities.map((entity) =>\n inverseColumns[0].referencedColumn!.getEntityValue(entity),\n )\n const areAllNumbers = values.every(\n (value) => typeof value === \"number\",\n )\n\n if (areAllNumbers) {\n condition2 = `${mainAlias}.${\n inverseColumns[0].propertyPath\n } IN (${values.join(\", \")})`\n } else {\n qb.setParameter(\"values2\", values)\n condition2 =\n mainAlias +\n \".\" +\n inverseColumns[0].propertyPath +\n \" IN (:...values2)\" // todo: use ANY for postgres\n }\n } else {\n condition2 =\n \"(\" +\n relatedEntities\n .map((entity, entityIndex) => {\n return inverseColumns\n .map((column) => {\n const paramName =\n \"entity2_\" +\n entityIndex +\n \"_\" +\n column.propertyName\n qb.setParameter(\n paramName,\n column.referencedColumn!.getEntityValue(\n entity,\n ),\n )\n return (\n mainAlias +\n \".\" +\n column.propertyPath +\n \" = :\" +\n paramName\n )\n })\n .join(\" AND \")\n })\n .map((condition) => \"(\" + condition + \")\")\n .join(\" OR \") +\n \")\"\n }\n }\n\n // qb.from(junctionMetadata.target, mainAlias)\n // .where(condition1 + (condition2 ? \" AND \" + condition2 : \"\"));\n //\n // // execute query\n // const { values1, values2 } = qb.getParameters();\n // console.log(`I can do it`, { values1, values2 });\n // if (inverseColumns.length === 1 &&\n // columns.length === 1 &&\n // this.connection.driver instanceof SqliteDriver &&\n // (values1.length + values2.length) > 500 &&\n // values1.length === values2.length) {\n // console.log(`I can do it`);\n // return qb.getRawMany();\n //\n // } else {\n // return qb.getRawMany();\n // }\n\n // execute query\n const condition = [condition1, condition2]\n .filter((v) => v.length > 0)\n .join(\" AND \")\n return qb\n .from(junctionMetadata.target, mainAlias)\n .where(condition)\n .getRawMany()\n }\n\n /**\n * Loads relation ids for the many-to-one and one-to-one owner relations.\n */\n protected loadForManyToOneAndOneToOneOwner(\n relation: RelationMetadata,\n entities: ObjectLiteral[],\n relatedEntities?: ObjectLiteral[],\n ) {\n const mainAlias = relation.entityMetadata.targetName\n\n // console.log(\"entitiesx\", entities);\n // console.log(\"relatedEntitiesx\", relatedEntities);\n const hasAllJoinColumnsInEntity = relation.joinColumns.every(\n (joinColumn) => {\n return !!relation.entityMetadata.nonVirtualColumns.find(\n (column) => column === joinColumn,\n )\n },\n )\n if (relatedEntities && hasAllJoinColumnsInEntity) {\n let relationIdMaps: ObjectLiteral[] = []\n entities.forEach((entity) => {\n let relationIdMap: ObjectLiteral = {}\n relation.entityMetadata.primaryColumns.forEach(\n (primaryColumn) => {\n const key =\n primaryColumn.entityMetadata.name +\n \"_\" +\n primaryColumn.propertyPath.replace(\".\", \"_\")\n relationIdMap[key] =\n primaryColumn.getEntityValue(entity)\n },\n )\n\n relatedEntities.forEach((relatedEntity) => {\n relation.joinColumns.forEach((joinColumn) => {\n const entityColumnValue =\n joinColumn.getEntityValue(entity)\n const relatedEntityColumnValue =\n joinColumn.referencedColumn!.getEntityValue(\n relatedEntity,\n )\n if (\n entityColumnValue === undefined ||\n relatedEntityColumnValue === undefined\n )\n return\n\n if (entityColumnValue === relatedEntityColumnValue) {\n const key =\n joinColumn.referencedColumn!.entityMetadata\n .name +\n \"_\" +\n relation.propertyPath.replace(\".\", \"_\") +\n \"_\" +\n joinColumn.referencedColumn!.propertyPath.replace(\n \".\",\n \"_\",\n )\n relationIdMap[key] = relatedEntityColumnValue\n }\n })\n })\n if (\n Object.keys(relationIdMap).length ===\n relation.entityMetadata.primaryColumns.length +\n relation.joinColumns.length\n ) {\n relationIdMaps.push(relationIdMap)\n }\n })\n // console.log(\"relationIdMap\", relationIdMaps);\n // console.log(\"entities.length\", entities.length);\n if (relationIdMaps.length === entities.length)\n return Promise.resolve(relationIdMaps)\n }\n\n // select all columns we need\n const qb = this.connection.createQueryBuilder()\n relation.entityMetadata.primaryColumns.forEach((primaryColumn) => {\n const columnName = DriverUtils.buildAlias(\n this.connection.driver,\n primaryColumn.entityMetadata.name +\n \"_\" +\n primaryColumn.propertyPath.replace(\".\", \"_\"),\n )\n qb.addSelect(\n mainAlias + \".\" + primaryColumn.propertyPath,\n columnName,\n )\n })\n relation.joinColumns.forEach((column) => {\n const columnName = DriverUtils.buildAlias(\n this.connection.driver,\n column.referencedColumn!.entityMetadata.name +\n \"_\" +\n relation.propertyPath.replace(\".\", \"_\") +\n \"_\" +\n column.referencedColumn!.propertyPath.replace(\".\", \"_\"),\n )\n qb.addSelect(mainAlias + \".\" + column.propertyPath, columnName)\n })\n\n // add condition for entities\n let condition: string = \"\"\n if (relation.entityMetadata.primaryColumns.length === 1) {\n const values = entities.map((entity) =>\n relation.entityMetadata.primaryColumns[0].getEntityValue(\n entity,\n ),\n )\n const areAllNumbers = values.every(\n (value) => typeof value === \"number\",\n )\n\n if (areAllNumbers) {\n condition = `${mainAlias}.${\n relation.entityMetadata.primaryColumns[0].propertyPath\n } IN (${values.join(\", \")})`\n } else {\n qb.setParameter(\"values\", values)\n condition =\n mainAlias +\n \".\" +\n relation.entityMetadata.primaryColumns[0].propertyPath +\n \" IN (:...values)\" // todo: use ANY for postgres\n }\n } else {\n condition = entities\n .map((entity, entityIndex) => {\n return relation.entityMetadata.primaryColumns\n .map((column, columnIndex) => {\n const paramName =\n \"entity\" + entityIndex + \"_\" + columnIndex\n qb.setParameter(\n paramName,\n column.getEntityValue(entity),\n )\n return (\n mainAlias +\n \".\" +\n column.propertyPath +\n \" = :\" +\n paramName\n )\n })\n .join(\" AND \")\n })\n .map((condition) => \"(\" + condition + \")\")\n .join(\" OR \")\n }\n\n // execute query\n return qb\n .from(relation.entityMetadata.target, mainAlias)\n .where(condition)\n .getRawMany()\n }\n\n /**\n * Loads relation ids for the one-to-many and one-to-one not owner relations.\n */\n protected loadForOneToManyAndOneToOneNotOwner(\n relation: RelationMetadata,\n entities: ObjectLiteral[],\n relatedEntities?: ObjectLiteral[],\n ) {\n relation = relation.inverseRelation!\n\n if (\n relation.entityMetadata.primaryColumns.length ===\n relation.joinColumns.length\n ) {\n const sameReferencedColumns =\n relation.entityMetadata.primaryColumns.every((column) => {\n return relation.joinColumns.indexOf(column) !== -1\n })\n if (sameReferencedColumns) {\n return Promise.resolve(\n entities.map((entity) => {\n const result: ObjectLiteral = {}\n relation.joinColumns.forEach(function (joinColumn) {\n const value =\n joinColumn.referencedColumn!.getEntityValue(\n entity,\n )\n const joinColumnName =\n joinColumn.referencedColumn!.entityMetadata\n .name +\n \"_\" +\n joinColumn.referencedColumn!.propertyPath.replace(\n \".\",\n \"_\",\n )\n const primaryColumnName =\n joinColumn.entityMetadata.name +\n \"_\" +\n relation.inverseRelation!.propertyPath.replace(\n \".\",\n \"_\",\n ) +\n \"_\" +\n joinColumn.propertyPath.replace(\".\", \"_\")\n result[joinColumnName] = value\n result[primaryColumnName] = value\n })\n return result\n }),\n )\n }\n }\n\n const mainAlias = relation.entityMetadata.targetName\n\n // select all columns we need\n const qb = this.connection.createQueryBuilder()\n relation.entityMetadata.primaryColumns.forEach((primaryColumn) => {\n const columnName = DriverUtils.buildAlias(\n this.connection.driver,\n primaryColumn.entityMetadata.name +\n \"_\" +\n relation.inverseRelation!.propertyPath.replace(\".\", \"_\") +\n \"_\" +\n primaryColumn.propertyPath.replace(\".\", \"_\"),\n )\n qb.addSelect(\n mainAlias + \".\" + primaryColumn.propertyPath,\n columnName,\n )\n })\n relation.joinColumns.forEach((column) => {\n const columnName = DriverUtils.buildAlias(\n this.connection.driver,\n column.referencedColumn!.entityMetadata.name +\n \"_\" +\n column.referencedColumn!.propertyPath.replace(\".\", \"_\"),\n )\n qb.addSelect(mainAlias + \".\" + column.propertyPath, columnName)\n })\n\n // add condition for entities\n let condition: string = \"\"\n if (relation.joinColumns.length === 1) {\n const values = entities.map((entity) =>\n relation.joinColumns[0].referencedColumn!.getEntityValue(\n entity,\n ),\n )\n const areAllNumbers = values.every(\n (value) => typeof value === \"number\",\n )\n\n if (areAllNumbers) {\n condition = `${mainAlias}.${\n relation.joinColumns[0].propertyPath\n } IN (${values.join(\", \")})`\n } else {\n qb.setParameter(\"values\", values)\n condition =\n mainAlias +\n \".\" +\n relation.joinColumns[0].propertyPath +\n \" IN (:...values)\" // todo: use ANY for postgres\n }\n } else {\n condition = entities\n .map((entity, entityIndex) => {\n return relation.joinColumns\n .map((joinColumn, joinColumnIndex) => {\n const paramName =\n \"entity\" + entityIndex + \"_\" + joinColumnIndex\n qb.setParameter(\n paramName,\n joinColumn.referencedColumn!.getEntityValue(\n entity,\n ),\n )\n return (\n mainAlias +\n \".\" +\n joinColumn.propertyPath +\n \" = :\" +\n paramName\n )\n })\n .join(\" AND \")\n })\n .map((condition) => \"(\" + condition + \")\")\n .join(\" OR \")\n }\n\n // execute query\n return qb\n .from(relation.entityMetadata.target, mainAlias)\n .where(condition)\n .getRawMany()\n }\n}\n"],"sourceRoot":".."}
|
|
@@ -2112,7 +2112,7 @@ class SelectQueryBuilder extends QueryBuilder_1.QueryBuilder {
|
|
|
2112
2112
|
// this.addSelect(alias + "." + propertyPath);
|
|
2113
2113
|
}
|
|
2114
2114
|
else if (embed) {
|
|
2115
|
-
this.buildSelect(select[key], metadata, alias,
|
|
2115
|
+
this.buildSelect(select[key], metadata, alias, propertyPath);
|
|
2116
2116
|
// } else if (relation) {
|
|
2117
2117
|
// const joinAlias = alias + "_" + relation.propertyName;
|
|
2118
2118
|
// const existJoin = this.joins.find(join => join.alias === joinAlias);
|