convex
Version:
Client for the Convex Cloud
93 lines (92 loc) • 3.06 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
import { performAsyncSyscall } from "./syscall.js";
import { version } from "../../index.js";
import {
FilterExpression
} from "../vector_search.js";
import { validateArg } from "./validate.js";
import { convexOrUndefinedToJson } from "../../values/value.js";
export function setupActionVectorSearch(requestId) {
return async (tableName, indexName, query) => {
validateArg(tableName, 1, "vectorSearch", "tableName");
validateArg(indexName, 2, "vectorSearch", "indexName");
validateArg(query, 3, "vectorSearch", "query");
if (!query.vector || !Array.isArray(query.vector) || query.vector.length === 0) {
throw Error("`vector` must be a non-empty Array in vectorSearch");
}
return await new VectorQueryImpl(
requestId,
tableName + "." + indexName,
query
).collect();
};
}
export class VectorQueryImpl {
constructor(requestId, indexName, query) {
__publicField(this, "requestId");
__publicField(this, "state");
this.requestId = requestId;
const filters = query.filter ? serializeExpression(query.filter(filterBuilderImpl)) : null;
this.state = {
type: "preparing",
query: {
indexName,
limit: query.limit,
vector: query.vector,
expressions: filters
}
};
}
async collect() {
if (this.state.type === "consumed") {
throw new Error("This query is closed and can't emit any more values.");
}
const query = this.state.query;
this.state = { type: "consumed" };
const { results } = await performAsyncSyscall("1.0/actions/vectorSearch", {
requestId: this.requestId,
version,
query
});
return results;
}
}
export class ExpressionImpl extends FilterExpression {
constructor(inner) {
super();
__publicField(this, "inner");
this.inner = inner;
}
serialize() {
return this.inner;
}
}
export function serializeExpression(expr) {
if (expr instanceof ExpressionImpl) {
return expr.serialize();
} else {
return { $literal: convexOrUndefinedToJson(expr) };
}
}
export const filterBuilderImpl = {
// Comparisons /////////////////////////////////////////////////////////////
eq(fieldName, value) {
if (typeof fieldName !== "string") {
throw new Error("The first argument to `q.eq` must be a field name.");
}
return new ExpressionImpl({
$eq: [
serializeExpression(new ExpressionImpl({ $field: fieldName })),
serializeExpression(value)
]
});
},
// Logic ///////////////////////////////////////////////////////////////////
or(...exprs) {
return new ExpressionImpl({ $or: exprs.map(serializeExpression) });
}
};
//# sourceMappingURL=vector_search_impl.js.map