@bcc-code/feathers-arangodb
Version:
ArangoDB Service/Adapter for FeathersJS
51 lines (50 loc) • 1.81 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateFuzzyStatement = exports.isQueryTypeCorrect = void 0;
const arangojs_1 = require("arangojs");
function isQueryTypeCorrect(query) {
return ['string', 'number'].includes(typeof query);
}
exports.isQueryTypeCorrect = isQueryTypeCorrect;
function generateFuzzyStatement(fields, query) {
const modifiedQuery = determineQueryType(query);
const searchStatements = [];
for (const field of fields) {
const statement = getSearchStatement(field, modifiedQuery);
if (!statement)
continue;
searchStatements.push(statement);
}
if (!searchStatements.length)
return undefined;
const searchConditions = arangojs_1.aql.join(searchStatements, ' OR ');
return searchConditions;
}
exports.generateFuzzyStatement = generateFuzzyStatement;
function getSearchStatement(field, query) {
if (typeof query.value !== field.type)
return undefined;
if (!field.isFuzzy) {
return (0, arangojs_1.aql) `doc[${field.name}] == ${query.value}`;
}
if (query.exact) {
return (0, arangojs_1.aql) `PHRASE(doc[${field.name}], ${query.value}, "space_delimited")`;
}
return (0, arangojs_1.aql) `NGRAM_MATCH(doc[${field.name}], ${query.value}, 0.6 , "fuzzy_search")`;
}
function determineQueryType(value) {
let exact = false;
if (typeof value === 'string' && hasQuotes(value)) {
value = value.slice(1, -1);
exact = true;
}
return { value, exact };
}
const hasQuotes = (string) => {
const quoteCharacters = ["'", "\""];
for (const quoteCharacter of quoteCharacters) {
if (string.startsWith(quoteCharacter) && string.endsWith(quoteCharacter))
return true;
}
return false;
};
;