1# How to map a Tcl selection result back to a view
2#
3# Note: it'd be nice to have a "$view loop var { script ... }" in Mk4tcl
4
5if {[catch {package require Mk4tcl}] &&
6    [catch {load ./Mk4tcl.so mk4tcl}] &&
7    [catch {load ../builds/Mk4tcl.so mk4tcl}] &&
8    [catch {load ./Mk4tcl_d.dll mk4tcl}] &&
9    [catch {load ../builds/Mk4tcl_d.dll mk4tcl}]} {
10  error "cannot load Mk4tcl"
11}
12
13mk::file open db
14mk::view layout db.squares {x:I y:I}
15
16set count 50000
17mk::view size db.squares $count
18
19set t [clock seconds]
20
21mk::loop c db.squares {
22  set i [mk::cursor position c]
23  mk::set $c x $i y [expr {$i*$i}]
24}
25
26puts "init took [expr {[clock seconds] - $t}] seconds"
27
28puts "select timing: [time {set v [mk::select db.squares -regexp y 11111]}]"
29
30puts "results from select:"
31foreach i $v {
32  foreach {x y} [mk::get db.squares!$i x y] break
33  puts [format {%7i: %10d,%d} $i $x $y]
34}
35
36set v1 [mk::view new]
37foreach i $v {
38  $v1 insert end n:I $i
39}
40
41puts "contents of v1:"
42for {set i 0} {$i < [$v1 size]} {incr i} {
43  puts "  [$v1 get $i n]"
44}
45
46set v2 [mk::view open db.squares]
47puts "the squares view is called '$v2' and contains [$v2 size] rows"
48
49set v3 [$v2 view map $v1]
50
51puts "mapped view:"
52for {set i 0} {$i < [$v3 size]} {incr i} {
53  foreach {x y} [$v3 get $i x y] break
54  puts [format {%7i: %10d,%d} $i $x $y]
55}
56
57$v3 close
58$v2 close
59$v1 close
60
61# The output on this script should be:
62#
63# init took 1 seconds
64# select timing: 443096 microseconds per iteration
65# results from select:
66#   10541:      10541,111112681
67#   33334:      33334,1111155556
68#   48310:      48310,-1961111196
69# contents of v1:
70#   10541
71#   33334
72#   48310
73# the squares view is called 'view1' and contains 100000 rows
74# mapped view:
75#       0:      10541,111112681
76#       1:      33334,1111155556
77#       2:      48310,-1961111196
78