Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
29c512b0cc | |||
105f69d1c9 | |||
4c375f8465 | |||
9466af6a4a | |||
c5aa747f42 | |||
b5f2474f65 | |||
85f0d99934 | |||
3b2d3d9072 |
42
package-lock.json
generated
42
package-lock.json
generated
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@pushrocks/smartdata",
|
||||
"version": "3.1.46",
|
||||
"version": "3.1.50",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@ -2402,9 +2402,9 @@
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "14.6.4",
|
||||
"resolved": "https://verdaccio.lossless.one/@types%2fnode/-/node-14.6.4.tgz",
|
||||
"integrity": "sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ=="
|
||||
"version": "14.11.2",
|
||||
"resolved": "https://verdaccio.lossless.one/@types%2fnode/-/node-14.11.2.tgz",
|
||||
"integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA=="
|
||||
},
|
||||
"@types/parcel-bundler": {
|
||||
"version": "1.12.1",
|
||||
@ -7673,11 +7673,11 @@
|
||||
}
|
||||
},
|
||||
"mongodb": {
|
||||
"version": "3.6.1",
|
||||
"resolved": "https://verdaccio.lossless.one/mongodb/-/mongodb-3.6.1.tgz",
|
||||
"integrity": "sha512-uH76Zzr5wPptnjEKJRQnwTsomtFOU/kQEU8a9hKHr2M7y9qVk7Q4Pkv0EQVp88742z9+RwvsdTw6dRjDZCNu1g==",
|
||||
"version": "3.6.2",
|
||||
"resolved": "https://verdaccio.lossless.one/mongodb/-/mongodb-3.6.2.tgz",
|
||||
"integrity": "sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA==",
|
||||
"requires": {
|
||||
"bl": "^2.2.0",
|
||||
"bl": "^2.2.1",
|
||||
"bson": "^1.1.4",
|
||||
"denque": "^1.4.1",
|
||||
"require_optional": "^1.0.1",
|
||||
@ -7686,18 +7686,18 @@
|
||||
}
|
||||
},
|
||||
"mongodb-memory-server": {
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://verdaccio.lossless.one/mongodb-memory-server/-/mongodb-memory-server-6.7.0.tgz",
|
||||
"integrity": "sha512-vCXvDfi2Sbvg6/Ww0LBRbp5FZtqeFA1zLJeF4wlwU7IBwcop3zI75nq+dm6hlMzLGVIsLhN5fb1Ps8hztz3TFw==",
|
||||
"version": "6.8.0",
|
||||
"resolved": "https://verdaccio.lossless.one/mongodb-memory-server/-/mongodb-memory-server-6.8.0.tgz",
|
||||
"integrity": "sha512-jAJwx9yrRjB3XDFDA0DBYSHbMSvhPssDdnbEg70O2gp0qfTRtgQTaAUvTGCawj2d/iDuEJgFHJkuczHQG33a0Q==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"mongodb-memory-server-core": "6.7.0"
|
||||
"mongodb-memory-server-core": "6.8.0"
|
||||
}
|
||||
},
|
||||
"mongodb-memory-server-core": {
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://verdaccio.lossless.one/mongodb-memory-server-core/-/mongodb-memory-server-core-6.7.0.tgz",
|
||||
"integrity": "sha512-N6pQqS6KjOGcfdydDgJ0ddaaifM8Ee6BtP+nFQIDjon76pvOtPuR8PddXM/tWeSv5fNhPx00/ILZCmpE8IiwLw==",
|
||||
"version": "6.8.0",
|
||||
"resolved": "https://verdaccio.lossless.one/mongodb-memory-server-core/-/mongodb-memory-server-core-6.8.0.tgz",
|
||||
"integrity": "sha512-cw8TX3iKhmXPiPQDcmIftHl1WvuCn970nomeQKgpcJZOYIUI87zD97apNIWfajkEduIe+24yYoqIwbwLbA19gQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/tmp": "^0.2.0",
|
||||
@ -7711,9 +7711,9 @@
|
||||
"lockfile": "^1.0.4",
|
||||
"md5-file": "^5.0.0",
|
||||
"mkdirp": "^1.0.4",
|
||||
"mongodb": "3.6.1",
|
||||
"mongodb": "3.6.2",
|
||||
"semver": "^7.3.2",
|
||||
"tar-stream": "^2.1.3",
|
||||
"tar-stream": "^2.1.4",
|
||||
"tmp": "^0.2.1",
|
||||
"uuid": "8.3.0",
|
||||
"yauzl": "^2.10.0"
|
||||
@ -10434,12 +10434,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"tar-stream": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://verdaccio.lossless.one/tar-stream/-/tar-stream-2.1.3.tgz",
|
||||
"integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==",
|
||||
"version": "2.1.4",
|
||||
"resolved": "https://verdaccio.lossless.one/tar-stream/-/tar-stream-2.1.4.tgz",
|
||||
"integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"bl": "^4.0.1",
|
||||
"bl": "^4.0.3",
|
||||
"end-of-stream": "^1.4.1",
|
||||
"fs-constants": "^1.0.0",
|
||||
"inherits": "^2.0.3",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@pushrocks/smartdata",
|
||||
"version": "3.1.46",
|
||||
"version": "3.1.50",
|
||||
"private": false,
|
||||
"description": "do more with data",
|
||||
"main": "dist_ts/index.js",
|
||||
@ -29,7 +29,7 @@
|
||||
"@types/lodash": "^4.14.161",
|
||||
"@types/mongodb": "^3.5.27",
|
||||
"lodash": "^4.17.20",
|
||||
"mongodb": "^3.6.1",
|
||||
"mongodb": "^3.6.2",
|
||||
"runtime-type-checks": "0.0.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
@ -39,9 +39,9 @@
|
||||
"@pushrocks/smartunique": "^3.0.3",
|
||||
"@pushrocks/tapbundle": "^3.2.9",
|
||||
"@types/mongodb-memory-server": "^2.3.0",
|
||||
"@types/node": "^14.6.4",
|
||||
"@types/node": "^14.11.2",
|
||||
"@types/shortid": "0.0.29",
|
||||
"mongodb-memory-server": "^6.7.0",
|
||||
"mongodb-memory-server": "^6.8.0",
|
||||
"tslint": "^6.1.3",
|
||||
"tslint-config-prettier": "^1.18.0"
|
||||
},
|
||||
|
14
test/test.ts
14
test/test.ts
@ -95,19 +95,21 @@ tap.test('should save the car to the db', async () => {
|
||||
} while (counter < 2000);
|
||||
});
|
||||
|
||||
tap.test('expect to get instance of Car', async () => {
|
||||
tap.test('expect to get instance of Car with shallow match', async () => {
|
||||
let counter = 0;
|
||||
do {
|
||||
const timeStart = Date.now();
|
||||
const myCars = await Car.getInstances<Car>({
|
||||
brand: 'Volvo',
|
||||
brand: 'Renault',
|
||||
});
|
||||
console.log(`took ${Date.now() - timeStart}`);
|
||||
expect(myCars[0].deepData.sodeep).to.equal('yes');
|
||||
expect(myCars[0].brand).to.equal('Renault');
|
||||
counter++;
|
||||
} while (counter < 2000);
|
||||
} while (counter < 30);
|
||||
});
|
||||
|
||||
tap.test('expect to get instance of Car', async () => {
|
||||
tap.test('expect to get instance of Car with deep match', async () => {
|
||||
let counter = 0;
|
||||
do {
|
||||
const timeStart = Date.now();
|
||||
@ -115,8 +117,10 @@ tap.test('expect to get instance of Car', async () => {
|
||||
'deepData.sodeep': 'yes',
|
||||
} as any);
|
||||
console.log(`took ${Date.now() - timeStart}`);
|
||||
expect(myCars2[0].deepData.sodeep).to.equal('yes');
|
||||
expect(myCars2[0].brand).to.equal('Volvo');
|
||||
counter++;
|
||||
} while (counter < 2000);
|
||||
} while (counter < 30);
|
||||
});
|
||||
|
||||
tap.test('expect to get instance of Car and update it', async () => {
|
||||
|
@ -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];
|
||||
}
|
||||
}
|
@ -32,6 +32,8 @@ export class SmartdataDb {
|
||||
const finalConnectionUrl = this.smartdataOptions.mongoDbUrl
|
||||
.replace('<USERNAME>', this.smartdataOptions.mongoDbUser)
|
||||
.replace('<username>', this.smartdataOptions.mongoDbUser)
|
||||
.replace('<USER>', this.smartdataOptions.mongoDbUser)
|
||||
.replace('<user>', this.smartdataOptions.mongoDbUser)
|
||||
.replace('<PASSWORD>', this.smartdataOptions.mongoDbPass)
|
||||
.replace('<password>', this.smartdataOptions.mongoDbPass)
|
||||
.replace('<DBNAME>', this.smartdataOptions.mongoDbName)
|
||||
@ -59,7 +61,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