code wiki / _hdl_build / nx_search_inverted_persist_test.nx

nx_search_inverted_persist_test.nx source

↩ module page · 47 lines · 2830 B

1// nx_search_inverted_persist_test.nx -- proves the inverted-index disk persistence round-trips: build an index 2// from a real seed corpus (seed/object_specs.jsonl), query a term, SAVE to disk, LOAD back, query the same term, 3// and verify identical n_rows + postings_count + query_hash. This is the S-class STORAGE rung: build once over a 4// corpus, persist, query forever (no re-tokenize). Exit 0 iff the loaded index returns identical results. 5import "nx_search_inverted_persist.nx" 6 7func sp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 8func sn(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 } 9 10func main() -> i64 { 11 sp("=== inverted-index DISK PERSISTENCE round-trip (build -> save -> load -> query) ===\n" as *u8) 12 let idx: *NxInvIndex = nx_inv_build_from_jsonl("seed/object_specs.jsonl" as *u8) 13 if idx == 0 as *NxInvIndex { sp(" build failed (is seed/object_specs.jsonl present?)\n" as *u8); sys_exit(1); return 1 } 14 15 let res: *NxInvQueryResult = sys_mmap(64) as *NxInvQueryResult 16 let rowids: *i64 = sys_mmap(8*256) as *i64 17 nx_inv_query_term(idx, "blade" as *u8, 5, rowids, 256, res) 18 let count_before: i64 = res.postings_count 19 let hash_before: i64 = res.query_hash 20 let rows_before: i64 = idx.n_rows 21 sp(" built: n_rows=" as *u8); sn(rows_before); sp(" query 'blade' postings=" as *u8); sn(count_before); sp("\n" as *u8) 22 23 let sv: i64 = nx_inv_save(idx, "/tmp/test_inv.idx" as *u8) 24 sp(" save verdict=" as *u8); sn(sv); sp(" (1=OK)\n" as *u8) 25 26 let idx2: *NxInvIndex = nx_inv_load("/tmp/test_inv.idx" as *u8) 27 if idx2 == 0 as *NxInvIndex { sp(" load failed\n" as *u8); sys_exit(1); return 1 } 28 let res2: *NxInvQueryResult = sys_mmap(64) as *NxInvQueryResult 29 nx_inv_query_term(idx2, "blade" as *u8, 5, rowids, 256, res2) 30 let count_after: i64 = res2.postings_count 31 let hash_after: i64 = res2.query_hash 32 let rows_after: i64 = idx2.n_rows 33 sp(" loaded: n_rows=" as *u8); sn(rows_after); sp(" query 'blade' postings=" as *u8); sn(count_after); sp("\n" as *u8) 34 35 var ok: i64 = 1 36 if rows_before != rows_after { ok = 0 } 37 if count_before != count_after { ok = 0 } 38 if hash_before != hash_after { ok = 0 } 39 if count_before <= 0 { ok = 0 } 40 if sv != NX_INV_OK { ok = 0 } 41 sp("----\n" as *u8) 42 if ok == 1 { 43 sp(" PROVEN: the disk-loaded index returns IDENTICAL results -- build once over the NAS corpus, query forever.\n" as *u8) 44 sys_exit(0); return 0 45 } 46 sp(" FAIL (loaded index diverged or 'blade' not found)\n" as *u8); sys_exit(1); return 1 47}