Files
pole-book/server/node_modules/@strapi/database/dist/query/helpers/search.mjs

66 lines
2.5 KiB
JavaScript

import _ from 'lodash/fp';
import { isScalarAttribute, isString, isNumber } from '../../utils/types.mjs';
import { toColumnName } from './transform.mjs';
const applySearch = (knex, query, ctx)=>{
const { qb, uid, db } = ctx;
const meta = db.metadata.get(uid);
const { attributes } = meta;
const searchColumns = [
'id'
];
const stringColumns = Object.keys(attributes).filter((attributeName)=>{
const attribute = attributes[attributeName];
return isScalarAttribute(attribute) && isString(attribute.type) && attribute.searchable !== false;
});
searchColumns.push(...stringColumns);
if (!_.isNaN(_.toNumber(query))) {
const numberColumns = Object.keys(attributes).filter((attributeName)=>{
const attribute = attributes[attributeName];
return isScalarAttribute(attribute) && isNumber(attribute.type) && attribute.searchable !== false;
});
searchColumns.push(...numberColumns);
}
switch(db.dialect.client){
case 'postgres':
{
searchColumns.forEach((attr)=>{
const columnName = toColumnName(meta, attr);
return knex.orWhereRaw(`??::text ILIKE ?`, [
qb.aliasColumn(columnName),
`%${escapeQuery(query, '*%\\')}%`
]);
});
break;
}
case 'sqlite':
{
searchColumns.forEach((attr)=>{
const columnName = toColumnName(meta, attr);
return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\'`, [
qb.aliasColumn(columnName),
`%${escapeQuery(query, '*%\\')}%`
]);
});
break;
}
case 'mysql':
{
searchColumns.forEach((attr)=>{
const columnName = toColumnName(meta, attr);
return knex.orWhereRaw(`?? LIKE ?`, [
qb.aliasColumn(columnName),
`%${escapeQuery(query, '*%\\')}%`
]);
});
break;
}
}
};
const escapeQuery = (query, charsToEscape, escapeChar = '\\')=>{
return query.split('').reduce((escapedQuery, char)=>charsToEscape.includes(char) ? `${escapedQuery}${escapeChar}${char}` : `${escapedQuery}${char}`, '');
};
export { applySearch };
//# sourceMappingURL=search.mjs.map