code wiki / _hdl_build / nx_dp_tsv_migrate.nx

nx_dp_tsv_migrate.nx source

↩ module page · 69 lines · 3197 B

1// nx_dp_tsv_migrate.nx -- ONE-TIME migration OFF the flat tsv: nx_dp_tsv_migrate <src.tsv> <domain> 2// Reads a legacy id<TAB>text search-source tsv ONCE and writes each doc into the domain's PUBLIC sovereign 3// seg_store shard (dp-<domain>-pub-, key doc:<cid>, .terms built by ss_write_seg) via RAW ss_add -- NOT dp_ingest, 4// so NO new tsv is emitted. After this runs the tsv is legacy/removable and dss_search queries the store directly. 5// This retires the tsv the operator flagged (2026-07-02), migrating its content INTO the nishi ecosystem. ORIGINAL 6import "nx_docportal_search_seg.nx" 7const K_MAGIC_1125899906842597: i64 = 1125899906842597 8 9func m_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 10func m_num(v: i64) -> i64 { 11 let bb: *u8 = sys_mmap(28); var m: i64 = v 12 if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m } 13 let t: *u8 = sys_mmap(28); var k: i64 = 0 14 if m == 0 { t[0] = 48 as u8; k = 1 } 15 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 16 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } 17 sys_write(1, bb, k); return 0 18} 19// stable positive content id (polynomial rolling hash; same text -> same cid -> idempotent re-migration) 20func mg_hash(s: *u8, n: i64) -> i64 { 21 var h: i64 = K_MAGIC_1125899906842597 22 var i: i64 = 0 23 while i < n { h = (h * 131) + (s[i] as i64); i = i + 1 } 24 if h < 0 { h = 0 - h } 25 return h & 0x7fffffffffffffff 26} 27 28func main(argc: i64, argv: *i64) -> i64 { 29 if argc < 3 { m_puts("usage: nx_dp_tsv_migrate <src.tsv> <domain>\n"); return 1 } 30 let tsv_path: *u8 = argv[1] as *u8 31 let domain: *u8 = argv[2] as *u8 32 let szp: *i64 = sys_mmap(16) as *i64 33 let buf: *u8 = ss_readall(tsv_path, szp) 34 let sz: i64 = szp[0] 35 if sz <= 0 { m_puts("empty or missing tsv: "); m_puts(tsv_path); m_puts("\n"); return 2 } 36 let prefix: *u8 = sys_mmap(512); dss_prefix(domain, prefix) 37 let w: *i64 = ss_begin() 38 var count: i64 = 0 39 var ls: i64 = 0 40 var i: i64 = 0 41 while i <= sz { 42 var eol: i64 = 0 43 if i == sz { eol = 1 } else { if buf[i] == (10 as u8) { eol = 1 } } 44 if eol == 1 { 45 if i > ls { 46 var tab: i64 = 0 - 1 47 var j: i64 = ls 48 while j < i { if buf[j] == (9 as u8) { if tab < 0 { tab = j } } j = j + 1 } 49 if tab >= 0 { 50 let ts: i64 = tab + 1 51 let tn: i64 = i - ts 52 if tn > 0 { 53 let txt: *u8 = ((buf as i64) + ts) as *u8 54 let cid: i64 = mg_hash(txt, tn) 55 let key: *u8 = sys_mmap(64); dss_mkkey(cid, key) 56 ss_add(w, 1, key, txt, tn) 57 count = count + 1 58 } 59 } 60 } 61 ls = i + 1 62 } 63 i = i + 1 64 } 65 if count == 0 { m_puts("no id<TAB>text rows found in "); m_puts(tsv_path); m_puts("\n"); return 3 } 66 ss_commit(prefix, w, 1) 67 m_puts("migrated "); m_num(count); m_puts(" docs -> "); m_puts(prefix); m_puts(" (sovereign seg_store, no tsv emitted)\n") 68 return 0 69}