From 946bc837c0865b8aaea1a633abc40ccff2a4028b Mon Sep 17 00:00:00 2001 From: Dekel Barzilay Date: Sat, 7 Dec 2019 00:44:52 +0200 Subject: [PATCH] Added $mergeEager to merge an eager expression to `$eager` --- README.md | 4 +++- package-lock.json | 23 +++++++++++++++-------- package.json | 4 ++-- src/index.js | 7 +++++++ test/index.test.js | 9 ++++++++- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index bb2146a..0edf116 100644 --- a/README.md +++ b/README.md @@ -164,8 +164,10 @@ Note that all this eager related options are optional. `JoinEagerAlgorithm`. See [`$joinEager`](https://vincit.github.io/objection.js/api/query-builder/eager-methods.html#joineager) documentation. -- **`$modifyEager`** - filter relation based on a relation's field. +- **`$modifyEager`** - filter relation based on a relation's field, e.g. `companies.find({ query: { $eager: 'employees', $modifyEager: { employees: { name: 'John' } } } })` +- **`$mergeEager`** - merge an eager expression to `$eager`, + e.g. `ccompanies.find({ query: { $eager: 'employees', $mergeEager: 'ceos' } })` - **`$pick`** - pick properties from result models. See [`pick`](https://vincit.github.io/objection.js/api/query-builder/other-methods.html#pick) documentation. diff --git a/package-lock.json b/package-lock.json index 67b0b89..f454845 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "feathers-objection", - "version": "4.6.1", + "version": "4.6.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -4108,9 +4108,9 @@ "dev": true }, "handlebars": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.2.tgz", - "integrity": "sha512-cIv17+GhL8pHHnRJzGu2wwcthL5sb8uDKBHvZ2Dtu5s1YNt0ljbzKbamnc+gr69y7bzwQiBdr5+hOpRd5pnOdg==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -7565,16 +7565,23 @@ "integrity": "sha512-c/5xjTcztW9XVhrkCycHQRBIAxww5JpDKk/q0zc2tVdQn6ZQvnChWgLvQaWAT1Al5JvRyvloUI15ad41m6dYwg==" }, "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.1.tgz", + "integrity": "sha512-pnOF7jY82wdIhATVn87uUY/FHU+MDUdPLkmGFvGoclQmeu229eTkbG5gjGGBi3R7UuYYSEeYXY/TTY5j2aym2g==", "dev": true, "optional": true, "requires": { - "commander": "~2.20.0", + "commander": "~2.20.3", "source-map": "~0.6.1" }, "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", diff --git a/package.json b/package.json index 0146dd3..a2ed485 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "feathers-objection", "description": "A service plugin for ObjectionJS an ORM based on KnexJS", - "version": "4.6.1", + "version": "4.6.2", "homepage": "https://github.com/feathersjs-ecosystem/feathers-objection", "keywords": [ "feathers", @@ -49,7 +49,7 @@ "compile": "rimraf lib/ && babel -d lib/ src/", "watch": "babel --watch -d lib/ src/", "lint": "semistandard --fix src/**/*.js test/**/*.js --config", - "dtslint": "dtslint types", + "dtslint": "dtslint --localTs node_modules/typescript/lib types", "mocha": "nyc mocha --opts mocha.opts", "coverage": "nyc report --reporter=text-lcov | coveralls", "test": "npm run compile && npm run lint && npm run dtslint && npm run mocha", diff --git a/src/index.js b/src/index.js index 605c61c..1a082d5 100644 --- a/src/index.js +++ b/src/index.js @@ -161,6 +161,7 @@ class Service extends AdapterService { if (params.$joinEager) { delete params.$joinEager; } if (params.$joinRelation) { delete params.$joinRelation; } if (params.$modifyEager) { delete params.$modifyEager; } + if (params.$mergeEager) { delete params.$mergeEager; } if (params.$pick) { delete params.$pick; } if (params.$noSelect) { delete params.$noSelect; } @@ -288,6 +289,12 @@ class Service extends AdapterService { delete query.$joinRelation; } + if (query && query.$mergeEager) { + q.mergeEager(query.$mergeEager); + + delete query.$mergeEager; + } + // apply eager filters if specified if (this.eagerFilters) { const eagerFilters = Array.isArray(this.eagerFilters) ? this.eagerFilters : [this.eagerFilters]; diff --git a/test/index.test.js b/test/index.test.js index 6a60698..eb07e13 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -134,7 +134,7 @@ const app = feathers() model: Company, id: 'id', multi: ['create', 'remove', 'patch'], - whitelist: ['$eager', '$modifyEager', '$pick', '$between', '$notBetween', '$containsKey', '$contains', '$contained', '$any', '$all', '$noSelect', '$like'], + whitelist: ['$eager', '$modifyEager', '$mergeEager', '$pick', '$between', '$notBetween', '$containsKey', '$contains', '$contained', '$any', '$all', '$noSelect', '$like'], allowedEager: '[ceos, clients]', namedEagerFilters: { notSnoop (builder) { @@ -779,6 +779,13 @@ describe('Feathers Objection Service', () => { }); }); + it('allows mergeEager queries', () => { + return companies.find({ query: { $eager: 'employees', $mergeEager: 'ceos' }, mergeAllowEager: '[employees, ceos]' }).then(data => { + expect(data[0].employees).to.be.ok; + expect(data[0].ceos).to.be.ok; + }); + }); + it('allows modifyEager queries', () => { return companies.find({ query: { $eager: 'employees', $modifyEager: { employees: { name: 'John' } } }, mergeAllowEager: 'employees' }).then(data => { expect(data[0].employees.length).to.equal(2);