// 列出所有唯一實體(subject ∪ object)— 零 SQL / 零 D1 // 取全部 triplet record(走基本盤 API),在記憶體統計 as_subject/as_object/total。 // GET /entities import type { KbdbClient } from '../lib/kbdb-client'; import { queryTriplets } from './triplet-crud'; export interface EntityStat { name: string; as_subject: number; as_object: number; total: number; } export interface EntityListResult { entities: EntityStat[]; total: number; limit: number; offset: number; } export async function listTripletEntities( client: KbdbClient, { limit = 200, offset = 0, q }: { limit?: number; offset?: number; q?: string }, ): Promise { const safeLimit = Math.min(limit, 500); const { triplets } = await queryTriplets(client, { limit: 2000 }); const stats = new Map(); const bump = (name: string, role: 'as_subject' | 'as_object') => { if (!name) return; let s = stats.get(name); if (!s) { s = { name, as_subject: 0, as_object: 0, total: 0 }; stats.set(name, s); } s[role] += 1; s.total += 1; }; for (const t of triplets) { bump(t.subject, 'as_subject'); bump(t.object, 'as_object'); } let entities = [...stats.values()]; if (q) { const needle = q.toLowerCase(); entities = entities.filter((e) => e.name.toLowerCase().includes(needle)); } entities.sort((a, b) => b.total - a.total); const total = entities.length; const page = entities.slice(offset, offset + safeLimit); return { entities: page, total, limit: safeLimit, offset }; }