mirror of
https://github.com/golang/go
synced 2024-11-25 07:07:57 -07:00
godoc: use new index/suffixarray serialization code
When saving/restoring the fulltext index, the entire respective suffixarray is now saved/restored (as opposed to the indexed data only, and the suffixarray recreated). This saves significant start-up time for large indexes, at the cost of significantly larger index files. R=r CC=golang-dev https://golang.org/cl/5037043
This commit is contained in:
parent
bd80b1198b
commit
66e44000d4
@ -834,31 +834,37 @@ func NewIndex(dirnames <-chan string, fulltextIndex bool, throttle float64) *Ind
|
|||||||
}
|
}
|
||||||
|
|
||||||
type fileIndex struct {
|
type fileIndex struct {
|
||||||
Sources []byte
|
|
||||||
Words map[string]*LookupResult
|
Words map[string]*LookupResult
|
||||||
Alts map[string]*AltWords
|
Alts map[string]*AltWords
|
||||||
Snippets []*Snippet
|
Snippets []*Snippet
|
||||||
|
Fulltext bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write writes the index x to w.
|
// Write writes the index x to w.
|
||||||
func (x *Index) Write(w io.Writer) os.Error {
|
func (x *Index) Write(w io.Writer) os.Error {
|
||||||
var sources []byte
|
fulltext := false
|
||||||
if x.suffixes != nil {
|
if x.suffixes != nil {
|
||||||
// fulltext index present
|
fulltext = true
|
||||||
sources = x.suffixes.Bytes()
|
|
||||||
}
|
}
|
||||||
fx := fileIndex{
|
fx := fileIndex{
|
||||||
sources, // indicates if fulltext index is present or not
|
|
||||||
x.words,
|
x.words,
|
||||||
x.alts,
|
x.alts,
|
||||||
x.snippets,
|
x.snippets,
|
||||||
|
fulltext,
|
||||||
}
|
}
|
||||||
err := gob.NewEncoder(w).Encode(fx)
|
if err := gob.NewEncoder(w).Encode(fx); err != nil {
|
||||||
if err == nil && sources != nil {
|
|
||||||
err = x.fset.Write(w)
|
|
||||||
}
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if fulltext {
|
||||||
|
if err := x.fset.Write(w); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := x.suffixes.Write(w); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Read reads the index from r into x; x must not be nil.
|
// Read reads the index from r into x; x must not be nil.
|
||||||
func (x *Index) Read(r io.Reader) os.Error {
|
func (x *Index) Read(r io.Reader) os.Error {
|
||||||
@ -866,17 +872,19 @@ func (x *Index) Read(r io.Reader) os.Error {
|
|||||||
if err := gob.NewDecoder(r).Decode(&fx); err != nil {
|
if err := gob.NewDecoder(r).Decode(&fx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if fx.Sources != nil {
|
x.words = fx.Words
|
||||||
// fulltext index is present
|
x.alts = fx.Alts
|
||||||
|
x.snippets = fx.Snippets
|
||||||
|
if fx.Fulltext {
|
||||||
x.fset = token.NewFileSet()
|
x.fset = token.NewFileSet()
|
||||||
if err := x.fset.Read(r); err != nil {
|
if err := x.fset.Read(r); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
x.suffixes = suffixarray.New(fx.Sources)
|
x.suffixes = new(suffixarray.Index)
|
||||||
|
if err := x.suffixes.Read(r); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
x.words = fx.Words
|
|
||||||
x.alts = fx.Alts
|
|
||||||
x.snippets = fx.Snippets
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user