Cleanup operators

This commit is contained in:
Alexandre Bodin 2021-07-01 13:52:01 +02:00
parent 2d59716f5d
commit 1728e67e5d
6 changed files with 83 additions and 44 deletions

View File

@ -21,7 +21,24 @@ async function main(connection) {
await orm.schema.sync();
await orm.schema.reset();
await tests(orm);
await orm.query('article').createMany({
// select: {},
// populate: {},
data: Array(5)
.fill({})
.map((v, idx) => ({
title: `Article ${_.padStart(idx, 3, '0')}`,
})),
});
const articles = await orm.query('article').findMany({
limit: 5,
where: { title: 'Article 001', createdAt: { $null: true } },
});
console.log(articles);
// await tests(orm);
} finally {
orm.destroy();
}

View File

@ -83,7 +83,8 @@ class SqliteDialect extends Dialect {
// TODO: get strapi.dir from somewhere else
this.db.config.connection.connection.filename = path.resolve(
strapi.dir,
// TODO: do this somewhere else
// global.strapi ? gstrapi.dir : process.cwd(),
this.db.config.connection.connection.filename
);

View File

@ -9,7 +9,7 @@ const GROUP_OPERATORS = ['$and', '$or'];
const OPERATORS = [
'$not',
'$in',
'$nin',
'$notIn',
'$eq',
'$ne',
'$gt',
@ -17,9 +17,10 @@ const OPERATORS = [
'$lt',
'$lte',
'$null',
'$notNull',
'$between',
'$like',
'$regexp',
// '$like',
// '$regexp',
'$startsWith',
'$endsWith',
'$contains',
@ -264,66 +265,96 @@ const applyWhereToColumn = (qb, column, columnWhere) => {
switch (operator) {
case '$not': {
return qb.whereNot(qb => applyWhereToColumn(qb, column, value));
qb.whereNot(qb => applyWhereToColumn(qb, column, value));
break;
}
case '$in': {
return qb.whereIn(column, value);
qb.whereIn(column, value);
break;
}
case '$nin': {
return qb.whereNotIn(column, value);
case '$notIn': {
qb.whereNotIn(column, value);
break;
}
case '$eq': {
if (value === null) {
return qb.whereNull(column);
qb.whereNull(column);
break;
}
return qb.where(column, value);
qb.where(column, value);
break;
}
case '$ne': {
if (value === null) {
return qb.whereNotNull(column);
qb.whereNotNull(column);
break;
}
return qb.where(column, '<>', value);
qb.where(column, '<>', value);
break;
}
case '$gt': {
return qb.where(column, '>', value);
qb.where(column, '>', value);
break;
}
case '$gte': {
return qb.where(column, '>=', value);
qb.where(column, '>=', value);
break;
}
case '$lt': {
return qb.where(column, '<', value);
qb.where(column, '<', value);
break;
}
case '$lte': {
return qb.where(column, '<=', value);
qb.where(column, '<=', value);
break;
}
case '$null': {
return value === true ? qb.whereNull(column) : qb.whereNotNull(column);
// TODO: make this better
if (value) {
qb.whereNull(column);
}
break;
}
case '$notNull': {
if (value) {
qb.whereNotNull(column);
}
break;
}
case '$between': {
return qb.whereBetween(column, value);
}
case '$regexp': {
// TODO:
return;
}
// string
// TODO: use $case to make it case insensitive
case '$like': {
return qb.where(column, 'like', value);
qb.whereBetween(column, value);
break;
}
// case '$regexp': {
// // TODO:
//
// break;
// }
// // string
// // TODO: use $case to make it case insensitive
// case '$like': {
// qb.where(column, 'like', value);
// break;
// }
// TODO: add casting logic
case '$startsWith': {
return qb.where(column, 'like', `${value}%`);
qb.where(column, 'like', `${value}%`);
break;
}
case '$endsWith': {
return qb.where(column, 'like', `%${value}`);
qb.where(column, 'like', `%${value}`);
break;
}
case '$contains': {
return qb.where(column, 'like', `%${value}%`);
qb.where(column, 'like', `%${value}%`);
break;
}
// TODO: json operators
@ -413,15 +444,7 @@ const processPopulate = (populate, ctx) => {
return null;
}
if (typeof populate === 'string' && Boolean(populate)) {
for (const key in meta.attributes) {
const attribute = meta.attributes[key];
if (attribute.type === 'relation') {
populateMap[key] = true;
}
}
} else if (Array.isArray(populate)) {
if (Array.isArray(populate)) {
for (const key of populate) {
populateMap[key] = true;
}

View File

@ -244,8 +244,6 @@ const createQueryBuilder = (uid, db) => {
helpers.applyJoins(qb, state.joins);
}
// console.log(qb.toQuery());
const rows = await qb;
if (state.populate && !_.isNil(rows)) {

View File

@ -491,7 +491,7 @@ class Strapi {
}
getModel(uid) {
return this.contentTypes[uid];
return this.contentTypes[uid] || this.components[uid];
}
/**

View File

@ -56,7 +56,7 @@ const preventCast = validator => validator.transform((val, originalVal) => origi
const createComponentValidator = createOrUpdate => (attr, data, { isDraft }) => {
let validator;
const [model] = strapi.db.getModelsByAttribute(attr);
const model = strapi.getModel(attr.component);
if (!model) {
throw new Error('Validation failed: Model not found');
}