UNPKG

@lakshya004/cosmos-odm

Version:

Azure Cosmos DB ODM/ORM with a Mongoose-like query builder and schema validation using Zod.

130 lines 3.74 kB
class QB { constructor(query = { name: "" }, params = []) { this.query = query; this.params = [...params]; } nextParamName() { return `@param${++QB.globalParamCounter}`; } addParam(value) { return { name: this.nextParamName(), value: value, }; } asc(field) { let query = `c.${field.name} ASC`; return query; } desc(field) { let query = `c.${field.name} DESC`; return query; } order(...fields) { return "ORDER BY " + fields.join(", "); } eq(field, value) { const param = this.addParam(value); return new QB({ name: `c.${field.name} = ${param.name}` }, [ ...this.params, param, ]); } gt(field, value) { const param = this.addParam(value); return new QB({ name: `c.${field.name} > ${param.name}` }, [ ...this.params, param, ]); } gte(field, value) { const param = this.addParam(value); return new QB({ name: `c.${field.name} >= ${param.name}` }, [ ...this.params, param, ]); } lt(field, value) { const param = this.addParam(value); return new QB({ name: `c.${field.name} < ${param.name}` }, [ ...this.params, param, ]); } lte(field, value) { const param = this.addParam(value); return new QB({ name: `c.${field.name} <= ${param.name}` }, [ ...this.params, param, ]); } inArray(field, values) { const params = values.map((v) => ({ name: this.nextParamName(), value: v, })); const placeholders = params.map((p) => p.name).join(", "); return new QB({ name: `c.${field.name} IN (${placeholders})` }, [ ...this.params, ...params, ]); } ieq(field, value) { const param = this.addParam(value.toLowerCase()); return new QB({ name: `LOWER(c.${field.name}) = ${param.name}` }, [ ...this.params, param, ]); } ilike(field, value) { const param = this.addParam(value.toLowerCase()); return new QB({ name: `CONTAINS(LOWER(c.${field.name}), ${param.name})` }, [ ...this.params, param, ]); } ne(field, value) { const param = this.addParam(value); return new QB({ name: `c.${field.name} != ${param.name}` }, [ ...this.params, param, ]); } and(...conditions) { const combinedQuery = conditions .map((c) => `(${c.query.name})`) .join(" AND "); const combinedParams = [ ...this.params, ...conditions.flatMap((c) => c.params), ]; return new QB({ name: combinedQuery }, combinedParams); } or(...conditions) { const combinedQuery = conditions .map((c) => `(${c.query.name})`) .join(" OR "); const combinedParams = [ ...this.params, ...conditions.flatMap((c) => c.params), ]; return new QB({ name: combinedQuery }, combinedParams); } arrayContains(field, value) { const param = this.addParam(value); return new QB({ name: `ARRAY_CONTAINS(c.${field.name}, ${param.name})` }, [ ...this.params, param, ]); } build() { return { query: this.query.name, params: this.params, }; } } QB.globalParamCounter = 0; const qb = () => new QB(); export { QB, qb }; //# sourceMappingURL=QueryBuilder.js.map