68 lines
2.5 KiB
JavaScript
68 lines
2.5 KiB
JavaScript
'use strict';
|
|
|
|
var _ = require('lodash/fp');
|
|
var types = require('../../utils/types.js');
|
|
var transform = require('./transform.js');
|
|
|
|
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 types.isScalarAttribute(attribute) && types.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 types.isScalarAttribute(attribute) && types.isNumber(attribute.type) && attribute.searchable !== false;
|
|
});
|
|
searchColumns.push(...numberColumns);
|
|
}
|
|
switch(db.dialect.client){
|
|
case 'postgres':
|
|
{
|
|
searchColumns.forEach((attr)=>{
|
|
const columnName = transform.toColumnName(meta, attr);
|
|
return knex.orWhereRaw(`??::text ILIKE ?`, [
|
|
qb.aliasColumn(columnName),
|
|
`%${escapeQuery(query, '*%\\')}%`
|
|
]);
|
|
});
|
|
break;
|
|
}
|
|
case 'sqlite':
|
|
{
|
|
searchColumns.forEach((attr)=>{
|
|
const columnName = transform.toColumnName(meta, attr);
|
|
return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\'`, [
|
|
qb.aliasColumn(columnName),
|
|
`%${escapeQuery(query, '*%\\')}%`
|
|
]);
|
|
});
|
|
break;
|
|
}
|
|
case 'mysql':
|
|
{
|
|
searchColumns.forEach((attr)=>{
|
|
const columnName = transform.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}`, '');
|
|
};
|
|
|
|
exports.applySearch = applySearch;
|
|
//# sourceMappingURL=search.js.map
|