code wiki / _hdl_build / nx_query_gate.nx

nx_query_gate.nx source

↩ module page · 101 lines · 5281 B

1// nx_query_gate.nx -- GATE for the query executor (nx_query). Known-answer queries over a small hand-built 2// dataset so SELECT-agg/WHERE-filter/GROUP-BY are proven exact. expect_exit: 0 license_tier: ORIGINAL 3import "nx_syscalls.nx" 4import "_hdl_build/nx_query.nx" 5 6func qp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 7func qn(v: i64) -> i64 { var m: i64=v; if m<0{qp("-" as *u8);m=0-m} let t:*u8=sys_mmap(24); var k:i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} let o:*u8=sys_mmap(24); var i:i64=0; while i<k{o[i]=t[k-1-i];i=i+1} sys_write(1,o,k); return 0 } 8 9func main() -> i64 { 10 qp("=== nx_query_gate ===\n" as *u8) 11 var pass: i64 = 0 12 var fail: i64 = 0 13 14 // dataset (8 rows): cat (group), size (filter), price (agg) 15 // row: cat size price 16 // 0 1 50 500 17 // 1 1 150 1500 18 // 2 2 80 800 19 // 3 2 200 2000 20 // 4 1 120 1200 21 // 5 3 60 600 22 // 6 2 300 3000 23 // 7 1 90 900 24 let n: i64 = 8 25 let cat: *i64 = sys_mmap(n * 8) as *i64 26 let size: *i64 = sys_mmap(n * 8) as *i64 27 let price: *i64 = sys_mmap(n * 8) as *i64 28 cat[0]=1; size[0]=50; price[0]=500 29 cat[1]=1; size[1]=150; price[1]=1500 30 cat[2]=2; size[2]=80; price[2]=800 31 cat[3]=2; size[3]=200; price[3]=2000 32 cat[4]=1; size[4]=120; price[4]=1200 33 cat[5]=3; size[5]=60; price[5]=600 34 cat[6]=2; size[6]=300; price[6]=3000 35 cat[7]=1; size[7]=90; price[7]=900 36 37 // Q1 SELECT count(*) -> 8 38 if q_scalar(price, size, n, Q_ALL, 0, Q_COUNT) == 8 { pass = pass + 1 } else { fail = fail + 1; qp("Q1 FAIL count all\n" as *u8) } 39 40 // Q2 SELECT sum(price) WHERE size > 100 -> rows 1(1500),3(2000),4(1200),6(3000) = 7700 41 let q2: i64 = q_scalar(price, size, n, 3, 100, Q_SUM) 42 qp("sum(price) WHERE size>100 = " as *u8); qn(q2); qp("\n" as *u8) 43 if q2 == 7700 { pass = pass + 1 } else { fail = fail + 1; qp("Q2 FAIL sum where\n" as *u8) } 44 45 // Q3 SELECT avg(price) WHERE size >= 80 -> rows 1500,800,2000,1200,3000,900 (6 rows) sum=9400 avg=1566 46 let q3: i64 = q_scalar(price, size, n, 4, 80, Q_AVG) 47 qp("avg(price) WHERE size>=80 = " as *u8); qn(q3); qp("\n" as *u8) 48 if q3 == 1566 { pass = pass + 1 } else { fail = fail + 1; qp("Q3 FAIL avg where\n" as *u8) } 49 50 // Q4 SELECT max(price) WHERE cat==2 (filter on cat) -> rows 800,2000,3000 -> 3000 ; min -> 800 51 var t4: i64 = 1 52 if q_scalar(price, cat, n, 0, 2, Q_MAX) != 3000 { t4 = 0 } 53 if q_scalar(price, cat, n, 0, 2, Q_MIN) != 800 { t4 = 0 } 54 if t4 == 1 { pass = pass + 1 } else { fail = fail + 1; qp("Q4 FAIL min/max where\n" as *u8) } 55 56 // Q5 SELECT sum(price) GROUP BY cat (no filter): 57 // cat1: 500+1500+1200+900 = 4100 ; cat2: 800+2000+3000 = 5800 ; cat3: 600 58 let ok: *i64 = sys_mmap(16 * 8) as *i64 59 let oa: *i64 = sys_mmap(16 * 8) as *i64 60 let oc: *i64 = sys_mmap(16 * 8) as *i64 61 let g: i64 = q_grouped(price, size, cat, n, Q_ALL, 0, Q_SUM, ok, oa, oc, 16) 62 qp("GROUP BY cat SUM(price): groups=" as *u8); qn(g); qp("\n" as *u8) 63 var t5: i64 = 1 64 if g != 3 { t5 = 0 } 65 // first-seen order: cat1, cat2, cat3 66 if ok[0] != 1 { t5 = 0 } else { if oa[0] != 4100 { t5 = 0 } } 67 if ok[1] != 2 { t5 = 0 } else { if oa[1] != 5800 { t5 = 0 } } 68 if ok[2] != 3 { t5 = 0 } else { if oa[2] != 600 { t5 = 0 } } 69 if t5 == 1 { pass = pass + 1 } else { fail = fail + 1; qp("Q5 FAIL group by sum\n" as *u8) } 70 71 // Q6 SELECT avg(price) GROUP BY cat WHERE size>=90: 72 // cat1: rows size>=90 -> 150(1500),120(1200),90(900) = 3600/3 = 1200 73 // cat2: 200(2000),300(3000) [80 excluded] = 5000/2 = 2500 ; cat3: 60 excluded -> no group 74 let g2: i64 = q_grouped(price, size, cat, n, 4, 90, Q_AVG, ok, oa, oc, 16) 75 var t6: i64 = 1 76 if g2 != 2 { t6 = 0 } 77 if ok[0] != 1 { t6 = 0 } else { if oa[0] != 1200 { t6 = 0 } } 78 if ok[1] != 2 { t6 = 0 } else { if oa[1] != 2500 { t6 = 0 } } 79 if t6 == 1 { pass = pass + 1 } else { fail = fail + 1; qp("Q6 FAIL group by avg + filter\n" as *u8) } 80 81 // Q7 empty filter result -> count 0, sum 0 82 var t7: i64 = 1 83 if q_scalar(price, size, n, 3, 100000, Q_COUNT) != 0 { t7 = 0 } 84 if q_scalar(price, size, n, 3, 100000, Q_SUM) != 0 { t7 = 0 } 85 if t7 == 1 { pass = pass + 1 } else { fail = fail + 1; qp("Q7 FAIL empty filter\n" as *u8) } 86 87 qp("pass=" as *u8); qn(pass); qp(" fail=" as *u8); qn(fail); qp("\n" as *u8) 88 let log: *u8 = sys_mmap(128) 89 var lo: i64 = 0 90 let pre: *u8 = "QUERY authored=organ verdict=" as *u8 91 var pi: i64 = 0 92 while pre[pi] != (0 as u8) { log[lo] = pre[pi]; lo = lo + 1; pi = pi + 1 } 93 if fail == 0 { let gg: *u8 = "GREEN\n" as *u8; var gi: i64 = 0; while gg[gi] != (0 as u8) { log[lo] = gg[gi]; lo = lo + 1; gi = gi + 1 } } else { let rr: *u8 = "RED\n" as *u8; var ri: i64 = 0; while rr[ri] != (0 as u8) { log[lo] = rr[ri]; lo = lo + 1; ri = ri + 1 } } 94 let fd: i64 = sys_openat_wr("knowledge/status/query.log" as *u8, 0x1A4) 95 if fd >= 0 { sys_write(fd, log, lo); sys_close(fd) } 96 97 if fail == 0 { qp("=== QUERY-GATE verdict=GREEN ===\n" as *u8); sys_exit(0); return 0 } 98 qp("=== QUERY-GATE verdict=RED ===\n" as *u8) 99 sys_exit(1) 100 return 1 101}