Skip to content

Commit

Permalink
Add KnexDriver and KnexQueryBuilderFactory
Browse files Browse the repository at this point in the history
  • Loading branch information
nhat-phan committed Jan 1, 2019
1 parent d32196c commit 1175b70
Show file tree
Hide file tree
Showing 18 changed files with 275 additions and 5 deletions.
2 changes: 2 additions & 0 deletions dist/lib/constants.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ export declare const ClassNames: {
KnexProvider: string;
};
Driver: {
KnexDriver: string;
KnexQueryBuilderFactory: string;
KnexExecutorFactory: string;
};
Knex: {
Expand Down
2 changes: 2 additions & 0 deletions dist/lib/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ exports.ClassNames = {
KnexProvider: 'NajsEloquent.Provider.KnexProvider'
},
Driver: {
KnexDriver: 'NajsEloquent.Driver.KnexDriver',
KnexQueryBuilderFactory: 'NajsEloquent.Driver.Knex.KnexQueryBuilderFactory',
KnexExecutorFactory: 'NajsEloquent.Driver.Knex.KnexExecutorFactory'
},
Knex: {
Expand Down
11 changes: 11 additions & 0 deletions dist/lib/driver/KnexDriver.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { NajsEloquent as NajsEloquentLib } from 'najs-eloquent';
import { KnexQueryBuilderFactory } from './KnexQueryBuilderFactory';
export declare class KnexDriver<T extends NajsEloquentLib.Driver.Record = NajsEloquentLib.Driver.Record> extends NajsEloquentLib
.Driver.DriverBase<T> {
protected recordManager: NajsEloquent.Feature.IRecordManager<T>;
static Name: string;
constructor();
getClassName(): string;
getRecordManager(): NajsEloquent.Feature.IRecordManager<T>;
makeQueryBuilderFactory(): KnexQueryBuilderFactory;
}
27 changes: 27 additions & 0 deletions dist/lib/driver/KnexDriver.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"use strict";
/// <reference types="najs-eloquent" />
Object.defineProperty(exports, "__esModule", { value: true });
const najs_binding_1 = require("najs-binding");
const najs_eloquent_1 = require("najs-eloquent");
const constants_1 = require("../constants");
const KnexQueryBuilderFactory_1 = require("./KnexQueryBuilderFactory");
const KnexExecutorFactory_1 = require("./KnexExecutorFactory");
class KnexDriver extends najs_eloquent_1.NajsEloquent
.Driver.DriverBase {
constructor() {
super();
this.recordManager = najs_binding_1.make(najs_eloquent_1.NajsEloquent.Driver.RecordManager, [najs_binding_1.make(KnexExecutorFactory_1.KnexExecutorFactory.className)]);
}
getClassName() {
return constants_1.ClassNames.Driver.KnexDriver;
}
getRecordManager() {
return this.recordManager;
}
makeQueryBuilderFactory() {
return najs_binding_1.make(KnexQueryBuilderFactory_1.KnexQueryBuilderFactory.className);
}
}
KnexDriver.Name = 'mongodb';
exports.KnexDriver = KnexDriver;
najs_binding_1.register(KnexDriver, constants_1.ClassNames.Driver.KnexDriver);
2 changes: 1 addition & 1 deletion dist/lib/driver/KnexQueryBuilder.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ import { NajsEloquent as NajsEloquentLib } from 'najs-eloquent';
export declare type KnexQueryBuilderType<T> = KnexQueryBuilder<T> & IKnexBasicQuery & IKnexConditionQuery;
export declare class KnexQueryBuilder<T, H extends KnexQueryBuilderHandler = KnexQueryBuilderHandler> extends NajsEloquentLib
.QueryBuilder.QueryBuilder<T, H> {
native(nativeCb: (queryBuilder: Knex.QueryBuilder) => any): this;
native(handler: (queryBuilder: Knex.QueryBuilder) => any): this;
toSqlQuery(): string;
}
4 changes: 2 additions & 2 deletions dist/lib/driver/KnexQueryBuilder.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
const najs_eloquent_1 = require("najs-eloquent");
class KnexQueryBuilder extends najs_eloquent_1.NajsEloquent
.QueryBuilder.QueryBuilder {
native(nativeCb) {
native(handler) {
const queryBuilder = this.handler.getKnexQueryBuilder();
nativeCb.call(queryBuilder, queryBuilder);
handler.call(queryBuilder, queryBuilder);
return this;
}
toSqlQuery() {
Expand Down
6 changes: 6 additions & 0 deletions dist/lib/driver/KnexQueryBuilderFactory.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { KnexQueryBuilder } from './KnexQueryBuilder';
export declare class KnexQueryBuilderFactory implements NajsEloquent.QueryBuilder.IQueryBuilderFactory {
static className: string;
getClassName(): string;
make(model: NajsEloquent.Model.IModel): KnexQueryBuilder<any>;
}
18 changes: 18 additions & 0 deletions dist/lib/driver/KnexQueryBuilderFactory.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
"use strict";
/// <reference types="najs-eloquent" />
Object.defineProperty(exports, "__esModule", { value: true });
const najs_binding_1 = require("najs-binding");
const constants_1 = require("../constants");
const KnexQueryBuilder_1 = require("./KnexQueryBuilder");
const KnexQueryBuilderHandler_1 = require("./KnexQueryBuilderHandler");
class KnexQueryBuilderFactory {
getClassName() {
return constants_1.ClassNames.Driver.KnexQueryBuilderFactory;
}
make(model) {
return new KnexQueryBuilder_1.KnexQueryBuilder(new KnexQueryBuilderHandler_1.KnexQueryBuilderHandler(model));
}
}
KnexQueryBuilderFactory.className = constants_1.ClassNames.Driver.KnexQueryBuilderFactory;
exports.KnexQueryBuilderFactory = KnexQueryBuilderFactory;
najs_binding_1.register(KnexQueryBuilderFactory, constants_1.ClassNames.Driver.KnexQueryBuilderFactory, true, true);
1 change: 1 addition & 0 deletions dist/test/driver/KnexDriver.test.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import 'jest';
45 changes: 45 additions & 0 deletions dist/test/driver/KnexDriver.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("jest");
const Sinon = require("sinon");
const NajsBinding = require("najs-binding");
const najs_eloquent_1 = require("najs-eloquent");
const KnexDriver_1 = require("../../lib/driver/KnexDriver");
const KnexQueryBuilderFactory_1 = require("../../lib/driver/KnexQueryBuilderFactory");
describe('KnexDriver', function () {
it('extends DriverBase, implements Autoload under name "NajsEloquent.Driver.KnexDriver"', function () {
const driver = new KnexDriver_1.KnexDriver();
expect(driver).toBeInstanceOf(najs_eloquent_1.NajsEloquent.Driver.DriverBase);
expect(driver.getClassName()).toEqual('NajsEloquent.Driver.KnexDriver');
});
describe('constructor()', function () {
it('makes RecordManager from "NajsEloquent.Feature.RecordManager" class', function () {
const makeSpy = Sinon.spy(NajsBinding, 'make');
const driver = new KnexDriver_1.KnexDriver();
expect(makeSpy.lastCall.calledWith(najs_eloquent_1.NajsEloquent.Driver.RecordManager)).toBe(true);
expect(driver['recordManager']).toBeInstanceOf(najs_eloquent_1.NajsEloquent.Driver.RecordManager);
makeSpy.restore();
});
});
describe('.getClassName()', function () {
it('implements Autoload under name "NajsEloquent.Driver.KnexDriver"', function () {
const driver = new KnexDriver_1.KnexDriver();
expect(driver.getClassName()).toEqual('NajsEloquent.Driver.KnexDriver');
});
});
describe('.getRecordManager()', function () {
it('simply returns property "recordManager"', function () {
const driver = new KnexDriver_1.KnexDriver();
expect(driver.getRecordManager() === driver['recordManager']).toBe(true);
});
});
describe('.makeQueryBuilderFactory()', function () {
it('creates and returns an instance of KnexQueryBuilderFactory', function () {
const driver = new KnexDriver_1.KnexDriver();
const factory1 = driver.makeQueryBuilderFactory();
const factory2 = driver.makeQueryBuilderFactory();
expect(factory1 === factory2).toBe(true);
expect(factory1).toBeInstanceOf(KnexQueryBuilderFactory_1.KnexQueryBuilderFactory);
});
});
});
1 change: 1 addition & 0 deletions dist/test/driver/KnexQueryBuilderFactory.test.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import 'jest';
28 changes: 28 additions & 0 deletions dist/test/driver/KnexQueryBuilderFactory.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("jest");
const najs_binding_1 = require("najs-binding");
const KnexQueryBuilder_1 = require("../../lib/driver/KnexQueryBuilder");
const KnexQueryBuilderFactory_1 = require("../../lib/driver/KnexQueryBuilderFactory");
describe('KnexQueryBuilderFactory', function () {
it('implements IAutoload and register with singleton option = true', function () {
const a = najs_binding_1.make(KnexQueryBuilderFactory_1.KnexQueryBuilderFactory.className);
const b = najs_binding_1.make(KnexQueryBuilderFactory_1.KnexQueryBuilderFactory.className);
expect(a.getClassName()).toEqual('NajsEloquent.Driver.Knex.KnexQueryBuilderFactory');
expect(a === b).toBe(true);
});
describe('.make()', function () {
it('creates new instance of KnexQueryBuilder', function () {
const model = {
getRecordName() {
return 'model';
}
};
const factory = najs_binding_1.make(KnexQueryBuilderFactory_1.KnexQueryBuilderFactory.className);
const qb1 = factory.make(model);
const qb2 = factory.make(model);
expect(qb1).toBeInstanceOf(KnexQueryBuilder_1.KnexQueryBuilder);
expect(qb1 === qb2).toBe(false);
});
});
});
2 changes: 2 additions & 0 deletions lib/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ export const ClassNames = {
KnexProvider: 'NajsEloquent.Provider.KnexProvider'
},
Driver: {
KnexDriver: 'NajsEloquent.Driver.KnexDriver',
KnexQueryBuilderFactory: 'NajsEloquent.Driver.Knex.KnexQueryBuilderFactory',
KnexExecutorFactory: 'NajsEloquent.Driver.Knex.KnexExecutorFactory'
},
Knex: {
Expand Down
32 changes: 32 additions & 0 deletions lib/driver/KnexDriver.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/// <reference types="najs-eloquent" />

import { register, make } from 'najs-binding'
import { NajsEloquent as NajsEloquentLib } from 'najs-eloquent'
import { ClassNames } from '../constants'
import { KnexQueryBuilderFactory } from './KnexQueryBuilderFactory'
import { KnexExecutorFactory } from './KnexExecutorFactory'

export class KnexDriver<T extends NajsEloquentLib.Driver.Record = NajsEloquentLib.Driver.Record> extends NajsEloquentLib
.Driver.DriverBase<T> {
protected recordManager: NajsEloquent.Feature.IRecordManager<T>
static Name = 'mongodb'

constructor() {
super()

this.recordManager = make(NajsEloquentLib.Driver.RecordManager, [make(KnexExecutorFactory.className)])
}

getClassName() {
return ClassNames.Driver.KnexDriver
}

getRecordManager() {
return this.recordManager
}

makeQueryBuilderFactory() {
return make<KnexQueryBuilderFactory>(KnexQueryBuilderFactory.className)
}
}
register(KnexDriver, ClassNames.Driver.KnexDriver)
4 changes: 2 additions & 2 deletions lib/driver/KnexQueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ export type KnexQueryBuilderType<T> = KnexQueryBuilder<T> & IKnexBasicQuery & IK

export class KnexQueryBuilder<T, H extends KnexQueryBuilderHandler = KnexQueryBuilderHandler> extends NajsEloquentLib
.QueryBuilder.QueryBuilder<T, H> {
native(nativeCb: (queryBuilder: Knex.QueryBuilder) => any) {
native(handler: (queryBuilder: Knex.QueryBuilder) => any) {
const queryBuilder = this.handler.getKnexQueryBuilder()
nativeCb.call(queryBuilder, queryBuilder)
handler.call(queryBuilder, queryBuilder)

return this
}
Expand Down
19 changes: 19 additions & 0 deletions lib/driver/KnexQueryBuilderFactory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/// <reference types="najs-eloquent" />

import { register } from 'najs-binding'
import { ClassNames } from '../constants'
import { KnexQueryBuilder } from './KnexQueryBuilder'
import { KnexQueryBuilderHandler } from './KnexQueryBuilderHandler'

export class KnexQueryBuilderFactory implements NajsEloquent.QueryBuilder.IQueryBuilderFactory {
static className: string = ClassNames.Driver.KnexQueryBuilderFactory

getClassName() {
return ClassNames.Driver.KnexQueryBuilderFactory
}

make(model: NajsEloquent.Model.IModel): KnexQueryBuilder<any> {
return new KnexQueryBuilder(new KnexQueryBuilderHandler(model))
}
}
register(KnexQueryBuilderFactory, ClassNames.Driver.KnexQueryBuilderFactory, true, true)
48 changes: 48 additions & 0 deletions test/driver/KnexDriver.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import 'jest'
import * as Sinon from 'sinon'
import * as NajsBinding from 'najs-binding'
import { NajsEloquent as NajsEloquentLib } from 'najs-eloquent'
import { KnexDriver } from '../../lib/driver/KnexDriver'
import { KnexQueryBuilderFactory } from '../../lib/driver/KnexQueryBuilderFactory'

describe('KnexDriver', function() {
it('extends DriverBase, implements Autoload under name "NajsEloquent.Driver.KnexDriver"', function() {
const driver = new KnexDriver()
expect(driver).toBeInstanceOf(NajsEloquentLib.Driver.DriverBase)
expect(driver.getClassName()).toEqual('NajsEloquent.Driver.KnexDriver')
})

describe('constructor()', function() {
it('makes RecordManager from "NajsEloquent.Feature.RecordManager" class', function() {
const makeSpy = Sinon.spy(NajsBinding, 'make')
const driver = new KnexDriver()
expect(makeSpy.lastCall.calledWith(NajsEloquentLib.Driver.RecordManager)).toBe(true)
expect(driver['recordManager']).toBeInstanceOf(NajsEloquentLib.Driver.RecordManager)
makeSpy.restore()
})
})

describe('.getClassName()', function() {
it('implements Autoload under name "NajsEloquent.Driver.KnexDriver"', function() {
const driver = new KnexDriver()
expect(driver.getClassName()).toEqual('NajsEloquent.Driver.KnexDriver')
})
})

describe('.getRecordManager()', function() {
it('simply returns property "recordManager"', function() {
const driver = new KnexDriver()
expect(driver.getRecordManager() === driver['recordManager']).toBe(true)
})
})

describe('.makeQueryBuilderFactory()', function() {
it('creates and returns an instance of KnexQueryBuilderFactory', function() {
const driver = new KnexDriver()
const factory1 = driver.makeQueryBuilderFactory()
const factory2 = driver.makeQueryBuilderFactory()
expect(factory1 === factory2).toBe(true)
expect(factory1).toBeInstanceOf(KnexQueryBuilderFactory)
})
})
})
28 changes: 28 additions & 0 deletions test/driver/KnexQueryBuilderFactory.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import 'jest'
import { make } from 'najs-binding'
import { KnexQueryBuilder } from '../../lib/driver/KnexQueryBuilder'
import { KnexQueryBuilderFactory } from '../../lib/driver/KnexQueryBuilderFactory'

describe('KnexQueryBuilderFactory', function() {
it('implements IAutoload and register with singleton option = true', function() {
const a = make<KnexQueryBuilderFactory>(KnexQueryBuilderFactory.className)
const b = make<KnexQueryBuilderFactory>(KnexQueryBuilderFactory.className)
expect(a.getClassName()).toEqual('NajsEloquent.Driver.Knex.KnexQueryBuilderFactory')
expect(a === b).toBe(true)
})

describe('.make()', function() {
it('creates new instance of KnexQueryBuilder', function() {
const model: any = {
getRecordName() {
return 'model'
}
}
const factory = make<KnexQueryBuilderFactory>(KnexQueryBuilderFactory.className)
const qb1 = factory.make(model)
const qb2 = factory.make(model)
expect(qb1).toBeInstanceOf(KnexQueryBuilder)
expect(qb1 === qb2).toBe(false)
})
})
})

0 comments on commit 1175b70

Please sign in to comment.