From 387e2617b84c6a5cc735f04403a9a77855819943 Mon Sep 17 00:00:00 2001 From: Artur Kruszewski Date: Wed, 8 Jul 2026 23:04:40 +0200 Subject: [PATCH] T9: Person title/pwzNumber fields [checkpoint] --- PLAN.md | 205 ++++++++++++++++-- PLAN2.md | 0 szpitale-graph/local-agent-progress.json | 10 +- .../szpitale/ingest/CanonicalWriter.java | 4 +- .../ingest/normalize/Deduplicator.java | 3 +- .../com/developx/szpitale/model/Person.java | 4 +- .../ingest/normalize/DeduplicatorTest.java | 12 +- .../szpitale/load/CanonicalRoundTripTest.java | 3 +- .../developx/szpitale/model/PersonTest.java | 26 +++ .../szpitale/ingest/CanonicalWriter.class | Bin 14107 -> 14147 bytes .../ingest/normalize/Deduplicator.class | Bin 6246 -> 6284 bytes .../com/developx/szpitale/model/Person.class | Bin 2742 -> 3162 bytes .../default-testCompile/createdFiles.lst | 2 +- .../default-testCompile/inputFiles.lst | 2 +- ...tale.ingest.normalize.DeduplicatorTest.xml | 10 +- ...le.ingest.normalize.NameNormalizerTest.xml | 28 +-- ...e.ingest.normalize.PartyNormalizerTest.xml | 16 +- ...gest.source.MarkdownRegistrySourceTest.xml | 14 +- ...x.szpitale.load.CanonicalRoundTripTest.xml | 8 +- ...com.developx.szpitale.model.PersonTest.xml | 59 +++++ ...tale.ingest.normalize.DeduplicatorTest.txt | 2 +- ...le.ingest.normalize.NameNormalizerTest.txt | 2 +- ...e.ingest.normalize.PartyNormalizerTest.txt | 2 +- ...gest.source.MarkdownRegistrySourceTest.txt | 2 +- ...x.szpitale.load.CanonicalRoundTripTest.txt | 2 +- ...com.developx.szpitale.model.PersonTest.txt | 4 + .../target/szpitale-graph-1.0.0-SNAPSHOT.jar | Bin 24455389 -> 24455498 bytes ...szpitale-graph-1.0.0-SNAPSHOT.jar.original | Bin 68296 -> 68405 bytes .../ingest/normalize/DeduplicatorTest.class | Bin 3484 -> 3528 bytes .../load/CanonicalRoundTripTest.class | Bin 6201 -> 6239 bytes .../szpitale/load/GraphLoaderIT.class | Bin 6499 -> 0 bytes .../developx/szpitale/model/PersonTest.class | Bin 0 -> 1330 bytes 32 files changed, 348 insertions(+), 72 deletions(-) delete mode 100644 PLAN2.md create mode 100644 szpitale-graph/src/test/java/com/developx/szpitale/model/PersonTest.java create mode 100644 szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.model.PersonTest.xml create mode 100644 szpitale-graph/target/surefire-reports/com.developx.szpitale.model.PersonTest.txt delete mode 100644 szpitale-graph/target/test-classes/com/developx/szpitale/load/GraphLoaderIT.class create mode 100644 szpitale-graph/target/test-classes/com/developx/szpitale/model/PersonTest.class diff --git a/PLAN.md b/PLAN.md index ce902f6..8f81d31 100644 --- a/PLAN.md +++ b/PLAN.md @@ -8,6 +8,8 @@ **Historia (poprzedni plan, superseded)** - Pierwsza wersja planu była jednoskryptowa (Python: `requests` + BeautifulSoup, ładowanie przez `neo4j` driver) i ograniczona do województwa podlaskiego. Zastąpiona przez ten plan: **wielowojewódzki**, **warstwowy**, jako aplikacja **Java 21 + Maven + Spring Shell**, gdzie każda warstwa to osobna komenda CLI. - Wkład starego planu wchłonięty tutaj: tabela źródeł/provenance (sekcja 3→ obecnie 4.6 + 7), zapytania walidacyjne i raport nakładek (→ 5.6), obsługa przypadków brzegowych i rate-limitu (→ 7), lista produktów i checklista wykonawcza (→ 9, 10). Pseudokod Pythona porzucony — logikę realizuje kod Javy warstw `ingest`/`load`. +- `PLAN2.md` (delta) wchłonięty tutaj: rozszerzenie `Person` o `title`/`pwzNumber` (→ 2, 4.7), nowe encje `Organization`/`Company` z powiązaniami po KRS/NIP/CEIDG (→ 2, 4.8, 5.2), nowe zadania kolejki agenta (→ T9–T13). Plik `PLAN2.md` usunięty po scaleniu. +- Kolejka §11 przepisana pod konkretny model wykonawczy: **Qwen-3.6-35B-A3B** (MoE, ~3B aktywnych parametrów na token, mały kontekst efektywny). Reguły atomowości zadań i zakaz planowania (już obecne w poprzedniej wersji dla „małego lokalnego modelu") pozostają — dopisano jawne odniesienie do tego modelu, by przyszłe zadania kalibrować pod jego ograniczenia kontekstu i skłonność do zmyślania API. --- @@ -89,9 +91,57 @@ Jeden schemat dla **wszystkich** województw. Plik `canonical/.json "fullName": "Jan Kochanowicz", "displayName": "prof. dr hab. n. med. Jan Kochanowicz", // z tytułami, jak w źródle "titles": ["prof.", "dr hab.", "n. med."], + "title": "prof. dr hab. n. med.", // tytuł skondensowany (jedno pole, do wyświetlania obok fullName) + "pwzNumber": "1234567", // Prawo Wykonywania Zawodu, z rejestr.nil.org.pl; null gdy nieznaleziony "sourceUrls": ["https://uskwb.pl/dyrekcja-szpitala/"] } ], + "organizations": [ // NGO/fundacje/stowarzyszenia powiązane z osobami przez KRS + { + "id": "org:fundacja-xyz", + "name": "Fundacja XYZ", + "krs": "0000123456", + "nip": null, + "sourceUrls": ["https://ems.ms.gov.pl/..."] + } + ], + "companies": [ // spółki/działalności gospodarcze powiązane z osobami + { + "id": "company:abc-sp-zoo", + "name": "ABC sp. z o.o.", + "krs": "0000654321", + "nip": "1234567890", + "ceidgId": null, + "sourceUrls": ["https://wyszukiwarka-krs.ms.gov.pl/..."] + } + ], + "personOrganizationLinks": [ // osoba ↔ organizacja, dopasowanie po KRS + { + "personId": "person:jan-kochanowicz", + "organizationId": "org:fundacja-xyz", + "roleLabel": "Prezes Zarządu", + "basis": "KRS", // klucz, po którym dopasowano powiązanie + "sourceUrls": ["https://ems.ms.gov.pl/..."] + } + ], + "organizationLinks": [ // organizacja ↔ organizacja, po KRS/NIP (np. wspólny adres/zarząd) + { + "fromOrganizationId": "org:fundacja-xyz", + "toOrganizationId": "org:inna-fundacja", + "basis": "NIP", // KRS | NIP + "note": "wspólny adres siedziby", + "sourceUrls": ["https://ems.ms.gov.pl/..."] + } + ], + "personCompanyLinks": [ // osoba ↔ firma, po KRS/CEIDG/NIP + { + "personId": "person:jan-kochanowicz", + "companyId": "company:abc-sp-zoo", + "roleLabel": "Wspólnik", + "basis": "KRS", // KRS | CEIDG | NIP + "sourceUrls": ["https://wyszukiwarka-krs.ms.gov.pl/..."] + } + ], "affiliations": [ // przynależność partyjna/komitetowa osoby { "personId": "person:karol-pilecki", @@ -133,8 +183,10 @@ Jeden schemat dla **wszystkich** województw. Plik `canonical/.json **Uwagi projektowe:** - `id` osoby jest generowane deterministycznie z znormalizowanego imienia i nazwiska (patrz normalizacja) — to podstawa deduplikacji **między szpitalami i województwami** (np. osoba zasiadająca w radach kilku szpitali). -- Enumy (`legalForm`, `roleType`, `mandateType`, `confidence`, `status`) są zamknięte i wspólne dla wszystkich województw — to gwarantuje uwspólniony format. +- Enumy (`legalForm`, `roleType`, `mandateType`, `confidence`, `status`) są zamknięte i wspólne dla wszystkich województw — to gwarantuje uwspólniony format. Nowy zamknięty enum `LinkBasis` (`KRS`, `NIP`, `CEIDG`) opisuje klucz dopasowania powiązań organizacja/firma. - Pola `note` i `confidence` przenoszą metadane jakościowe z materiału roboczego (kluczowe dla kontekstu dziennikarskiego). +- `id` organizacji/firmy jest slugiem z nazwy + (gdy dostępny) KRS w nawiasie logiki dedupu — dwie różne organizacje o tej samej nazwie, ale różnym KRS, **nie są scalane** (analogicznie do zasady dla `Person` w 4.3 pkt 4). +- `pwzNumber` bywa `null` — brak trafienia w rejestr.nil.org.pl to nie błąd, tylko luka odnotowywana w `ingest-report.json` (patrz 4.7). --- @@ -152,6 +204,7 @@ Jeden schemat dla **wszystkich** województw. Plik `canonical/.json | CSV (raporty) | `commons-csv` | | Testy | JUnit 5, Testcontainers (`neo4j` container) do testów warstwy ładowania | | Konteneryzacja Neo4j | Docker (`neo4j:5`), Bolt na `7687`, UI na `7474` | +| Rejestry zewnętrzne | rejestr.nil.org.pl (PWZ, formularz HTML — brak API), wyszukiwarka-krs.ms.gov.pl / api-krs (KRS), CEIDG API (dane.biznes.gov.pl) | ### Szkielet projektu Maven ``` @@ -163,14 +216,18 @@ szpitale-graph/ │ ├── model/ # rekordy modelu kanonicznego │ │ ├── CanonicalDataset.java │ │ ├── Hospital.java Person.java Affiliation.java Role.java Mandate.java -│ │ └── enums/ (LegalForm, RoleType, MandateType, Confidence, ...) +│ │ ├── Organization.java Company.java PersonOrganizationLink.java OrganizationLink.java PersonCompanyLink.java +│ │ └── enums/ (LegalForm, RoleType, MandateType, Confidence, LinkBasis, ...) │ ├── ingest/ # WARSTWA 1 │ │ ├── IngestCommand.java # @ShellComponent — komenda `ingest` │ │ ├── source/ # źródła per-województwo │ │ │ ├── VoivodeshipSource.java # interfejs: List fetch() │ │ │ ├── MarkdownRegistrySource.java# parser materiałów typu research-*.md │ │ │ ├── HtmlScraperSource.java # jsoup: strony szpitali/BIP -│ │ │ └── PkwSource.java # weryfikacja afiliacji w PKW 2024 +│ │ │ ├── PkwSource.java # weryfikacja afiliacji w PKW 2024 +│ │ │ ├── PwzRegistrySource.java # uzupełnienie pwzNumber z rejestr.nil.org.pl (4.7) +│ │ │ ├── KrsSource.java # organizacje/firmy + powiązania po KRS (4.8) +│ │ │ └── CeidgSource.java # powiązania osoba↔firma po CEIDG/NIP (4.8) │ │ ├── normalize/ │ │ │ ├── NameNormalizer.java # diakrytyki, tytuły, wielkość liter, slug │ │ │ ├── PartyNormalizer.java # mapowanie nazw partii/komitetów @@ -203,6 +260,9 @@ Implementacje (wybierane po fladze/konfiguracji): - **`MarkdownRegistrySource`** — parsuje istniejące materiały robocze w formacie tabel Markdown (jak `research-podlaskie.md`). To ścieżka startowa: podlaskie już mamy. Kolejne województwa dokładamy jako `research-.md` (patrz sekcja 4.6 — generowane skillem deep-research). - **`HtmlScraperSource`** — `HttpClient` + jsoup do stron szpitali (dyrekcja) i BIP (rady). Rate-limiting + retry z backoffem, `User-Agent`, poszanowanie `robots.txt`. - **`PkwSource`** — kontrola krzyżowa afiliacji radnych w `samorzad2024.pkw.gov.pl` (podnosi `confidence`). +- **`PwzRegistrySource`** — uzupełnia `pwzNumber` osoby z `rejestr.nil.org.pl` (formularz imię+nazwisko, patrz 4.7). +- **`KrsSource`** — wyszukuje organizacje/firmy powiązane z osobą po KRS (patrz 4.8). +- **`CeidgSource`** — kontrola krzyżowa działalności gospodarczych osoby po CEIDG/NIP (patrz 4.8). Rejestr źródeł spina wszystkie województwa; brak konfiguracji dla danego województwa = pomijane z ostrzeżeniem w logu (żadnych cichych luk). @@ -238,6 +298,27 @@ Wynik zapisujemy jako `research-mazowieckie.md`. Skalowanie na wszystkie wojewó **Granica odpowiedzialności:** deep-research **znajduje i weryfikuje źródła** (etap dziennikarsko-badawczy, wymaga oceny człowieka przed publikacją, zwłaszcza dla oznaczeń `NIEZWERYFIKOWANA`). Kod Javy (warstwa 1) **nie prowadzi researchu** — jedynie deterministycznie normalizuje gotowy materiał `.md` do modelu kanonicznego. Ten podział utrzymuje warstwę 1 testowalną i powtarzalną, a odkrywanie źródeł — audytowalne i cytowane. +### 4.7. Uzupełnienie numeru PWZ — `PwzRegistrySource` + +`rejestr.nil.org.pl` (Naczelna Izba Lekarska) udostępnia wyszukiwarkę lekarzy **wyłącznie jako formularz HTML** (imię + nazwisko), bez publicznego API. Wzbogacenie działa jako osobny krok w `ingest`, **po** normalizacji osób (potrzebuje `fullName`): + +1. Dla każdej osoby o `titles` sugerujących zawód medyczny (`dr`, `dr n. med.`, `prof.`, `lek.`, itp. — heurystyka w `PwzRegistrySource`, nie każda osoba w radzie jest lekarzem) wyślij zapytanie z `fullName`. +2. **Wiele trafień** (częste nazwiska) → `pwzNumber = null`, `note = "wieloznaczne trafienie NIL, wymaga ręcznej weryfikacji"`, wpis w `ingest-report.json`. +3. **Brak trafienia** → `pwzNumber = null`, brak `note` (osoba może nie być lekarzem — to nie błąd). +4. Rate-limiting jak dla `HtmlScraperSource` (4.2/7) — to ten sam serwis żywy, nie plik `.md`. + +**Granica odpowiedzialności:** to wzbogacenie jest **deterministyczne i automatyczne** (1:1 zapytanie→wynik po nazwisku), inaczej niż `deep-research` (4.6) — nie wymaga oceny dziennikarskiej, tylko technicznej weryfikacji przy wieloznaczności. + +### 4.8. Organizacje i firmy — `KrsSource` / `CeidgSource` + +Rozszerzenie modelu o encje `Organization` (fundacje, stowarzyszenia) i `Company` (spółki, działalności gospodarcze) powiązane z osobami z organów szpitali — cel: ujawnić potencjalne konflikty interesów. + +1. **`KrsSource`** — dla każdej osoby: wyszukanie w KRS (`wyszukiwarka-krs.ms.gov.pl` / `api-krs`) wpisów, gdzie figuruje jako zarząd/wspólnik/fundator. Zwraca `Organization`/`Company` + `personOrganizationLinks`/`personCompanyLinks` z `basis=KRS`. +2. Powiązania **organizacja↔organizacja** (`organizationLinks`) — wspólny KRS-owy adres, zarząd lub `nip` między dwiema organizacjami; `basis=KRS` lub `basis=NIP`. +3. **`CeidgSource`** — kontrola krzyżowa jednoosobowych działalności gospodarczych osoby po CEIDG (`dane.biznes.gov.pl`, API publiczne) i po `nip`; `basis=CEIDG` lub `basis=NIP`. +4. Deduplikacja: `Organization`/`Company` scalane po `krs` (klucz twardy, jednoznaczny) — w przeciwieństwie do `Person`, gdzie deduplikacja jest fuzzy i ostrożna (4.3 pkt 4), bo KRS/NIP są identyfikatorami unikalnymi z rejestru państwowego. +5. Brak dopasowania po KRS/CEIDG/NIP dla danej osoby = brak wpisu (nie każda osoba w radzie ma powiązania biznesowe) — nie jest to luka do raportowania. + ### 4.3. Normalizacja do formatu uwspólnionego 1. **Nazwiska** (`NameNormalizer`): usunięcie tytułów do `titles[]`, `displayName` zachowuje oryginał, `fullName` = imię+nazwisko, `id` = slug z NFKD bez diakrytyków, lower-case, `-`. Uwaga na warianty (np. `Wojciech Łuczaj` występuje w kilku szpitalach). 2. **Partie/komitety** (`PartyNormalizer`): mapowanie na kanoniczne nazwy (`Koalicja Obywatelska`, `PiS`, `PSL`, `Polska 2050`, `Trzecia Droga`, ...) + typ `PARTIA`/`KOMITET_WYBORCZY`/`KWW_LOKALNY`. `confidence` z markerów źródła (`NIEZWERYFIKOWANE` → `NIEZWERYFIKOWANA`, `brak danych` → `BRAK_DANYCH`, `brak/niepotwierdzona` → `NIEPOTWIERDZONA`). @@ -285,10 +366,12 @@ Odczytać plik(i) kanoniczne i zmaterializować graf w Neo4j: węzły, relacje i ### 5.2. Model grafu **Węzły (labels):** - `:Hospital {id, name, shortName, city, voivodeship, legalForm, foundingBody, supervisoryBodyType, nip, krs, website, sourceUrls}` -- `:Person {id, fullName, displayName, titles, sourceUrls}` +- `:Person {id, fullName, displayName, titles, title, pwzNumber, sourceUrls}` - `:Party {name, type}` (partia/komitet) - `:GovBody {name, type, voivodeship, term}` (sejmik, rada powiatu, urząd gminy — dla mandatów) - `:Voivodeship {slug, name}` (grupowanie i zapytania regionalne) +- `:Organization {id, name, krs, nip, sourceUrls}` (fundacje, stowarzyszenia) +- `:Company {id, name, krs, nip, ceidgId, sourceUrls}` (spółki, działalności gospodarcze) **Relacje:** | Relacja | Od → Do | Właściwości | @@ -300,6 +383,9 @@ Odczytać plik(i) kanoniczne i zmaterializować graf w Neo4j: węzły, relacje i | `[:CZLONEK_PARTII]` | Person → Party | `confidence, note, sourceUrls` | | `[:PELNI_MANDAT]` | Person → GovBody | `mandateType, term, sourceUrls` | | `[:W_WOJEWODZTWIE]` | Hospital → Voivodeship | — | +| `[:CZLONEK_ORGANIZACJI]` | Person → Organization | `roleLabel, basis (KRS), sourceUrls` | +| `[:POWIAZANA_Z]` | Organization → Organization | `basis (KRS/NIP), note, sourceUrls` | +| `[:POWIAZANY_Z_FIRMA]` | Person → Company | `roleLabel, basis (KRS/CEIDG/NIP), sourceUrls` | > Uwaga: zamiast osobnych typów relacji dla każdej funkcji można użyć jednej `[:PELNI_FUNKCJE {roleType, organ, ...}]`. Wybór: **typowane relacje** dla czytelności zapytań Cypher + `roleType` jako property dla filtrowania. @@ -309,7 +395,10 @@ CREATE CONSTRAINT hospital_id IF NOT EXISTS FOR (h:Hospital) REQUIRE h.id IS UNI CREATE CONSTRAINT person_id IF NOT EXISTS FOR (p:Person) REQUIRE p.id IS UNIQUE; CREATE CONSTRAINT party_name IF NOT EXISTS FOR (x:Party) REQUIRE x.name IS UNIQUE; CREATE CONSTRAINT voiv_slug IF NOT EXISTS FOR (v:Voivodeship) REQUIRE v.slug IS UNIQUE; +CREATE CONSTRAINT org_id IF NOT EXISTS FOR (o:Organization) REQUIRE o.id IS UNIQUE; +CREATE CONSTRAINT company_id IF NOT EXISTS FOR (c:Company) REQUIRE c.id IS UNIQUE; CREATE INDEX person_name IF NOT EXISTS FOR (p:Person) ON (p.fullName); +CREATE INDEX person_pwz IF NOT EXISTS FOR (p:Person) ON (p.pwzNumber); ``` ### 5.4. Ładowanie (parametryzowane, wsadowe) @@ -325,7 +414,30 @@ MERGE (hosp)-[:W_WOJEWODZTWIE]->(v); UNWIND $people AS p MERGE (person:Person {id: p.id}) SET person += {fullName:p.fullName, displayName:p.displayName, - titles:p.titles, sourceUrls:p.sourceUrls}; + titles:p.titles, title:p.title, pwzNumber:p.pwzNumber, sourceUrls:p.sourceUrls}; + +UNWIND $organizations AS o +MERGE (org:Organization {id: o.id}) +SET org += {name:o.name, krs:o.krs, nip:o.nip, sourceUrls:o.sourceUrls}; + +UNWIND $companies AS c +MERGE (comp:Company {id: c.id}) +SET comp += {name:c.name, krs:c.krs, nip:c.nip, ceidgId:c.ceidgId, sourceUrls:c.sourceUrls}; + +UNWIND $personOrganizationLinks AS pol +MATCH (p:Person {id:pol.personId}), (org:Organization {id:pol.organizationId}) +MERGE (p)-[m:CZLONEK_ORGANIZACJI]->(org) +SET m += {roleLabel:pol.roleLabel, basis:pol.basis, sourceUrls:pol.sourceUrls}; + +UNWIND $organizationLinks AS ol +MATCH (a:Organization {id:ol.fromOrganizationId}), (b:Organization {id:ol.toOrganizationId}) +MERGE (a)-[m:POWIAZANA_Z]->(b) +SET m += {basis:ol.basis, note:ol.note, sourceUrls:ol.sourceUrls}; + +UNWIND $personCompanyLinks AS pcl +MATCH (p:Person {id:pcl.personId}), (comp:Company {id:pcl.companyId}) +MERGE (p)-[m:POWIAZANY_Z_FIRMA]->(comp) +SET m += {roleLabel:pcl.roleLabel, basis:pcl.basis, sourceUrls:pcl.sourceUrls}; UNWIND $roles AS r MATCH (h:Hospital {id:r.hospitalId}), (p:Person {id:r.personId}) @@ -393,8 +505,15 @@ RETURN p.fullName, collect(DISTINCT h.name) AS szpitale, collect(DISTINCT g.name MATCH (h:Hospital)-[:CZLONEK_ORGANU]->(p:Person) WITH p, collect(DISTINCT h) AS hs WHERE size(hs) > 1 RETURN p.fullName, [x IN hs | x.name] AS szpitale; + +// Osoby w organie szpitala mające jednocześnie powiązanie biznesowe (konflikt interesów) +MATCH (h:Hospital)-[:CZLONEK_ORGANU]->(p:Person) +WHERE (p)-[:POWIAZANY_Z_FIRMA]->() OR (p)-[:CZLONEK_ORGANIZACJI]->() +OPTIONAL MATCH (p)-[:POWIAZANY_Z_FIRMA]->(comp:Company) +OPTIONAL MATCH (p)-[:CZLONEK_ORGANIZACJI]->(org:Organization) +RETURN p.fullName, h.name, collect(DISTINCT comp.name) AS firmy, collect(DISTINCT org.name) AS organizacje; ``` -Eksport `overlap_report.csv` (osoba, szpitale, funkcje, partia, mandaty, `confidence`, `sourceUrls`). +Eksport `overlap_report.csv` (osoba, szpitale, funkcje, partia, mandaty, firmy/organizacje, `confidence`, `sourceUrls`). --- @@ -421,6 +540,9 @@ Model kanoniczny, schemat grafu i komendy pozostają niezmienne — nowe wojewó | Dane dynamiczne (zmiany kadr) | `validFrom`/`validTo` + `status` na relacji funkcji (`AKTUALNY`/`PELNIACY_OBOWIAZKI`/`ELEKT`/`BYLY`) | | Rate-limit / blokada scrapera | Exponential backoff; przełączenie na materiał `.md` jako cache; adnotacja źródła | | Spółka z o.o. (rada nadzorcza) vs SPZOZ (rada społeczna) | `supervisoryBodyType` + `organ` na relacji rozróżniają organy | +| Wieloznaczne trafienie w rejestr.nil.org.pl (popularne nazwisko) | `pwzNumber=null`, `note="wieloznaczne trafienie NIL, wymaga ręcznej weryfikacji"`, wpis w `ingest-report.json` | +| Brak trafienia w KRS/CEIDG dla osoby | Brak wpisu w `personOrganizationLinks`/`personCompanyLinks` — to nie luka (nie każdy ma powiązania biznesowe) | +| Ta sama nazwa organizacji, różny KRS | Osobne węzły `:Organization` (dedup po `krs`, nie po nazwie) | --- @@ -452,9 +574,10 @@ java -jar target/szpitale-graph.jar load --voivodeship podlaskie 1. **Aplikacja Java 21 / Maven / Spring Shell** z komendami `ingest` (warstwa 1) i `load` (warstwa 2). 2. **Model kanoniczny** (`canonical/*.json`) — wersjonowalny, wielowojewódzki snapshot danych. 3. **Schemat Neo4j** — udokumentowane labels, typy relacji i właściwości (sekcja 5.2–5.3). -4. **`overlap_report.csv`** — osoby łączące funkcje w organach szpitali z mandatami/partiami, z `sourceUrls` i `confidence`. -5. **`ingest-report.json`** — statystyki i rejestr luk/rozbieżności per województwo. +4. **`overlap_report.csv`** — osoby łączące funkcje w organach szpitali z mandatami/partiami/firmami/organizacjami, z `sourceUrls` i `confidence`. +5. **`ingest-report.json`** — statystyki i rejestr luk/rozbieżności per województwo (w tym wieloznaczne trafienia PWZ). 6. **Testy** — JUnit + Testcontainers (Neo4j) dla warstwy ładowania; testy jednostkowe normalizacji/deduplikacji. +7. **Encje `Organization`/`Company`** w modelu kanonicznym i grafie, z powiązaniami do osób po KRS/CEIDG/NIP (sekcja 4.8, 5.2). --- @@ -471,12 +594,15 @@ java -jar target/szpitale-graph.jar load --voivodeship podlaskie - [ ] Testy: parsowanie MD, normalizacja nazwisk, ładowanie do Testcontainers-Neo4j, zapytania walidacyjne. - [ ] Weryfikacja end-to-end na podlaskim, następnie dołożenie kolejnego województwa: `deep-research` → `research-.md` → `ingest` → `load`. - [ ] Dla każdego nowego województwa: uruchomić skill `deep-research` (sekcja 4.6), zweryfikować oznaczenia `NIEZWERYFIKOWANA` przed użyciem, zapisać `research-.md`. +- [ ] `Person` rozszerzony o `title`/`pwzNumber` (sekcja 2, 4.7) + `PwzRegistrySource`. +- [ ] Nowe rekordy modelu: `Organization`, `Company`, `PersonOrganizationLink`, `OrganizationLink`, `PersonCompanyLink` (sekcja 2) + `KrsSource`/`CeidgSource` (sekcja 4.8). +- [ ] Warstwa 2: węzły `:Organization`/`:Company` + relacje `CZLONEK_ORGANIZACJI`/`POWIAZANA_Z`/`POWIAZANY_Z_FIRMA` (sekcja 5.2, 5.4) + constrainty (5.3). --- ## 11. Kolejka zadań dla lokalnego agenta (TDD, kroki atomowe) -Ta sekcja jest pisana pod **mały lokalny model** o ograniczonym kontekście. Każde zadanie jest samowystarczalne: jeden plik lub jedna metoda, dokładna ścieżka, dokładny test, jedna komenda weryfikacji, twarde kryterium ukończenia. Agent **nie planuje** — bierze pierwsze niezrobione zadanie i wykonuje je w całości. +Ta sekcja jest pisana pod lokalny model wykonawczy **Qwen-3.6-35B-A3B** (MoE, ~3B aktywnych parametrów na token, mały efektywny kontekst, skłonność do zmyślania nieistniejących API przy niedoprecyzowanym zadaniu). Każde zadanie jest samowystarczalne: jeden plik lub jedna metoda, dokładna ścieżka, dokładny test, jedna komenda weryfikacji, twarde kryterium ukończenia. Agent **nie planuje** — bierze pierwsze niezrobione zadanie i wykonuje je w całości. Zasada 7 (poniżej) jest przy tym modelu szczególnie krytyczna: A3B chętnie "dopisuje" wygodne metody, których nie ma w `src/main/java` — zawsze czytaj plik przed wywołaniem metody. ### Reguły pracy (przeczytaj przed każdym zadaniem) @@ -555,6 +681,47 @@ Ta sekcja jest pisana pod **mały lokalny model** o ograniczonym kontekście. Ka - Jeśli któreś [NEO4J] pominięte — odnotuj w tej checklistcie jako `[~]` z powodem. - DoD: `./mvnw -q verify` przechodzi (pomijając wyłącznie zadania bez Dockera). +**T9 — Rozszerzyć `Person` o `title` i `pwzNumber`** +- Plik: `src/main/java/com/developx/szpitale/model/Person.java` (rekord z 5 polami: `id, fullName, displayName, titles, sourceUrls`). +- Zamiar: dodać dwa nowe pola rekordu: `@JsonProperty("title") String title` (może być `null`) i `@JsonProperty("pwzNumber") String pwzNumber` (może być `null`), jako **ostatnie** dwa parametry konstruktora rekordu. +- TDD: + 1. Test `PersonTest.person_withTitleAndPwzNumber_fieldsAccessible` w `src/test/java/com/developx/szpitale/model/PersonTest.java`: zbuduj `Person` z niepustym `title` i `pwzNumber`, asercja że `person.title()` i `person.pwzNumber()` zwracają wpisane wartości. RED (kompilacja nie przejdzie, bo konstruktor ma 5 argumentów) → dodaj pola → GREEN. + 2. Znajdź **wszystkie** miejsca konstruujące `new Person(...)` (`grep -rn "new Person(" src/`) i dopisz `null, null` (lub realną wartość jeśli już znana) na końcu wywołania — inaczej build nie skompiluje się. +- DoD: `./mvnw -q compile` przechodzi; `./mvnw -q test -Dtest=PersonTest` zielony. + +**T10 — `PwzRegistrySource` (fixture, bez żywego HTTP w teście)** +- Nowy plik: `src/main/java/com/developx/szpitale/ingest/source/PwzRegistrySource.java`. +- Zamiar (sekcja 4.7): metoda `Optional lookupPwz(String fullName)` przyjmuje wynik zapytania do `rejestr.nil.org.pl` jako **wstrzykniętą zależność** (np. interfejs `PwzLookupClient` z metodą `List query(String fullName)`), żeby test nie robił żywego HTTP. +- Fixture: `src/test/resources/fixtures/nil-single-match.json` z jednym wynikiem (`["1234567"]`) i `nil-multiple-matches.json` z dwoma. +- TDD: + 1. Test `PwzRegistrySourceTest.lookupPwz_singleMatch_returnsPwzNumber` → mock `PwzLookupClient` zwraca jeden wynik → `lookupPwz` zwraca `Optional.of("1234567")`. + 2. Test `PwzRegistrySourceTest.lookupPwz_multipleMatches_returnsEmpty` → mock zwraca 2 wyniki → `lookupPwz` zwraca `Optional.empty()` (wieloznaczność, patrz 4.7 pkt 2 — **nie zgadywać**, który wynik jest właściwy). + 3. Test `PwzRegistrySourceTest.lookupPwz_noMatch_returnsEmpty` → mock zwraca pustą listę → `Optional.empty()`. +- DoD: `./mvnw -q test -Dtest=PwzRegistrySourceTest` zielony. Nie implementuj żywego klienta HTTP w tym zadaniu — tylko interfejs `PwzLookupClient` + logika `PwzRegistrySource` na nim. + +**T11 — Rekordy `Organization`/`Company` + linki (round-trip)** +- Nowe pliki: `src/main/java/com/developx/szpitale/model/Organization.java`, `Company.java`, `PersonOrganizationLink.java`, `OrganizationLink.java`, `PersonCompanyLink.java` — pola dokładnie jak w sekcji 2 PLAN.md (przykłady JSON), jako rekordy Java z `@JsonProperty` (wzoruj się na `Hospital.java`/`Person.java`). +- Zamiar: `CanonicalDataset` (`src/main/java/com/developx/szpitale/model/CanonicalDataset.java`) dostaje 5 nowych pól-list: `organizations, companies, personOrganizationLinks, organizationLinks, personCompanyLinks` (domyślnie puste listy, nie `null`). +- TDD: + 1. Test `OrganizationCompanyRoundTripTest.write_thenRead_preservesOrganizationsAndCompanies` w `src/test/java/com/developx/szpitale/ingest/` (mirror `CanonicalRoundTripTest` z T5): zbuduj `CanonicalDataset` z 1 `Organization`, 1 `Company`, po 1 linku każdego typu; zapisz `CanonicalWriter`, odczytaj `CanonicalReader`, porównaj pola. RED najpierw. + 2. Minimalny kod: dodaj rekordy + pola w `CanonicalDataset`, sprawdź że Jackson serializuje/deserializuje bez adnotacji dodatkowych (jak reszta modelu). +- DoD: `./mvnw -q test -Dtest=OrganizationCompanyRoundTripTest` zielony. + +**T12 — [NEO4J] `GraphLoader` ładuje `:Organization`/`:Company`** +- Plik prod: `src/main/java/com/developx/szpitale/load/GraphLoader.java` (przeczytaj istniejącą metodę ładującą `Hospital`/`Person`, wzoruj się na jej strukturze). +- Zamiar (sekcja 5.4): dodać metodę analogiczną do istniejącego ładowania węzłów, wykonującą `UNWIND $organizations ... MERGE (:Organization {id})`, `UNWIND $companies ... MERGE (:Company {id})` oraz 3 `MERGE` relacji: `CZLONEK_ORGANIZACJI`, `POWIAZANA_Z`, `POWIAZANY_Z_FIRMA` (dokładne zapytania Cypher w sekcji 5.4 PLAN.md). +- Test integracyjny: `GraphLoaderOrganizationIT` z `@Testcontainers` (wzoruj się na istniejącym wzorcu z T6, jeśli `GraphLoaderIT` już istnieje — skopiuj setup kontenera). + - `load_organizationAndCompany_nodesCreatedWithLinks` → załaduj 1 osobę + 1 organizację + 1 firmę + odpowiednie linki, sprawdź że istnieją węzły `:Organization`, `:Company` i relacje do `:Person`. +- Wymaga Dockera. Bez Dockera → `[~]` + notatka (jak T6/T7). +- DoD: `./mvnw -q test -Dtest=GraphLoaderOrganizationIT` zielony (lub pominięte z notatką). + +**T13 — [NEO4J] `GraphValidator` — zapytanie o konflikt interesów** +- Plik prod: `src/main/java/com/developx/szpitale/load/GraphValidator.java`. +- Zamiar (sekcja 5.6): dodać metodę zwracającą wynik zapytania „osoby w organie szpitala z powiązaniem biznesowym" (dokładny Cypher w sekcji 5.6 PLAN.md, blok „konflikt interesów"). +- Test integracyjny `GraphValidatorOrganizationIT`: wgraj dataset z 1 osobą mającą `CZLONEK_ORGANU` (szpital) i `POWIAZANY_Z_FIRMA` (firma); asercja: wynik zawiera tę osobę z nazwą firmy. +- Wymaga Dockera. Bez Dockera → `[~]` + notatka. +- DoD: `./mvnw -q test -Dtest=GraphValidatorOrganizationIT` zielony (lub pominięte z notatką). + --- ## 12. Sekcja postępu (aktualizuje lokalny agent) @@ -563,15 +730,27 @@ Po ukończeniu zadania agent zmienia jego status w liście poniżej i dopisuje j - [x] T1 Deduplicator compile fix - [x] T2 NameNormalizer testy -- [ ] T3 PartyNormalizer testy +- [x] T3 PartyNormalizer testy - [x] T4 MarkdownRegistrySource test - [x] T5 Canonical round-trip - [~] T6 GraphLoader idempotencja [NEO4J] (skipped: Docker API too old) -- [ ] T7 GraphValidator + CSV [NEO4J] -- [ ] T8 Zielony pełny build +- [~] T7 GraphValidator + CSV [NEO4J] (skipped: Docker API too old, jak T6) +- [x] T8 Zielony pełny build +- [x] T9 Person: title/pwzNumber +- [ ] T10 PwzRegistrySource +- [ ] T11 Organization/Company rekordy + round-trip +- [ ] T12 GraphLoader: Organization/Company [NEO4J] +- [ ] T13 GraphValidator: konflikt interesów [NEO4J] **Dziennik (data — zadanie — wynik):** -- (pusto) +- 2026-07-07 — T1 — Deduplicator compile fix + unit tests [checkpoint] (commit 38a93d0) +- 2026-07-07 — T2 — NameNormalizer testy + transliteratePolish, token-strip titles [checkpoint] (commit afe107c) +- 2026-07-07 — T3 — PartyNormalizer testy + KO alias [checkpoint] (commit bc4eaac) +- 2026-07-07 — T4 — MarkdownRegistrySource test + fix isPersonTable check [checkpoint] (commit 7f636a1) +- 2026-07-07 — T5 — CanonicalWriter/Reader round-trip test [checkpoint] (commit b072cb3) +- 2026-07-07 — T6/T8 — skip NEO4J tests (Docker API zbyt stary) + pełny build zielony [checkpoint] (commit 59d27b1) +- 2026-07-08 — PLAN.md scalony z PLAN2.md (Person.title/pwzNumber, Organization/Company, kolejka T9–T13); dostosowano §11 pod Qwen-3.6-35B-A3B. +- 2026-07-08 — T9 — Person: title/pwzNumber — dodano dwa pola do record Person, zaktualizowano wszyskie konstruktory (CanonicalWriter, Deduplicator, testy). 7 testow zielonych. --- diff --git a/PLAN2.md b/PLAN2.md deleted file mode 100644 index e69de29..0000000 diff --git a/szpitale-graph/local-agent-progress.json b/szpitale-graph/local-agent-progress.json index 3c9465e..ecfa3f1 100644 --- a/szpitale-graph/local-agent-progress.json +++ b/szpitale-graph/local-agent-progress.json @@ -4,7 +4,7 @@ "description": "Stan wykonania kolejki zadań lokalnego agenta (PLAN2.md §11-13). Zrodlo prawdy przy konflikcie: git log.", "resumeHint": "Wczytaj ten plik, znajdz pierwszy task o statusie todo/in_progress. Jesli in_progress i drzewo git brudne -> git checkout -- . && git clean -fd, ustaw task na todo, zacznij od zera (PLAN2.md §13.1).", "createdAt": "2026-07-07", - "updatedAt": "2026-07-08", + "updatedAt": "2026-07-08T23:03:00Z", "tasks": [ { "id": "T1", @@ -82,10 +82,10 @@ "id": "T9", "title": "Person: title/pwzNumber", "tag": null, - "status": "todo", - "startedAt": null, - "finishedAt": null, - "note": "PLAN2.md delta: rozszerzenie Person o title i pwzNumber (PLAN.md sekcja 2, T9)." + "status": "done", + "startedAt": "2026-07-08T23:00:00Z", + "finishedAt": "2026-07-08T23:03:00Z", + "note": "Dodano title i pwzNumber do Person record. Zaktualizowano wszystkie nowicje Person (CanonicalWriter, Deduplicator, testy). 7 testow zielonych." }, { "id": "T10", diff --git a/szpitale-graph/src/main/java/com/developx/szpitale/ingest/CanonicalWriter.java b/szpitale-graph/src/main/java/com/developx/szpitale/ingest/CanonicalWriter.java index 8a51ea5..c379998 100644 --- a/szpitale-graph/src/main/java/com/developx/szpitale/ingest/CanonicalWriter.java +++ b/szpitale-graph/src/main/java/com/developx/szpitale/ingest/CanonicalWriter.java @@ -73,7 +73,7 @@ public class CanonicalWriter { if (!peopleMap.containsKey(personId)) { peopleMap.put(personId, new Person( personId, extractedName, personEntry.displayTitle(), - titles, new ArrayList<>() + titles, new ArrayList<>(), null, null )); personUrlsMap.put(personId, new LinkedHashSet<>()); } @@ -122,7 +122,7 @@ public class CanonicalWriter { if (p != null) { updatedPeople.add(new Person( p.id(), p.fullName(), p.displayName(), - p.titles(), new ArrayList<>(entry.getValue()) + p.titles(), new ArrayList<>(entry.getValue()), null, null )); } } diff --git a/szpitale-graph/src/main/java/com/developx/szpitale/ingest/normalize/Deduplicator.java b/szpitale-graph/src/main/java/com/developx/szpitale/ingest/normalize/Deduplicator.java index 2c9be43..c5882d0 100644 --- a/szpitale-graph/src/main/java/com/developx/szpitale/ingest/normalize/Deduplicator.java +++ b/szpitale-graph/src/main/java/com/developx/szpitale/ingest/normalize/Deduplicator.java @@ -49,7 +49,8 @@ public class Deduplicator { first.fullName(), first.displayName(), first.titles(), - new ArrayList<>(allUrls) + new ArrayList<>(allUrls), + null, null ); } diff --git a/szpitale-graph/src/main/java/com/developx/szpitale/model/Person.java b/szpitale-graph/src/main/java/com/developx/szpitale/model/Person.java index 53c14c3..4dc9b75 100644 --- a/szpitale-graph/src/main/java/com/developx/szpitale/model/Person.java +++ b/szpitale-graph/src/main/java/com/developx/szpitale/model/Person.java @@ -9,6 +9,8 @@ public record Person( @JsonProperty("fullName") String fullName, @JsonProperty("displayName") String displayName, @JsonProperty("titles") List titles, - @JsonProperty("sourceUrls") List sourceUrls + @JsonProperty("sourceUrls") List sourceUrls, + @JsonProperty("title") String title, + @JsonProperty("pwzNumber") String pwzNumber ) { } diff --git a/szpitale-graph/src/test/java/com/developx/szpitale/ingest/normalize/DeduplicatorTest.java b/szpitale-graph/src/test/java/com/developx/szpitale/ingest/normalize/DeduplicatorTest.java index da0f8e3..63de02f 100644 --- a/szpitale-graph/src/test/java/com/developx/szpitale/ingest/normalize/DeduplicatorTest.java +++ b/szpitale-graph/src/test/java/com/developx/szpitale/ingest/normalize/DeduplicatorTest.java @@ -24,14 +24,16 @@ class DeduplicatorTest { "Jan Kowalski", "Jan Kowalski", List.of(), - List.of("https://example.com/1") + List.of("https://example.com/1"), + null, null ); Person janKowaski = new Person( "person:jan-kowaski", "Jan Kowaski", "Jan Kowaski", List.of(), - List.of("https://example.com/2") + List.of("https://example.com/2"), + null, null ); List input = List.of(janKowalski, janKowaski); @@ -50,14 +52,16 @@ class DeduplicatorTest { "Jan Kowalski", "Jan Kowalski", List.of(), - List.of("https://example.com/1") + List.of("https://example.com/1"), + null, null ); Person second = new Person( "person:jan-kowalski", "Jan Kowalski", "Jan Kowalski", List.of(), - List.of("https://example.com/2") + List.of("https://example.com/2"), + null, null ); List result = deduplicator.deduplicate(List.of(first, second)); diff --git a/szpitale-graph/src/test/java/com/developx/szpitale/load/CanonicalRoundTripTest.java b/szpitale-graph/src/test/java/com/developx/szpitale/load/CanonicalRoundTripTest.java index b76e829..743e626 100644 --- a/szpitale-graph/src/test/java/com/developx/szpitale/load/CanonicalRoundTripTest.java +++ b/szpitale-graph/src/test/java/com/developx/szpitale/load/CanonicalRoundTripTest.java @@ -40,7 +40,8 @@ class CanonicalRoundTripTest { "Jan Kowalski", "Dyrektor Naczelny", List.of("prof."), - List.of("https://uskwb.pl/dyrekcja") + List.of("https://uskwb.pl/dyrekcja"), + null, null ); Affiliation affiliation = new Affiliation( diff --git a/szpitale-graph/src/test/java/com/developx/szpitale/model/PersonTest.java b/szpitale-graph/src/test/java/com/developx/szpitale/model/PersonTest.java new file mode 100644 index 0000000..b446876 --- /dev/null +++ b/szpitale-graph/src/test/java/com/developx/szpitale/model/PersonTest.java @@ -0,0 +1,26 @@ +package com.developx.szpitale.model; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class PersonTest { + + @Test + void person_withTitleAndPwzNumber_fieldsAccessible() { + Person person = new Person( + "person:jan-kochanowicz", + "Jan Kochanowicz", + "prof. dr hab. n. med. Jan Kochanowicz", + List.of("prof.", "dr hab.", "n. med."), + List.of("https://uskwb.pl/dyrekcja-szpitala/"), + "prof. dr hab. n. med.", + "1234567" + ); + + assertEquals("prof. dr hab. n. med.", person.title()); + assertEquals("1234567", person.pwzNumber()); + } +} diff --git a/szpitale-graph/target/classes/com/developx/szpitale/ingest/CanonicalWriter.class b/szpitale-graph/target/classes/com/developx/szpitale/ingest/CanonicalWriter.class index 0b9330e7f8a0ac3ca0b597785080409f286b0b5f..11be567aa622ae737c2c24e8f4198091a51497e4 100644 GIT binary patch delta 805 zcmX|9TSi zwbst$7;7>+!Fm_x8ESI`vu&^8MmAu2t&c0Kyw0%L1z~XsO59#|7&`>lvCq2V&(}?l{Ju<)5j+l~pQybvd(#{1b%mv1 z?qz26(6rx3s1+5`jwJcW3T*DJ&XN}K_gSp#5^3} zDg?P6hggQgtVS~%aD+h|WiwjXiDT^6xeu)zzzGhbjiWfp=V<2(bnp#2`3YSiW6)u2 zIAt6-ZBlW@cyZR`qTBeh(~gU#2bbgvAf?DrfPnmvDR>oQ zoBUMJ423DdwERYC|fAwRsx}T6) zxr-FdU<|J`g;afp33-n+_1~?Xm_j-xvk|m6L-A(V_o!g;38?CeR7{Ti}ZQ}T=RI$SG))Smn{P5>H+|lF9L7{Y%I{WmBTrUa@b>G Vx7v%Eq|tg?bYGf=`qvCZ{{!gdr$_(* delta 751 zcmX|3{P{T+2KI^&GD@z!{W!kIuZih{0$bi*MfO$E^sGYcV+^2(HEU}#0B zpipX=n<5xOY*B$L$xRS~1T9*%NvP;%nthJi*_`M6|HnDc`~GLTeXRXiz$LX-zN;oW z?rO=k&%uLSzzkZ>;tH9u>Wc5k6YFzvhwQW(gIUqOV2()GdJqaogY_a*sLLNhLH{IP zO<|O%dA#z_pWt^-$(GfJ<+5neHY1S^9F;Cq$S_XGI4UKIlkyVPGJ_g6XS52KAd3y%?zT2J8+f<(8@5{Scmg$#s#*bojth7LA?*7lOwpyd+6d6x;cv; zzC|zR(Z^5dk8lOO#)c~<5m${D111gEOfH7ZR$MnF7&iNG!&G9#G+@-U;ikESTV?>a zKO()ZI&V~Zh#B`mDN6?&NhEf8yn=mt#60ygW)30RLMyr^`Y&f*n zL(Jhh51iD$3N3JG9oh!-;9JkJNpq~(2magVZ`iW{?lnCYs$NWhMH>RTyDq@ZYXa6t cNw+jw@ug4gO^eWDcfnyjD#?q!FKxB`1E8Xv=>Px# diff --git a/szpitale-graph/target/classes/com/developx/szpitale/ingest/normalize/Deduplicator.class b/szpitale-graph/target/classes/com/developx/szpitale/ingest/normalize/Deduplicator.class index 4b75e546a87ab1d4fc32a740c56800baf937c474..da1f7d8e31cb67b628f503928fb8a7cc1fe42f3e 100644 GIT binary patch delta 229 zcmaE6&||pa2`gjm;Q^rLBtt$GVB8KfGQZSFdSfDWZ-77VYte$kAaCnok4-&8pBBjW`-2mBE3*i@}k>7sw7`aArthaA7C} p%9jIeYGm+W=m+YX%HYE=52#`pgCE02hQP_s#C|gRPktc21^}!4EQ|mE diff --git a/szpitale-graph/target/classes/com/developx/szpitale/model/Person.class b/szpitale-graph/target/classes/com/developx/szpitale/model/Person.class index f60a7f7f69922684673d67ebed0e75568f98800e..fde291c29b43f8e80df5539862b8a90a46d32452 100644 GIT binary patch literal 3162 zcmb_eTUQ%Z6#gb8nE->~QlLR7inN7+cBt3ZV3ks9sgxp6ywsN=nZm$iCeBQ-bS;05 zZ$8+y%+ke!KfoX5^4pnQNs3wM!^!Nk&pF@O``ee3zy3b`6Tk|-??VhdD&iUvNGcdS zG>=WgG2MM*%gT9vUO{r%cJ1)4f}Xkg-Cm^7tD;XsKQsk1Ij>;ktz*maiZ6`dWzh~z z$1)0D-g1mh%MUzPLChw~@OlGzJM?XLKPy;oXh;iC>Uqg=Hq3%0${`KIqU_JxLD4Z! zYWhnWMlnW%3MRP^N zv}k&ZKfc^374|HDn4G+=VFvHeqR@-%RB(H4{onn}&bNCgcvm%C!*${vn8Cp+iBWL9 zJG?bHKCeN?0)4iAD47m@zSGs=CR?8D9a_0CJO7=6%vQ+_?Si#y2lk$0t+=iinxXBv z#5F2DJ~xBV@?R7jg!=l;}?Hw!QC~VacaFdnO{w zO@>s%ewRmonrqj0uW7{l%x&3jFy?m^#G^o@*KOB|Lce2@5J^)nXF9v4Z_B)@jE4s{ z8Jg`T3lxmCLYx$9FoTb+@W9J&nm+TKEEDqQ|A&W;ET7@#oIRCtuSTbxLE&qrHF4@L zv}Dkwxeg^zX&Y+_Mw>ltN=e0Q?G4o>Dr;zsXe+qZrtIhzi+{UP{10piYJb#;Zb}DY zCDj_+;62X^gU~mNQDA};zF>XX`E0EjWt$pMHflQAMpub6*?RX#D^NKGI0iXJIL0|9 zIHuA`Z1&+RY^m7Ru!E-xrW*~>kIK@BoUdBL!rH4DsNhvIf3|z<9a%=S@uBJF*$rpc zJ@2SgJii302X~m1_pKo3+r`lHn~$tIW)L(hs%i18DK9$Q-qQT)A=K7f*YYcnR-ob= z1y>tBcR;E6pn|>X%K2Lv$H-yaVk?iaQ>uJ4_$WcaB4_>l-r%?yP#l&=rhOsJ1wJ(G z3!>&rLs)}QF)W>h9OVW+GOyo|;RZf8?a-54;H%TVFkLY@L3iSKm$&{w@D#s``tMNm zg)&rqv5W!zMj3;8CSJyfo=KE3u4j^EOz0W4jHy@L--Gw~o8$#T$@~1>ig54&KIDvu zRhmQ+UWB|wnx*lqNaA_CB8iKMiX^@yE0P$m;v>r9ezbq7zJH1PZ&N#^@)8gp1O_2N zzCcPq?@^`o4nC&5q0-iRsOn<6p&f3BqYW|B5GNbrG=}(oXQ>bpZ}D3pLO;b@z^_!r z+W3)R2v-q5Lwv56I~<<{e(CDCj!$@r+`i1OP?XXaPBHho^AU}ydU#T}i%)5Q(3ns- z0Vn-*DFQV(6MGZ-Z&1&3C{aahs|JN(>4Y|L0W^uya7VPk3!q7$NAVf+Q0Qy+bfg=! zs90B+!Y%bLIg{y#I{qI}CH*EldOpz&>KPj)gQq*9O@DWsrAN8>Rn1zen029%(W+wf6Wi@5NmjZFR_lt*uXAV`?&fwzQr?S F{s9_acO3u# literal 2742 zcmb_e-BQ~|7(Ht&Y(Uh;;86D`p_DXOBvI2}Qc+q$nugRN6eu%ouY|n;fh@U_%!JXlBZEhKoKxAF7kHmW>5=s3+~kdcXa4_w0ARKl$%}PX7Y1g6&bHFqA=BhlXK+ z{DFOBo38EcnVYie2Q`7=CC783Wr3mj^3Djd7|CE%#~5^h*{WYRYw}3Ce&d-L{@idP z+m&YBuSwV3kU{8s0x5?mg-REBD+(NM&r(>g>BuRd?9-;}uG@8~loL7%N;y_@!iH-f zcl1*_inv0HA}4ZXNNZ!zX5_eL#R;PpeOiHH-oDDE^xyFxxT66ExgT_B0qj# zU~#_k@Ag~eUdt8UH61f}hj{yTxW7um0yhT3TT|EH)iHogsU01Gno*&tf<9oz4TO6O-VI+fRb=N$wtA`AWX`dZ3A91}A z_zf9E$CiM0WV=n$8QF67JUeOzl;_+VLFpCv|vQx7<&B01E1S@U=R=3J? z0vV2Rjy%UC$8>HO4@a?vM;Uyhqk_i**Sd`;h|9)|Nw!~Q;_r405qO^Tlj9xvhtiA> zKD50WyU<+4_Ya#5>(VrDU)*M5-IrlCa2k;xB(JQxb{HlV?V|cI0o&*GbIs{2RQj6d z$)E)(!wfbAu6H^2LFsVFU{m1gm@w|JQ>WO;G&XB~48UyQYK-#@j`@&cK{fZ@ zjT|@F;CnZenjN07WkRK3T!bw00Gs>E50o%MSPctE<0dhF<b{31cO9PanG=8i(v2~DA3~F+v?A44vkhzSI)<*2fPC>`_LmPhuG!>6R zU$p!ypsA1+@fkBxxi86dauBpQf2`i(;Xj4GsMG%ewZyDmqLnFp&UyhWMJ2UPNmYnS vZ1t-ugT0)Rs%ljo-PIS=PI3J;b1#c8aSyAwkFW3m>)aXT&J%o#EtFmWeYZGe diff --git a/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst index 4a2bb4b..9aaf793 100644 --- a/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst +++ b/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -1,6 +1,6 @@ com/developx/szpitale/ingest/normalize/NameNormalizerTest.class com/developx/szpitale/ingest/normalize/PartyNormalizerTest.class +com/developx/szpitale/model/PersonTest.class com/developx/szpitale/ingest/source/MarkdownRegistrySourceTest.class com/developx/szpitale/ingest/normalize/DeduplicatorTest.class -com/developx/szpitale/load/GraphLoaderIT.class com/developx/szpitale/load/CanonicalRoundTripTest.class diff --git a/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst index 7403611..cb08b75 100644 --- a/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst +++ b/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -3,4 +3,4 @@ /home/kruszewskia/Workspace/Private/Szpitale-graph/szpitale-graph/src/test/java/com/developx/szpitale/ingest/normalize/PartyNormalizerTest.java /home/kruszewskia/Workspace/Private/Szpitale-graph/szpitale-graph/src/test/java/com/developx/szpitale/ingest/source/MarkdownRegistrySourceTest.java /home/kruszewskia/Workspace/Private/Szpitale-graph/szpitale-graph/src/test/java/com/developx/szpitale/load/CanonicalRoundTripTest.java -/home/kruszewskia/Workspace/Private/Szpitale-graph/szpitale-graph/src/test/java/com/developx/szpitale/load/GraphLoaderIT.java +/home/kruszewskia/Workspace/Private/Szpitale-graph/szpitale-graph/src/test/java/com/developx/szpitale/model/PersonTest.java diff --git a/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.normalize.DeduplicatorTest.xml b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.normalize.DeduplicatorTest.xml index bc8cda5..d9a8a1e 100644 --- a/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.normalize.DeduplicatorTest.xml +++ b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.normalize.DeduplicatorTest.xml @@ -1,5 +1,5 @@ - + @@ -13,7 +13,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -55,6 +55,6 @@ - - + + \ No newline at end of file diff --git a/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.normalize.NameNormalizerTest.xml b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.normalize.NameNormalizerTest.xml index ef14079..2b80600 100644 --- a/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.normalize.NameNormalizerTest.xml +++ b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.normalize.NameNormalizerTest.xml @@ -1,5 +1,5 @@ - + @@ -13,7 +13,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -55,28 +55,28 @@ - + - + - - + + - - - - + + + + - - - + + + diff --git a/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.normalize.PartyNormalizerTest.xml b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.normalize.PartyNormalizerTest.xml index e4e169c..8346769 100644 --- a/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.normalize.PartyNormalizerTest.xml +++ b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.normalize.PartyNormalizerTest.xml @@ -1,5 +1,5 @@ - + @@ -13,7 +13,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -58,16 +58,16 @@ - + - - - - + + + + \ No newline at end of file diff --git a/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.source.MarkdownRegistrySourceTest.xml b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.source.MarkdownRegistrySourceTest.xml index 902f8e3..895b7c2 100644 --- a/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.source.MarkdownRegistrySourceTest.xml +++ b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.ingest.source.MarkdownRegistrySourceTest.xml @@ -1,5 +1,5 @@ - + @@ -13,7 +13,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -55,10 +55,10 @@ - - + - - + + \ No newline at end of file diff --git a/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.load.CanonicalRoundTripTest.xml b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.load.CanonicalRoundTripTest.xml index 06f2a51..6e76be9 100644 --- a/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.load.CanonicalRoundTripTest.xml +++ b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.load.CanonicalRoundTripTest.xml @@ -1,5 +1,5 @@ - + @@ -13,7 +13,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -55,5 +55,5 @@ - + \ No newline at end of file diff --git a/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.model.PersonTest.xml b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.model.PersonTest.xml new file mode 100644 index 0000000..43fb67d --- /dev/null +++ b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.model.PersonTest.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.normalize.DeduplicatorTest.txt b/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.normalize.DeduplicatorTest.txt index 0595544..e1a8173 100644 --- a/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.normalize.DeduplicatorTest.txt +++ b/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.normalize.DeduplicatorTest.txt @@ -1,4 +1,4 @@ ------------------------------------------------------------------------------- Test set: com.developx.szpitale.ingest.normalize.DeduplicatorTest ------------------------------------------------------------------------------- -Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 s -- in com.developx.szpitale.ingest.normalize.DeduplicatorTest +Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 s -- in com.developx.szpitale.ingest.normalize.DeduplicatorTest diff --git a/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.normalize.NameNormalizerTest.txt b/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.normalize.NameNormalizerTest.txt index 1b6e864..f548f62 100644 --- a/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.normalize.NameNormalizerTest.txt +++ b/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.normalize.NameNormalizerTest.txt @@ -1,4 +1,4 @@ ------------------------------------------------------------------------------- Test set: com.developx.szpitale.ingest.normalize.NameNormalizerTest ------------------------------------------------------------------------------- -Tests run: 25, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.078 s -- in com.developx.szpitale.ingest.normalize.NameNormalizerTest +Tests run: 25, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.081 s -- in com.developx.szpitale.ingest.normalize.NameNormalizerTest diff --git a/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.normalize.PartyNormalizerTest.txt b/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.normalize.PartyNormalizerTest.txt index 051b3cc..9b59a88 100644 --- a/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.normalize.PartyNormalizerTest.txt +++ b/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.normalize.PartyNormalizerTest.txt @@ -1,4 +1,4 @@ ------------------------------------------------------------------------------- Test set: com.developx.szpitale.ingest.normalize.PartyNormalizerTest ------------------------------------------------------------------------------- -Tests run: 15, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 s -- in com.developx.szpitale.ingest.normalize.PartyNormalizerTest +Tests run: 15, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.010 s -- in com.developx.szpitale.ingest.normalize.PartyNormalizerTest diff --git a/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.source.MarkdownRegistrySourceTest.txt b/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.source.MarkdownRegistrySourceTest.txt index fd670ee..6f6f56d 100644 --- a/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.source.MarkdownRegistrySourceTest.txt +++ b/szpitale-graph/target/surefire-reports/com.developx.szpitale.ingest.source.MarkdownRegistrySourceTest.txt @@ -1,4 +1,4 @@ ------------------------------------------------------------------------------- Test set: com.developx.szpitale.ingest.source.MarkdownRegistrySourceTest ------------------------------------------------------------------------------- -Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.100 s -- in com.developx.szpitale.ingest.source.MarkdownRegistrySourceTest +Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.101 s -- in com.developx.szpitale.ingest.source.MarkdownRegistrySourceTest diff --git a/szpitale-graph/target/surefire-reports/com.developx.szpitale.load.CanonicalRoundTripTest.txt b/szpitale-graph/target/surefire-reports/com.developx.szpitale.load.CanonicalRoundTripTest.txt index 68fc706..8124706 100644 --- a/szpitale-graph/target/surefire-reports/com.developx.szpitale.load.CanonicalRoundTripTest.txt +++ b/szpitale-graph/target/surefire-reports/com.developx.szpitale.load.CanonicalRoundTripTest.txt @@ -1,4 +1,4 @@ ------------------------------------------------------------------------------- Test set: com.developx.szpitale.load.CanonicalRoundTripTest ------------------------------------------------------------------------------- -Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.187 s -- in com.developx.szpitale.load.CanonicalRoundTripTest +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.165 s -- in com.developx.szpitale.load.CanonicalRoundTripTest diff --git a/szpitale-graph/target/surefire-reports/com.developx.szpitale.model.PersonTest.txt b/szpitale-graph/target/surefire-reports/com.developx.szpitale.model.PersonTest.txt new file mode 100644 index 0000000..db07dac --- /dev/null +++ b/szpitale-graph/target/surefire-reports/com.developx.szpitale.model.PersonTest.txt @@ -0,0 +1,4 @@ +------------------------------------------------------------------------------- +Test set: com.developx.szpitale.model.PersonTest +------------------------------------------------------------------------------- +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 s -- in com.developx.szpitale.model.PersonTest diff --git a/szpitale-graph/target/szpitale-graph-1.0.0-SNAPSHOT.jar b/szpitale-graph/target/szpitale-graph-1.0.0-SNAPSHOT.jar index 5d067ff5ebca7abf5dc77778803a57b959325008..41397ffc9c8f13a0b4f29c771393dfcf1ba214f2 100644 GIT binary patch delta 16621 zcma*O1zZ$g-}le%(%lFWDqYegNJxovgMfrI(w!?HA}xX}y@GU?G$Vkihlu)3pv~8;EMm9Q*0it_TM=h=HZ(Eo%6~9T;acS z)-1qp{C7_NMY#O`?)=@9{D*a%zqd9St!Yu)i*N?0J&Bj#%24ANF2U{32-Wa@37*CX zncU!r+h>{9;0Wx~4%tN@jLtHdV#LkpKT3I0HNF(SOJ@ z6Ffh?_g{ZyNvh0R?_CqEhbhPoRbgYoC=??}FR-u(;Jw6j3S!~wdtq&xnT8>^Y1KV; zvwVzd{hgw!iL)YisO+=)`iW+*;jyvFwu8Bu3Lnp$)oC%LP})6}>+?rQrZkCf?Vf`_ zW;_S3ew#kJZ#O5g$AW=&{3_dFbD>Lttp@kUR2hST$_sp-lu?%%+lFpjW18>bKPR}t zO8vHM5iXs_^;*6vkyLRX63u2pA2}OL9oTaiy>sa~CWnnwny3h|PMi&%a4y;rVG1Q*N~o#| zAY6Y#NJ%o)^Z-mi~T6gYg z$CuY$s-D%;OQP4)Rafhxz1O;9f!+CfxRdTux_g$2k!UN@|8|>Yi?xYxjaT2|BO-c^ zxSuY8w~N}?Edu!&F7JNjp|GL zf~%@2Sl)hwLZ;pSbZ7r$b{pqa@iOiZ3`ff)XFRH|clZl#?)(FpB(&&82=vmMZcX16@Tr{pdN* zeUugTNu%KGpuzM5I>a-!bvKnxiEyI{2{VJbo>{69yhcSO;Z*yVY}b^ud=oT#HB_cz zTcdPs4yA?|9FYwO)~{m&UvrAKN*boFCHjzvKK-CTQ13Rd87=eZt%#nY)MXZ#_BSs- z+J9{FHJRGH*ZA6JK+XZ~FfnvvQ_zCUHUU#AM`@=%&7P+9!*GQb3!6oLLzhC~zHQx) z+imX_#H!V6u|8{XSEY2l@1hm9$UQHIJxD9;Xvoe;7UW=v?6{u#*+SE|j)gN zX|eMMvUR-r+SvCwK5=Z0m)J<6bFa2q_EU*ebdhw{9n9#`|GW z6GwX(W7-I!Nsy`EFSyJrzFDBFp0vsc`^g>nSv?VhBu!t+OM#Bea9*icQ(A4ALEk9L zYS4&2=tkFw@h`8T!gJ2GEKf7kgD@Ma#>;$eg;7Lnsu6ga5C$dlb9(!^wam27M*Hmk zT<9p*A)1wIv`{O)E&6SAjiU&+=Mw#L!_s96U)7h5k^yie%+7MF>lNYj?ZsPt-aq75 zUxqFx7Q?ut{I;^0dlXAJUN2aZz*@lkRg0aC$j;nVuxoj}&c-<(y;jc2D(K zT|LX)A4TO*B{3A{oH=8HIbx?4G}cF*lYKoy;mLAUq?%Oh;Fl|p=~v!f6P)fv4 zJ{Rd_=HbWTo3|C%@l|ge*T@()BoDFH2dS6 zC_{zYwjA#q9K0*jzYBysnwW9SpBnZpX))2cXYgH!LWU+Hn*&V{kSmgtI@=QBuxRKP zCqMF`WnZXs9XXPk%N*W+g1kq|Y|Cn!!t>pP;(6CL9@nUVH6F2#?K=6f$WM-(U+kAW zy>eu*zh%Dr1iPKkuNGf(j_K`<5_!{~l?z<{c>{@JRPOs|^SoUd$3$KvEYhok>%J@*5H^|0CM~APr!_UNZieY~$0>dUX znKLDoB?F(tq1H#eZrB021Z%*48UwPAVVCg{U9sJGbSZMLxHoUtW2U!bURPn7tq)hK^8Atw*$4EWnmP`3v;DAtrl4~DGOqYGE6*y)8h5xLNqG)__*i;f z{8++)sIYt5+Hk6O8QB0ABacMCK|Zr%xQf1B|1(#;x$4H~RfB+{`;J5~GKS z_EhR1-%n|al5O{};n?PetlBEMv)ToujN89sBTMN=4sLwbN_D!nE!oc^&X9w3SZR9e?`Ubd)DJmw#aZWVc^u+t* z1N1M^962|}dZKFRYl^#`Xe2fF$`rMpXUQOX&#S-pdXX$Y?q0v*lsZ0X%gmLHWiH%XpgfgY>!fD ztIOyQ?40+D$5YI`5}!3yw6@mzaCtPnLUfHTK#b|-WTs2!;$mV?UU78oTHC&Kc!kK? ziI-WBd+eTCKWs>ATxaT0<08|E*&FHR**ub$2{FiwWokVpnlt)ws2kKc9wPt-kcHz-y#37TfackE^n`fR# zsx>EV(H(s4RMGfZ)-c=9GtOntWmMz({Tm*8i@e*&ty|AT+C_Muef`KQEztW)tvPb* zezgUUcU^`wd&~vmE_ISGCDUzH{T?GU_ZA6x ziilJ9i)6X(?1~5*j6OcPNwMz7Xuf=IgYcdY_KX+u;VUm}>i&lUk!n|XZtsohkBe5v zl+tl=kG&TaX<5Tne)x8rxN%KYE%LAjSV&i3S$Zd1KrK^^c(d7{+>?G zCs)k-k!)hY;g-t&WA*$pPVYQBGv~Cl_05MrmAXcK>Fc6VJ4{I#efL_3i6!2Sg?>(8 zt)){Szcs(Pz95%NT71p9|A0Jr@X5BS-*c%FkxY+f`u<4<@#)63$f&yOz*o6T~_$0qW+?*kK{1{pvyA z-{SJ&^OB1{7g_TS%de`)P0!+uziBq5x8_t_;x)oFVMxzBb-VKid(thM0k!y;5+!Qw zf!E>#B|k9qMn>A+#|vL^y^rs`TlXRQdp^VV+XuVFR(|tqbEuSRQM22mpX>M(l-${c z4z0qF1e6*yeIwZ+IUKbTa%@xY)<3yjvtHxOG*l9E`~*{+O}zJ#a?5S+79X+*hP}1< z*=N-|Qu2|Sf$^{(i^KQBU{wvj`GTY>M+GDH7EYUwrrZ_>53bRNxR-5y%6upov5Xgm z4s6z$ePJExjaSHr{{@@mA*W>0Lsh^2#3_oEXyp6&@nESdR-0a=p0ro%IcxSmYiaUK zQ7NfpDRnCu>Q+8igkBQkrbinU zd^e!!;It`i&GQ~GWPd{;KX_Y^!meh(!E$jv;;jIs`PL5wuaN{BEgmf3Qw{2v62X8J zTv>J~`tg)blqJx^+VHbuZC60VIY;e9tNSz_HqLu^?4xl$W!$3!P3R={ZQ0iJn)An5 z9p4kUx9IyX3;UR7|E$;d4LEn-*28@~KF3u^(`03+W!>_fl2WAS-F5d6=Er0s8HTp9 zx3b*JX{wqV>P>1j{eE2u6kvK3cxiDR8+mf$t%}uBw5dedZ%j z`s@lh#p^W<=c~Vd$+Qj2c?;8P<&dGm2jS(SI6T`Lry(Qh_6?T z|M_*Zduz#A9)F)6Gh{zw^=CD-Ln;X`g25r(XNu|r8D#YyW4zAmq+6JYZBLk-{F7g8tSO6FRtCs%NKeQ_ z^yf*Y(PX6=1-<5i$%Tf~WY zQ5DH5K`^CqdRxTo?xhXY+1$qd2gD0+PQI5AsL#50dc_7lC)*yH6kx9i-j-G)%SMI- z=?Wauc=^h-_v@nB_k9m{bk;D{e?B3R;mRuNLmw>AwUK{@idfUsFE;-kmZZ9)0!w;B8B%6?4>0(D5Hc=`Cer>bGvkode%RW_~k#@H))$Fw{ z9dbqvY5IRw^T}9JGrgEBp0xKNrfD`TgvIP>s8-gm++p=hE5KNTj+euyQOu z&=qbJA6W%Y5ZWe7UUW!a@K4#ff;3nl;@8k1@ZTAxFDtN$f0N&O$H0<7KlhQSCE{65 zwAFFjc@Zz>%Q;6ApK+?A{A@-%?Q>DXYL%7*x7#y+cI~?xaS@oj$E+(hwl^dg&N0Z< zef(6_EX;Xb@Qxt^Zjm!?NvV7OWY?V7r2>~84R0Es;-{bV=Q>@!l2_J0}6&sRSGv5)6{<`nlBN0)ZyvTdVS0MN(ZJ$jh>%Q10jp=?p7;nDn8gBu<1C?{$ z+P-M?gna25!`AshPh@=jh#h|@l6QylmgRZ1Wtm%h`>JY-AGWn$1|{uYnJG>7xQMpX zD-hIU!}kvn;ZmjLurQG-n|^Dz=#}>h%jj z!|?RC$>(XBMLGC%KinC_7Ex4>h%9ebQeUc;xKUqC>_=}>w8jxVxTuyL5gx2We)Ja8 z=O83ITqCRdQ(cINWDXkL^R-k0?_~Xsb*bls9o0Esda7Q5<+G1>_`E%h*spHsN> zuapy!I?{-Yk7S4YGK>fH$419UpDoE%hCA;QtUpgLiQjd&{dfiU2EM>2Sokf$PldZ0 z`ge-_?Xe!;*mxKf|4D(=^G0)gc)ZtL2@(8nMV?K{ zq;}*Ls=21GbCtDbIewW%Jf|5zV)xwM&qjPXvLEchQrwqoTXGwZBzD^$8sGE~+n#DlCJT_$2v@*j!4&zxX3)D1t9pCL=YYqNGbr zbkhQ^Z*O9$1>e%eBQBH?o2^uqzI2kndc>r;|4jw?+$AdWY1B{lykEuEzYHn%p0k|{ zvNX1*4HcLS*1l=KYJn!YLpAStCqGiWQY!XRP^fQcy(xFGYEG7q>L5$`|%dJA)=^%cGk#Ill76}TR(dfJkf_Z-e#m^tp6e})` z=czQ|xh^R>uP`mKuQBg+TPys$Adq8d9pKA;vyzdt;NlkY{>%@e_&V2`4fMwcL6?IS z_ELn>AH3wITdLf-Nxzik9?MN1DLTL&%Vf;gCq} zAk>>jG)>EXoLHODER$3Lo>X;TbOV|F~9ou-MBb=;f99z?O6e7 z{I&Et`&n5PN9)hZ_cs<;ig@~ilwXIg5_(H>-!n+X6ZvWtruul@OQ+!S{I+qg)_K2+ zW<@f5I^M_Ag$AV_>iR{`N_0d-)>>BpWi!1&KE8(`8K%#16cela4*&zc@*XF{Y9{F!K%MY~~o!`9lMh%v(Eh4xG*osuK8=99Qjgl&^P0C8aP9#kBCYZNGaLJ}ahm{g-iH zjWwszvXgVUkIzb**!IbGYD2*CM+6Dnh`r>b=&ow0Nd(TV(DltpVqR;<-Ql76`ptls z)X1F*k;VHnm**Yr=?&&7#IIU)U(*hbbh#O2mNU9_&(f)YQE>5Tz-!{}a%(lAxS0TZ z*_buNh^C4RWh0k1mVSp6m9k~~ixNRr?~P%vPT@=G&a7DR(KNW!;!l4)5O&n9l6^8J zAmM!8*4|98SbhII=Tw4YV@VaMH$HW-INd9x+c@nNm1`C{K04!8@R;*-M|RXgwK-Lu zPNf&$zA7<_9mn;nQ|QbjHM%J)^C({VPFHl~m>rID2z_Keei&EEf?qV>qZyktw&2^W zy6~UFd5<-Q-f7%$aZ1&7!xQn$oh;ExprGP0bSJ07jF*m8gx_H4Vy>#Oyd3&rW-l!2 zE>aBdZN|cfC#;lpxIC$8>+f}LTV^rZr!d+pT<^Y-d1-!R$;Ts%JMZ#~1l`eKDh*w? z=IHn0Pc3jFJM1O`1SuqA@coWzzEDt)0@YNBKDFFor?{L<&%iZc zOWwiYTR)kmsHv1-$t+7+F#c!C~Hh^&{jN`!J!$Wl;3LQ5Jz*ER?)>( zKMxNrNzJBzFUj6%8=z<5-M(QXJv39<>Y736mlGZ1Ca@44yOy~7b#11Fy}9;7xzH0Q zWDG0Gxa_oWw)^lyO$)-1a@vEYPI`T*L z`OE&~tt#Ca?oBU_$<}^VkqN2sI!ufn<<;!Fd_M4zl3YCYm&`W#c-&XiezV)e2Af-{ zggvE--5Re+se8(um-%X9y&arQ=AG)xklkcTZ*SJwhz-hClkUKs*|0ByQi(O*Dat4$ zt8ej}o%06v4-O|kq<&clhPRp2S!asYVMmtfy`HdLm-Byur7J-iM#e4Od9O;h<9;f& zrjspy@izZ{R;xgtRe)59@_Cb!MlvzZM&s@y_cvaNoYRT2EXzr>=*No^%I~XSjq2Sv zZjuPC7=?YzXXXZn_tu4*%lx?dug%|eM;1ntEM88FHKsoMD`k)k^D>2DeFXz{Vp1##Cf-;A3jnWU}okx-~ z@t*crr62)VeFdX&qA(D zE!<^G;Z&OXXT9Rz2CQzj$u+zx`}8oyy7+d@yYR=Bw}mS{tg)b$YUL}`B5ZMNKUC}? zmA~919(<6P%+QvbX3OTwCv6q{`UW<-Jw`B#YgO}ORLG*)!Ka#ve3zGbm##q8#aZ>wez}U*Cx<)$=iV3Thu@I< zM(tL{1%xhbu@*khzMiCrWNW;gk*4N<9UWvHlg7Kc;>>ev)9NttN6Gci5mS6pou#-D zap61FJJi~Cb%Xol8-^qxFRj{|H#jWO)`424Q;XYQmnesYX zJeu#iXHt!{&4cRL4ntVg*DKV4yR_}kku!sZ_@;fUID6TZvT?_p4{r0VN)3EtK~MH^ z`c=A2;tYF{z8(uM3c~n#L|+knd?2~Uy}Bz~0eYJuBb-_Y>yJT_V>eqp{ct6Sm^ z9HWar3`s@Yl&it$ZL-E^*PAD>r|-So&`gq>7EV>3O{FVtthHDSFQ2{Zi*JX2Fo|4! zqup{r)2@_Ut6+%t6@f`GY>slkQpkrL4)cAnn%?QJvo}vUQ28RIMSGlbN8QTPiPez1 zHYsw;8NZReT4a7!o@yrEpZ>1sj#)$F7L1&zt45)PU= zle){sux}RwOtrQ0Epom%c(ogH8X;QmX()zJODACQY0ZoEE|N{-d@rCNo?Co|#GnsRoMhoGo@~s|7CdXfrC_37yLwHk_pNMAZ%55#} zGIXwcSePxptjl{uYCD#_d~@vC+?+*_O`YvRSOk{9#qv^S0I zNfzdEy%o%JM5b*Fh@e{fyydti(@#&5x5->0JXLptQ<#{{d>BLSGS$puS}rJ?dV4-6 zJ5JT|d$98CJD#B#`TNYHgB3yKN55(SHz9HBi0f{?%Y<+;2$b z{+zhp^X_dwbB*qwT}`VyIL88#heAJBVt>XX7yU1){vgPGRJS*NU&Cttn?W>}faY7} z`RCAMw@#_vd@Vi(Ml5*!=UKji2zU zXeQlr9YwLJVdCWEH8?$qIVShp3SFy9md03EQq-sR4OwDSsC{}KzD$ix4il!t^VBb_ z7@r`k&Ft}<2^{7R?y?G)DHc$jv#wa3AXiem)~BzL*bqEk_w6E|dX zf76rtFgQ*efn7yY-jiOD+i_^~JHi_+Z~MvEx4BZg0zrPf1I`75;=L8|Hv}hS9<6Wi zE9SWtHqX!gq?5Sbc!hrUim$oW6U#&^TNx3e7_0WH$)5In2|gr7@A>$Skr(7<94Fh2 z?Ia8Awr<{eU(YbNqyCD`)a-?{kQBOUa3dweLXQMbMXXur5RvZMtP$Sy(>*O!O0bMA zLa5$(>%;vyF9#_k8}pl!yt0QIeEA_KJLw}q%7Zw!c|Ko%fECrNrk;BEUKTYZY0tMuMTt=BX+~_l=D(O2FBvn=uJi}> zf2GzCyO)jMtQBn!bH7uj+Kb9n)$s@zynjH>DQRE$;jvr3=8tr^s&mZBb32d45jmF% zPu2CjfsT~6CGqyv7A5BEv8b1Zqvp2d(-N_-a}Y)J^jAKP=&}waw-hQPmBQ2nH6F31 zv81u3T}e?2nrOlqXKt2AWX#1bocz}PA3~eVs}I*g7lOMg zhI>}H<2@(t5NbF~CDME}ThTYGU66E{u;>?*;)5@(%~yV-51FCl+Nke0h4o3%&Z#s? z=@AMR@n0qq&6mRNX;e}EfyB*97Br*t;*{$o?|--7uH-TE)H2>&@PvT&X0IZzo5+kX zX6Z;Lu1ls!Z&K)$URl=gYm{E0)X~}miULu(;sULjs+G8+D%-4^n%5_-2x{s_I~#q< zBgzVTZl;co`Vowzr`ua9>3*cPHGg!%A^pTItV*1f>76I{iw@=Q=SY!H@3KiRw#Ggn zW4F?a^;;GYSiIQN{ovIjQs#DlTJ(@#$!1#Nj^u$@?@#JDJDWpXT*mnZqih9M&WDsL z@G+Mq-2m6#1-*zz6gQL~d?)R`s3R||F?3>9fXBYe)`mqki8l)ip+R4Llkkoa=U8pX zyN!N9n&enCx#j*~Z*&VEawJ1Hd6ZgHD1@>P}f)Wa~eqlj3NLPd`UH~Qr#!bTiaf1{$ zLpYvw$7?i0Fk?dZ#u-b5{#mB$R){C3rgd9{?O7&UJ4Ea0yMHWB2<@{>F;0ls(@3;# z2$Qo+(QXLJ)4T8!Z-mAfCe-PjoyG?db?TJ8k5EK^A^@+0p5bpG3qmZwp^9cbL@1&p zkO;c7oDN9D#;FsOQ3i#)kHAJ{gdwQUu%i~D5DX2=VThZjl?MeeKFbM;K-KW_KBD|I zI+!hzKvl&d2vLnu2#PcEG=S*Ir-8w{nWuKHvz$9|h|>R4LGv?AC}29@z?+DuK6Qe( zG;f~e1cjw+uuewwojUnY2)(~JDH_U92=CL5WzIz0I?D+vL)lQ8i5NVs(P;w=RU@#_ z=gGl4qGx1kSbu^r#e+HyltCKZ0IX+qMMF&qVhQ_?RUREe<_*I}%~vA`&I%2#p-^hb z58jTIK!Kv*qb?61@K8g&2>P?~!21xZrxo4kM;M-EG8#Zso=)81O(RUtFrh#TQ#8a+ zBd~D5i@K4ImkMgSAw0^lOx5`Y=N0$>HO0oVZ?08RiGfE&OA;00U;@B#P%0sujP5I`6p z0uTj=0mK0kfGYq=fE3^=KpG$ekOjyAt^wo$3IIib5;Vn{M}QOH z4!{}U0&oSm0o(x|08fAyz#HHL@CEn*`~d-gKtK>67!U$L0`3Ar0bzh}z&$_&;65M{ z@Bk16hz7&}VgYf0ct8T+As`X(2#^Fw20R9&08oHbKpG$&kO9a9WC5}PXuuOd4j>os z6p#nV2NVDb0Y!jfKnb7}PzERmQ~)XgRe)+h4WJfK2Y3dk2Q&a00Zo8rKntK1&<1D+ zJO{i0bO1U5U4WN>Za@#<6`&W;2Y3y519%JQ2MhoP0YiXcz&pSQU=;8kFa{V0OaMLr zCIM4`X}}C%7BB~x2P^;<0ZV{oz(>FeU={EQum)HMYydt3HUV3JZNLs-7qAET0@w$9 z1snjr0lou%01g31fMdW3;3wc$%;P0k0ss;?BnU__A;E$K8xkBya3R5i1RoLtNC+Vz zf`k|n5=clPA%lb*5(-EtA)$hV8WI{v&Ot&82^}QoA)$wa0TM{_T$wf#mLBb3P z3nZ+NutCBO2?r#ckZ?i54G9k@2kZ3}p1&KB! zI*{l>q6djSBnFTeLSh7oF(fx3F@eMs5;I6{L1GSx1tgY`SV3|d5^G3oAhCtS4ibAv z93XLo#0io+kT^r)0*NamZjiV`;sJXO?l`dEMex7lIc1L*%mfa$(C)onur_Fezt0OM z0UdJ!8({*_uI)oFmu)dq?{+v{!Niw7LYF1t4P*Mf_J(xf4t17`H;f-Nc-9kdm?3D{tRLPmpTAWK zT6=@ehk3)?|5uk9+#7b*6ZmQ27>Tq%2mjxnDA8X)hQGEb;{_i311@^_ocQmYXi~7~i~FycPRsDm>7pC|D#K6NKV^`WLvZ}>fj)e9 zb}z-kz^Eg`z>xe`AOp42KzyhSwKE^!e|HL0jWTSg8YrDVdHymD^*hgLE&e&Clla%k zV~qX;8ZttV{k0a*$!Bq(lc$-T=HW;4;CjQ(8c6)7#Ie9d50|$3b0T`HGY3KcDDlQ{ z#PmZ128J#k28QOpN~~)4kF!&vr0vf9q5MBZ7{r5$5aIN@2xxkIZ`fJCuK&)&1YOM! zvh^lEfst?}F$RXhzseAR4h13pdYk+Gg?NYE@XHPK`V&$N46%QOfccyj=C6wqf5&)9 z;DR;kNnd7>Kn-AxQpO6X>!oKg~E1_m4tnlX$}z|C;gi5;<=9Ebs&rn&baz%%5m? z5JKy(Ax>Mdo%8+qY7jycgpmJNf5;{OrzU63HUFby6OKxMnu5#K1N?Kn`maC_QRs^l z-Y_Bb3aK~jfB%;Af)Ou0{9fj1CJEG?Oa#?ms{u9P;Ax(jC#QKX|8*$-yU0)`Col@9 zhZmRp$@I5D`9Cfc<#$gb^udcWuq*$wp5M_IKsEomdiV4~$p9{T_{ZMgt@6JP*8kDQ z%xf`H;ox7ACL;!h?7!MrZQwuA&YC^?N1$u0;hdFV-6|Y>e-!@}$Z`6#*E!LgRA;}~ z^E(pyF0e4dn`TdQP@n>55mM+OaE~TLA3;YDopT7Zd&)H!C7Pew8>WJ|zVv_64?$Y+ z_rr$F8+tm}0eS)Kxq=W{MxZ-rykS)6%41I$7V2aPL4a1L^@ic2)xmB?gw#6YA451u zOTyV7ph@ zrQy~J=t{706X9C-6vb5cloKt&0F`OA|0(+7B``CHehbnBXe3ZkM4N8eKlbV)hywmk zTAa}vCX1N*R(E=w1&s!2A%qXC{&yO616EIl#%F>;AIdhP7S4B3qS|Gf&!gMGK76zb zP)39ReHV1(^65?v#2(easS$k)jw&FCOa3GcFF=)V85{Y1v1(86=j5%yQ4$F1}n<7ZxI`<3O0q| zSNl)*nZxd(7r+iZgxrrM)b95sHuNpf;T#CO84NTT2h<~IkQPUT8xfzTsnFXXEsF4~ zCI6F#ni~r}Gs6zUL94Jpv2WF&kzhj|QQgIb9%2QPdFa3{E*Kg55bWhZ;8Q7_?xjW# zQ7XXBo$kd)n*kpq;)k;0pJUIJ760VGNAIwE!!Xe+b{a5JFq!@PFE3Ql9z6&$nZU2Q zp?TP#uf-J)L$nL&Ak-6V(CxrPgBAuV1}?@s;8PQB zr-p6=8``jSGzqA<3^Yd40vq%&Z?rS`WMzV$@Sm-Sj0J%bi~=bB6b1Uo3w?*K1}--2 L1TezF!1(_FGjcB~ delta 16685 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 diff --git a/szpitale-graph/target/szpitale-graph-1.0.0-SNAPSHOT.jar.original b/szpitale-graph/target/szpitale-graph-1.0.0-SNAPSHOT.jar.original index 3a94a558c344df75f254c0cccbdc70498dbc757f..0cd6c8c07c71fffc369026768dcd0ff06fd782f7 100644 GIT binary patch delta 11205 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 delta 11052 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 delta 365 zcmZXP%}PR16ouD4nnfKePI4!=;u>alb&%2zm&7zN3>rs5<)EM<=*JXlRPV5-Jw(tT z!58o$dVrpxQOjdFX>#`7Ywe%!^u1T_?aNV(jFeSMd=--;r5XMAb0rgbjd6?tX!S7L zFvcWIq6^o|cd__^~0~#`As}9i=u6N|Gdt~>(INV7n5l{=Y5hq%Ifq# zxsRo1l=kBfY4+( z_B30tlNXTSKewGzvMLn!)m^CF>SBecCv#ATVRA4)+8gTbJPZB0eD=?A96f#;m}JrTUy3tJf*Hx}3Zns-D?6);Fw8Hn4)aR3Nu_VON}}1nCF27 z9!>hi=o^dFS)#$R#EOEX)xoOzS<^7JXobx%gGWYr|c2ax&y zl25*ji|C1Oeh_ipn(`(VNuAT;7Z(K`33JY-tc)zVa8prAwwd9fri9$`;H9oMdF8`L P!%%+1`4zw!Y47|41WZFv diff --git a/szpitale-graph/target/test-classes/com/developx/szpitale/load/GraphLoaderIT.class b/szpitale-graph/target/test-classes/com/developx/szpitale/load/GraphLoaderIT.class deleted file mode 100644 index cd489d0bf5b1a17b115621a6e977a078c4c9ecb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6499 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 diff --git a/szpitale-graph/target/test-classes/com/developx/szpitale/model/PersonTest.class b/szpitale-graph/target/test-classes/com/developx/szpitale/model/PersonTest.class new file mode 100644 index 0000000000000000000000000000000000000000..d6a01f472a5e53af8f4ec9df96f63f31b8c21a6b GIT binary patch literal 1330 zcma)6ZBNrs6n-vm8)FERcSNlquz_3UT^XX&XpAmOge>tBx$7?Mj;@_;2a54W`9+8( z{s4cJ@!Yn`f-}$$r}w;{=k&S#`Rm&c0C_w~pbhOYbR^M_iZ&bOR zIdselx1D2Yp2U%4=zGa+{Z+H^8pBN8b@sD*+0`q&l-2F5UK8c4{!eH>LuU{ghsF?# z;^P=1B}(eS2u5QVOJW=o4A%l&4PRPDL3)I$&Dm#okt$roo4bl79R~d^my2VPVY=e` zb#KEk8s6b?DO}Y4&QV=N*|eJf)<_rCB&j6Qn5VDgOWzUW}J~F zoM^eek+X?eT6{b$s@eJQN6mp4t}c`|6*6~+^buF!+(kH2l$ zzO0F&3<~6J+wpm{*2zNa)hpzbn%Hp~t|^{N1-CD}-^!I$cLzFF=og|MCFv&uhBZ1F z^k&L3e+u>`aIce8ZlD|YNhZSpJirENK#sg^LGmYxQ011tBlb?~)_SyFtxp@!2G208 zT|dJOP1mMQ3A?5*e8t=u7PKikEYjh;)dZCTdeM&o3`3(yM~RhVSfcBv+K+@SqV_rl Wv5AK?(iZvDn2+eq@R(#9^1lJnUSd4} literal 0 HcmV?d00001