Impl FTS and some main tests
This commit is contained in:
1
notes/notes_test.go
Normal file
1
notes/notes_test.go
Normal file
@@ -0,0 +1 @@
|
||||
package notes
|
||||
45
notes/search.go
Normal file
45
notes/search.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package notes
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"local/notes-server/filetree"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
func (n *Notes) Search(phrase string) (string, error) {
|
||||
files := filetree.NewFiles()
|
||||
err := filepath.Walk(n.root,
|
||||
func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if info.IsDir() {
|
||||
return nil
|
||||
}
|
||||
ok, err := grepFile(path, []byte(phrase))
|
||||
if ok {
|
||||
p := filetree.NewPathFromLocal(path)
|
||||
files.Push(p, info)
|
||||
}
|
||||
return err
|
||||
},
|
||||
)
|
||||
return filetree.Paths(*files).List(), err
|
||||
}
|
||||
|
||||
func grepFile(file string, pat []byte) (bool, error) {
|
||||
f, err := os.Open(file)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
defer f.Close()
|
||||
scanner := bufio.NewScanner(f)
|
||||
for scanner.Scan() {
|
||||
if bytes.Contains(scanner.Bytes(), pat) {
|
||||
return true, scanner.Err()
|
||||
}
|
||||
}
|
||||
return false, scanner.Err()
|
||||
}
|
||||
44
notes/search_test.go
Normal file
44
notes/search_test.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package notes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestSearch(t *testing.T) {
|
||||
d, err := ioutil.TempDir(os.TempDir(), "pattern*")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(d)
|
||||
for i := 0; i < 5; i++ {
|
||||
f, err := ioutil.TempFile(d, fmt.Sprintf("file_%d", i))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
fmt.Fprintf(f, "this file is number %d", i)
|
||||
f.Close()
|
||||
}
|
||||
|
||||
n := New()
|
||||
n.root = d
|
||||
|
||||
result, err := n.Search("this file")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if v := len(strings.Split(result, "\n")); v < 7 {
|
||||
t.Fatal(v, result)
|
||||
}
|
||||
|
||||
result, err = n.Search("4")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if v := len(strings.Split(result, "\n")); v > 4 {
|
||||
t.Fatal(v, result)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user