package main
import(
"strings"
"os"
"gob"
"bytes"
"fmt"
)
type InvertMap map[string][]invert
type invert struct{
doc int
num int
}
func NewInvertMap() InvertMap {
return make(InvertMap)
}
func (im InvertMap) AddStemTo(doc []string, index int) (err os.Error) {
for i := range doc {
// if this is the first time the word is added
if im[doc[i]] == nil {
in := invert{doc:i, num:1}
im[doc[i]] = append(im[doc[i]],in)
} else {
chk := true
for j := range im[doc[i]] {
// if there already exist an inverted doc, just add to num
if im[doc[i]][j].doc == index {
im[doc[i]][j].num++
chk = false
}
}
if chk {
in := invert{doc:i, num:1}
im[doc[i]] = append(im[doc[i]],in)
// im[doc[i]] = append(im[doc[i]], index)
}
}
}
return nil
}
func (im *InvertMap) Load(im_filename string) (err os.Error) {
str, err := contents(im_filename)
b := bytes.NewBufferString(str)
dec := gob.NewDecoder(b)
dec.Decode(im)
return nil
}
func (im *InvertMap) Save(im_filename string) (err os.Error) {
b := new(bytes.Buffer)
enc := gob.NewEncoder(b)
err = enc.Encode(im)
if err != nil {
fmt.Printf("encode %s\n", err.String())
return
}
err = write_to(im_filename, b.Bytes())
if err != nil {
fmt.Printf("write %s\n", err.String())
return
}
return nil
}
func main (){
im1 := NewInvertMap()
im2 := NewInvertMap()
s := "words to have stored and returned to "
st := strings.Fields(s)
im1.AddStemTo(st,1)
im1.Save("store")
im2.Load("store")
for i := range im1 {
for j := range im1[i]{
println(im1[i][j].doc,im1[i][j].num)
}
}
for i := range im2 {
for j := range im2[i]{
println(im2[i][j].doc,im2[i][j].num)
}
}
}