{"version":3,"file":"search.mjs","sources":["../../../src/query/helpers/search.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport * as types from '../../utils/types';\nimport { toColumnName } from './transform';\nimport type { Ctx } from '../types';\n\nexport const applySearch = (knex: Knex.QueryBuilder, query: string, ctx: Ctx) => {\n  const { qb, uid, db } = ctx;\n  const meta = db.metadata.get(uid);\n\n  const { attributes } = meta;\n\n  const searchColumns = ['id'];\n\n  const stringColumns = Object.keys(attributes).filter((attributeName) => {\n    const attribute = attributes[attributeName];\n    return (\n      types.isScalarAttribute(attribute) &&\n      types.isString(attribute.type) &&\n      attribute.searchable !== false\n    );\n  });\n\n  searchColumns.push(...stringColumns);\n\n  if (!_.isNaN(_.toNumber(query))) {\n    const numberColumns = Object.keys(attributes).filter((attributeName) => {\n      const attribute = attributes[attributeName];\n      return (\n        types.isScalarAttribute(attribute) &&\n        types.isNumber(attribute.type) &&\n        attribute.searchable !== false\n      );\n    });\n\n    searchColumns.push(...numberColumns);\n  }\n\n  switch (db.dialect.client) {\n    case 'postgres': {\n      searchColumns.forEach((attr) => {\n        const columnName = toColumnName(meta, attr);\n        return knex.orWhereRaw(`??::text ILIKE ?`, [\n          qb.aliasColumn(columnName),\n          `%${escapeQuery(query, '*%\\\\')}%`,\n        ]);\n      });\n\n      break;\n    }\n    case 'sqlite': {\n      searchColumns.forEach((attr) => {\n        const columnName = toColumnName(meta, attr);\n        return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\\\'`, [\n          qb.aliasColumn(columnName),\n          `%${escapeQuery(query, '*%\\\\')}%`,\n        ]);\n      });\n      break;\n    }\n    case 'mysql': {\n      searchColumns.forEach((attr) => {\n        const columnName = toColumnName(meta, attr);\n        return knex.orWhereRaw(`?? LIKE ?`, [\n          qb.aliasColumn(columnName),\n          `%${escapeQuery(query, '*%\\\\')}%`,\n        ]);\n      });\n      break;\n    }\n    default: {\n      // do nothing\n    }\n  }\n};\n\nconst escapeQuery = (query: string, charsToEscape: string, escapeChar = '\\\\') => {\n  return query\n    .split('')\n    .reduce(\n      (escapedQuery, char) =>\n        charsToEscape.includes(char)\n          ? `${escapedQuery}${escapeChar}${char}`\n          : `${escapedQuery}${char}`,\n      ''\n    );\n};\n"],"names":["applySearch","knex","query","ctx","qb","uid","db","meta","metadata","get","attributes","searchColumns","stringColumns","Object","keys","filter","attributeName","attribute","types","type","searchable","push","_","isNaN","toNumber","numberColumns","dialect","client","forEach","attr","columnName","toColumnName","orWhereRaw","aliasColumn","escapeQuery","charsToEscape","escapeChar","split","reduce","escapedQuery","char","includes"],"mappings":"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"}