refactor: query & index commands

Add some fixtures
pull/3/head
sundowndev 2020-04-13 00:52:45 +01:00
parent 1adfa390fb
commit 9efb70b41a
8 changed files with 89 additions and 25 deletions

View File

@ -84,16 +84,14 @@ Les tâches qui le composent sont les suivantes:
- [x] créer une fonction pouvant extraire un résultat d'un "sorted set" Redis
- [x] créer un test d'intégration combinant les deux précédentes
- [x] créer une fonction lisant un fichier texte mot par mot
- [ ] créer une fonction enregistrant les statistiques de mots d'un fichier au moyen des fonctions de 2. et 5.
- [ ] créer une fonction parcourant une sous-arborescence disque pour en examiner tous les fichiers
- [x] créer une fonction enregistrant les statistiques de mots d'un fichier au moyen des fonctions de 2. et 5.
- [x] créer une fonction parcourant une sous-arborescence disque pour en examiner tous les fichiers
- [x] créer une fonction identifiant si un fichier est reconnu par Go comme un fichier texte
- [x] intégrer les deux précédentes pour que le parcours ne traite que les fichiers reconnus comme texte
- [ ] intégrer la fonction avec l'écriture des comptes de mots dans Redis
- [x] intégrer la fonction avec l'écriture des comptes de mots dans Redis
- [x] écrire une fonction implémentant la commande de déboguage, qui liste tout le contenu de la base Redis après une indexation
- [ ] écrire une fonction implémentant la commande de recherche, qui interroge Redis pour ramener les meilleurs résultats pour une recherche
- [ ] contextualiser l'affichage des résultats avec le texte avoisinant
- [x] contextualiser l'affichage des résultats avec le texte avoisinant
## Ressources

View File

@ -30,19 +30,22 @@ var indexCmd = &cobra.Command{
fmt.Printf("Walking %v...\n", path)
// Open File
f, err := ioutil.ReadFile(path)
if err != nil {
panic(err)
for _, file := range engine.GetFilesFromDir(path) {
// Open File
f, err := ioutil.ReadFile(file)
if err != nil {
panic(err)
}
if engine.IsTextFile(f) == false {
return
}
content := string(f)
client.AddFile(file, content)
fmt.Println("Successfully indexed file", file)
}
content := string(f)
if engine.IsTextFile(f) == false {
return
}
client.AddFile(path, content)
fmt.Println("Successfully indexed file", path)
},
}

View File

@ -2,6 +2,7 @@ package cmd
import (
"fmt"
"io/ioutil"
"log"
"os"
@ -44,10 +45,16 @@ var queryCmd = &cobra.Command{
continue
}
// Open File
f, err := ioutil.ReadFile(file)
if err != nil {
panic(err)
}
queryResults = append(queryResults, &engine.QueryResult{
File: file,
Count: score,
FirstMatch: engine.GetFirstMatchLine("", word),
FirstMatch: engine.GetFirstMatchingLine(string(f), word),
})
}

View File

@ -1,9 +1,30 @@
package engine
import (
"fmt"
"os"
"path/filepath"
)
// GetFilesFromDir walks through a directory and returns
// file paths contained inside.
func GetFilesFromDir(dir string) (files []string) {
// is dir?
// is readable/exists?
return files
filepath.Walk(dir, func(fp string, fi os.FileInfo, err error) error {
if err != nil {
fmt.Println(err)
return nil
}
fi.Mode()
if fi.IsDir() {
return nil
}
files = append(files, fp)
return nil
})
return
}

View File

@ -10,7 +10,7 @@ import (
// CountWord returns the number of
// occurence for a word in a given text.
func CountWord(text, word string) (count int) {
for _, v := range strings.Split(text, " ") {
for _, v := range GetWordsFromText(text) {
if v == word {
count++
}
@ -38,7 +38,15 @@ func IsTextFile(file []byte) bool {
return strings.Index(contentType, "text/plain") > -1
}
// GetFirstMatchLine returns the first line to match the given word.
func GetFirstMatchLine(data string, word string) string {
return "..."
// GetFirstMatchingLine returns the first line to match the given word.
func GetFirstMatchingLine(text string, word string) string {
scanner := bufio.NewScanner(bytes.NewBufferString(text))
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
if strings.Index(scanner.Text(), word) > -1 {
return scanner.Text()
}
}
return ""
}

View File

@ -26,4 +26,10 @@ func TestText(t *testing.T) {
assert.Equal(false, IsTextFile([]byte("<html></html>")), "should be equal")
})
t.Run("GetFirstMatchingLine", func(t *testing.T) {
text := "1 no\n2no\n3 yes"
assert.Equal("3 yes", GetFirstMatchingLine(text, "yes"), "should be equal")
})
}

21
fixtures/0/1/3/guide.txt Normal file
View File

@ -0,0 +1,21 @@
Ideally, you should be able to just type:
./configure
make
make install
For Kali Linux, you might also need to do:
apt install libssl1.0-dev
It needs an older SSL version due to OpenSSH code for the SSH module.
For Ubuntu, you might also need to add the -lrt flag to the LDFLAGS variable in the Makefile,
if you get the undefined reference to `clock_gettime' error:
LDFLAGS = -Lnbase -Lnsock/src -Lopensshlib $(DBGFLAGS) $(STATIC) -lrt

BIN
fixtures/example.pdf Normal file

Binary file not shown.