fix(core): update
This commit is contained in:
		| @@ -100,7 +100,7 @@ tap.test('expect to get instance of Car', async () => { | |||||||
|   do { |   do { | ||||||
|     const timeStart = Date.now(); |     const timeStart = Date.now(); | ||||||
|     const myCars = await Car.getInstances<Car>({ |     const myCars = await Car.getInstances<Car>({ | ||||||
|       brand: 'Volvo', |       brand: 'Renault', | ||||||
|     }); |     }); | ||||||
|     console.log(`took ${Date.now() - timeStart}`); |     console.log(`took ${Date.now() - timeStart}`); | ||||||
|     counter++; |     counter++; | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| import * as plugins from './smartdata.plugins'; | import * as plugins from './smartdata.plugins'; | ||||||
| import { SmartdataDb } from './smartdata.classes.db'; | import { SmartdataDb } from './smartdata.classes.db'; | ||||||
| import { SmartDataDbDoc } from './smartdata.classes.doc'; | import { SmartDataDbDoc } from './smartdata.classes.doc'; | ||||||
|  | import { CollectionFactory } from './smartdata.classes.collectionfactory'; | ||||||
|  |  | ||||||
| export interface IFindOptions { | export interface IFindOptions { | ||||||
|   limit?: number; |   limit?: number; | ||||||
| @@ -15,23 +16,26 @@ export interface IDocValidationFunc<T> { | |||||||
|  |  | ||||||
| export type TDelayedDbCreation = () => SmartdataDb; | export type TDelayedDbCreation = () => SmartdataDb; | ||||||
|  |  | ||||||
|  | const collectionFactory = new CollectionFactory(); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * This is a decorator that will tell the decorated class what dbTable to use |  * This is a decorator that will tell the decorated class what dbTable to use | ||||||
|  * @param dbArg |  * @param dbArg | ||||||
|  */ |  */ | ||||||
| export function Collection(dbArg: SmartdataDb | TDelayedDbCreation) { | export function Collection(dbArg: SmartdataDb | TDelayedDbCreation) { | ||||||
|   return function (constructor) { |   return function classDecorator<T extends { new (...args: any[]): {} }>(constructor: T) { | ||||||
|     if (dbArg instanceof SmartdataDb) { |     return class extends constructor { | ||||||
|       // tslint:disable-next-line: no-string-literal |       public static get collection() { | ||||||
|       constructor['smartdataCollection'] = new SmartdataCollection(constructor, dbArg); |         return collectionFactory.getCollection(constructor.name, dbArg); | ||||||
|     } else { |       } | ||||||
|       constructor['smartdataDelayedCollection'] = () => { |       public get collection() { | ||||||
|         return new SmartdataCollection(constructor, dbArg()); |         return collectionFactory.getCollection(constructor.name, dbArg); | ||||||
|       }; |       } | ||||||
|     } |     }; | ||||||
|   }; |   }; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // tslint:disable-next-line: max-classes-per-file | ||||||
| export class SmartdataCollection<T> { | export class SmartdataCollection<T> { | ||||||
|   /** |   /** | ||||||
|    * the collection that is used |    * the collection that is used | ||||||
| @@ -42,13 +46,13 @@ export class SmartdataCollection<T> { | |||||||
|   public smartdataDb: SmartdataDb; |   public smartdataDb: SmartdataDb; | ||||||
|   public uniqueIndexes: string[] = []; |   public uniqueIndexes: string[] = []; | ||||||
|  |  | ||||||
|   constructor(collectedClassArg: T & SmartDataDbDoc<T, unknown>, smartDataDbArg: SmartdataDb) { |   constructor(classNameArg: string, smartDataDbArg: SmartdataDb) { | ||||||
|     // tell the collection where it belongs |     // tell the collection where it belongs | ||||||
|     this.collectionName = collectedClassArg.name; |     this.collectionName = classNameArg; | ||||||
|     this.smartdataDb = smartDataDbArg; |     this.smartdataDb = smartDataDbArg; | ||||||
|  |  | ||||||
|     // tell the db class about it (important since Db uses different systems under the hood) |     // tell the db class about it (important since Db uses different systems under the hood) | ||||||
|     this.smartdataDb.addTable(this); |     this.smartdataDb.addCollection(this); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								ts/smartdata.classes.collectionfactory.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								ts/smartdata.classes.collectionfactory.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -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<any>} = {}; | ||||||
|  |  | ||||||
|  |   public getCollection = (nameArg: string, dbArg: SmartdataDb | (() => SmartdataDb)): SmartdataCollection<any> => { | ||||||
|  |     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]; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -59,7 +59,7 @@ export class SmartdataDb { | |||||||
|  |  | ||||||
|   // handle table to class distribution |   // handle table to class distribution | ||||||
|  |  | ||||||
|   public addTable(SmartdataCollectionArg: SmartdataCollection<any>) { |   public addCollection(SmartdataCollectionArg: SmartdataCollection<any>) { | ||||||
|     this.smartdataCollectionMap.add(SmartdataCollectionArg); |     this.smartdataCollectionMap.add(SmartdataCollectionArg); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -45,7 +45,8 @@ export class SmartDataDbDoc<T, TImplements> { | |||||||
|   /** |   /** | ||||||
|    * the collection object an Doc belongs to |    * the collection object an Doc belongs to | ||||||
|    */ |    */ | ||||||
|   public collection: SmartdataCollection<T>; |   public static collection: SmartdataCollection<any>; | ||||||
|  |   public collection: SmartdataCollection<any>; | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * how the Doc in memory was created, may prove useful later. |    * how the Doc in memory was created, may prove useful later. | ||||||
| @@ -75,32 +76,12 @@ export class SmartDataDbDoc<T, TImplements> { | |||||||
|   /** |   /** | ||||||
|    * class constructor |    * class constructor | ||||||
|    */ |    */ | ||||||
|   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'); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   public static async getInstances<T>( |   public static async getInstances<T>( | ||||||
|     filterArg: plugins.tsclass.typeFest.PartialDeep<T> |     filterArg: plugins.tsclass.typeFest.PartialDeep<T> | ||||||
|   ): Promise<T[]> { |   ): Promise<T[]> { | ||||||
|     const self: any = this; // fool typesystem |     const foundDocs = await this.collection.find(filterArg); | ||||||
|     let referenceMongoDBCollection: SmartdataCollection<T>; |  | ||||||
|  |  | ||||||
|     if (self.smartdataCollection) { |  | ||||||
|       referenceMongoDBCollection = self.smartdataCollection; |  | ||||||
|     } else if (self.smartdataDelayedCollection) { |  | ||||||
|       referenceMongoDBCollection = self.smartdataDelayedCollection(); |  | ||||||
|     } |  | ||||||
|     const foundDocs = await referenceMongoDBCollection.find(filterArg); |  | ||||||
|     const returnArray = []; |     const returnArray = []; | ||||||
|     for (const item of foundDocs) { |     for (const item of foundDocs) { | ||||||
|       const newInstance = new this(); |       const newInstance = new this(); | ||||||
| @@ -146,8 +127,7 @@ export class SmartDataDbDoc<T, TImplements> { | |||||||
|    * deletes a document from the database |    * deletes a document from the database | ||||||
|    */ |    */ | ||||||
|   public async delete() { |   public async delete() { | ||||||
|     const self: any = this; |     await this.collection.delete(this); | ||||||
|     await this.collection.delete(self); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user