feat: doküman metninden sektör zenginleştirme — başlığı sinyalsiz ilanlar ilan metninden sınıflandırılıyor (kalıcı önbellekli)
This commit is contained in:
@@ -50,6 +50,13 @@ CREATE INDEX IF NOT EXISTS idx_idare ON sonuclar(idare_adi);
|
||||
CREATE INDEX IF NOT EXISTS idx_il ON sonuclar(il);
|
||||
CREATE INDEX IF NOT EXISTS idx_tarih ON sonuclar(ihale_tarihi);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sektor_zengin (
|
||||
ilan_id TEXT PRIMARY KEY, -- ör. ilan-12345
|
||||
sektor TEXT NOT NULL, -- doküman metninden çıkarılan sektör
|
||||
kaynak TEXT, -- 'dokuman' | 'okas'
|
||||
zaman TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS havuz_olcum (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
zaman TEXT NOT NULL,
|
||||
@@ -416,3 +423,80 @@ export function havuzOzet() {
|
||||
db.close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// --- Sektör zenginleştirme (doküman metninden) -----------------------------
|
||||
// Başlığı sinyalsiz ihaleler ("MUHTELİF MALZEME ALIMI") ilan metninden
|
||||
// sınıflandırılır. Sonuç kalıcı saklanır: aynı ilan bir daha indirilmez.
|
||||
|
||||
/** id → sektör haritası. Yalnızca istenen id'ler okunur. */
|
||||
export function sektorZenginOku(idler) {
|
||||
const db = openDb();
|
||||
if (!db || !idler?.length) return new Map();
|
||||
try {
|
||||
const harita = new Map();
|
||||
// SQLite parametre sınırına takılmamak için parçalara böl.
|
||||
for (let i = 0; i < idler.length; i += 400) {
|
||||
const parca = idler.slice(i, i + 400);
|
||||
const yer = parca.map(() => '?').join(',');
|
||||
const satirlar = db
|
||||
.prepare(`SELECT ilan_id, sektor FROM sektor_zengin WHERE ilan_id IN (${yer})`)
|
||||
.all(...parca);
|
||||
for (const r of satirlar) harita.set(r.ilan_id, r.sektor);
|
||||
}
|
||||
return harita;
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
}
|
||||
|
||||
export function sektorZenginYaz(kayitlar) {
|
||||
const db = openDb({ create: true });
|
||||
if (!db || !kayitlar?.length) return 0;
|
||||
try {
|
||||
const st = db.prepare(
|
||||
`INSERT INTO sektor_zengin (ilan_id, sektor, kaynak, zaman) VALUES (?,?,?,?)
|
||||
ON CONFLICT(ilan_id) DO UPDATE SET sektor=excluded.sektor, kaynak=excluded.kaynak, zaman=excluded.zaman`
|
||||
);
|
||||
const now = new Date().toISOString();
|
||||
let n = 0;
|
||||
for (const k of kayitlar) {
|
||||
if (!k?.id || !k?.sektor) continue;
|
||||
st.run(k.id, k.sektor, k.kaynak || 'dokuman', now);
|
||||
n++;
|
||||
}
|
||||
return n;
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
}
|
||||
|
||||
/** Hangi id'ler daha önce denenmiş? ('Genel' kaydı da denenmiş sayılır) */
|
||||
export function sektorZenginDenenmis(idler) {
|
||||
const db = openDb();
|
||||
if (!db || !idler?.length) return new Set();
|
||||
try {
|
||||
const küme = new Set();
|
||||
for (let i = 0; i < idler.length; i += 400) {
|
||||
const parca = idler.slice(i, i + 400);
|
||||
const yer = parca.map(() => '?').join(',');
|
||||
for (const r of db.prepare(`SELECT ilan_id FROM sektor_zengin WHERE ilan_id IN (${yer})`).all(...parca))
|
||||
küme.add(r.ilan_id);
|
||||
}
|
||||
return küme;
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
}
|
||||
|
||||
export function sektorZenginSayi() {
|
||||
const db = openDb();
|
||||
if (!db) return { toplam: 0, cozulen: 0 };
|
||||
try {
|
||||
const t = db.prepare("SELECT COUNT(*) c FROM sektor_zengin").get().c;
|
||||
const c = db.prepare("SELECT COUNT(*) c FROM sektor_zengin WHERE sektor <> 'Genel'").get().c;
|
||||
return { toplam: t, cozulen: c };
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user