typeorm 0.2.38 → 0.2.39-dev.1649882
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/README.md +60 -59
- package/browser/connection/ConnectionMetadataBuilder.js +4 -4
- package/browser/connection/ConnectionMetadataBuilder.js.map +1 -1
- package/browser/connection/ConnectionOptionsReader.js +2 -1
- package/browser/connection/ConnectionOptionsReader.js.map +1 -1
- package/browser/connection/options-reader/ConnectionOptionsYmlReader.js +1 -1
- package/browser/connection/options-reader/ConnectionOptionsYmlReader.js.map +1 -1
- package/browser/decorator/entity-view/ViewEntity.js +1 -0
- package/browser/decorator/entity-view/ViewEntity.js.map +1 -1
- package/browser/decorator/options/ViewEntityOptions.d.ts +5 -0
- package/browser/decorator/options/ViewEntityOptions.js.map +1 -1
- package/browser/decorator/transaction/Transaction.js +3 -3
- package/browser/decorator/transaction/Transaction.js.map +1 -1
- package/browser/driver/DriverUtils.js +1 -1
- package/browser/driver/DriverUtils.js.map +1 -1
- package/browser/driver/aurora-data-api/AuroraDataApiConnectionOptions.d.ts +5 -0
- package/browser/driver/aurora-data-api/AuroraDataApiConnectionOptions.js.map +1 -1
- package/browser/driver/aurora-data-api/AuroraDataApiDriver.js +6 -5
- package/browser/driver/aurora-data-api/AuroraDataApiDriver.js.map +1 -1
- package/browser/driver/aurora-data-api/AuroraDataApiQueryRunner.js +19 -48
- package/browser/driver/aurora-data-api/AuroraDataApiQueryRunner.js.map +1 -1
- package/browser/driver/aurora-data-api-pg/AuroraDataApiPostgresConnectionOptions.d.ts +5 -0
- package/browser/driver/aurora-data-api-pg/AuroraDataApiPostgresConnectionOptions.js.map +1 -1
- package/browser/driver/aurora-data-api-pg/AuroraDataApiPostgresDriver.js +2 -1
- package/browser/driver/aurora-data-api-pg/AuroraDataApiPostgresDriver.js.map +1 -1
- package/browser/driver/aurora-data-api-pg/AuroraDataApiPostgresQueryRunner.js +17 -46
- package/browser/driver/aurora-data-api-pg/AuroraDataApiPostgresQueryRunner.js.map +1 -1
- package/browser/driver/better-sqlite3/BetterSqlite3ConnectionOptions.d.ts +5 -0
- package/browser/driver/better-sqlite3/BetterSqlite3ConnectionOptions.js.map +1 -1
- package/browser/driver/better-sqlite3/BetterSqlite3Driver.js +4 -3
- package/browser/driver/better-sqlite3/BetterSqlite3Driver.js.map +1 -1
- package/browser/driver/cockroachdb/CockroachConnectionOptions.d.ts +10 -0
- package/browser/driver/cockroachdb/CockroachConnectionOptions.js.map +1 -1
- package/browser/driver/cockroachdb/CockroachDriver.js +28 -18
- package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
- package/browser/driver/cockroachdb/CockroachQueryRunner.js +109 -146
- package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
- package/browser/driver/cordova/CordovaConnectionOptions.d.ts +5 -0
- package/browser/driver/cordova/CordovaConnectionOptions.js.map +1 -1
- package/browser/driver/cordova/CordovaDriver.d.ts +1 -1
- package/browser/driver/cordova/CordovaDriver.js +27 -19
- package/browser/driver/cordova/CordovaDriver.js.map +1 -1
- package/browser/driver/cordova/CordovaQueryRunner.js +50 -43
- package/browser/driver/cordova/CordovaQueryRunner.js.map +1 -1
- package/browser/driver/expo/ExpoQueryRunner.js +12 -43
- package/browser/driver/expo/ExpoQueryRunner.js.map +1 -1
- package/browser/driver/mongodb/MongoConnectionOptions.d.ts +5 -0
- package/browser/driver/mongodb/MongoConnectionOptions.js.map +1 -1
- package/browser/driver/mongodb/MongoDriver.js +2 -1
- package/browser/driver/mongodb/MongoDriver.js.map +1 -1
- package/browser/driver/mysql/MysqlConnectionOptions.d.ts +6 -0
- package/browser/driver/mysql/MysqlConnectionOptions.js.map +1 -1
- package/browser/driver/mysql/MysqlDriver.js +4 -2
- package/browser/driver/mysql/MysqlDriver.js.map +1 -1
- package/browser/driver/mysql/MysqlQueryRunner.js +24 -54
- package/browser/driver/mysql/MysqlQueryRunner.js.map +1 -1
- package/browser/driver/nativescript/NativescriptQueryRunner.js +45 -37
- package/browser/driver/nativescript/NativescriptQueryRunner.js.map +1 -1
- package/browser/driver/oracle/OracleConnectionOptions.d.ts +5 -0
- package/browser/driver/oracle/OracleConnectionOptions.js.map +1 -1
- package/browser/driver/oracle/OracleDriver.js +5 -4
- package/browser/driver/oracle/OracleDriver.js.map +1 -1
- package/browser/driver/oracle/OracleQueryRunner.js +20 -48
- package/browser/driver/oracle/OracleQueryRunner.js.map +1 -1
- package/browser/driver/postgres/PostgresConnectionOptions.d.ts +10 -0
- package/browser/driver/postgres/PostgresConnectionOptions.js.map +1 -1
- package/browser/driver/postgres/PostgresDriver.d.ts +2 -2
- package/browser/driver/postgres/PostgresDriver.js +37 -45
- package/browser/driver/postgres/PostgresDriver.js.map +1 -1
- package/browser/driver/postgres/PostgresQueryRunner.js +28 -66
- package/browser/driver/postgres/PostgresQueryRunner.js.map +1 -1
- package/browser/driver/react-native/ReactNativeConnectionOptions.d.ts +5 -0
- package/browser/driver/react-native/ReactNativeConnectionOptions.js.map +1 -1
- package/browser/driver/react-native/ReactNativeDriver.js +2 -1
- package/browser/driver/react-native/ReactNativeDriver.js.map +1 -1
- package/browser/driver/sap/SapConnectionOptions.d.ts +16 -6
- package/browser/driver/sap/SapConnectionOptions.js.map +1 -1
- package/browser/driver/sap/SapDriver.js +6 -3
- package/browser/driver/sap/SapDriver.js.map +1 -1
- package/browser/driver/sap/SapQueryRunner.js +30 -78
- package/browser/driver/sap/SapQueryRunner.js.map +1 -1
- package/browser/driver/sqlite/SqliteConnectionOptions.d.ts +5 -0
- package/browser/driver/sqlite/SqliteConnectionOptions.js.map +1 -1
- package/browser/driver/sqlite/SqliteDriver.js +4 -3
- package/browser/driver/sqlite/SqliteDriver.js.map +1 -1
- package/browser/driver/sqlite/SqliteQueryRunner.js +16 -8
- package/browser/driver/sqlite/SqliteQueryRunner.js.map +1 -1
- package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +19 -49
- package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
- package/browser/driver/sqljs/SqljsConnectionOptions.d.ts +5 -0
- package/browser/driver/sqljs/SqljsConnectionOptions.js.map +1 -1
- package/browser/driver/sqljs/SqljsDriver.js +9 -24
- package/browser/driver/sqljs/SqljsDriver.js.map +1 -1
- package/browser/driver/sqljs/SqljsQueryRunner.js +9 -10
- package/browser/driver/sqljs/SqljsQueryRunner.js.map +1 -1
- package/browser/driver/sqlserver/SqlServerConnectionOptions.d.ts +5 -0
- package/browser/driver/sqlserver/SqlServerConnectionOptions.js.map +1 -1
- package/browser/driver/sqlserver/SqlServerDriver.js +7 -6
- package/browser/driver/sqlserver/SqlServerDriver.js.map +1 -1
- package/browser/driver/sqlserver/SqlServerQueryRunner.js +84 -116
- package/browser/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
- package/browser/entity-manager/MongoEntityManager.js +8 -13
- package/browser/entity-manager/MongoEntityManager.js.map +1 -1
- package/browser/find-options/FindOptionsUtils.js +1 -1
- package/browser/find-options/FindOptionsUtils.js.map +1 -1
- package/browser/metadata/ColumnMetadata.js +4 -4
- package/browser/metadata/ColumnMetadata.js.map +1 -1
- package/browser/metadata/EmbeddedMetadata.js +1 -1
- package/browser/metadata/EmbeddedMetadata.js.map +1 -1
- package/browser/metadata/EntityMetadata.d.ts +5 -0
- package/browser/metadata/EntityMetadata.js +2 -1
- package/browser/metadata/EntityMetadata.js.map +1 -1
- package/browser/metadata/RelationMetadata.js +4 -4
- package/browser/metadata/RelationMetadata.js.map +1 -1
- package/browser/metadata-args/TableMetadataArgs.d.ts +4 -0
- package/browser/metadata-args/TableMetadataArgs.js.map +1 -1
- package/browser/metadata-builder/EntityMetadataBuilder.js +5 -5
- package/browser/metadata-builder/EntityMetadataBuilder.js.map +1 -1
- package/browser/metadata-builder/JunctionEntityMetadataBuilder.js +1 -1
- package/browser/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
- package/browser/migration/MigrationExecutor.d.ts +1 -1
- package/browser/migration/MigrationExecutor.js +6 -14
- package/browser/migration/MigrationExecutor.js.map +1 -1
- package/browser/naming-strategy/DefaultNamingStrategy.js +5 -5
- package/browser/naming-strategy/DefaultNamingStrategy.js.map +1 -1
- package/browser/persistence/Subject.js +1 -1
- package/browser/persistence/Subject.js.map +1 -1
- package/browser/persistence/SubjectDatabaseEntityLoader.js +1 -1
- package/browser/persistence/SubjectDatabaseEntityLoader.js.map +1 -1
- package/browser/persistence/SubjectExecutor.js +4 -4
- package/browser/persistence/SubjectExecutor.js.map +1 -1
- package/browser/persistence/SubjectTopoligicalSorter.js +5 -5
- package/browser/persistence/SubjectTopoligicalSorter.js.map +1 -1
- package/browser/persistence/subject-builder/OneToManySubjectBuilder.js +10 -4
- package/browser/persistence/subject-builder/OneToManySubjectBuilder.js.map +1 -1
- package/browser/persistence/tree/ClosureSubjectExecutor.js +4 -4
- package/browser/persistence/tree/ClosureSubjectExecutor.js.map +1 -1
- package/browser/query-builder/DeleteQueryBuilder.js +3 -10
- package/browser/query-builder/DeleteQueryBuilder.js.map +1 -1
- package/browser/query-builder/InsertQueryBuilder.js +4 -6
- package/browser/query-builder/InsertQueryBuilder.js.map +1 -1
- package/browser/query-builder/QueryBuilder.js +9 -9
- package/browser/query-builder/QueryBuilder.js.map +1 -1
- package/browser/query-builder/RelationLoader.js +2 -2
- package/browser/query-builder/RelationLoader.js.map +1 -1
- package/browser/query-builder/RelationRemover.js +6 -6
- package/browser/query-builder/RelationRemover.js.map +1 -1
- package/browser/query-builder/SelectQueryBuilder.d.ts +1 -1
- package/browser/query-builder/SelectQueryBuilder.js +33 -17
- package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
- package/browser/query-builder/SoftDeleteQueryBuilder.js +3 -10
- package/browser/query-builder/SoftDeleteQueryBuilder.js.map +1 -1
- package/browser/query-builder/UpdateQueryBuilder.js +5 -12
- package/browser/query-builder/UpdateQueryBuilder.js.map +1 -1
- package/browser/query-builder/relation-id/RelationIdLoader.js +1 -1
- package/browser/query-builder/relation-id/RelationIdLoader.js.map +1 -1
- package/browser/query-builder/transformer/RawSqlResultsToEntityTransformer.js +4 -10
- package/browser/query-builder/transformer/RawSqlResultsToEntityTransformer.js.map +1 -1
- package/browser/query-runner/BaseQueryRunner.js +5 -4
- package/browser/query-runner/BaseQueryRunner.js.map +1 -1
- package/browser/query-runner/QueryLock.js +1 -1
- package/browser/query-runner/QueryLock.js.map +1 -1
- package/browser/repository/BaseEntity.js +1 -1
- package/browser/repository/BaseEntity.js.map +1 -1
- package/browser/repository/Repository.js +1 -1
- package/browser/repository/Repository.js.map +1 -1
- package/browser/repository/TreeRepository.js +2 -2
- package/browser/repository/TreeRepository.js.map +1 -1
- package/browser/schema-builder/RdbmsSchemaBuilder.js +223 -148
- package/browser/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
- package/browser/schema-builder/table/TableCheck.js +1 -1
- package/browser/schema-builder/table/TableCheck.js.map +1 -1
- package/browser/schema-builder/table/TableForeignKey.js +2 -2
- package/browser/schema-builder/table/TableForeignKey.js.map +1 -1
- package/browser/schema-builder/table/TableIndex.js +1 -1
- package/browser/schema-builder/table/TableIndex.js.map +1 -1
- package/browser/schema-builder/table/TableUnique.js +1 -1
- package/browser/schema-builder/table/TableUnique.js.map +1 -1
- package/browser/schema-builder/util/ViewUtils.d.ts +7 -0
- package/browser/schema-builder/util/ViewUtils.js +25 -0
- package/browser/schema-builder/util/ViewUtils.js.map +1 -0
- package/browser/subscriber/Broadcaster.d.ts +23 -2
- package/browser/subscriber/Broadcaster.js +35 -2
- package/browser/subscriber/Broadcaster.js.map +1 -1
- package/browser/subscriber/BroadcasterResult.d.ts +4 -0
- package/browser/subscriber/BroadcasterResult.js +19 -0
- package/browser/subscriber/BroadcasterResult.js.map +1 -1
- package/cache/DbQueryResultCache.js +12 -12
- package/cache/RedisQueryResultCache.js +12 -12
- package/cli.js +1 -6
- package/cli.js.map +1 -1
- package/commands/CacheClearCommand.js +4 -4
- package/commands/CacheClearCommand.js.map +1 -1
- package/commands/CommandUtils.js +10 -10
- package/commands/CommandUtils.js.map +1 -1
- package/commands/EntityCreateCommand.js +3 -3
- package/commands/EntityCreateCommand.js.map +1 -1
- package/commands/InitCommand.js +5 -5
- package/commands/InitCommand.js.map +1 -1
- package/commands/MigrationCreateCommand.js +5 -5
- package/commands/MigrationCreateCommand.js.map +1 -1
- package/commands/MigrationGenerateCommand.js +7 -7
- package/commands/MigrationGenerateCommand.js.map +1 -1
- package/commands/MigrationRevertCommand.js +4 -4
- package/commands/MigrationRevertCommand.js.map +1 -1
- package/commands/MigrationRunCommand.js +5 -5
- package/commands/MigrationRunCommand.js.map +1 -1
- package/commands/MigrationShowCommand.js +5 -5
- package/commands/MigrationShowCommand.js.map +1 -1
- package/commands/QueryCommand.js +4 -4
- package/commands/QueryCommand.js.map +1 -1
- package/commands/SchemaDropCommand.js +4 -4
- package/commands/SchemaDropCommand.js.map +1 -1
- package/commands/SchemaLogCommand.js +5 -5
- package/commands/SchemaLogCommand.js.map +1 -1
- package/commands/SchemaSyncCommand.js +4 -4
- package/commands/SchemaSyncCommand.js.map +1 -1
- package/commands/SubscriberCreateCommand.js +3 -3
- package/commands/SubscriberCreateCommand.js.map +1 -1
- package/commands/VersionCommand.js +3 -3
- package/commands/VersionCommand.js.map +1 -1
- package/connection/Connection.js +19 -19
- package/connection/Connection.js.map +1 -1
- package/connection/ConnectionMetadataBuilder.js +11 -11
- package/connection/ConnectionMetadataBuilder.js.map +1 -1
- package/connection/ConnectionOptionsReader.js +11 -10
- package/connection/ConnectionOptionsReader.js.map +1 -1
- package/connection/options-reader/ConnectionOptionsEnvReader.js +2 -2
- package/connection/options-reader/ConnectionOptionsXmlReader.js +3 -3
- package/connection/options-reader/ConnectionOptionsXmlReader.js.map +1 -1
- package/connection/options-reader/ConnectionOptionsYmlReader.js +4 -4
- package/connection/options-reader/ConnectionOptionsYmlReader.js.map +1 -1
- package/decorator/Check.js +1 -1
- package/decorator/Check.js.map +1 -1
- package/decorator/EntityRepository.js +1 -1
- package/decorator/EntityRepository.js.map +1 -1
- package/decorator/Exclusion.js +1 -1
- package/decorator/Exclusion.js.map +1 -1
- package/decorator/Generated.js +1 -1
- package/decorator/Generated.js.map +1 -1
- package/decorator/Index.js +1 -1
- package/decorator/Index.js.map +1 -1
- package/decorator/Unique.js +1 -1
- package/decorator/Unique.js.map +1 -1
- package/decorator/columns/Column.js +4 -4
- package/decorator/columns/Column.js.map +1 -1
- package/decorator/columns/CreateDateColumn.js +1 -1
- package/decorator/columns/CreateDateColumn.js.map +1 -1
- package/decorator/columns/DeleteDateColumn.js +1 -1
- package/decorator/columns/DeleteDateColumn.js.map +1 -1
- package/decorator/columns/ObjectIdColumn.js +1 -1
- package/decorator/columns/ObjectIdColumn.js.map +1 -1
- package/decorator/columns/PrimaryColumn.js +2 -2
- package/decorator/columns/PrimaryColumn.js.map +1 -1
- package/decorator/columns/PrimaryGeneratedColumn.js +2 -2
- package/decorator/columns/PrimaryGeneratedColumn.js.map +1 -1
- package/decorator/columns/UpdateDateColumn.js +1 -1
- package/decorator/columns/UpdateDateColumn.js.map +1 -1
- package/decorator/columns/VersionColumn.js +1 -1
- package/decorator/columns/VersionColumn.js.map +1 -1
- package/decorator/columns/ViewColumn.js +1 -1
- package/decorator/columns/ViewColumn.js.map +1 -1
- package/decorator/entity/ChildEntity.js +2 -2
- package/decorator/entity/ChildEntity.js.map +1 -1
- package/decorator/entity/Entity.js +1 -1
- package/decorator/entity/Entity.js.map +1 -1
- package/decorator/entity/TableInheritance.js +1 -1
- package/decorator/entity/TableInheritance.js.map +1 -1
- package/decorator/entity-view/ViewEntity.js +2 -1
- package/decorator/entity-view/ViewEntity.js.map +1 -1
- package/decorator/listeners/AfterInsert.js +1 -1
- package/decorator/listeners/AfterInsert.js.map +1 -1
- package/decorator/listeners/AfterLoad.js +1 -1
- package/decorator/listeners/AfterLoad.js.map +1 -1
- package/decorator/listeners/AfterRemove.js +1 -1
- package/decorator/listeners/AfterRemove.js.map +1 -1
- package/decorator/listeners/AfterUpdate.js +1 -1
- package/decorator/listeners/AfterUpdate.js.map +1 -1
- package/decorator/listeners/BeforeInsert.js +1 -1
- package/decorator/listeners/BeforeInsert.js.map +1 -1
- package/decorator/listeners/BeforeRemove.js +1 -1
- package/decorator/listeners/BeforeRemove.js.map +1 -1
- package/decorator/listeners/BeforeUpdate.js +1 -1
- package/decorator/listeners/BeforeUpdate.js.map +1 -1
- package/decorator/listeners/EventSubscriber.js +1 -1
- package/decorator/listeners/EventSubscriber.js.map +1 -1
- package/decorator/options/ViewEntityOptions.d.ts +5 -0
- package/decorator/options/ViewEntityOptions.js.map +1 -1
- package/decorator/relations/JoinColumn.js +1 -1
- package/decorator/relations/JoinColumn.js.map +1 -1
- package/decorator/relations/JoinTable.js +1 -1
- package/decorator/relations/JoinTable.js.map +1 -1
- package/decorator/relations/ManyToMany.js +1 -1
- package/decorator/relations/ManyToMany.js.map +1 -1
- package/decorator/relations/ManyToOne.js +1 -1
- package/decorator/relations/ManyToOne.js.map +1 -1
- package/decorator/relations/OneToMany.js +1 -1
- package/decorator/relations/OneToMany.js.map +1 -1
- package/decorator/relations/OneToOne.js +1 -1
- package/decorator/relations/OneToOne.js.map +1 -1
- package/decorator/relations/RelationCount.js +1 -1
- package/decorator/relations/RelationCount.js.map +1 -1
- package/decorator/relations/RelationId.js +1 -1
- package/decorator/relations/RelationId.js.map +1 -1
- package/decorator/transaction/Transaction.js +7 -7
- package/decorator/transaction/Transaction.js.map +1 -1
- package/decorator/transaction/TransactionManager.js +1 -1
- package/decorator/transaction/TransactionManager.js.map +1 -1
- package/decorator/transaction/TransactionRepository.js +1 -1
- package/decorator/transaction/TransactionRepository.js.map +1 -1
- package/decorator/tree/Tree.js +1 -1
- package/decorator/tree/Tree.js.map +1 -1
- package/decorator/tree/TreeChildren.js +1 -1
- package/decorator/tree/TreeChildren.js.map +1 -1
- package/decorator/tree/TreeLevelColumn.js +1 -1
- package/decorator/tree/TreeLevelColumn.js.map +1 -1
- package/decorator/tree/TreeParent.js +1 -1
- package/decorator/tree/TreeParent.js.map +1 -1
- package/driver/DriverUtils.js +9 -9
- package/driver/DriverUtils.js.map +1 -1
- package/driver/aurora-data-api/AuroraDataApiConnection.js +1 -1
- package/driver/aurora-data-api/AuroraDataApiConnection.js.map +1 -1
- package/driver/aurora-data-api/AuroraDataApiConnectionOptions.d.ts +5 -0
- package/driver/aurora-data-api/AuroraDataApiConnectionOptions.js.map +1 -1
- package/driver/aurora-data-api/AuroraDataApiDriver.js +12 -11
- package/driver/aurora-data-api/AuroraDataApiDriver.js.map +1 -1
- package/driver/aurora-data-api/AuroraDataApiQueryRunner.js +146 -175
- package/driver/aurora-data-api/AuroraDataApiQueryRunner.js.map +1 -1
- package/driver/aurora-data-api-pg/AuroraDataApiPostgresConnectionOptions.d.ts +5 -0
- package/driver/aurora-data-api-pg/AuroraDataApiPostgresConnectionOptions.js.map +1 -1
- package/driver/aurora-data-api-pg/AuroraDataApiPostgresDriver.js +10 -9
- package/driver/aurora-data-api-pg/AuroraDataApiPostgresDriver.js.map +1 -1
- package/driver/aurora-data-api-pg/AuroraDataApiPostgresQueryRunner.js +29 -58
- package/driver/aurora-data-api-pg/AuroraDataApiPostgresQueryRunner.js.map +1 -1
- package/driver/better-sqlite3/BetterSqlite3ConnectionOptions.d.ts +5 -0
- package/driver/better-sqlite3/BetterSqlite3ConnectionOptions.js.map +1 -1
- package/driver/better-sqlite3/BetterSqlite3Driver.js +12 -11
- package/driver/better-sqlite3/BetterSqlite3Driver.js.map +1 -1
- package/driver/better-sqlite3/BetterSqlite3QueryRunner.js +5 -5
- package/driver/better-sqlite3/BetterSqlite3QueryRunner.js.map +1 -1
- package/driver/capacitor/CapacitorDriver.js +7 -7
- package/driver/capacitor/CapacitorDriver.js.map +1 -1
- package/driver/capacitor/CapacitorQueryRunner.js +5 -5
- package/driver/capacitor/CapacitorQueryRunner.js.map +1 -1
- package/driver/cockroachdb/CockroachConnectionOptions.d.ts +10 -0
- package/driver/cockroachdb/CockroachConnectionOptions.js.map +1 -1
- package/driver/cockroachdb/CockroachDriver.js +38 -28
- package/driver/cockroachdb/CockroachDriver.js.map +1 -1
- package/driver/cockroachdb/CockroachQueryRunner.js +241 -278
- package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
- package/driver/cordova/CordovaConnectionOptions.d.ts +5 -0
- package/driver/cordova/CordovaConnectionOptions.js.map +1 -1
- package/driver/cordova/CordovaDriver.d.ts +1 -1
- package/driver/cordova/CordovaDriver.js +30 -22
- package/driver/cordova/CordovaDriver.js.map +1 -1
- package/driver/cordova/CordovaQueryRunner.js +61 -54
- package/driver/cordova/CordovaQueryRunner.js.map +1 -1
- package/driver/expo/ExpoDriver.js +3 -3
- package/driver/expo/ExpoDriver.js.map +1 -1
- package/driver/expo/ExpoQueryRunner.js +23 -54
- package/driver/expo/ExpoQueryRunner.js.map +1 -1
- package/driver/mongodb/MongoConnectionOptions.d.ts +5 -0
- package/driver/mongodb/MongoConnectionOptions.js.map +1 -1
- package/driver/mongodb/MongoDriver.js +4 -3
- package/driver/mongodb/MongoDriver.js.map +1 -1
- package/driver/mongodb/MongoQueryRunner.js +178 -178
- package/driver/mysql/MysqlConnectionOptions.d.ts +6 -0
- package/driver/mysql/MysqlConnectionOptions.js.map +1 -1
- package/driver/mysql/MysqlDriver.js +9 -7
- package/driver/mysql/MysqlDriver.js.map +1 -1
- package/driver/mysql/MysqlQueryRunner.js +152 -182
- package/driver/mysql/MysqlQueryRunner.js.map +1 -1
- package/driver/nativescript/NativescriptDriver.js +3 -3
- package/driver/nativescript/NativescriptDriver.js.map +1 -1
- package/driver/nativescript/NativescriptQueryRunner.js +48 -40
- package/driver/nativescript/NativescriptQueryRunner.js.map +1 -1
- package/driver/oracle/OracleConnectionOptions.d.ts +5 -0
- package/driver/oracle/OracleConnectionOptions.js.map +1 -1
- package/driver/oracle/OracleDriver.js +13 -12
- package/driver/oracle/OracleDriver.js.map +1 -1
- package/driver/oracle/OracleQueryRunner.js +143 -171
- package/driver/oracle/OracleQueryRunner.js.map +1 -1
- package/driver/postgres/PostgresConnectionOptions.d.ts +10 -0
- package/driver/postgres/PostgresConnectionOptions.js.map +1 -1
- package/driver/postgres/PostgresDriver.d.ts +2 -2
- package/driver/postgres/PostgresDriver.js +52 -60
- package/driver/postgres/PostgresDriver.js.map +1 -1
- package/driver/postgres/PostgresQueryRunner.js +175 -213
- package/driver/postgres/PostgresQueryRunner.js.map +1 -1
- package/driver/react-native/ReactNativeConnectionOptions.d.ts +5 -0
- package/driver/react-native/ReactNativeConnectionOptions.js.map +1 -1
- package/driver/react-native/ReactNativeDriver.js +5 -4
- package/driver/react-native/ReactNativeDriver.js.map +1 -1
- package/driver/react-native/ReactNativeQueryRunner.js +3 -3
- package/driver/react-native/ReactNativeQueryRunner.js.map +1 -1
- package/driver/sap/SapConnectionOptions.d.ts +16 -6
- package/driver/sap/SapConnectionOptions.js.map +1 -1
- package/driver/sap/SapDriver.js +11 -8
- package/driver/sap/SapDriver.js.map +1 -1
- package/driver/sap/SapQueryRunner.js +159 -207
- package/driver/sap/SapQueryRunner.js.map +1 -1
- package/driver/sqlite/SqliteConnectionOptions.d.ts +5 -0
- package/driver/sqlite/SqliteConnectionOptions.js.map +1 -1
- package/driver/sqlite/SqliteDriver.js +12 -11
- package/driver/sqlite/SqliteDriver.js.map +1 -1
- package/driver/sqlite/SqliteQueryRunner.js +21 -13
- package/driver/sqlite/SqliteQueryRunner.js.map +1 -1
- package/driver/sqlite-abstract/AbstractSqliteDriver.js +4 -4
- package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +138 -168
- package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
- package/driver/sqljs/SqljsConnectionOptions.d.ts +5 -0
- package/driver/sqljs/SqljsConnectionOptions.js.map +1 -1
- package/driver/sqljs/SqljsDriver.js +22 -37
- package/driver/sqljs/SqljsDriver.js.map +1 -1
- package/driver/sqljs/SqljsQueryRunner.js +17 -18
- package/driver/sqljs/SqljsQueryRunner.js.map +1 -1
- package/driver/sqlserver/SqlServerConnectionOptions.d.ts +5 -0
- package/driver/sqlserver/SqlServerConnectionOptions.js.map +1 -1
- package/driver/sqlserver/SqlServerDriver.js +13 -12
- package/driver/sqlserver/SqlServerDriver.js.map +1 -1
- package/driver/sqlserver/SqlServerQueryRunner.js +220 -252
- package/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
- package/entity-manager/EntityManager.js +30 -30
- package/entity-manager/EntityManager.js.map +1 -1
- package/entity-manager/MongoEntityManager.js +23 -28
- package/entity-manager/MongoEntityManager.js.map +1 -1
- package/entity-manager/SqljsEntityManager.js +5 -5
- package/entity-manager/SqljsEntityManager.js.map +1 -1
- package/entity-schema/EntitySchemaTransformer.js +1 -1
- package/entity-schema/EntitySchemaTransformer.js.map +1 -1
- package/error/AlreadyHasActiveConnectionError.js +1 -1
- package/error/AlreadyHasActiveConnectionError.js.map +1 -1
- package/error/CannotAttachTreeChildrenEntityError.js +1 -1
- package/error/CannotAttachTreeChildrenEntityError.js.map +1 -1
- package/error/CannotConnectAlreadyConnectedError.js +1 -1
- package/error/CannotConnectAlreadyConnectedError.js.map +1 -1
- package/error/CannotCreateEntityIdMapError.js +1 -1
- package/error/CannotCreateEntityIdMapError.js.map +1 -1
- package/error/CannotDetermineEntityError.js +1 -1
- package/error/CannotDetermineEntityError.js.map +1 -1
- package/error/CannotExecuteNotConnectedError.js +1 -1
- package/error/CannotExecuteNotConnectedError.js.map +1 -1
- package/error/CannotGetEntityManagerNotConnectedError.js +1 -1
- package/error/CannotGetEntityManagerNotConnectedError.js.map +1 -1
- package/error/CannotReflectMethodParameterTypeError.js +1 -1
- package/error/CannotReflectMethodParameterTypeError.js.map +1 -1
- package/error/CircularRelationsError.js +1 -1
- package/error/CircularRelationsError.js.map +1 -1
- package/error/ColumnTypeUndefinedError.js +1 -1
- package/error/ColumnTypeUndefinedError.js.map +1 -1
- package/error/ConnectionIsNotSetError.js +1 -1
- package/error/ConnectionIsNotSetError.js.map +1 -1
- package/error/ConnectionNotFoundError.js +1 -1
- package/error/ConnectionNotFoundError.js.map +1 -1
- package/error/CustomRepositoryCannotInheritRepositoryError.js +1 -1
- package/error/CustomRepositoryCannotInheritRepositoryError.js.map +1 -1
- package/error/CustomRepositoryDoesNotHaveEntityError.js +1 -1
- package/error/CustomRepositoryDoesNotHaveEntityError.js.map +1 -1
- package/error/CustomRepositoryNotFoundError.js +1 -1
- package/error/CustomRepositoryNotFoundError.js.map +1 -1
- package/error/DataTypeNotSupportedError.js +1 -1
- package/error/DataTypeNotSupportedError.js.map +1 -1
- package/error/DriverOptionNotSetError.js +1 -1
- package/error/DriverOptionNotSetError.js.map +1 -1
- package/error/DriverPackageNotInstalledError.js +1 -1
- package/error/DriverPackageNotInstalledError.js.map +1 -1
- package/error/EntityColumnNotFound.js +1 -1
- package/error/EntityColumnNotFound.js.map +1 -1
- package/error/EntityMetadataNotFoundError.js +1 -1
- package/error/EntityMetadataNotFoundError.js.map +1 -1
- package/error/EntityNotFoundError.js +1 -1
- package/error/EntityNotFoundError.js.map +1 -1
- package/error/FindRelationsNotFoundError.js +1 -1
- package/error/FindRelationsNotFoundError.js.map +1 -1
- package/error/InitializedRelationError.js +1 -1
- package/error/InitializedRelationError.js.map +1 -1
- package/error/InsertValuesMissingError.js +1 -1
- package/error/InsertValuesMissingError.js.map +1 -1
- package/error/LimitOnUpdateNotSupportedError.js +1 -1
- package/error/LimitOnUpdateNotSupportedError.js.map +1 -1
- package/error/LockNotSupportedOnGivenDriverError.js +1 -1
- package/error/LockNotSupportedOnGivenDriverError.js.map +1 -1
- package/error/MetadataAlreadyExistsError.js +1 -1
- package/error/MetadataAlreadyExistsError.js.map +1 -1
- package/error/MetadataWithSuchNameAlreadyExistsError.js +1 -1
- package/error/MetadataWithSuchNameAlreadyExistsError.js.map +1 -1
- package/error/MissingDeleteDateColumnError.js +1 -1
- package/error/MissingDeleteDateColumnError.js.map +1 -1
- package/error/MissingDriverError.js +1 -1
- package/error/MissingDriverError.js.map +1 -1
- package/error/MissingJoinColumnError.js +1 -1
- package/error/MissingJoinColumnError.js.map +1 -1
- package/error/MissingJoinTableError.js +1 -1
- package/error/MissingJoinTableError.js.map +1 -1
- package/error/MissingPrimaryColumnError.js +1 -1
- package/error/MissingPrimaryColumnError.js.map +1 -1
- package/error/MustBeEntityError.js +1 -1
- package/error/MustBeEntityError.js.map +1 -1
- package/error/NamingStrategyNotFoundError.js +1 -1
- package/error/NamingStrategyNotFoundError.js.map +1 -1
- package/error/NestedSetMultipleRootError.js +1 -1
- package/error/NestedSetMultipleRootError.js.map +1 -1
- package/error/NoConnectionForRepositoryError.js +1 -1
- package/error/NoConnectionForRepositoryError.js.map +1 -1
- package/error/NoConnectionOptionError.js +1 -1
- package/error/NoConnectionOptionError.js.map +1 -1
- package/error/NoNeedToReleaseEntityManagerError.js +1 -1
- package/error/NoNeedToReleaseEntityManagerError.js.map +1 -1
- package/error/NoVersionOrUpdateDateColumnError.js +1 -1
- package/error/NoVersionOrUpdateDateColumnError.js.map +1 -1
- package/error/OffsetWithoutLimitNotSupportedError.js +1 -1
- package/error/OffsetWithoutLimitNotSupportedError.js.map +1 -1
- package/error/OptimisticLockCanNotBeUsedError.js +1 -1
- package/error/OptimisticLockCanNotBeUsedError.js.map +1 -1
- package/error/OptimisticLockVersionMismatchError.js +1 -1
- package/error/OptimisticLockVersionMismatchError.js.map +1 -1
- package/error/PersistedEntityNotFoundError.js +1 -1
- package/error/PersistedEntityNotFoundError.js.map +1 -1
- package/error/PessimisticLockTransactionRequiredError.js +1 -1
- package/error/PessimisticLockTransactionRequiredError.js.map +1 -1
- package/error/PrimaryColumnCannotBeNullableError.js +1 -1
- package/error/PrimaryColumnCannotBeNullableError.js.map +1 -1
- package/error/QueryFailedError.js +3 -3
- package/error/QueryFailedError.js.map +1 -1
- package/error/QueryRunnerAlreadyReleasedError.js +1 -1
- package/error/QueryRunnerAlreadyReleasedError.js.map +1 -1
- package/error/QueryRunnerProviderAlreadyReleasedError.js +1 -1
- package/error/QueryRunnerProviderAlreadyReleasedError.js.map +1 -1
- package/error/RepositoryNotFoundError.js +1 -1
- package/error/RepositoryNotFoundError.js.map +1 -1
- package/error/RepositoryNotTreeError.js +1 -1
- package/error/RepositoryNotTreeError.js.map +1 -1
- package/error/ReturningStatementNotSupportedError.js +1 -1
- package/error/ReturningStatementNotSupportedError.js.map +1 -1
- package/error/SubjectRemovedAndUpdatedError.js +1 -1
- package/error/SubjectRemovedAndUpdatedError.js.map +1 -1
- package/error/SubjectWithoutIdentifierError.js +1 -1
- package/error/SubjectWithoutIdentifierError.js.map +1 -1
- package/error/TransactionAlreadyStartedError.js +1 -1
- package/error/TransactionAlreadyStartedError.js.map +1 -1
- package/error/TransactionNotStartedError.js +1 -1
- package/error/TransactionNotStartedError.js.map +1 -1
- package/error/TreeRepositoryNotSupportedError.js +1 -1
- package/error/TreeRepositoryNotSupportedError.js.map +1 -1
- package/error/TypeORMError.js +1 -1
- package/error/TypeORMError.js.map +1 -1
- package/error/UpdateValuesMissingError.js +1 -1
- package/error/UpdateValuesMissingError.js.map +1 -1
- package/error/UsingJoinColumnIsNotAllowedError.js +1 -1
- package/error/UsingJoinColumnIsNotAllowedError.js.map +1 -1
- package/error/UsingJoinColumnOnlyOnOneSideAllowedError.js +1 -1
- package/error/UsingJoinColumnOnlyOnOneSideAllowedError.js.map +1 -1
- package/error/UsingJoinTableIsNotAllowedError.js +1 -1
- package/error/UsingJoinTableIsNotAllowedError.js.map +1 -1
- package/error/UsingJoinTableOnlyOnOneSideAllowedError.js +1 -1
- package/error/UsingJoinTableOnlyOnOneSideAllowedError.js.map +1 -1
- package/error/index.js +62 -62
- package/error/index.js.map +1 -1
- package/find-options/FindOptionsUtils.js +4 -4
- package/find-options/FindOptionsUtils.js.map +1 -1
- package/globals.js +7 -7
- package/globals.js.map +1 -1
- package/index.js +102 -102
- package/index.js.map +1 -1
- package/logger/DebugLogger.js +9 -9
- package/logger/DebugLogger.js.map +1 -1
- package/logger/FileLogger.js +1 -1
- package/logger/FileLogger.js.map +1 -1
- package/metadata/ColumnMetadata.js +4 -4
- package/metadata/ColumnMetadata.js.map +1 -1
- package/metadata/EmbeddedMetadata.js +1 -1
- package/metadata/EmbeddedMetadata.js.map +1 -1
- package/metadata/EntityMetadata.d.ts +5 -0
- package/metadata/EntityMetadata.js +3 -2
- package/metadata/EntityMetadata.js.map +1 -1
- package/metadata/RelationMetadata.js +4 -4
- package/metadata/RelationMetadata.js.map +1 -1
- package/metadata-args/TableMetadataArgs.d.ts +4 -0
- package/metadata-args/TableMetadataArgs.js.map +1 -1
- package/metadata-builder/EntityMetadataBuilder.js +5 -5
- package/metadata-builder/EntityMetadataBuilder.js.map +1 -1
- package/metadata-builder/JunctionEntityMetadataBuilder.js +1 -1
- package/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
- package/migration/MigrationExecutor.d.ts +1 -1
- package/migration/MigrationExecutor.js +39 -47
- package/migration/MigrationExecutor.js.map +1 -1
- package/naming-strategy/DefaultNamingStrategy.js +10 -10
- package/naming-strategy/DefaultNamingStrategy.js.map +1 -1
- package/package.json +1 -239
- package/persistence/EntityPersistExecutor.js +5 -5
- package/persistence/EntityPersistExecutor.js.map +1 -1
- package/persistence/Subject.js +1 -1
- package/persistence/Subject.js.map +1 -1
- package/persistence/SubjectDatabaseEntityLoader.js +6 -6
- package/persistence/SubjectDatabaseEntityLoader.js.map +1 -1
- package/persistence/SubjectExecutor.js +33 -33
- package/persistence/SubjectExecutor.js.map +1 -1
- package/persistence/SubjectTopoligicalSorter.js +5 -5
- package/persistence/SubjectTopoligicalSorter.js.map +1 -1
- package/persistence/subject-builder/CascadesSubjectBuilder.js +1 -1
- package/persistence/subject-builder/CascadesSubjectBuilder.js.map +1 -1
- package/persistence/subject-builder/OneToManySubjectBuilder.js +10 -4
- package/persistence/subject-builder/OneToManySubjectBuilder.js.map +1 -1
- package/persistence/tree/ClosureSubjectExecutor.js +13 -13
- package/persistence/tree/ClosureSubjectExecutor.js.map +1 -1
- package/persistence/tree/MaterializedPathSubjectExecutor.js +5 -5
- package/persistence/tree/MaterializedPathSubjectExecutor.js.map +1 -1
- package/persistence/tree/NestedSetSubjectExecutor.js +14 -14
- package/persistence/tree/NestedSetSubjectExecutor.js.map +1 -1
- package/platform/PlatformTools.js +8 -8
- package/platform/PlatformTools.js.map +1 -1
- package/query-builder/DeleteQueryBuilder.js +7 -14
- package/query-builder/DeleteQueryBuilder.js.map +1 -1
- package/query-builder/InsertQueryBuilder.js +9 -11
- package/query-builder/InsertQueryBuilder.js.map +1 -1
- package/query-builder/JoinAttribute.js +1 -1
- package/query-builder/JoinAttribute.js.map +1 -1
- package/query-builder/QueryBuilder.js +37 -37
- package/query-builder/QueryBuilder.js.map +1 -1
- package/query-builder/QueryBuilderUtils.js +1 -1
- package/query-builder/QueryBuilderUtils.js.map +1 -1
- package/query-builder/QueryExpressionMap.js +3 -3
- package/query-builder/QueryExpressionMap.js.map +1 -1
- package/query-builder/RelationLoader.js +2 -2
- package/query-builder/RelationLoader.js.map +1 -1
- package/query-builder/RelationQueryBuilder.js +13 -13
- package/query-builder/RelationQueryBuilder.js.map +1 -1
- package/query-builder/RelationRemover.js +12 -12
- package/query-builder/RelationRemover.js.map +1 -1
- package/query-builder/RelationUpdater.js +2 -2
- package/query-builder/ReturningResultsEntityUpdator.js +6 -6
- package/query-builder/SelectQueryBuilder.d.ts +1 -1
- package/query-builder/SelectQueryBuilder.js +61 -45
- package/query-builder/SelectQueryBuilder.js.map +1 -1
- package/query-builder/SoftDeleteQueryBuilder.js +7 -14
- package/query-builder/SoftDeleteQueryBuilder.js.map +1 -1
- package/query-builder/UpdateQueryBuilder.js +10 -17
- package/query-builder/UpdateQueryBuilder.js.map +1 -1
- package/query-builder/relation-count/RelationCountAttribute.js +2 -2
- package/query-builder/relation-count/RelationCountAttribute.js.map +1 -1
- package/query-builder/relation-count/RelationCountLoader.js +4 -4
- package/query-builder/relation-id/RelationIdAttribute.js +1 -1
- package/query-builder/relation-id/RelationIdAttribute.js.map +1 -1
- package/query-builder/relation-id/RelationIdLoader.js +5 -5
- package/query-builder/relation-id/RelationIdLoader.js.map +1 -1
- package/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.js +3 -3
- package/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.js.map +1 -1
- package/query-builder/transformer/RawSqlResultsToEntityTransformer.js +4 -10
- package/query-builder/transformer/RawSqlResultsToEntityTransformer.js.map +1 -1
- package/query-runner/BaseQueryRunner.js +28 -27
- package/query-runner/BaseQueryRunner.js.map +1 -1
- package/query-runner/QueryLock.js +3 -3
- package/query-runner/QueryLock.js.map +1 -1
- package/repository/AbstractRepository.js +1 -1
- package/repository/AbstractRepository.js.map +1 -1
- package/repository/BaseEntity.js +4 -4
- package/repository/BaseEntity.js.map +1 -1
- package/repository/MongoRepository.js +1 -1
- package/repository/MongoRepository.js.map +1 -1
- package/repository/Repository.js +1 -1
- package/repository/Repository.js.map +1 -1
- package/repository/TreeRepository.js +7 -7
- package/repository/TreeRepository.js.map +1 -1
- package/schema-builder/MongoSchemaBuilder.js +2 -2
- package/schema-builder/RdbmsSchemaBuilder.js +311 -236
- package/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
- package/schema-builder/table/Table.js +1 -1
- package/schema-builder/table/Table.js.map +1 -1
- package/schema-builder/table/TableCheck.js +1 -1
- package/schema-builder/table/TableCheck.js.map +1 -1
- package/schema-builder/table/TableForeignKey.js +2 -2
- package/schema-builder/table/TableForeignKey.js.map +1 -1
- package/schema-builder/table/TableIndex.js +1 -1
- package/schema-builder/table/TableIndex.js.map +1 -1
- package/schema-builder/table/TableUnique.js +1 -1
- package/schema-builder/table/TableUnique.js.map +1 -1
- package/schema-builder/util/ViewUtils.d.ts +7 -0
- package/schema-builder/util/ViewUtils.js +28 -0
- package/schema-builder/util/ViewUtils.js.map +1 -0
- package/subscriber/Broadcaster.d.ts +23 -2
- package/subscriber/Broadcaster.js +35 -2
- package/subscriber/Broadcaster.js.map +1 -1
- package/subscriber/BroadcasterResult.d.ts +4 -0
- package/subscriber/BroadcasterResult.js +19 -0
- package/subscriber/BroadcasterResult.js.map +1 -1
- package/util/DateUtils.js +1 -1
- package/util/DateUtils.js.map +1 -1
- package/util/DirectoryExportedClassesLoader.js +1 -1
- package/util/DirectoryExportedClassesLoader.js.map +1 -1
- package/util/ObjectUtils.js +2 -2
- package/util/ObjectUtils.js.map +1 -1
- package/util/OrmUtils.js +2 -2
- package/util/OrmUtils.js.map +1 -1
- package/util/StringUtils.js +2 -2
- package/util/StringUtils.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/persistence/SubjectTopoligicalSorter.ts"],"names":[],"mappings":"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","file":"SubjectTopoligicalSorter.js","sourcesContent":["import {Subject} from \"./Subject\";\nimport {EntityMetadata} from \"../metadata/EntityMetadata\";\nimport { TypeORMError } from \"../error\";\n\n/**\n * Orders insert or remove subjects in proper order (using topological sorting)\n * to make sure insert or remove operations are executed in a proper order.\n */\nexport class SubjectTopoligicalSorter {\n\n // -------------------------------------------------------------------------\n // Public Properties\n // -------------------------------------------------------------------------\n\n /**\n * Insert subjects needs to be sorted.\n */\n subjects: Subject[];\n\n /**\n * Unique list of entity metadatas of this subject.\n */\n metadatas: EntityMetadata[];\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(subjects: Subject[]) {\n this.subjects = [...subjects]; // copy subjects to prevent changing of sent array\n this.metadatas = this.getUniqueMetadatas(this.subjects);\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Sorts (orders) subjects in their topological order.\n */\n sort(direction: \"insert\"|\"delete\"): Subject[] {\n\n // if there are no metadatas it probably mean there is no subjects... we don't have to do anything here\n if (!this.metadatas.length)\n return this.subjects;\n\n const sortedSubjects: Subject[] = [];\n\n // first if we sort for deletion all junction subjects\n // junction subjects are subjects without entity and database entity set\n if (direction === \"delete\") {\n const junctionSubjects = this.subjects.filter(subject => !subject.entity && !subject.databaseEntity);\n sortedSubjects.push(...junctionSubjects);\n this.removeAlreadySorted(junctionSubjects);\n }\n\n // next we always insert entities with non-nullable relations, sort them first\n const nonNullableDependencies = this.getNonNullableDependencies();\n let sortedNonNullableEntityTargets = this.toposort(nonNullableDependencies);\n if (direction === \"insert\")\n sortedNonNullableEntityTargets = sortedNonNullableEntityTargets.reverse();\n\n // so we have a sorted entity targets\n // go thought each of them and find all subjects with sorted entity target\n // add those sorted targets and remove them from original array of targets\n sortedNonNullableEntityTargets.forEach(sortedEntityTarget => {\n const entityTargetSubjects = this.subjects.filter(subject => subject.metadata.targetName === sortedEntityTarget);\n sortedSubjects.push(...entityTargetSubjects);\n this.removeAlreadySorted(entityTargetSubjects);\n });\n\n // next sort all other entities\n // same process as in above but with other entities\n const otherDependencies: string[][] = this.getDependencies();\n let sortedOtherEntityTargets = this.toposort(otherDependencies);\n if (direction === \"insert\")\n sortedOtherEntityTargets = sortedOtherEntityTargets.reverse();\n\n sortedOtherEntityTargets.forEach(sortedEntityTarget => {\n const entityTargetSubjects = this.subjects.filter(subject => subject.metadata.targetName === sortedEntityTarget);\n sortedSubjects.push(...entityTargetSubjects);\n this.removeAlreadySorted(entityTargetSubjects);\n });\n\n // if we have something left in the subjects add them as well\n sortedSubjects.push(...this.subjects);\n return sortedSubjects;\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Removes already sorted subjects from this.subjects list of subjects.\n */\n protected removeAlreadySorted(subjects: Subject[]) {\n subjects.forEach(subject => {\n this.subjects.splice(this.subjects.indexOf(subject), 1);\n });\n }\n\n /**\n * Extracts all unique metadatas from the given subjects.\n */\n protected getUniqueMetadatas(subjects: Subject[]) {\n const metadatas: EntityMetadata[] = [];\n subjects.forEach(subject => {\n if (metadatas.indexOf(subject.metadata) === -1)\n metadatas.push(subject.metadata);\n });\n return metadatas;\n }\n\n /**\n * Gets dependency tree for all entity metadatas with non-nullable relations.\n * We need to execute insertions first for entities which non-nullable relations.\n */\n protected getNonNullableDependencies(): string[][] {\n return this.metadatas.reduce((dependencies, metadata) => {\n metadata.relationsWithJoinColumns.forEach(relation => {\n if (relation.isNullable)\n return;\n\n dependencies.push([metadata.targetName, relation.inverseEntityMetadata.targetName]);\n });\n return dependencies;\n }, [] as string[][]);\n }\n\n /**\n * Gets dependency tree for all entity metadatas with non-nullable relations.\n * We need to execute insertions first for entities which non-nullable relations.\n */\n protected getDependencies(): string[][] {\n return this.metadatas.reduce((dependencies, metadata) => {\n metadata.relationsWithJoinColumns.forEach(relation => {\n\n // if relation is self-referenced we skip it\n if (relation.inverseEntityMetadata === metadata)\n return;\n\n dependencies.push([metadata.targetName, relation.inverseEntityMetadata.targetName]);\n });\n return dependencies;\n }, [] as string[][]);\n }\n\n /**\n * Sorts given graph using topological sorting algorithm.\n *\n * Algorithm is kindly taken from https://github.com/marcelklehr/toposort repository.\n */\n protected toposort(edges: any[][]) {\n\n function uniqueNodes(arr: any[]) {\n let res = [];\n for (let i = 0, len = arr.length; i < len; i++) {\n let edge: any = arr[i];\n if (res.indexOf(edge[0]) < 0) res.push(edge[0]);\n if (res.indexOf(edge[1]) < 0) res.push(edge[1]);\n }\n return res;\n }\n\n const nodes = uniqueNodes(edges);\n let cursor = nodes.length\n , sorted = new Array(cursor)\n , visited: any = {}\n , i = cursor;\n\n while (i--) {\n if (!visited[i]) visit(nodes[i], i, []);\n }\n\n function visit(node: any, i: number, predecessors: any[]) {\n if (predecessors.indexOf(node) >= 0) {\n throw new TypeORMError(\"Cyclic dependency: \" + JSON.stringify(node)); // todo: better error\n }\n\n if (!~nodes.indexOf(node)) {\n throw new TypeORMError(\"Found unknown node. Make sure to provided all involved nodes. Unknown node: \" + JSON.stringify(node));\n }\n\n if (visited[i]) return;\n visited[i] = true;\n\n // outgoing edges\n let outgoing = edges.filter(function(edge) {\n return edge[0] === node;\n });\n if (i = outgoing.length) {\n let preds = predecessors.concat(node);\n do {\n let child = outgoing[--i][1];\n visit(child, nodes.indexOf(child), preds);\n } while (i);\n }\n\n sorted[--cursor] = node;\n }\n\n return sorted;\n }\n\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../../src/persistence/SubjectTopoligicalSorter.ts"],"names":[],"mappings":"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","file":"SubjectTopoligicalSorter.js","sourcesContent":["import {Subject} from \"./Subject\";\nimport {EntityMetadata} from \"../metadata/EntityMetadata\";\nimport { TypeORMError } from \"../error\";\n\n/**\n * Orders insert or remove subjects in proper order (using topological sorting)\n * to make sure insert or remove operations are executed in a proper order.\n */\nexport class SubjectTopoligicalSorter {\n\n // -------------------------------------------------------------------------\n // Public Properties\n // -------------------------------------------------------------------------\n\n /**\n * Insert subjects needs to be sorted.\n */\n subjects: Subject[];\n\n /**\n * Unique list of entity metadatas of this subject.\n */\n metadatas: EntityMetadata[];\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(subjects: Subject[]) {\n this.subjects = [...subjects]; // copy subjects to prevent changing of sent array\n this.metadatas = this.getUniqueMetadatas(this.subjects);\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Sorts (orders) subjects in their topological order.\n */\n sort(direction: \"insert\"|\"delete\"): Subject[] {\n\n // if there are no metadatas it probably mean there is no subjects... we don't have to do anything here\n if (!this.metadatas.length)\n return this.subjects;\n\n const sortedSubjects: Subject[] = [];\n\n // first if we sort for deletion all junction subjects\n // junction subjects are subjects without entity and database entity set\n if (direction === \"delete\") {\n const junctionSubjects = this.subjects.filter(subject => !subject.entity && !subject.databaseEntity);\n sortedSubjects.push(...junctionSubjects);\n this.removeAlreadySorted(junctionSubjects);\n }\n\n // next we always insert entities with non-nullable relations, sort them first\n const nonNullableDependencies = this.getNonNullableDependencies();\n let sortedNonNullableEntityTargets = this.toposort(nonNullableDependencies);\n if (direction === \"insert\")\n sortedNonNullableEntityTargets = sortedNonNullableEntityTargets.reverse();\n\n // so we have a sorted entity targets\n // go thought each of them and find all subjects with sorted entity target\n // add those sorted targets and remove them from original array of targets\n sortedNonNullableEntityTargets.forEach(sortedEntityTarget => {\n const entityTargetSubjects = this.subjects.filter(subject => subject.metadata.targetName === sortedEntityTarget);\n sortedSubjects.push(...entityTargetSubjects);\n this.removeAlreadySorted(entityTargetSubjects);\n });\n\n // next sort all other entities\n // same process as in above but with other entities\n const otherDependencies: string[][] = this.getDependencies();\n let sortedOtherEntityTargets = this.toposort(otherDependencies);\n if (direction === \"insert\")\n sortedOtherEntityTargets = sortedOtherEntityTargets.reverse();\n\n sortedOtherEntityTargets.forEach(sortedEntityTarget => {\n const entityTargetSubjects = this.subjects.filter(subject => subject.metadata.targetName === sortedEntityTarget);\n sortedSubjects.push(...entityTargetSubjects);\n this.removeAlreadySorted(entityTargetSubjects);\n });\n\n // if we have something left in the subjects add them as well\n sortedSubjects.push(...this.subjects);\n return sortedSubjects;\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Removes already sorted subjects from this.subjects list of subjects.\n */\n protected removeAlreadySorted(subjects: Subject[]) {\n subjects.forEach(subject => {\n this.subjects.splice(this.subjects.indexOf(subject), 1);\n });\n }\n\n /**\n * Extracts all unique metadatas from the given subjects.\n */\n protected getUniqueMetadatas(subjects: Subject[]) {\n const metadatas: EntityMetadata[] = [];\n subjects.forEach(subject => {\n if (metadatas.indexOf(subject.metadata) === -1)\n metadatas.push(subject.metadata);\n });\n return metadatas;\n }\n\n /**\n * Gets dependency tree for all entity metadatas with non-nullable relations.\n * We need to execute insertions first for entities which non-nullable relations.\n */\n protected getNonNullableDependencies(): string[][] {\n return this.metadatas.reduce((dependencies, metadata) => {\n metadata.relationsWithJoinColumns.forEach(relation => {\n if (relation.isNullable)\n return;\n\n dependencies.push([metadata.targetName, relation.inverseEntityMetadata.targetName]);\n });\n return dependencies;\n }, [] as string[][]);\n }\n\n /**\n * Gets dependency tree for all entity metadatas with non-nullable relations.\n * We need to execute insertions first for entities which non-nullable relations.\n */\n protected getDependencies(): string[][] {\n return this.metadatas.reduce((dependencies, metadata) => {\n metadata.relationsWithJoinColumns.forEach(relation => {\n\n // if relation is self-referenced we skip it\n if (relation.inverseEntityMetadata === metadata)\n return;\n\n dependencies.push([metadata.targetName, relation.inverseEntityMetadata.targetName]);\n });\n return dependencies;\n }, [] as string[][]);\n }\n\n /**\n * Sorts given graph using topological sorting algorithm.\n *\n * Algorithm is kindly taken from https://github.com/marcelklehr/toposort repository.\n */\n protected toposort(edges: any[][]) {\n\n function uniqueNodes(arr: any[]) {\n let res = [];\n for (let i = 0, len = arr.length; i < len; i++) {\n let edge: any = arr[i];\n if (res.indexOf(edge[0]) < 0) res.push(edge[0]);\n if (res.indexOf(edge[1]) < 0) res.push(edge[1]);\n }\n return res;\n }\n\n const nodes = uniqueNodes(edges);\n let cursor = nodes.length\n , sorted = new Array(cursor)\n , visited: any = {}\n , i = cursor;\n\n while (i--) {\n if (!visited[i]) visit(nodes[i], i, []);\n }\n\n function visit(node: any, i: number, predecessors: any[]) {\n if (predecessors.indexOf(node) >= 0) {\n throw new TypeORMError(\"Cyclic dependency: \" + JSON.stringify(node)); // todo: better error\n }\n\n if (!~nodes.indexOf(node)) {\n throw new TypeORMError(\"Found unknown node. Make sure to provided all involved nodes. Unknown node: \" + JSON.stringify(node));\n }\n\n if (visited[i]) return;\n visited[i] = true;\n\n // outgoing edges\n let outgoing = edges.filter(function(edge) {\n return edge[0] === node;\n });\n if (i = outgoing.length) {\n let preds = predecessors.concat(node);\n do {\n let child = outgoing[--i][1];\n visit(child, nodes.indexOf(child), preds);\n } while (i);\n }\n\n sorted[--cursor] = node;\n }\n\n return sorted;\n }\n\n}\n"],"sourceRoot":".."}
|
|
@@ -25,7 +25,7 @@ var CascadesSubjectBuilder = /** @class */ (function () {
|
|
|
25
25
|
subject.metadata
|
|
26
26
|
.extractRelationValuesFromEntity(subject.entity, subject.metadata.relations) // todo: we can create EntityMetadata.cascadeRelations
|
|
27
27
|
.forEach(function (_a) {
|
|
28
|
-
var _b = tslib_1.__read(_a, 3), relation = _b[0], relationEntity = _b[1], relationEntityMetadata = _b[2];
|
|
28
|
+
var _b = (0, tslib_1.__read)(_a, 3), relation = _b[0], relationEntity = _b[1], relationEntityMetadata = _b[2];
|
|
29
29
|
// we need only defined values and insert, update, soft-remove or recover cascades of the relation should be set
|
|
30
30
|
if (relationEntity === undefined ||
|
|
31
31
|
relationEntity === null ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/persistence/subject-builder/CascadesSubjectBuilder.ts"],"names":[],"mappings":";;;;AAAA,sCAAmC;AAGnC;;;GAGG;AACH;IAEI,wEAAwE;IACxE,cAAc;IACd,wEAAwE;IAExE,gCAAsB,WAAsB;QAAtB,gBAAW,GAAX,WAAW,CAAW;IAC5C,CAAC;IAED,wEAAwE;IACxE,iBAAiB;IACjB,wEAAwE;IAExE;;OAEG;IACH,sCAAK,GAAL,UAAM,OAAgB,EAAE,aAAsD;QAA9E,iBA+CC;QA7CG,OAAO,CAAC,QAAQ;aACX,+BAA+B,CAAC,OAAO,CAAC,MAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,sDAAsD;aACnI,OAAO,CAAC,UAAC,EAAkD;gBAAlD,KAAA,
|
|
1
|
+
{"version":3,"sources":["../../src/persistence/subject-builder/CascadesSubjectBuilder.ts"],"names":[],"mappings":"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","file":"CascadesSubjectBuilder.js","sourcesContent":["import {Subject} from \"../Subject\";\nimport {ObjectLiteral} from \"../../common/ObjectLiteral\";\n\n/**\n * Finds all cascade operations of the given subject and cascade operations of the found cascaded subjects,\n * e.g. builds a cascade tree and creates a subjects for them.\n */\nexport class CascadesSubjectBuilder {\n\n // ---------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------\n\n constructor(protected allSubjects: Subject[]) {\n }\n\n // ---------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds a cascade subjects tree and pushes them in into the given array of subjects.\n */\n build(subject: Subject, operationType: \"save\"|\"remove\"|\"soft-remove\"|\"recover\") {\n\n subject.metadata\n .extractRelationValuesFromEntity(subject.entity!, subject.metadata.relations) // todo: we can create EntityMetadata.cascadeRelations\n .forEach(([relation, relationEntity, relationEntityMetadata]) => {\n\n // we need only defined values and insert, update, soft-remove or recover cascades of the relation should be set\n if (relationEntity === undefined ||\n relationEntity === null ||\n (!relation.isCascadeInsert && !relation.isCascadeUpdate && !relation.isCascadeSoftRemove && !relation.isCascadeRecover))\n return;\n\n // if relation entity is just a relation id set (for example post.tag = 1)\n // then we don't really need to check cascades since there is no object to insert or update\n if (!(relationEntity instanceof Object))\n return;\n\n // if we already has this entity in list of operated subjects then skip it to avoid recursion\n const alreadyExistRelationEntitySubject = this.findByPersistEntityLike(relationEntityMetadata.target, relationEntity);\n if (alreadyExistRelationEntitySubject) {\n if (alreadyExistRelationEntitySubject.canBeInserted === false) // if its not marked for insertion yet\n alreadyExistRelationEntitySubject.canBeInserted = relation.isCascadeInsert === true && operationType === \"save\";\n if (alreadyExistRelationEntitySubject.canBeUpdated === false) // if its not marked for update yet\n alreadyExistRelationEntitySubject.canBeUpdated = relation.isCascadeUpdate === true && operationType === \"save\";\n if (alreadyExistRelationEntitySubject.canBeSoftRemoved === false) // if its not marked for removal yet\n alreadyExistRelationEntitySubject.canBeSoftRemoved = relation.isCascadeSoftRemove === true && operationType === \"soft-remove\";\n if (alreadyExistRelationEntitySubject.canBeRecovered === false) // if its not marked for recovery yet\n alreadyExistRelationEntitySubject.canBeRecovered = relation.isCascadeRecover === true && operationType === \"recover\";\n return;\n }\n\n // mark subject with what we can do with it\n // and add to the array of subjects to load only if there is no same entity there already\n const relationEntitySubject = new Subject({\n metadata: relationEntityMetadata,\n parentSubject: subject,\n entity: relationEntity,\n canBeInserted: relation.isCascadeInsert === true && operationType === \"save\",\n canBeUpdated: relation.isCascadeUpdate === true && operationType === \"save\",\n canBeSoftRemoved: relation.isCascadeSoftRemove === true && operationType === \"soft-remove\",\n canBeRecovered: relation.isCascadeRecover === true && operationType === \"recover\"\n });\n this.allSubjects.push(relationEntitySubject);\n\n // go recursively and find other entities we need to insert/update\n this.build(relationEntitySubject, operationType);\n });\n }\n\n // ---------------------------------------------------------------------\n // Protected Methods\n // ---------------------------------------------------------------------\n\n /**\n * Finds subject where entity like given subject's entity.\n * Comparision made by entity id.\n */\n protected findByPersistEntityLike(entityTarget: Function|string, entity: ObjectLiteral): Subject|undefined {\n return this.allSubjects.find(subject => {\n if (!subject.entity)\n return false;\n\n if (subject.entity === entity)\n return true;\n\n return subject.metadata.target === entityTarget && subject.metadata.compareEntities(subject.entityWithFulfilledIds!, entity);\n });\n }\n\n}"],"sourceRoot":"../.."}
|
|
@@ -48,14 +48,20 @@ var OneToManySubjectBuilder = /** @class */ (function () {
|
|
|
48
48
|
* by example: subject is "post" entity we are saving here and relation is "categories" inside it here.
|
|
49
49
|
*/
|
|
50
50
|
OneToManySubjectBuilder.prototype.buildForSubjectRelation = function (subject, relation) {
|
|
51
|
-
var _this = this;
|
|
52
51
|
// prepare objects (relation id maps) for the database entity
|
|
53
|
-
// note: subject.databaseEntity contains relations with loaded relation ids only
|
|
54
52
|
// by example: since subject is a post, we are expecting to get all post's categories saved in the database here,
|
|
55
53
|
// particularly their relation ids, e.g. category ids stored in the database
|
|
54
|
+
var _this = this;
|
|
55
|
+
// in most cases relatedEntityDatabaseValues will contain only the entity key properties.
|
|
56
|
+
// this is because subject.databaseEntity contains relations with loaded relation ids only.
|
|
57
|
+
// however if the entity uses the afterLoad hook to calculate any properties, the fetched "key object" might include ADDITIONAL properties.
|
|
58
|
+
// to handle such situations, we pass the data to relation.inverseEntityMetadata.getEntityIdMap to extract the key without any other properties.
|
|
56
59
|
var relatedEntityDatabaseRelationIds = [];
|
|
57
60
|
if (subject.databaseEntity) { // related entities in the database can exist only if this entity (post) is saved
|
|
58
|
-
|
|
61
|
+
var relatedEntityDatabaseRelation = relation.getEntityValue(subject.databaseEntity);
|
|
62
|
+
if (relatedEntityDatabaseRelation) {
|
|
63
|
+
relatedEntityDatabaseRelationIds = relatedEntityDatabaseRelation.map(function (entity) { return relation.inverseEntityMetadata.getEntityIdMap(entity); });
|
|
64
|
+
}
|
|
59
65
|
}
|
|
60
66
|
// get related entities of persisted entity
|
|
61
67
|
// by example: get categories from the passed to persist post entity
|
|
@@ -64,7 +70,7 @@ var OneToManySubjectBuilder = /** @class */ (function () {
|
|
|
64
70
|
relatedEntities = [];
|
|
65
71
|
if (relatedEntities === undefined) // if relation is undefined then nothing to update
|
|
66
72
|
return;
|
|
67
|
-
// extract only relation ids from the related entities, since we only need them for
|
|
73
|
+
// extract only relation ids from the related entities, since we only need them for comparison
|
|
68
74
|
// by example: extract from categories only relation ids (category id, or let's say category title, depend on join column options)
|
|
69
75
|
var relatedPersistedEntityRelationIds = [];
|
|
70
76
|
relatedEntities.forEach(function (relatedEntity) {
|
|
@@ -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 // ---------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------\n\n constructor(protected subjects: Subject[]) {\n }\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\n // skip relations for which persistence is disabled\n if (relation.persistenceEnabled === false)\n 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(subject: Subject, relation: RelationMetadata) {\n\n // prepare objects (relation id maps) for the database entity\n // note: subject.databaseEntity contains relations with loaded relation ids only\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 let relatedEntityDatabaseRelationIds: ObjectLiteral[] = [];\n if (subject.databaseEntity) { // related entities in the database can exist only if this entity (post) is saved\n relatedEntityDatabaseRelationIds = relation.getEntityValue(subject.databaseEntity);\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(subject.entity!);\n if (relatedEntities === null) // we treat relations set to null as removed, so we don't skip it\n relatedEntities = [] as ObjectLiteral[];\n if (relatedEntities === undefined) // 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 comparision\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 => { // by example: relatedEntity is a category here\n let relationIdMap = 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\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)\n 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 = relatedEntityDatabaseRelationIds.find(relatedDatabaseEntityRelationId => {\n return OrmUtils.compareIds(relationIdMap, relatedDatabaseEntityRelationId);\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\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\n .difference(relatedEntityDatabaseRelationIds, relatedPersistedEntityRelationIds)\n .forEach(removedRelatedEntityRelationId => { // 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 (!relation.inverseRelation || relation.inverseRelation.orphanedRowAction === \"nullify\") {\n removedRelatedEntitySubject.canBeUpdated = true;\n removedRelatedEntitySubject.changeMaps = [{\n relation: relation.inverseRelation!,\n value: null\n }];\n } else if (relation.inverseRelation.orphanedRowAction === \"delete\") {\n removedRelatedEntitySubject.mustBeRemoved = true;\n }\n\n this.subjects.push(removedRelatedEntitySubject);\n });\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 // ---------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------\n\n constructor(protected subjects: Subject[]) {\n }\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\n // skip relations for which persistence is disabled\n if (relation.persistenceEnabled === false)\n 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(subject: Subject, relation: RelationMetadata) {\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\t\t// in most cases relatedEntityDatabaseValues will contain only the entity key properties.\n\t\t// this is because subject.databaseEntity contains relations with loaded relation ids only.\n\t\t// however if the entity uses the afterLoad hook to calculate any properties, the fetched \"key object\" might include ADDITIONAL properties.\n\t\t// 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) { // related entities in the database can exist only if this entity (post) is saved\n const relatedEntityDatabaseRelation: ObjectLiteral[] | undefined = relation.getEntityValue(subject.databaseEntity)\n if (relatedEntityDatabaseRelation) {\n relatedEntityDatabaseRelationIds = relatedEntityDatabaseRelation.map((entity) => relation.inverseEntityMetadata.getEntityIdMap(entity)!);\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(subject.entity!);\n if (relatedEntities === null) // we treat relations set to null as removed, so we don't skip it\n relatedEntities = [] as ObjectLiteral[];\n if (relatedEntities === undefined) // 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 => { // by example: relatedEntity is a category here\n let relationIdMap = 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\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)\n 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 = relatedEntityDatabaseRelationIds.find(relatedDatabaseEntityRelationId => {\n return OrmUtils.compareIds(relationIdMap, relatedDatabaseEntityRelationId);\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\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\n .difference(relatedEntityDatabaseRelationIds, relatedPersistedEntityRelationIds)\n .forEach(removedRelatedEntityRelationId => { // 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 (!relation.inverseRelation || relation.inverseRelation.orphanedRowAction === \"nullify\") {\n removedRelatedEntitySubject.canBeUpdated = true;\n removedRelatedEntitySubject.changeMaps = [{\n relation: relation.inverseRelation!,\n value: null\n }];\n } else if (relation.inverseRelation.orphanedRowAction === \"delete\") {\n removedRelatedEntitySubject.mustBeRemoved = true;\n }\n\n this.subjects.push(removedRelatedEntitySubject);\n });\n }\n\n}\n"],"sourceRoot":"../.."}
|
|
@@ -22,10 +22,10 @@ var ClosureSubjectExecutor = /** @class */ (function () {
|
|
|
22
22
|
* Executes operations when subject is being inserted.
|
|
23
23
|
*/
|
|
24
24
|
ClosureSubjectExecutor.prototype.insert = function (subject) {
|
|
25
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
25
|
+
return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
|
|
26
26
|
var closureJunctionInsertMap, parent, escape_1, tableName, queryParams_1, ancestorColumnNames, descendantColumnNames, childEntityIds1, whereCondition;
|
|
27
27
|
var _this = this;
|
|
28
|
-
return tslib_1.__generator(this, function (_a) {
|
|
28
|
+
return (0, tslib_1.__generator)(this, function (_a) {
|
|
29
29
|
switch (_a.label) {
|
|
30
30
|
case 0:
|
|
31
31
|
closureJunctionInsertMap = {};
|
|
@@ -74,7 +74,7 @@ var ClosureSubjectExecutor = /** @class */ (function () {
|
|
|
74
74
|
var parameterName = _this.queryRunner.connection.driver.createParameter("parent_entity_" + column.referencedColumn.databaseName, queryParams_1.length - 1);
|
|
75
75
|
return columnName + " = " + parameterName;
|
|
76
76
|
});
|
|
77
|
-
return [4 /*yield*/, this.queryRunner.query("INSERT INTO " + tableName + " (" + tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(ancestorColumnNames)), tslib_1.__read(descendantColumnNames)).join(", ") + ") " +
|
|
77
|
+
return [4 /*yield*/, this.queryRunner.query("INSERT INTO " + tableName + " (" + (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(ancestorColumnNames), false), (0, tslib_1.__read)(descendantColumnNames), false).join(", ") + ") " +
|
|
78
78
|
("SELECT " + ancestorColumnNames.join(", ") + ", " + childEntityIds1.join(", ") + " FROM " + tableName + " WHERE " + whereCondition.join(" AND ")), queryParams_1)];
|
|
79
79
|
case 2:
|
|
80
80
|
_a.sent();
|
|
@@ -88,11 +88,11 @@ var ClosureSubjectExecutor = /** @class */ (function () {
|
|
|
88
88
|
* Executes operations when subject is being updated.
|
|
89
89
|
*/
|
|
90
90
|
ClosureSubjectExecutor.prototype.update = function (subject) {
|
|
91
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
91
|
+
return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
|
|
92
92
|
var parent, entity, oldParent, oldParentId, parentId, escape, closureTable, ancestorColumnNames, descendantColumnNames, createSubQuery, parameters, _a, _b, column, queryParams_2, tableName, superAlias_1, subAlias_1, select, entityWhereCondition, parentWhereCondition;
|
|
93
93
|
var e_1, _c;
|
|
94
94
|
var _this = this;
|
|
95
|
-
return tslib_1.__generator(this, function (_d) {
|
|
95
|
+
return (0, tslib_1.__generator)(this, function (_d) {
|
|
96
96
|
switch (_d.label) {
|
|
97
97
|
case 0:
|
|
98
98
|
parent = subject.metadata.treeParentRelation.getEntityValue(subject.entity);
|
|
@@ -102,7 +102,7 @@ var ClosureSubjectExecutor = /** @class */ (function () {
|
|
|
102
102
|
if (!entity && parent) // if entity was attached via children
|
|
103
103
|
entity = subject.metadata.treeChildrenRelation.getEntityValue(parent).find(function (child) {
|
|
104
104
|
return Object.entries(subject.identifier).every(function (_a) {
|
|
105
|
-
var _b = tslib_1.__read(_a, 2), key = _b[0], value = _b[1];
|
|
105
|
+
var _b = (0, tslib_1.__read)(_a, 2), key = _b[0], value = _b[1];
|
|
106
106
|
return child[key] === value;
|
|
107
107
|
});
|
|
108
108
|
});
|
|
@@ -133,7 +133,7 @@ var ClosureSubjectExecutor = /** @class */ (function () {
|
|
|
133
133
|
.from(closureTable.tablePath, subAlias);
|
|
134
134
|
try {
|
|
135
135
|
// Create where conditions e.g. (WHERE "subdescendant"."id_ancestor" = :value_id)
|
|
136
|
-
for (var _b = tslib_1.__values(closureTable.ancestorColumns), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
136
|
+
for (var _b = (0, tslib_1.__values)(closureTable.ancestorColumns), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
137
137
|
var column = _c.value;
|
|
138
138
|
subSelect.andWhere(escape(subAlias) + "." + escape(column.databaseName) + " = :value_" + column.referencedColumn.databaseName);
|
|
139
139
|
}
|
|
@@ -153,7 +153,7 @@ var ClosureSubjectExecutor = /** @class */ (function () {
|
|
|
153
153
|
};
|
|
154
154
|
parameters = {};
|
|
155
155
|
try {
|
|
156
|
-
for (_a = tslib_1.__values(subject.metadata.primaryColumns), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
156
|
+
for (_a = (0, tslib_1.__values)(subject.metadata.primaryColumns), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
157
157
|
column = _b.value;
|
|
158
158
|
parameters["value_" + column.databaseName] = entity[column.databaseName];
|
|
159
159
|
}
|
|
@@ -181,7 +181,7 @@ var ClosureSubjectExecutor = /** @class */ (function () {
|
|
|
181
181
|
tableName = this.getTableName(closureTable.tablePath);
|
|
182
182
|
superAlias_1 = escape("supertree");
|
|
183
183
|
subAlias_1 = escape("subtree");
|
|
184
|
-
select = tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(ancestorColumnNames.map(function (columnName) { return superAlias_1 + "." + columnName; }))), tslib_1.__read(descendantColumnNames.map(function (columnName) { return subAlias_1 + "." + columnName; })));
|
|
184
|
+
select = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(ancestorColumnNames.map(function (columnName) { return superAlias_1 + "." + columnName; })), false), (0, tslib_1.__read)(descendantColumnNames.map(function (columnName) { return subAlias_1 + "." + columnName; })), false);
|
|
185
185
|
entityWhereCondition = subject.metadata.closureJunctionTable.ancestorColumns.map(function (column) {
|
|
186
186
|
var columnName = escape(column.databaseName);
|
|
187
187
|
var entityId = column.referencedColumn.getEntityValue(entity);
|
|
@@ -198,10 +198,10 @@ var ClosureSubjectExecutor = /** @class */ (function () {
|
|
|
198
198
|
var parameterName = _this.queryRunner.connection.driver.createParameter("parent_entity_" + column.referencedColumn.databaseName, queryParams_2.length - 1);
|
|
199
199
|
return superAlias_1 + "." + columnName + " = " + parameterName;
|
|
200
200
|
});
|
|
201
|
-
return [4 /*yield*/, this.queryRunner.query("INSERT INTO " + tableName + " (" + tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(ancestorColumnNames)), tslib_1.__read(descendantColumnNames)).join(", ") + ") " +
|
|
201
|
+
return [4 /*yield*/, this.queryRunner.query("INSERT INTO " + tableName + " (" + (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(ancestorColumnNames), false), (0, tslib_1.__read)(descendantColumnNames), false).join(", ") + ") " +
|
|
202
202
|
("SELECT " + select.join(", ") + " ") +
|
|
203
203
|
("FROM " + tableName + " AS " + superAlias_1 + ", " + tableName + " AS " + subAlias_1 + " ") +
|
|
204
|
-
("WHERE " + tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(entityWhereCondition)), tslib_1.__read(parentWhereCondition)).join(" AND ")), queryParams_2)];
|
|
204
|
+
("WHERE " + (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(entityWhereCondition), false), (0, tslib_1.__read)(parentWhereCondition), false).join(" AND ")), queryParams_2)];
|
|
205
205
|
case 2:
|
|
206
206
|
_d.sent();
|
|
207
207
|
_d.label = 3;
|
|
@@ -214,10 +214,10 @@ var ClosureSubjectExecutor = /** @class */ (function () {
|
|
|
214
214
|
* Executes operations when subject is being removed.
|
|
215
215
|
*/
|
|
216
216
|
ClosureSubjectExecutor.prototype.remove = function (subjects) {
|
|
217
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
217
|
+
return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
|
|
218
218
|
var escape, identifiers, closureTable, generateWheres, ancestorWhere, descendantWhere;
|
|
219
219
|
var _this = this;
|
|
220
|
-
return tslib_1.__generator(this, function (_a) {
|
|
220
|
+
return (0, tslib_1.__generator)(this, function (_a) {
|
|
221
221
|
switch (_a.label) {
|
|
222
222
|
case 0:
|
|
223
223
|
// Only mssql need to execute deletes for the juntion table as it doesn't support multi cascade paths.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/persistence/tree/ClosureSubjectExecutor.ts"],"names":[],"mappings":"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","file":"ClosureSubjectExecutor.js","sourcesContent":["import {Subject} from \"../Subject\";\nimport {QueryRunner} from \"../../query-runner/QueryRunner\";\nimport {ObjectLiteral} from \"../../common/ObjectLiteral\";\nimport {CannotAttachTreeChildrenEntityError} from \"../../error/CannotAttachTreeChildrenEntityError\";\nimport {DeleteQueryBuilder} from \"../../query-builder/DeleteQueryBuilder\";\nimport {OrmUtils} from \"../../util/OrmUtils\";\nimport {SqlServerDriver} from \"../../driver/sqlserver/SqlServerDriver\";\nimport {ColumnMetadata} from \"../../metadata/ColumnMetadata\";\n\n/**\n * Executes subject operations for closure entities.\n */\nexport class ClosureSubjectExecutor {\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(protected queryRunner: QueryRunner) {\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Executes operations when subject is being inserted.\n */\n async insert(subject: Subject): Promise<void> {\n\n // create values to be inserted into the closure junction\n const closureJunctionInsertMap: ObjectLiteral = {};\n subject.metadata.closureJunctionTable.ancestorColumns.forEach(column => {\n closureJunctionInsertMap[column.databaseName] = subject.identifier;\n });\n subject.metadata.closureJunctionTable.descendantColumns.forEach(column => {\n closureJunctionInsertMap[column.databaseName] = subject.identifier;\n });\n\n // insert values into the closure junction table\n await this.queryRunner\n .manager\n .createQueryBuilder()\n .insert()\n .into(subject.metadata.closureJunctionTable.tablePath)\n .values(closureJunctionInsertMap)\n .updateEntity(false)\n .callListeners(false)\n .execute();\n\n let parent = subject.metadata.treeParentRelation!.getEntityValue(subject.entity!); // if entity was attached via parent\n if (!parent && subject.parentSubject && subject.parentSubject.entity) // if entity was attached via children\n parent = subject.parentSubject.insertedValueSet ? subject.parentSubject.insertedValueSet : subject.parentSubject.entity;\n\n if (parent) {\n const escape = (alias: string) => this.queryRunner.connection.driver.escape(alias);\n const tableName = this.getTableName(subject.metadata.closureJunctionTable.tablePath);\n const queryParams: any[] = [];\n\n const ancestorColumnNames = subject.metadata.closureJunctionTable.ancestorColumns.map(column => {\n return escape(column.databaseName);\n });\n const descendantColumnNames = subject.metadata.closureJunctionTable.descendantColumns.map(column => {\n return escape(column.databaseName);\n });\n const childEntityIds1 = subject.metadata.primaryColumns.map(column => {\n queryParams.push(column.getEntityValue(subject.insertedValueSet ? subject.insertedValueSet : subject.entity!));\n return this.queryRunner.connection.driver.createParameter(\"child_entity_\" + column.databaseName, queryParams.length - 1);\n });\n\n const whereCondition = subject.metadata.closureJunctionTable.descendantColumns.map(column => {\n const columnName = escape(column.databaseName);\n const parentId = column.referencedColumn!.getEntityValue(parent);\n\n if (!parentId)\n throw new CannotAttachTreeChildrenEntityError(subject.metadata.name);\n\n queryParams.push(parentId);\n const parameterName = this.queryRunner.connection.driver.createParameter(\"parent_entity_\" + column.referencedColumn!.databaseName, queryParams.length - 1);\n return `${columnName} = ${parameterName}`;\n });\n\n await this.queryRunner.query(\n `INSERT INTO ${tableName} (${[...ancestorColumnNames, ...descendantColumnNames].join(\", \")}) ` +\n `SELECT ${ancestorColumnNames.join(\", \")}, ${childEntityIds1.join(\", \")} FROM ${tableName} WHERE ${whereCondition.join(\" AND \")}`,\n queryParams\n );\n }\n }\n\n /**\n * Executes operations when subject is being updated.\n */\n async update(subject: Subject): Promise<void> {\n let parent = subject.metadata.treeParentRelation!.getEntityValue(subject.entity!); // if entity was attached via parent\n if (!parent && subject.parentSubject && subject.parentSubject.entity) // if entity was attached via children\n parent = subject.parentSubject.entity;\n\n let entity = subject.databaseEntity; // if entity was attached via parent\n if (!entity && parent) // if entity was attached via children\n entity = subject.metadata.treeChildrenRelation!.getEntityValue(parent).find((child: any) => {\n return Object.entries(subject.identifier!).every(([key, value]) => child[key] === value);\n });\n\n // Exit if the parent or the entity where never set\n if (entity === undefined || parent === undefined) {\n return;\n }\n\n const oldParent = subject.metadata.treeParentRelation!.getEntityValue(entity!);\n const oldParentId = subject.metadata.getEntityIdMap(oldParent);\n const parentId = subject.metadata.getEntityIdMap(parent);\n\n // Exit if the new and old parents are the same\n if (OrmUtils.compareIds(oldParentId, parentId)) {\n return;\n }\n\n const escape = (alias: string) => this.queryRunner.connection.driver.escape(alias);\n const closureTable = subject.metadata.closureJunctionTable;\n\n const ancestorColumnNames = closureTable.ancestorColumns.map(column => {\n return escape(column.databaseName);\n });\n\n const descendantColumnNames = closureTable.descendantColumns.map(column => {\n return escape(column.databaseName);\n });\n\n // Delete logic\n const createSubQuery = (qb: DeleteQueryBuilder<any>, alias: string) => {\n const subAlias = `sub${alias}`;\n\n const subSelect = qb.createQueryBuilder()\n .select(descendantColumnNames.join(\", \"))\n .from(closureTable.tablePath, subAlias);\n\n // Create where conditions e.g. (WHERE \"subdescendant\".\"id_ancestor\" = :value_id)\n for (const column of closureTable.ancestorColumns) {\n subSelect.andWhere(`${escape(subAlias)}.${escape(column.databaseName)} = :value_${column.referencedColumn!.databaseName}`);\n }\n\n return qb.createQueryBuilder()\n .select(descendantColumnNames.join(\", \"))\n .from(`(${subSelect.getQuery()})`, alias)\n .setParameters(subSelect.getParameters())\n .getQuery();\n };\n\n const parameters: ObjectLiteral = {};\n for (const column of subject.metadata.primaryColumns) {\n parameters[`value_${column.databaseName}`] = entity![column.databaseName];\n }\n\n await this.queryRunner\n .manager\n .createQueryBuilder()\n .delete()\n .from(closureTable.tablePath)\n .where(qb => `(${descendantColumnNames.join(\", \")}) IN (${createSubQuery(qb, \"descendant\")})`)\n .andWhere(qb => `(${ancestorColumnNames.join(\", \")}) NOT IN (${createSubQuery(qb, \"ancestor\")})`)\n .setParameters(parameters)\n .execute();\n\n /**\n * Only insert new parent if it exits\n * \n * This only happens if the entity doesn't become a root entity\n */\n if (parent) {\n // Insert logic\n const queryParams: any[] = [];\n\n const tableName = this.getTableName(closureTable.tablePath);\n const superAlias = escape(\"supertree\");\n const subAlias = escape(\"subtree\");\n\n const select = [\n ...ancestorColumnNames.map(columnName => `${superAlias}.${columnName}`),\n ...descendantColumnNames.map(columnName => `${subAlias}.${columnName}`)\n ];\n\n const entityWhereCondition = subject.metadata.closureJunctionTable.ancestorColumns.map(column => {\n const columnName = escape(column.databaseName);\n const entityId = column.referencedColumn!.getEntityValue(entity!);\n\n queryParams.push(entityId);\n const parameterName = this.queryRunner.connection.driver.createParameter(\"entity_\" + column.referencedColumn!.databaseName, queryParams.length - 1);\n return `${subAlias}.${columnName} = ${parameterName}`;\n });\n\n const parentWhereCondition = subject.metadata.closureJunctionTable.descendantColumns.map(column => {\n const columnName = escape(column.databaseName);\n const parentId = column.referencedColumn!.getEntityValue(parent);\n\n if (!parentId)\n throw new CannotAttachTreeChildrenEntityError(subject.metadata.name);\n\n queryParams.push(parentId);\n const parameterName = this.queryRunner.connection.driver.createParameter(\"parent_entity_\" + column.referencedColumn!.databaseName, queryParams.length - 1);\n return `${superAlias}.${columnName} = ${parameterName}`;\n });\n\n\n await this.queryRunner.query(\n `INSERT INTO ${tableName} (${[...ancestorColumnNames, ...descendantColumnNames].join(\", \")}) ` +\n `SELECT ${select.join(\", \")} ` +\n `FROM ${tableName} AS ${superAlias}, ${tableName} AS ${subAlias} ` +\n `WHERE ${[...entityWhereCondition, ...parentWhereCondition].join(\" AND \")}`,\n queryParams\n );\n }\n }\n\n /**\n * Executes operations when subject is being removed.\n */\n async remove(subjects: Subject|Subject[]): Promise<void> {\n // Only mssql need to execute deletes for the juntion table as it doesn't support multi cascade paths.\n if (!(this.queryRunner.connection.driver instanceof SqlServerDriver)) {\n return;\n }\n\n if (!Array.isArray(subjects))\n subjects = [subjects];\n\n const escape = (alias: string) => this.queryRunner.connection.driver.escape(alias);\n const identifiers = subjects.map(subject => subject.identifier);\n const closureTable = subjects[0].metadata.closureJunctionTable;\n\n const generateWheres = (columns: ColumnMetadata[]) => {\n return columns.map(column => {\n const data = identifiers.map(identifier => identifier![column.referencedColumn!.databaseName]);\n return `${escape(column.databaseName)} IN (${data.join(\", \")})`;\n }).join(\" AND \");\n };\n\n const ancestorWhere = generateWheres(closureTable.ancestorColumns);\n const descendantWhere = generateWheres(closureTable.descendantColumns);\n\n await this.queryRunner\n .manager\n .createQueryBuilder()\n .delete()\n .from(closureTable.tablePath)\n .where(ancestorWhere)\n .orWhere(descendantWhere)\n .execute();\n }\n\n /**\n * Gets escaped table name with schema name if SqlServer or Postgres driver used with custom\n * schema name, otherwise returns escaped table name.\n */\n protected getTableName(tablePath: string): string {\n return tablePath.split(\".\")\n .map(i => {\n // this condition need because in SQL Server driver when custom database name was specified and schema name was not, we got `dbName..tableName` string, and doesn't need to escape middle empty string\n return i === \"\" ? i : this.queryRunner.connection.driver.escape(i);\n }).join(\".\");\n }\n}"],"sourceRoot":"../.."}
|
|
1
|
+
{"version":3,"sources":["../../src/persistence/tree/ClosureSubjectExecutor.ts"],"names":[],"mappings":"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","file":"ClosureSubjectExecutor.js","sourcesContent":["import {Subject} from \"../Subject\";\nimport {QueryRunner} from \"../../query-runner/QueryRunner\";\nimport {ObjectLiteral} from \"../../common/ObjectLiteral\";\nimport {CannotAttachTreeChildrenEntityError} from \"../../error/CannotAttachTreeChildrenEntityError\";\nimport {DeleteQueryBuilder} from \"../../query-builder/DeleteQueryBuilder\";\nimport {OrmUtils} from \"../../util/OrmUtils\";\nimport {SqlServerDriver} from \"../../driver/sqlserver/SqlServerDriver\";\nimport {ColumnMetadata} from \"../../metadata/ColumnMetadata\";\n\n/**\n * Executes subject operations for closure entities.\n */\nexport class ClosureSubjectExecutor {\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(protected queryRunner: QueryRunner) {\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Executes operations when subject is being inserted.\n */\n async insert(subject: Subject): Promise<void> {\n\n // create values to be inserted into the closure junction\n const closureJunctionInsertMap: ObjectLiteral = {};\n subject.metadata.closureJunctionTable.ancestorColumns.forEach(column => {\n closureJunctionInsertMap[column.databaseName] = subject.identifier;\n });\n subject.metadata.closureJunctionTable.descendantColumns.forEach(column => {\n closureJunctionInsertMap[column.databaseName] = subject.identifier;\n });\n\n // insert values into the closure junction table\n await this.queryRunner\n .manager\n .createQueryBuilder()\n .insert()\n .into(subject.metadata.closureJunctionTable.tablePath)\n .values(closureJunctionInsertMap)\n .updateEntity(false)\n .callListeners(false)\n .execute();\n\n let parent = subject.metadata.treeParentRelation!.getEntityValue(subject.entity!); // if entity was attached via parent\n if (!parent && subject.parentSubject && subject.parentSubject.entity) // if entity was attached via children\n parent = subject.parentSubject.insertedValueSet ? subject.parentSubject.insertedValueSet : subject.parentSubject.entity;\n\n if (parent) {\n const escape = (alias: string) => this.queryRunner.connection.driver.escape(alias);\n const tableName = this.getTableName(subject.metadata.closureJunctionTable.tablePath);\n const queryParams: any[] = [];\n\n const ancestorColumnNames = subject.metadata.closureJunctionTable.ancestorColumns.map(column => {\n return escape(column.databaseName);\n });\n const descendantColumnNames = subject.metadata.closureJunctionTable.descendantColumns.map(column => {\n return escape(column.databaseName);\n });\n const childEntityIds1 = subject.metadata.primaryColumns.map(column => {\n queryParams.push(column.getEntityValue(subject.insertedValueSet ? subject.insertedValueSet : subject.entity!));\n return this.queryRunner.connection.driver.createParameter(\"child_entity_\" + column.databaseName, queryParams.length - 1);\n });\n\n const whereCondition = subject.metadata.closureJunctionTable.descendantColumns.map(column => {\n const columnName = escape(column.databaseName);\n const parentId = column.referencedColumn!.getEntityValue(parent);\n\n if (!parentId)\n throw new CannotAttachTreeChildrenEntityError(subject.metadata.name);\n\n queryParams.push(parentId);\n const parameterName = this.queryRunner.connection.driver.createParameter(\"parent_entity_\" + column.referencedColumn!.databaseName, queryParams.length - 1);\n return `${columnName} = ${parameterName}`;\n });\n\n await this.queryRunner.query(\n `INSERT INTO ${tableName} (${[...ancestorColumnNames, ...descendantColumnNames].join(\", \")}) ` +\n `SELECT ${ancestorColumnNames.join(\", \")}, ${childEntityIds1.join(\", \")} FROM ${tableName} WHERE ${whereCondition.join(\" AND \")}`,\n queryParams\n );\n }\n }\n\n /**\n * Executes operations when subject is being updated.\n */\n async update(subject: Subject): Promise<void> {\n let parent = subject.metadata.treeParentRelation!.getEntityValue(subject.entity!); // if entity was attached via parent\n if (!parent && subject.parentSubject && subject.parentSubject.entity) // if entity was attached via children\n parent = subject.parentSubject.entity;\n\n let entity = subject.databaseEntity; // if entity was attached via parent\n if (!entity && parent) // if entity was attached via children\n entity = subject.metadata.treeChildrenRelation!.getEntityValue(parent).find((child: any) => {\n return Object.entries(subject.identifier!).every(([key, value]) => child[key] === value);\n });\n\n // Exit if the parent or the entity where never set\n if (entity === undefined || parent === undefined) {\n return;\n }\n\n const oldParent = subject.metadata.treeParentRelation!.getEntityValue(entity!);\n const oldParentId = subject.metadata.getEntityIdMap(oldParent);\n const parentId = subject.metadata.getEntityIdMap(parent);\n\n // Exit if the new and old parents are the same\n if (OrmUtils.compareIds(oldParentId, parentId)) {\n return;\n }\n\n const escape = (alias: string) => this.queryRunner.connection.driver.escape(alias);\n const closureTable = subject.metadata.closureJunctionTable;\n\n const ancestorColumnNames = closureTable.ancestorColumns.map(column => {\n return escape(column.databaseName);\n });\n\n const descendantColumnNames = closureTable.descendantColumns.map(column => {\n return escape(column.databaseName);\n });\n\n // Delete logic\n const createSubQuery = (qb: DeleteQueryBuilder<any>, alias: string) => {\n const subAlias = `sub${alias}`;\n\n const subSelect = qb.createQueryBuilder()\n .select(descendantColumnNames.join(\", \"))\n .from(closureTable.tablePath, subAlias);\n\n // Create where conditions e.g. (WHERE \"subdescendant\".\"id_ancestor\" = :value_id)\n for (const column of closureTable.ancestorColumns) {\n subSelect.andWhere(`${escape(subAlias)}.${escape(column.databaseName)} = :value_${column.referencedColumn!.databaseName}`);\n }\n\n return qb.createQueryBuilder()\n .select(descendantColumnNames.join(\", \"))\n .from(`(${subSelect.getQuery()})`, alias)\n .setParameters(subSelect.getParameters())\n .getQuery();\n };\n\n const parameters: ObjectLiteral = {};\n for (const column of subject.metadata.primaryColumns) {\n parameters[`value_${column.databaseName}`] = entity![column.databaseName];\n }\n\n await this.queryRunner\n .manager\n .createQueryBuilder()\n .delete()\n .from(closureTable.tablePath)\n .where(qb => `(${descendantColumnNames.join(\", \")}) IN (${createSubQuery(qb, \"descendant\")})`)\n .andWhere(qb => `(${ancestorColumnNames.join(\", \")}) NOT IN (${createSubQuery(qb, \"ancestor\")})`)\n .setParameters(parameters)\n .execute();\n\n /**\n * Only insert new parent if it exits\n * \n * This only happens if the entity doesn't become a root entity\n */\n if (parent) {\n // Insert logic\n const queryParams: any[] = [];\n\n const tableName = this.getTableName(closureTable.tablePath);\n const superAlias = escape(\"supertree\");\n const subAlias = escape(\"subtree\");\n\n const select = [\n ...ancestorColumnNames.map(columnName => `${superAlias}.${columnName}`),\n ...descendantColumnNames.map(columnName => `${subAlias}.${columnName}`)\n ];\n\n const entityWhereCondition = subject.metadata.closureJunctionTable.ancestorColumns.map(column => {\n const columnName = escape(column.databaseName);\n const entityId = column.referencedColumn!.getEntityValue(entity!);\n\n queryParams.push(entityId);\n const parameterName = this.queryRunner.connection.driver.createParameter(\"entity_\" + column.referencedColumn!.databaseName, queryParams.length - 1);\n return `${subAlias}.${columnName} = ${parameterName}`;\n });\n\n const parentWhereCondition = subject.metadata.closureJunctionTable.descendantColumns.map(column => {\n const columnName = escape(column.databaseName);\n const parentId = column.referencedColumn!.getEntityValue(parent);\n\n if (!parentId)\n throw new CannotAttachTreeChildrenEntityError(subject.metadata.name);\n\n queryParams.push(parentId);\n const parameterName = this.queryRunner.connection.driver.createParameter(\"parent_entity_\" + column.referencedColumn!.databaseName, queryParams.length - 1);\n return `${superAlias}.${columnName} = ${parameterName}`;\n });\n\n\n await this.queryRunner.query(\n `INSERT INTO ${tableName} (${[...ancestorColumnNames, ...descendantColumnNames].join(\", \")}) ` +\n `SELECT ${select.join(\", \")} ` +\n `FROM ${tableName} AS ${superAlias}, ${tableName} AS ${subAlias} ` +\n `WHERE ${[...entityWhereCondition, ...parentWhereCondition].join(\" AND \")}`,\n queryParams\n );\n }\n }\n\n /**\n * Executes operations when subject is being removed.\n */\n async remove(subjects: Subject|Subject[]): Promise<void> {\n // Only mssql need to execute deletes for the juntion table as it doesn't support multi cascade paths.\n if (!(this.queryRunner.connection.driver instanceof SqlServerDriver)) {\n return;\n }\n\n if (!Array.isArray(subjects))\n subjects = [subjects];\n\n const escape = (alias: string) => this.queryRunner.connection.driver.escape(alias);\n const identifiers = subjects.map(subject => subject.identifier);\n const closureTable = subjects[0].metadata.closureJunctionTable;\n\n const generateWheres = (columns: ColumnMetadata[]) => {\n return columns.map(column => {\n const data = identifiers.map(identifier => identifier![column.referencedColumn!.databaseName]);\n return `${escape(column.databaseName)} IN (${data.join(\", \")})`;\n }).join(\" AND \");\n };\n\n const ancestorWhere = generateWheres(closureTable.ancestorColumns);\n const descendantWhere = generateWheres(closureTable.descendantColumns);\n\n await this.queryRunner\n .manager\n .createQueryBuilder()\n .delete()\n .from(closureTable.tablePath)\n .where(ancestorWhere)\n .orWhere(descendantWhere)\n .execute();\n }\n\n /**\n * Gets escaped table name with schema name if SqlServer or Postgres driver used with custom\n * schema name, otherwise returns escaped table name.\n */\n protected getTableName(tablePath: string): string {\n return tablePath.split(\".\")\n .map(i => {\n // this condition need because in SQL Server driver when custom database name was specified and schema name was not, we got `dbName..tableName` string, and doesn't need to escape middle empty string\n return i === \"\" ? i : this.queryRunner.connection.driver.escape(i);\n }).join(\".\");\n }\n}"],"sourceRoot":"../.."}
|
|
@@ -20,10 +20,10 @@ var MaterializedPathSubjectExecutor = /** @class */ (function () {
|
|
|
20
20
|
* Executes operations when subject is being inserted.
|
|
21
21
|
*/
|
|
22
22
|
MaterializedPathSubjectExecutor.prototype.insert = function (subject) {
|
|
23
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
23
|
+
return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
|
|
24
24
|
var parent, parentId, parentPath, insertedEntityId;
|
|
25
25
|
var _a;
|
|
26
|
-
return tslib_1.__generator(this, function (_b) {
|
|
26
|
+
return (0, tslib_1.__generator)(this, function (_b) {
|
|
27
27
|
switch (_b.label) {
|
|
28
28
|
case 0:
|
|
29
29
|
parent = subject.metadata.treeParentRelation.getEntityValue(subject.entity);
|
|
@@ -59,10 +59,10 @@ var MaterializedPathSubjectExecutor = /** @class */ (function () {
|
|
|
59
59
|
* Executes operations when subject is being updated.
|
|
60
60
|
*/
|
|
61
61
|
MaterializedPathSubjectExecutor.prototype.update = function (subject) {
|
|
62
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
62
|
+
return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
|
|
63
63
|
var newParent, entity, oldParent, oldParentId, newParentId, newParentPath, oldParentPath, entityPath, propertyPath;
|
|
64
64
|
var _a;
|
|
65
|
-
return tslib_1.__generator(this, function (_b) {
|
|
65
|
+
return (0, tslib_1.__generator)(this, function (_b) {
|
|
66
66
|
switch (_b.label) {
|
|
67
67
|
case 0:
|
|
68
68
|
newParent = subject.metadata.treeParentRelation.getEntityValue(subject.entity);
|
|
@@ -72,7 +72,7 @@ var MaterializedPathSubjectExecutor = /** @class */ (function () {
|
|
|
72
72
|
if (!entity && newParent) // if entity was attached via children
|
|
73
73
|
entity = subject.metadata.treeChildrenRelation.getEntityValue(newParent).find(function (child) {
|
|
74
74
|
return Object.entries(subject.identifier).every(function (_a) {
|
|
75
|
-
var _b = tslib_1.__read(_a, 2), key = _b[0], value = _b[1];
|
|
75
|
+
var _b = (0, tslib_1.__read)(_a, 2), key = _b[0], value = _b[1];
|
|
76
76
|
return child[key] === value;
|
|
77
77
|
});
|
|
78
78
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/persistence/tree/MaterializedPathSubjectExecutor.ts"],"names":[],"mappings":";;;;AAEA,gDAA6C;AAG7C;;GAEG;AACH;IAEI,4EAA4E;IAC5E,cAAc;IACd,4EAA4E;IAE5E,yCAAsB,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAC9C,CAAC;IAED,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAE5E;;OAEG;IACG,gDAAM,GAAZ,UAAa,OAAgB;;;;;;;wBACrB,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,kBAAmB,CAAC,cAAc,CAAC,OAAO,CAAC,MAAO,CAAC,CAAC;wBAClF,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,sCAAsC;4BACxG,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;wBAEtH,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;wBAErD,UAAU,GAAW,EAAE,CAAC;6BACxB,QAAQ,EAAR,wBAAQ;wBACK,qBAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAA;;wBAAxD,UAAU,GAAG,SAA2C,CAAC;;;wBAGvD,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,kBAAmB,CAAC,WAAW,CAAC,GAAG,CAAC,UAAA,UAAU;4BACpF,OAAO,UAAU,CAAC,gBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAiB,CAAC,CAAC;wBAClF,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBAEb,qBAAM,IAAI,CAAC,WAAW,CAAC,OAAO;iCACzB,kBAAkB,EAAE;iCACpB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;iCAC/B,GAAG,CAAC,CAAA;gCACD,GAAC,OAAO,CAAC,QAAQ,CAAC,sBAAuB,CAAC,YAAY,IAAG,UAAU,GAAG,gBAAgB,GAAG,GAAG;kCACxF,CAAA,CAAC;iCACR,KAAK,CAAC,OAAO,CAAC,UAAW,CAAC;iCAC1B,OAAO,EAAE,EAAA;;wBAPd,SAOc,CAAC;;;;;KAClB;IAED;;OAEG;IACG,gDAAM,GAAZ,UAAa,OAAgB;;;;;;;wBACrB,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,kBAAmB,CAAC,cAAc,CAAC,OAAO,CAAC,MAAO,CAAC,CAAC;wBACrF,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,sCAAsC;4BAC3G,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;wBAEzC,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;wBACpC,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,sCAAsC;4BAC5D,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,oBAAqB,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAC,KAAU;gCACtF,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAW,CAAC,CAAC,KAAK,CAAC,UAAC,EAAY;wCAAZ,KAAA,
|
|
1
|
+
{"version":3,"sources":["../../src/persistence/tree/MaterializedPathSubjectExecutor.ts"],"names":[],"mappings":"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","file":"MaterializedPathSubjectExecutor.js","sourcesContent":["import {Subject} from \"../Subject\";\nimport {QueryRunner} from \"../../query-runner/QueryRunner\";\nimport {OrmUtils} from \"../../util/OrmUtils\";\nimport {ObjectLiteral} from \"../../common/ObjectLiteral\";\n\n/**\n * Executes subject operations for materialized-path tree entities.\n */\nexport class MaterializedPathSubjectExecutor {\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(protected queryRunner: QueryRunner) {\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Executes operations when subject is being inserted.\n */\n async insert(subject: Subject): Promise<void> {\n let parent = subject.metadata.treeParentRelation!.getEntityValue(subject.entity!); // if entity was attached via parent\n if (!parent && subject.parentSubject && subject.parentSubject.entity) // if entity was attached via children\n parent = subject.parentSubject.insertedValueSet ? subject.parentSubject.insertedValueSet : subject.parentSubject.entity;\n\n const parentId = subject.metadata.getEntityIdMap(parent);\n\n let parentPath: string = \"\";\n if (parentId) {\n parentPath = await this.getEntityPath(subject, parentId);\n }\n\n const insertedEntityId = subject.metadata.treeParentRelation!.joinColumns.map(joinColumn => {\n return joinColumn.referencedColumn!.getEntityValue(subject.insertedValueSet!);\n }).join(\"_\");\n\n await this.queryRunner.manager\n .createQueryBuilder()\n .update(subject.metadata.target)\n .set({\n [subject.metadata.materializedPathColumn!.propertyPath]: parentPath + insertedEntityId + \".\"\n } as any)\n .where(subject.identifier!)\n .execute();\n }\n\n /**\n * Executes operations when subject is being updated.\n */\n async update(subject: Subject): Promise<void> {\n let newParent = subject.metadata.treeParentRelation!.getEntityValue(subject.entity!); // if entity was attached via parent\n if (!newParent && subject.parentSubject && subject.parentSubject.entity) // if entity was attached via children\n newParent = subject.parentSubject.entity;\n\n let entity = subject.databaseEntity; // if entity was attached via parent\n if (!entity && newParent) // if entity was attached via children\n entity = subject.metadata.treeChildrenRelation!.getEntityValue(newParent).find((child: any) => {\n return Object.entries(subject.identifier!).every(([key, value]) => child[key] === value);\n });\n\n\n const oldParent = subject.metadata.treeParentRelation!.getEntityValue(entity!);\n const oldParentId = subject.metadata.getEntityIdMap(oldParent);\n const newParentId = subject.metadata.getEntityIdMap(newParent);\n\n // Exit if the new and old parents are the same\n if (OrmUtils.compareIds(oldParentId, newParentId)) {\n return;\n }\n\n let newParentPath: string = \"\";\n if (newParentId) {\n newParentPath = await this.getEntityPath(subject, newParentId);\n }\n\n let oldParentPath: string = \"\";\n if (oldParentId) {\n oldParentPath = await this.getEntityPath(subject, oldParentId) || \"\";\n }\n\n const entityPath = subject.metadata.treeParentRelation!.joinColumns.map(joinColumn => {\n return joinColumn.referencedColumn!.getEntityValue(entity!);\n }).join(\"_\");\n\n const propertyPath = subject.metadata.materializedPathColumn!.propertyPath;\n await this.queryRunner.manager\n .createQueryBuilder()\n .update(subject.metadata.target)\n .set({\n [propertyPath]: () => `REPLACE(${propertyPath}, '${oldParentPath}${entityPath}.', '${newParentPath}${entityPath}.')`\n } as any)\n .where(`${propertyPath} LIKE :path`, { path: `${oldParentPath}${entityPath}.%` })\n .execute();\n }\n\n private getEntityPath(subject: Subject, id: ObjectLiteral): Promise<any> {\n return this.queryRunner.manager\n .createQueryBuilder()\n .select(subject.metadata.targetName + \".\" + subject.metadata.materializedPathColumn!.propertyPath, \"path\")\n .from(subject.metadata.target, subject.metadata.targetName)\n .whereInIds(id)\n .getRawOne()\n .then(result => result ? result[\"path\"] : undefined);\n }\n}\n"],"sourceRoot":"../.."}
|