feat(veri): Program tipi yılsız — db eşleyicisi, lib ve snapshot ilkYil (P-B a)
Program artık siraGecmisi (YILLAR ile hizalı) + efektifSira + siraSon/puanSon/ kontenjanSon/yerlesenSon taşır. db.ts kolonları YILLAR'dan üretip takma adla seçer, programSatiri eşleyicisi ham satırı Program'a çevirir; SELECT_COLS'un üç tüketicisi de eşleyiciden geçer. EFEKTIF_SIRA veri-yillari'dan gelir. - trend: ILK_YIL tek kaynaktan, opsiyonel ilkYil parametresi - rapor snapshot'ına opsiyonel ilkYil yazılır (eski kayıtlar: okurken ILK_YIL) - rapor promptu son 4 yılı göndermeye devam eder, anahtarlar dinamik - tadımlık "son N yıl" filtresi genel: N != VERI_YIL_SAYISI ise servis edilmez - veri-kapsami VERI_YIL_SAYISI'nı veri-yillari'dan türetir Bileşenler bir sonraki commit'te yeni tipe geçer (ikisi birlikte derlenir). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
import path from "node:path";
|
||||
import Database from "better-sqlite3";
|
||||
import { KATEGORILER, kategoriBul } from "./kategoriler";
|
||||
import { EFEKTIF_SIRA_SQL, SON_YIL, YILLAR } from "./veri-yillari";
|
||||
import {
|
||||
PUAN_TURLERI,
|
||||
type DilimKey,
|
||||
@@ -27,12 +28,46 @@ export function getDb(): Database.Database {
|
||||
return globalForDb.yokatlasDb;
|
||||
}
|
||||
|
||||
// Yıl ekli kolonlar yalnız burada, `YILLAR`'dan üretilerek adlandırılır; DB
|
||||
// dışına yılsız `Program` çıkar. SELECT_COLS ile okunan her satır
|
||||
// `programSatiri` eşleyicisinden geçmelidir (ham satır `Program` değildir).
|
||||
export const SELECT_COLS = `id, isim, universite, unitur, il, fakulte, tur, sure,
|
||||
sira2025, sira2024, sira2023, sira2022, sira2021,
|
||||
puan2025, kontenjan2025, yerlesen2025`;
|
||||
${YILLAR.map((yil) => `sira${yil} AS s${yil}`).join(", ")},
|
||||
puan${SON_YIL} AS puanSon, kontenjan${SON_YIL} AS kontenjanSon, yerlesen${SON_YIL} AS yerlesenSon`;
|
||||
|
||||
// 2025 sıralaması yoksa (az yerleşen/yeni program) 2024'e düşer
|
||||
export const EFEKTIF_SIRA = "COALESCE(sira2025, sira2024)";
|
||||
// Son yılın sıralaması yoksa (az yerleşen/yeni program) bir önceki yıla düşer.
|
||||
// İfade indeks sözleşmesidir; tek kaynağı lib/veri-yillari.ts.
|
||||
export const EFEKTIF_SIRA = EFEKTIF_SIRA_SQL;
|
||||
|
||||
/** SELECT_COLS ile okunan ham satır: sıra kolonları `s<yıl>` takma adıyla gelir. */
|
||||
export type ProgramHamSatiri = Omit<
|
||||
Program,
|
||||
"siraGecmisi" | "efektifSira" | "siraSon"
|
||||
> &
|
||||
Record<`s${number}`, number | null>;
|
||||
|
||||
/** Ham DB satırını yılsız `Program`'a çevirir. */
|
||||
export function programSatiri(row: ProgramHamSatiri): Program {
|
||||
const siraGecmisi = YILLAR.map((yil) => row[`s${yil}`] ?? null);
|
||||
const siraSon = siraGecmisi[siraGecmisi.length - 1] ?? null;
|
||||
return {
|
||||
id: row.id,
|
||||
isim: row.isim,
|
||||
universite: row.universite,
|
||||
unitur: row.unitur,
|
||||
il: row.il,
|
||||
fakulte: row.fakulte,
|
||||
tur: row.tur,
|
||||
sure: row.sure,
|
||||
siraGecmisi,
|
||||
// EFEKTIF_SIRA ile aynı kural: son yıl, yoksa bir önceki yıl
|
||||
efektifSira: siraSon ?? siraGecmisi[siraGecmisi.length - 2] ?? null,
|
||||
siraSon,
|
||||
puanSon: row.puanSon,
|
||||
kontenjanSon: row.kontenjanSon,
|
||||
yerlesenSon: row.yerlesenSon,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Kullanıcının başarı sıralamasına göre programları üç dilime ayırır.
|
||||
@@ -112,18 +147,18 @@ export function dilimAra(
|
||||
// hayal: sınıra en yakın (en büyük taban) önce; diğerleri en yakından uzağa
|
||||
const yon = dilim === "hayal" ? "DESC" : "ASC";
|
||||
|
||||
const programlar = db
|
||||
const satirlar = db
|
||||
.prepare(
|
||||
`SELECT ${SELECT_COLS} ${base} ORDER BY ${EFEKTIF_SIRA} ${yon} LIMIT ? OFFSET ?`
|
||||
)
|
||||
.all(...args, limit, offset) as Program[];
|
||||
.all(...args, limit, offset) as ProgramHamSatiri[];
|
||||
const toplam = (
|
||||
db.prepare(`SELECT COUNT(*) AS adet ${base}`).get(...args) as {
|
||||
adet: number;
|
||||
}
|
||||
).adet;
|
||||
|
||||
return { programlar, toplam };
|
||||
return { programlar: satirlar.map(programSatiri), toplam };
|
||||
}
|
||||
|
||||
export function searchByRank(
|
||||
|
||||
Reference in New Issue
Block a user