fix(core): update
This commit is contained in:
parent
85f0d99934
commit
b5f2474f65
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user