feat: engine package
parent
e0ca1a0150
commit
fca18f39d1
|
@ -0,0 +1 @@
|
||||||
|
package engine
|
|
@ -0,0 +1,69 @@
|
||||||
|
package engine
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"io/ioutil"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/go-redis/redis/v7"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RedisClient is an idiomatic interface for the Redis client,
|
||||||
|
// adding few methods to interact with the file system.
|
||||||
|
type RedisClient struct {
|
||||||
|
conn *redis.Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewRedisClient returns a Redis client
|
||||||
|
func NewRedisClient(addr, port string) (*RedisClient, error) {
|
||||||
|
client := redis.NewClient(&redis.Options{
|
||||||
|
Addr: addr + ":" + port,
|
||||||
|
Password: "", // no password set
|
||||||
|
DB: 0, // use default DB
|
||||||
|
})
|
||||||
|
|
||||||
|
err := client.Ping().Err()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &RedisClient{conn: client}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddFile index a file
|
||||||
|
func (c *RedisClient) AddFile(file string, score int) error {
|
||||||
|
data, err := ioutil.ReadFile(file)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
words := strings.Split(string(data), " ")
|
||||||
|
|
||||||
|
wordsJSONArray, err := json.Marshal(&words)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.conn.Set(file, wordsJSONArray, 0).Err()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetKey returns a key value
|
||||||
|
func (c *RedisClient) GetKey(key string) (string, error) {
|
||||||
|
// Utilisez Redigo pour lire toutes les valeurs de la clef, et les
|
||||||
|
// placer dans une tranche de chaînes. Renvoyez une erreur si nécessaire.
|
||||||
|
return c.conn.Get(key).Result()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllKeys returns a key value
|
||||||
|
func (c *RedisClient) GetAllKeys() (keys []string, err error) {
|
||||||
|
// Utilisez Redigo pour lire toutes les valeurs de la clef, et les
|
||||||
|
// placer dans une tranche de chaînes. Renvoyez une erreur si nécessaire.
|
||||||
|
keys, _, err = c.conn.Scan(0, "*", 15).Result()
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close closes the Redis connection
|
||||||
|
func (c *RedisClient) Close() error {
|
||||||
|
return c.conn.Close()
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
package engine
|
|
@ -0,0 +1,17 @@
|
||||||
|
package engine
|
||||||
|
|
||||||
|
import "strings"
|
||||||
|
|
||||||
|
// CountWord returns the number of
|
||||||
|
// occurence for a word in a given text.
|
||||||
|
func CountWord(text, word string) int {
|
||||||
|
count := 0
|
||||||
|
|
||||||
|
for _, v := range strings.Split(text, " ") {
|
||||||
|
if v == word {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package engine
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestText(t *testing.T) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
|
||||||
|
t.Run("CountWord", func(t *testing.T) {
|
||||||
|
t.Run("should count words in text", func(t *testing.T) {
|
||||||
|
text := "Contrairement à une opinion répandue, le Lorem Ipsum n'est pas simplement du texte aléatoire. Il trouve ses racines dans une oeuvre de la littérature latine classique datant de 45 av. J.-C., le rendant vieux de 2000 ans. Un professeur du Hampden-Sydney College, en Virginie, s'est intéressé à un des mots latins les plus obscurs, consectetur, extrait d'un passage du Lorem Ipsum, et en étudiant tous les usages de ce mot dans la littérature classique, découvrit la source incontestable du Lorem Ipsum."
|
||||||
|
|
||||||
|
assert.Equal(3, CountWord(text, "la"), "should be equal")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in New Issue