@lakshya004/cosmos-odm
Version:
Azure Cosmos DB ODM/ORM with a Mongoose-like query builder and schema validation using Zod.
79 lines • 2.52 kB
JavaScript
class QB {
constructor(query = "", params = []) {
this.query = query;
this.params = [...params];
}
nextParamName() {
return `@param${++QB.globalParamCounter}`;
}
addParam(value) {
return {
name: this.nextParamName(),
value: value,
};
}
eq(field, value) {
const param = this.addParam(value);
return new QB(`c.${field} = ${param.name}`, [...this.params, param]);
}
gt(field, value) {
const param = this.addParam(value);
return new QB(`c.${field} > ${param.name}`, [...this.params, param]);
}
lt(field, value) {
const param = this.addParam(value);
return new QB(`c.${field} < ${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(`c.${field} IN (${placeholders})`, [
...this.params,
...params,
]);
}
ieq(field, value) {
const param = this.addParam(value.toLowerCase());
return new QB(`LOWER(c.${field}) = ${param.name}`, [...this.params, param]);
}
ilike(field, value) {
const param = this.addParam(value.toLowerCase());
return new QB(`CONTAINS(LOWER(c.${field}), ${param.name})`, [
...this.params,
param,
]);
}
ne(field, value) {
const param = this.addParam(value);
return new QB(`c.${field} != ${param.name}`, [...this.params, param]);
}
and(...conditions) {
const combinedQuery = conditions.map((c) => `(${c.query})`).join(" AND ");
const combinedParams = [
...this.params,
...conditions.flatMap((c) => c.params),
];
return new QB(combinedQuery, combinedParams);
}
or(...conditions) {
const combinedQuery = conditions.map((c) => `(${c.query})`).join(" OR ");
const combinedParams = [
...this.params,
...conditions.flatMap((c) => c.params),
];
return new QB(combinedQuery, combinedParams);
}
build() {
return {
query: this.query,
params: this.params,
};
}
}
QB.globalParamCounter = 0; // Static counter to ensure unique param names
const qb = () => new QB();
export { QB, qb };
//# sourceMappingURL=QueryBuilder.js.map