From b5f2474f65682243f3a7361e5ae27078902a0315 Mon Sep 17 00:00:00 2001 From: Phil Kunz Date: Thu, 10 Sep 2020 10:12:17 +0000 Subject: [PATCH] fix(core): update --- test/test.ts | 2 +- ts/smartdata.classes.collection.ts | 28 ++++++++++++--------- ts/smartdata.classes.collectionfactory.ts | 22 +++++++++++++++++ ts/smartdata.classes.db.ts | 2 +- ts/smartdata.classes.doc.ts | 30 ++++------------------- 5 files changed, 45 insertions(+), 39 deletions(-) create mode 100644 ts/smartdata.classes.collectionfactory.ts diff --git a/test/test.ts b/test/test.ts index f0d9aa0..4597eca 100644 --- a/test/test.ts +++ b/test/test.ts @@ -100,7 +100,7 @@ tap.test('expect to get instance of Car', async () => { do { const timeStart = Date.now(); const myCars = await Car.getInstances({ - brand: 'Volvo', + brand: 'Renault', }); console.log(`took ${Date.now() - timeStart}`); counter++; diff --git a/ts/smartdata.classes.collection.ts b/ts/smartdata.classes.collection.ts index 6f13d31..623ce89 100644 --- a/ts/smartdata.classes.collection.ts +++ b/ts/smartdata.classes.collection.ts @@ -1,6 +1,7 @@ import * as plugins from './smartdata.plugins'; import { SmartdataDb } from './smartdata.classes.db'; import { SmartDataDbDoc } from './smartdata.classes.doc'; +import { CollectionFactory } from './smartdata.classes.collectionfactory'; export interface IFindOptions { limit?: number; @@ -15,23 +16,26 @@ export interface IDocValidationFunc { export type TDelayedDbCreation = () => SmartdataDb; +const collectionFactory = new CollectionFactory(); + /** * This is a decorator that will tell the decorated class what dbTable to use * @param dbArg */ export function Collection(dbArg: SmartdataDb | TDelayedDbCreation) { - return function (constructor) { - if (dbArg instanceof SmartdataDb) { - // tslint:disable-next-line: no-string-literal - constructor['smartdataCollection'] = new SmartdataCollection(constructor, dbArg); - } else { - constructor['smartdataDelayedCollection'] = () => { - return new SmartdataCollection(constructor, dbArg()); - }; - } + return function classDecorator(constructor: T) { + return class extends constructor { + public static get collection() { + return collectionFactory.getCollection(constructor.name, dbArg); + } + public get collection() { + return collectionFactory.getCollection(constructor.name, dbArg); + } + }; }; } +// tslint:disable-next-line: max-classes-per-file export class SmartdataCollection { /** * the collection that is used @@ -42,13 +46,13 @@ export class SmartdataCollection { public smartdataDb: SmartdataDb; public uniqueIndexes: string[] = []; - constructor(collectedClassArg: T & SmartDataDbDoc, smartDataDbArg: SmartdataDb) { + constructor(classNameArg: string, smartDataDbArg: SmartdataDb) { // tell the collection where it belongs - this.collectionName = collectedClassArg.name; + this.collectionName = classNameArg; this.smartdataDb = smartDataDbArg; // tell the db class about it (important since Db uses different systems under the hood) - this.smartdataDb.addTable(this); + this.smartdataDb.addCollection(this); } /** diff --git a/ts/smartdata.classes.collectionfactory.ts b/ts/smartdata.classes.collectionfactory.ts new file mode 100644 index 0000000..5982223 --- /dev/null +++ b/ts/smartdata.classes.collectionfactory.ts @@ -0,0 +1,22 @@ +import * as plugins from './smartdata.plugins'; +import { SmartdataCollection } from './smartdata.classes.collection'; +import { SmartdataDb } from './smartdata.classes.db'; + +export class CollectionFactory { + public collections: {[key: string]: SmartdataCollection} = {}; + + public getCollection = (nameArg: string, dbArg: SmartdataDb | (() => SmartdataDb)): SmartdataCollection => { + if (!this.collections[nameArg]) { + this.collections[nameArg] = (() => { + if (dbArg instanceof SmartdataDb) { + // tslint:disable-next-line: no-string-literal + return new SmartdataCollection(nameArg, dbArg); + } else { + dbArg = dbArg(); + return new SmartdataCollection(nameArg, dbArg); + } + })(); + } + return this.collections[nameArg]; + } +} \ No newline at end of file diff --git a/ts/smartdata.classes.db.ts b/ts/smartdata.classes.db.ts index a8aa01e..35f341a 100644 --- a/ts/smartdata.classes.db.ts +++ b/ts/smartdata.classes.db.ts @@ -59,7 +59,7 @@ export class SmartdataDb { // handle table to class distribution - public addTable(SmartdataCollectionArg: SmartdataCollection) { + public addCollection(SmartdataCollectionArg: SmartdataCollection) { this.smartdataCollectionMap.add(SmartdataCollectionArg); } diff --git a/ts/smartdata.classes.doc.ts b/ts/smartdata.classes.doc.ts index b2a09e4..bfee998 100644 --- a/ts/smartdata.classes.doc.ts +++ b/ts/smartdata.classes.doc.ts @@ -45,7 +45,8 @@ export class SmartDataDbDoc { /** * the collection object an Doc belongs to */ - public collection: SmartdataCollection; + public static collection: SmartdataCollection; + public collection: SmartdataCollection; /** * how the Doc in memory was created, may prove useful later. @@ -75,32 +76,12 @@ export class SmartDataDbDoc { /** * class constructor */ - constructor() { - this.name = this.constructor['name']; - if (this.constructor['smartdataCollection']) { - // tslint:disable-next-line: no-string-literal - this.collection = this.constructor['smartdataCollection']; - // tslint:disable-next-line: no-string-literal - } else if (typeof this.constructor['smartdataDelayedCollection'] === 'function') { - // tslint:disable-next-line: no-string-literal - this.collection = this.constructor['smartdataDelayedCollection'](); - } else { - console.error('Could not determine collection for DbDoc'); - } - } + constructor() {} public static async getInstances( filterArg: plugins.tsclass.typeFest.PartialDeep ): Promise { - const self: any = this; // fool typesystem - let referenceMongoDBCollection: SmartdataCollection; - - if (self.smartdataCollection) { - referenceMongoDBCollection = self.smartdataCollection; - } else if (self.smartdataDelayedCollection) { - referenceMongoDBCollection = self.smartdataDelayedCollection(); - } - const foundDocs = await referenceMongoDBCollection.find(filterArg); + const foundDocs = await this.collection.find(filterArg); const returnArray = []; for (const item of foundDocs) { const newInstance = new this(); @@ -146,8 +127,7 @@ export class SmartDataDbDoc { * deletes a document from the database */ public async delete() { - const self: any = this; - await this.collection.delete(self); + await this.collection.delete(this); } /**