properly handle knex queries for in and notIn

This commit is contained in:
Pierre Noël 2022-09-01 19:26:54 +02:00
parent 3ff32e91eb
commit 79355cf239
3 changed files with 48 additions and 2 deletions

View File

@ -6,6 +6,7 @@ const types = require('../../types');
const { createField } = require('../../fields');
const { createJoin } = require('./join');
const { toColumnName } = require('./transform');
const { isKnexQuery } = require('../../utils/knex');
const GROUP_OPERATORS = ['$and', '$or'];
const OPERATORS = [
@ -206,12 +207,12 @@ const applyOperator = (qb, column, operator, value) => {
}
case '$in': {
qb.whereIn(column, _.isObject(value) ? value : [value]);
qb.whereIn(column, isKnexQuery(value) ? value : _.castArray(value));
break;
}
case '$notIn': {
qb.whereNotIn(column, _.isObject(value) ? value : [value]);
qb.whereNotIn(column, isKnexQuery(value) ? value : _.castArray(value));
break;
}

View File

@ -0,0 +1,33 @@
'use strict';
const { createStrapiInstance } = require('../../../../../test/helpers/strapi');
const { isKnexQuery } = require('../utils/knex');
let strapi;
describe('knex', () => {
beforeAll(async () => {
strapi = await createStrapiInstance();
});
afterAll(async () => {
await strapi.destroy();
});
describe('isKnexQuery', () => {
test('knex query: true', () => {
const res = isKnexQuery(strapi.db.connection('strapi_core_store_settings'));
expect(res).toBe(true);
});
test('knex raw: true', () => {
const res = isKnexQuery(strapi.db.connection.raw('SELECT * FROM strapi_core_store_settings'));
expect(res).toBe(true);
});
test.each([[''], [{}], [[]], [2], [new Date()]])('%s: false', (value) => {
const res = isKnexQuery(value);
expect(res).toBe(false);
});
});
});

View File

@ -0,0 +1,12 @@
'use strict';
const KnexBuilder = require('knex/lib/query/querybuilder');
const KnexRaw = require('knex/lib/raw');
const isKnexQuery = (value) => {
return value instanceof KnexBuilder || value instanceof KnexRaw;
};
module.exports = {
isKnexQuery,
};