fix(core): update
This commit is contained in:
		| @@ -100,7 +100,7 @@ tap.test('expect to get instance of Car', async () => { | ||||
|   do { | ||||
|     const timeStart = Date.now(); | ||||
|     const myCars = await Car.getInstances<Car>({ | ||||
|       brand: 'Volvo', | ||||
|       brand: 'Renault', | ||||
|     }); | ||||
|     console.log(`took ${Date.now() - timeStart}`); | ||||
|     counter++; | ||||
|   | ||||
| @@ -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<T> { | ||||
|  | ||||
| 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<T extends { new (...args: any[]): {} }>(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<T> { | ||||
|   /** | ||||
|    * the collection that is used | ||||
| @@ -42,13 +46,13 @@ export class SmartdataCollection<T> { | ||||
|   public smartdataDb: SmartdataDb; | ||||
|   public uniqueIndexes: string[] = []; | ||||
|  | ||||
|   constructor(collectedClassArg: T & SmartDataDbDoc<T, unknown>, 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); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|   | ||||
							
								
								
									
										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 | ||||
|  | ||||
|   public addTable(SmartdataCollectionArg: SmartdataCollection<any>) { | ||||
|   public addCollection(SmartdataCollectionArg: SmartdataCollection<any>) { | ||||
|     this.smartdataCollectionMap.add(SmartdataCollectionArg); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -45,7 +45,8 @@ export class SmartDataDbDoc<T, TImplements> { | ||||
|   /** | ||||
|    * 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. | ||||
| @@ -75,32 +76,12 @@ export class SmartDataDbDoc<T, TImplements> { | ||||
|   /** | ||||
|    * 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<T>( | ||||
|     filterArg: plugins.tsclass.typeFest.PartialDeep<T> | ||||
|   ): Promise<T[]> { | ||||
|     const self: any = this; // fool typesystem | ||||
|     let referenceMongoDBCollection: SmartdataCollection<T>; | ||||
|  | ||||
|     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<T, TImplements> { | ||||
|    * deletes a document from the database | ||||
|    */ | ||||
|   public async delete() { | ||||
|     const self: any = this; | ||||
|     await this.collection.delete(self); | ||||
|     await this.collection.delete(this); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|   | ||||
		Reference in New Issue
	
	Block a user