Files
astrololo/services/data
gitea 413c46b5dd Napraw lokalne środowisko dev: Parquet mixed-types, brak deps, compose
Trzy usterki uniemożliwiające uruchomienie stosu lokalnie:

1. Warstwa danych wykładała się na starcie przy zapisie Parquet dla realnych
   plików (np. Encyclopaedia of Medical Astrology) — kolumny o mieszanych
   typach (int+str+NaN). frame_cache.put() zapisuje teraz ramkę jako string
   (warstwa i tak wyszukuje po tekście). Dodatkowo warmup() jest odporny:
   pojedynczy uszkodzony plik nie blokuje startu usługi.

2. Brakowało kroku instalacji zależności — dev-logic/dev-presentation padały na
   'No module named httpx'. Nowy cel `make install` instaluje zależności
   WSZYSTKICH warstw do aktywnego venv. README zaktualizowane (instalowało
   wcześniej tylko warstwę danych).

3. `make up` zakładał `docker compose`, którego użytkownik nie ma. Makefile
   wykrywa `docker compose` lub `docker-compose`, a przy braku obu podaje
   czytelną instrukcję trybu lokalnego. Dodano `make test` i `make clean-cache`.

Zweryfikowane end-to-end na realnym środowisku (.env, Python 3.14) i danych:
warmup przechodzi (3 pliki), cały stos wstaje, formularz → logika → silnik
Skyfield zwraca poprawne pozycje.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 10:55:04 +02:00
..

Warstwa bazodanowa (data)

Niezależna usługa. Jedyne zadanie: wyszukać dane i podać je w górę. Nie zna warstwy logicznej ani prezentacji — komunikacja wyłącznie przez HTTP/JSON (models.py).

API

  • POST /searchSearchQuerySearchResult
  • GET /healthHealthInfo

Architektura wewnętrzna

providers/        wymienna implementacja (wzorzec Repository)
  base.py         interfejs DataProvider  ← kontrakt
  excel_provider  dziś: Excel + 4 poziomy cache
  sql_provider    jutro: SQL (ten sam interfejs)
  factory.py      DATA_PROVIDER=excel|sql
excel/            wykrywanie nagłówka + mapowanie układu kolumn (jedyne miejsce znające .xlsx)
cache/            fingerprint, schema(L1), frame/parquet(L2), query(L3), index(L4)
ingest/           build_index.py (warmup), to_sql.py (migracja ETL)

Cache — dlaczego szybko

Poziom Co cache'uje Zysk
L1 schema.db wykryty nagłówek + układ kolumn per plik brak ponownego skanu heurystyką
L2 Parquet znormalizowany arkusz 10100× szybciej niż parsowanie .xlsx
L3 QueryCache wynik zapytania (TTL/LRU) powtarzalne zapytania natychmiast
L4 index.db odwrócony indeks wartość→plik otwieramy tylko trafione pliki, nie setki

Unieważnianie: klucz = odcisk pliku (mtime+rozmiar, opcjonalnie sha256). Zmiana pliku → inny odcisk → automatyczny przebudowa.

Uruchomienie lokalne

pip install -r requirements.txt
python scripts/make_sample_data.py     # przykładowe .xlsx
python -m app.ingest.build_index       # (opcjonalnie) prebuild indeksu
uvicorn app.main:app --port 8002

Migracja do SQL (gdy nadejdzie czas)

python -m app.ingest.to_sql            # Excel -> tabela 'records' + indeksy
export DATA_PROVIDER=sql               # przełącz warstwę — reszta systemu bez zmian