Files
lancedb/nodejs/lancedb/util.ts
2025-03-21 10:57:08 -07:00

83 lines
2.1 KiB
TypeScript

// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: Copyright The LanceDB Authors
export type IntoSql =
| string
| number
| boolean
| null
| Date
| ArrayBufferLike
| Buffer
| IntoSql[];
export function toSQL(value: IntoSql): string {
if (typeof value === "string") {
return `'${value.replace(/'/g, "''")}'`;
} else if (typeof value === "number") {
return value.toString();
} else if (typeof value === "boolean") {
return value ? "TRUE" : "FALSE";
} else if (value === null) {
return "NULL";
} else if (value instanceof Date) {
return `'${value.toISOString()}'`;
} else if (Array.isArray(value)) {
return `[${value.map(toSQL).join(", ")}]`;
} else if (Buffer.isBuffer(value)) {
return `X'${value.toString("hex")}'`;
} else if (value instanceof ArrayBuffer) {
return `X'${Buffer.from(value).toString("hex")}'`;
} else {
throw new Error(
`Unsupported value type: ${typeof value} value: (${value})`,
);
}
}
export function packBits(data: Array<number>): Array<number> {
const packed = Array(data.length >> 3).fill(0);
for (let i = 0; i < data.length; i++) {
const byte = i >> 3;
const bit = i & 7;
packed[byte] |= data[i] << bit;
}
return packed;
}
export class TTLCache {
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
private readonly cache: Map<string, { value: any; expires: number }>;
/**
* @param ttl Time to live in milliseconds
*/
constructor(private readonly ttl: number) {
this.cache = new Map();
}
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
get(key: string): any | undefined {
const entry = this.cache.get(key);
if (entry === undefined) {
return undefined;
}
if (entry.expires < Date.now()) {
this.cache.delete(key);
return undefined;
}
return entry.value;
}
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
set(key: string, value: any): void {
this.cache.set(key, { value, expires: Date.now() + this.ttl });
}
delete(key: string): void {
this.cache.delete(key);
}
}