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}