fix(core): update

This commit is contained in:
Philipp Kunz 2020-09-10 10:12:17 +00:00
parent 85f0d99934
commit b5f2474f65
5 changed files with 45 additions and 39 deletions

View File

@ -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++;

View File

@ -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);
}
/**

View 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];
}
}

View File

@ -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);
}

View File

@ -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);
}
/**