7
Kelengkapan Data dan `missings.json`
has_path dan api/missings.json adalah dua artefak turunan yang lahir setelah API statis dan polygon terbentuk. Keduanya membaca satu sumber kebenaran yang sama, yaitu isi direktori api/paths/: keberadaan api/paths/{id}.json menentukan nilai has_path, dan wilayah yang tidak punya berkas itu atau tidak punya koordinat dicatat sebagai missing. Urutan perintah lengkapnya ada di Pipeline Generate dengan Go Tools, sedangkan bentuk polygon dan endpoint paths dibahas di Polygon dan Boundary.
graph LR
paths["api/paths/*.json"] --> set["buildHasPathSet"]
set --> add["add-has-path"]
set --> mis["generate-missings"]
api["api/provinces.json, provinces/, regencies/, districts/, villages/"] --> add
add --> patched["endpoint JSON + has_path"]
patched --> mis
mis --> out["api/missings.json"]
style paths fill:#336791,color:#fff
style api fill:#336791,color:#fff
style set fill:#8b5cf6,color:#fff
style add fill:#f59e0b,color:#000
style mis fill:#f59e0b,color:#000
style patched fill:#2d7d46,color:#fff
style out fill:#2d7d46,color:#fff
%% fig: Satu himpunan kode polygon menjadi dua artefak turunan
%% desc: buildHasPathSet membaca api/paths lalu dipakai add-has-path untuk memflag endpoint dan generate-missings untuk menulis api/missings.json.Kedua perintah adalah subcommand dari go run ./tools: add-has-path (alias add_has_path) dan generate-missings (alias generate-missing, generate_missings, missings) tools/main.go:20-221. Flag keduanya identik tools/add_has_path.go:30-432 dan tools/generate_missings.go:39-463.
| Flag | Default | Efek di add-has-path | Efek di generate-missings |
|---|---|---|---|
-out | api | akar pohon JSON yang dipatch | akar pohon JSON yang discan; missings.json ditulis ke sini |
-paths | <out>/paths | direktori sumber kode yang punya polygon | direktori sumber yang sama |
-v | false | log setiap berkas yang dipatch | log ringkasan by_level |
add-has-path: dari direktori paths ke flag has_path
buildHasPathSet membaca api/paths dan memakai nama berkas tanpa akhiran .json sebagai kode wilayah, jadi api/paths/32.73.01.json menyumbang kode 32.73.01 tools/add_has_path.go:110-1274. Direktori yang tidak ada bukan error: fungsi mengembalikan map kosong tools/add_has_path.go:112-1175.
⚠️ Karena map kosong tidak memicu error,
-pathsyang salah arah membuat seluruh item mendapathas_path: falsetanpa peringatan apa pun. Gejalanya baru terlihat dimissings.json:total_missingmeledak mendekati jumlah seluruh wilayah.
Target patch dikumpulkan dari api/provinces.json di akar, lalu semua berkas .json di api/provinces, api/regencies, api/districts, dan api/villages. Subdirektori yang belum ada dilewati begitu saja tools/add_has_path.go:63-926.
| Keluarga berkas | Bentuk data | Sumber id untuk lookup |
|---|---|---|
api/provinces.json | array | id tiap item |
api/provinces/{code}.json | object | data.id, fallback nama berkas |
api/regencies/{code}.json | array (daftar) atau object (detail) | id tiap item / data.id |
api/districts/{code}.json | array atau object | id tiap item / data.id |
api/villages/{code}.json | array atau object | id tiap item / data.id |
Pada cabang array, setiap item yang punya id non-kosong diberi m["has_path"] = hasPathSet[id]; pada cabang object, has_path diisi dari data.id, dan bila id kosong dipakai nama berkas tanpa .json. Nilainya selalu ditulis, true maupun false, sehingga field ini tidak pernah hilang dari response tools/add_has_path.go:143-1707. Berkas yang tidak punya key data menghasilkan missing data key, dicatat sebagai warning, lalu dilewati tanpa menghentikan proses; di akhir muncul log patched N/M files tools/add_has_path.go:138-1418 dan tools/add_has_path.go:94-1079.
meta ikut diubah: generated_at dihapus dan updated_at diisi tanggal UTC berformat 2006-01-02 tools/add_has_path.go:172-17610. Berkas ditulis ulang secara compact tanpa indent lewat writeGenJSONCompactPatched tools/add_has_path.go:188-19711.
⚠️ Patch ini menulis ulang ribuan berkas dan menghapus
meta.generated_atsecara permanen. Diff di git akan tampak besar walau isidatatidak berubah selainhas_pathdanupdated_at.
Aturan has_latlng dan seleksi masuk daftar
generate-missings tidak membaca field has_path hasil patch; ia menghitung ulang himpunan kode dari api/paths lewat buildHasPathSet yang sama tools/generate_missings.go:66-7012. Berkas yang discan sama persis: api/provinces.json di akar plus empat subdirektori level, dengan urutan provinsi lebih dulu tools/generate_missings.go:72-10013. extractItemsForMissings mengubah tiap berkas menjadi missingItem berisi id, name, has_path, dan has_latlng tools/generate_missings.go:179-22614, dengan nama field JSON persis seperti struct-nya tools/generate_missings.go:31-3615.
hasLatLngFromMap mengembalikan false pada empat keadaan tools/generate_missings.go:228-24716:
| Kondisi | has_latlng | Rujukan |
|---|---|---|
lat atau lng tidak ada di object | false | tools/generate_missings.go:229-23317 |
salah satu bernilai null | false | tools/generate_missings.go:234-23618 |
nilai tidak bisa dibaca sebagai angka oleh toFloat64 | false | tools/generate_missings.go:237-24119 |
lat == 0 dan lng == 0 | false | tools/generate_missings.go:243-24520 |
lat dan lng angka, tidak keduanya 0 | true | tools/generate_missings.go:24621 |
toFloat64 menerima float64, float32, int, int64, dan json.Number; tipe lain langsung dianggap gagal tools/generate_missings.go:249-26722. Karena pasangan 0,0 dianggap placeholder, wilayah dengan lat 0 tetapi lng bukan 0 tetap dihitung punya koordinat.
Satu wilayah bisa muncul di berkas daftar sekaligus berkas detail, jadi entri disaring dengan !it.HasPath || !it.HasLatLng lalu dideduplikasi per id; kemunculan pertama yang dipertahankan tools/generate_missings.go:102-11623. Hasilnya diurutkan menaik berdasarkan id sebelum dilaporkan tools/generate_missings.go:118-12324, sehingga diff missings.json antar build stabil.
Diagram berikut memetakan keputusan untuk satu item yang dibaca dari sebuah berkas endpoint.
stateDiagram-v2
[*] --> ReadItem
ReadItem --> SkipNoID: id kosong
ReadItem --> PathGate: id terisi
PathGate --> Candidate: has_path false
PathGate --> LatLngGate: has_path true
LatLngGate --> Candidate: has_latlng false
LatLngGate --> SkipComplete: has_latlng true
Candidate --> Dedupe
Dedupe --> SortByID: id belum tercatat
Dedupe --> SkipDuplicate: id sudah tercatat
SortByID --> Summary
SkipComplete --> [*]
SkipDuplicate --> [*]
Summary --> [*]
classDef storage fill:#336791,color:#fff
classDef caution fill:#f59e0b,color:#000
classDef derived fill:#8b5cf6,color:#fff
classDef bad fill:#dc2626,color:#fff
classDef good fill:#2d7d46,color:#fff
class ReadItem storage
class PathGate,LatLngGate caution
class Candidate bad
class Dedupe,SortByID,Summary derived
class SkipComplete,SkipDuplicate,SkipNoID good
%% fig: Keputusan satu wilayah masuk missings.json
%% desc: Item gugur bila id kosong atau lengkap punya polygon dan koordinat; sisanya masuk daftar, dideduplikasi, lalu diurutkan untuk summary.Isi api/missings.json
Keluaran berupa objek dengan tiga kunci: data berisi slice missingItem yang sudah terurut, meta berisi updated_at dan level: 0, serta summary berisi hitungan agregat tools/generate_missings.go:159-16825. Berkas ditulis lewat writeGenJSON dengan indent = false, jadi hasilnya satu baris compact tanpa spasi hiasan tools/generate_static_api.go:581-59526.
Field summary | Perhitungan |
|---|---|
total_missing | len(missings) setelah deduplikasi |
total_missing_path | jumlah entri dengan !has_path |
total_missing_latlng | jumlah entri dengan !has_latlng |
total_missing_both | jumlah entri dengan !has_path && !has_latlng |
by_level | hitungan province, regency, district, village |
Semua angka di tabel itu dihitung dalam satu putaran atas missings sebelum summary disusun tools/generate_missings.go:125-15727. by_level memakai genLevelCount(id), yaitu jumlah titik pada kode, lalu memetakan 0 ke province, 1 ke regency, 2 ke district, dan 3 ke village tools/generate_missings.go:138-14828 dan tools/generate_static_api.go:16429.
⚠️
by_levelmemakai jumlah titik, sedangkanmeta.leveldi endpoint wilayah biasa adalah jumlah titik ditambah satu. Jadi kode11.01masukby_level.regency(1 titik) tetapi responseregencies/11.jsonmenandainya level 2. Jangan menyamakan kedua skala ini saat menyusun dashboard kelengkapan.
Kontrak sisi klien cukup sederhana: setiap item di endpoint wilayah selalu punya has_path, dan cek flag itu sebelum memanggil /paths/{id}.json supaya tidak kena 404 README.md:7430. Daftar wilayah yang belum lengkap tersedia sebagai satu endpoint datar beserta summary README.md:94-9531. Contoh response lengkap dengan angka total_missing 360, total_missing_path 320, total_missing_latlng 40, dan total_missing_both 12 ada di README.md:493-51932. Urutan pemanggilan add-has-path lalu generate-missings dalam build ada di README.md:614-61833.