From e917c61b0276ea0fbb2a34ce83cbd9202efa71ad Mon Sep 17 00:00:00 2001 From: Aurelsicoko Date: Mon, 2 Apr 2018 19:24:36 +0200 Subject: [PATCH] Optimize GraphQL query with Bookshelf --- packages/strapi-bookshelf/package.json | 2 +- packages/strapi-knex/package.json | 2 +- .../config/queries/mongoose.js | 2 +- .../services/ContentManager.js | 2 +- .../strapi-plugin-graphql/services/GraphQL.js | 38 +++++++++++-------- 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/packages/strapi-bookshelf/package.json b/packages/strapi-bookshelf/package.json index 762a69959e..974275401a 100755 --- a/packages/strapi-bookshelf/package.json +++ b/packages/strapi-bookshelf/package.json @@ -55,4 +55,4 @@ "npm": ">= 5.3.0" }, "license": "MIT" -} +} \ No newline at end of file diff --git a/packages/strapi-knex/package.json b/packages/strapi-knex/package.json index 74dc4591df..87232be415 100755 --- a/packages/strapi-knex/package.json +++ b/packages/strapi-knex/package.json @@ -46,4 +46,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/config/queries/mongoose.js b/packages/strapi-plugin-content-manager/config/queries/mongoose.js index 7d5c354d18..d871b66db6 100755 --- a/packages/strapi-plugin-content-manager/config/queries/mongoose.js +++ b/packages/strapi-plugin-content-manager/config/queries/mongoose.js @@ -3,7 +3,7 @@ const _ = require('lodash'); module.exports = { find: async function (params) { return this - .find(params.query) + .find(params.where) .limit(Number(params.limit)) .sort(params.sort) .skip(Number(params.skip)); diff --git a/packages/strapi-plugin-content-manager/services/ContentManager.js b/packages/strapi-plugin-content-manager/services/ContentManager.js index 91b410b1c5..1bccd46242 100644 --- a/packages/strapi-plugin-content-manager/services/ContentManager.js +++ b/packages/strapi-plugin-content-manager/services/ContentManager.js @@ -15,7 +15,7 @@ module.exports = { limit, skip, sort, - query: request, + where: request, queryAttribute }); }, diff --git a/packages/strapi-plugin-graphql/services/GraphQL.js b/packages/strapi-plugin-graphql/services/GraphQL.js index ba3c7e2232..fe23e8a76c 100644 --- a/packages/strapi-plugin-graphql/services/GraphQL.js +++ b/packages/strapi-plugin-graphql/services/GraphQL.js @@ -158,10 +158,13 @@ module.exports = { // or the shadow CRUD resolver (aka Content-Manager). const resolver = (() => { if (isSingular) { - return - _.get(handler, `Query.${pluralize.singular(name)}.resolver`, - resolvers.fetch({ ...params, id: options.id }, queryOpts) - ); + return _.get(handler, `Query.${pluralize.singular(name)}.resolver`, + async () => { + const value = await resolvers.fetch({ ...params, id: options.id }, queryOpts); + + return value.toJSON ? value.toJSON() : value; + } + ); } const resolver = _.get(handler, `Query.${pluralize.plural(name)}.resolver`, @@ -173,7 +176,9 @@ module.exports = { convertedParams.skip = convertedParams.start; convertedParams.query = where.where; - return resolvers.fetchAll(params, {...queryOpts, ...convertedParams}); + const value = await resolvers.fetchAll(params, {...queryOpts, ...convertedParams}); + + return value.toJSON ? value.toJSON() : value; } ); @@ -250,10 +255,6 @@ module.exports = { return acc; }, initialState); - // console.log(name); - // console.log(model.associations); - // console.log(); - // Add parameters to optimize association query. (model.associations || []) .filter(association => association.type === 'collection') @@ -308,7 +309,7 @@ module.exports = { // TODO: // - Handle limit, skip, etc options _.merge(acc.resolver[globalId], { - [association.alias]: (obj, options, context) => { + [association.alias]: async (obj, options, context) => { // Construct parameters object to retrieve the correct related entries. const params = { model: association.model || association.collection, @@ -335,21 +336,26 @@ module.exports = { const convertedParams = strapi.utils.models.convertParams(name, this.convertToParams(options)); const where = strapi.utils.models.convertParams(name, options.where || {}); + // Limit, order, etc. Object.assign(queryOpts, convertedParams); - queryOpts.query = { + // Skip. + queryOpts.skip = convertedParams.start; + + // Where. + queryOpts.query = strapi.utils.models.convertParams(name, { // Construct the "where" query to only retrieve entries which are // related to this entry. [association.via]: obj[ref.primaryKey], ...where.where - }; - - queryOpts.skip = convertedParams.start; + }).where; } - return association.model ? + const value = await (association.model ? resolvers.fetch(params, association.plugin): - resolvers.fetchAll(params, queryOpts) + resolvers.fetchAll(params, queryOpts)); + + return value.toJSON ? value.toJSON() : value; } }); });