52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
import { Database, camelCaseRows, safeString } from './database';
|
|
|
|
export class Prospects {
|
|
constructor(private db: Database) { }
|
|
|
|
|
|
async semanticSearch(prompt: string, riskProfile?: string, minAge?: number, maxAge?: number) {
|
|
let query = `SELECT id, first_name, last_name, email, age, risk_profile, bio,
|
|
bio_embedding <=> google_ml.embedding('text-embedding-005', '${safeString(prompt)}')::vector AS distance
|
|
FROM user_profiles`;
|
|
|
|
let filters = this.getFilters(riskProfile, minAge, maxAge);
|
|
query += filters += ` ORDER BY distance LIMIT 50;`;
|
|
|
|
const rows = await this.db.query(query);
|
|
return { data: camelCaseRows(rows), query: query };
|
|
}
|
|
|
|
private getFilters(riskProfile?: string, minAge?: number, maxAge?: number) {
|
|
let filter: string;
|
|
|
|
if (riskProfile || minAge || maxAge) {
|
|
filter = ` WHERE `;
|
|
|
|
if (riskProfile) {
|
|
filter += `risk_profile = '${riskProfile}'`;
|
|
}
|
|
|
|
if (minAge) {
|
|
|
|
if (riskProfile) {
|
|
filter += ` AND `;
|
|
}
|
|
filter += ` age >= ${minAge}`;
|
|
}
|
|
|
|
if (maxAge) {
|
|
|
|
if (riskProfile || minAge) {
|
|
filter += ` AND `;
|
|
}
|
|
filter += ` age <= ${maxAge}`;
|
|
}
|
|
}
|
|
else {
|
|
filter = ``;
|
|
}
|
|
|
|
return filter;
|
|
}
|
|
}
|