/ Hex Artifact Content
Login

Artifact 9eaf6c3df352f98a2ab5ce1921dd94128ab1381d:


0000: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0050: 50 72 6f 63 65 73 73 20 63 6f 6d 6d 61 6e 64 20  Process command 
0060: 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a  line arguments..
0070: 23 0a 70 72 6f 63 20 75 73 61 67 65 20 7b 7d 20  #.proc usage {} 
0080: 7b 0a 20 20 70 75 74 73 20 73 74 64 65 72 72 20  {.  puts stderr 
0090: 22 75 73 61 67 65 3a 20 24 3a 3a 61 72 67 76 30  "usage: $::argv0
00a0: 20 3f 4f 50 54 49 4f 4e 53 3f 20 64 61 74 61 62   ?OPTIONS? datab
00b0: 61 73 65 20 74 61 62 6c 65 22 0a 20 20 70 75 74  ase table".  put
00c0: 73 20 73 74 64 65 72 72 20 22 22 0a 20 20 70 75  s stderr "".  pu
00d0: 74 73 20 73 74 64 65 72 72 20 22 20 20 2d 6e 74  ts stderr "  -nt
00e0: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
00f0: 20 20 20 28 63 6f 75 6e 74 20 6e 75 6d 62 65 72     (count number
0100: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 65 61 63   of terms in eac
0110: 68 20 73 65 67 6d 65 6e 74 29 22 0a 20 20 70 75  h segment)".  pu
0120: 74 73 20 73 74 64 65 72 72 20 22 22 0a 20 20 65  ts stderr "".  e
0130: 78 69 74 20 31 0a 7d 0a 0a 73 65 74 20 4f 28 6e  xit 1.}..set O(n
0140: 74 65 72 6d 29 20 30 0a 0a 69 66 20 7b 5b 6c 6c  term) 0..if {[ll
0150: 65 6e 67 74 68 20 24 61 72 67 76 5d 3c 32 7d 20  ength $argv]<2} 
0160: 75 73 61 67 65 0a 66 6f 72 65 61 63 68 20 61 20  usage.foreach a 
0170: 5b 6c 72 61 6e 67 65 20 24 61 72 67 76 20 30 20  [lrange $argv 0 
0180: 65 6e 64 2d 32 5d 20 7b 0a 20 20 73 77 69 74 63  end-2] {.  switc
0190: 68 20 2d 2d 20 24 61 20 7b 0a 20 20 20 20 2d 6e  h -- $a {.    -n
01a0: 74 65 72 6d 20 7b 0a 20 20 20 20 20 20 73 65 74  term {.      set
01b0: 20 4f 28 6e 74 65 72 6d 29 20 31 0a 20 20 20 20   O(nterm) 1.    
01c0: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 20 7b  }..    default {
01d0: 0a 20 20 20 20 20 20 75 73 61 67 65 0a 20 20 20  .      usage.   
01e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 65 74 20 64 61   }.  }.}..set da
01f0: 74 61 62 61 73 65 20 5b 6c 69 6e 64 65 78 20 24  tabase [lindex $
0200: 61 72 67 76 20 65 6e 64 2d 31 5d 0a 73 65 74 20  argv end-1].set 
0210: 74 62 6c 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  tbl [lindex $arg
0220: 76 20 65 6e 64 5d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  v end]...#------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0270: 2d 2d 2d 0a 23 20 43 6f 75 6e 74 20 74 68 65 20  ---.# Count the 
0280: 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  number of terms 
0290: 69 6e 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20  in each segment 
02a0: 6f 66 20 66 74 73 35 20 74 61 62 6c 65 20 24 74  of fts5 table $t
02b0: 62 6c 2e 20 53 74 6f 72 65 20 74 68 65 0a 23 20  bl. Store the.# 
02c0: 63 6f 75 6e 74 73 20 69 6e 20 74 68 65 20 61 72  counts in the ar
02d0: 72 61 79 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ray variable in 
02e0: 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6e 74 65  the parent conte
02f0: 78 74 20 6e 61 6d 65 64 20 62 79 20 70 61 72 61  xt named by para
0300: 6d 65 74 65 72 0a 23 20 24 61 72 72 61 79 6e 61  meter.# $arrayna
0310: 6d 65 2c 20 69 6e 64 65 78 65 64 20 62 79 20 73  me, indexed by s
0320: 65 67 6d 65 6e 74 2d 69 64 2e 20 45 78 61 6d 70  egment-id. Examp
0330: 6c 65 3a 0a 23 0a 23 20 20 20 63 6f 75 6e 74 5f  le:.#.#   count_
0340: 74 65 72 6d 73 20 66 74 73 5f 74 62 6c 20 41 0a  terms fts_tbl A.
0350: 23 20 20 20 66 6f 72 65 61 63 68 20 7b 6b 20 76  #   foreach {k v
0360: 7d 20 5b 61 72 72 61 79 20 67 65 74 20 41 5d 20  } [array get A] 
0370: 7b 20 70 75 74 73 20 22 73 65 67 69 64 3d 24 6b  { puts "segid=$k
0380: 20 6e 54 65 72 6d 3d 24 76 22 20 7d 0a 23 0a 70   nTerm=$v" }.#.p
0390: 72 6f 63 20 63 6f 75 6e 74 5f 74 65 72 6d 73 20  roc count_terms 
03a0: 7b 74 62 6c 20 61 72 72 61 79 6e 61 6d 65 7d 20  {tbl arrayname} 
03b0: 7b 0a 20 20 75 70 76 61 72 20 41 20 24 61 72 72  {.  upvar A $arr
03c0: 61 79 6e 61 6d 65 0a 20 20 61 72 72 61 79 20 75  ayname.  array u
03d0: 6e 73 65 74 20 41 0a 20 20 64 62 20 65 76 61 6c  nset A.  db eval
03e0: 20 22 53 45 4c 45 43 54 20 66 74 73 35 5f 64 65   "SELECT fts5_de
03f0: 63 6f 64 65 28 72 6f 77 69 64 2c 20 62 6c 6f 63  code(rowid, bloc
0400: 6b 29 20 41 53 20 64 20 46 52 4f 4d 20 24 7b 74  k) AS d FROM ${t
0410: 62 6c 7d 5f 64 61 74 61 22 20 7b 0a 20 20 20 20  bl}_data" {.    
0420: 73 65 74 20 64 65 73 63 20 5b 6c 69 6e 64 65 78  set desc [lindex
0430: 20 24 64 20 30 5d 0a 20 20 20 20 69 66 20 7b 5b   $d 0].    if {[
0440: 72 65 67 65 78 70 20 7b 5e 73 65 67 69 64 3d 28  regexp {^segid=(
0450: 5b 30 2d 39 5d 2a 29 7d 20 24 64 65 73 63 20 2d  [0-9]*)} $desc -
0460: 3e 20 69 64 5d 7d 20 7b 0a 20 20 20 20 20 20 66  > id]} {.      f
0470: 6f 72 65 61 63 68 20 69 20 5b 6c 72 61 6e 67 65  oreach i [lrange
0480: 20 24 64 20 31 20 65 6e 64 5d 20 7b 0a 20 20 20   $d 1 end] {.   
0490: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
04a0: 20 6d 61 74 63 68 20 7b 74 65 72 6d 3d 2a 7d 20   match {term=*} 
04b0: 24 69 5d 7d 20 7b 20 69 6e 63 72 20 41 28 24 69  $i]} { incr A($i
04c0: 64 29 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  d) }.      }.   
04d0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d   }.  }.}...#----
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0520: 2d 2d 2d 2d 2d 0a 23 20 53 74 61 72 74 20 6f 66  -----.# Start of
0530: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 23   main program..#
0540: 0a 73 71 6c 69 74 65 33 20 64 62 20 24 64 61 74  .sqlite3 db $dat
0550: 61 62 61 73 65 0a 63 61 74 63 68 20 7b 20 6c 6f  abase.catch { lo
0560: 61 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73  ad_static_extens
0570: 69 6f 6e 20 64 62 20 66 74 73 35 20 7d 0a 0a 69  ion db fts5 }..i
0580: 66 20 7b 24 4f 28 6e 74 65 72 6d 29 7d 20 7b 20  f {$O(nterm)} { 
0590: 63 6f 75 6e 74 5f 74 65 72 6d 73 20 24 74 62 6c  count_terms $tbl
05a0: 20 41 20 7d 0a 0a 64 62 20 65 76 61 6c 20 22 53   A }..db eval "S
05b0: 45 4c 45 43 54 20 66 74 73 35 5f 64 65 63 6f 64  ELECT fts5_decod
05c0: 65 28 72 6f 77 69 64 2c 20 62 6c 6f 63 6b 29 20  e(rowid, block) 
05d0: 41 53 20 64 20 46 52 4f 4d 20 24 7b 74 62 6c 7d  AS d FROM ${tbl}
05e0: 5f 64 61 74 61 20 57 48 45 52 45 20 69 64 3d 31  _data WHERE id=1
05f0: 30 22 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 6c  0" {.  foreach l
0600: 76 6c 20 5b 6c 72 61 6e 67 65 20 24 64 20 31 20  vl [lrange $d 1 
0610: 65 6e 64 5d 20 7b 0a 20 20 20 20 70 75 74 73 20  end] {.    puts 
0620: 5b 6c 72 61 6e 67 65 20 24 6c 76 6c 20 30 20 32  [lrange $lvl 0 2
0630: 5d 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 73  ]..    foreach s
0640: 65 67 20 5b 6c 72 61 6e 67 65 20 24 6c 76 6c 20  eg [lrange $lvl 
0650: 33 20 65 6e 64 5d 20 7b 0a 20 20 20 20 20 20 69  3 end] {.      i
0660: 66 20 7b 24 3a 3a 4f 28 6e 74 65 72 6d 29 7d 20  f {$::O(nterm)} 
0670: 7b 0a 20 20 20 20 20 20 20 20 72 65 67 65 78 70  {.        regexp
0680: 20 7b 5e 69 64 3d 28 5b 30 2d 39 5d 2a 29 7d 20   {^id=([0-9]*)} 
0690: 24 73 65 67 20 2d 3e 20 69 64 0a 20 20 20 20 20  $seg -> id.     
06a0: 20 20 20 73 65 74 20 6e 54 65 72 6d 20 30 0a 20     set nTerm 0. 
06b0: 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 20 73         catch { s
06c0: 65 74 20 6e 54 65 72 6d 20 24 41 28 24 69 64 29  et nTerm $A($id)
06d0: 20 7d 0a 20 20 20 20 20 20 20 20 70 75 74 73 20   }.        puts 
06e0: 5b 66 6f 72 6d 61 74 20 22 20 20 20 20 20 20 20  [format "       
06f0: 20 25 20 2d 32 38 73 20 20 20 20 6e 54 65 72 6d   % -28s    nTerm
0700: 3d 25 64 22 20 24 73 65 67 20 24 6e 54 65 72 6d  =%d" $seg $nTerm
0710: 5d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ].      } else {
0720: 0a 20 20 20 20 20 20 20 20 70 75 74 73 20 5b 66  .        puts [f
0730: 6f 72 6d 61 74 20 22 20 20 20 20 20 20 20 20 25  ormat "        %
0740: 20 2d 32 38 73 22 20 24 73 65 67 5d 0a 20 20 20   -28s" $seg].   
0750: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
0760: 0a 0a 0a 0a 0a 0a                                ......