boredgame/src/tsVector.ts

26 lines
772 B
TypeScript

import { customType } from 'drizzle-orm/pg-core';
function genExpWithWeights(input: string[]) {
const columnExpressions = input.map((column, index) => {
const weight = String.fromCharCode(index + 65);
return `setweight(to_tsvector('english', coalesce(${column}, '')), '${weight}')`;
});
return `tsvector GENERATED ALWAYS AS (${columnExpressions.join(' || ')}) STORED`;
}
export const tsvector = customType<{
data: string;
config: { sources: string[]; weighted: boolean };
}>({
dataType(config) {
if (config) {
const sources = config.sources.join(" || ' ' || ");
return config.weighted
? genExpWithWeights(config.sources)
: `tsvector generated always as (to_tsvector('english', ${sources})) stored`;
} else {
return `tsvector`;
}
}
});