Skip to content

Commit 76b1c66

Browse files
authored
Support FT.SYNADD FT.SYNUPDATE FT.SYNDUMP commands (#55)
* Support FT.SYNADD FT.SYNUPDATE FT.SYNDUMP commands
1 parent a595a0d commit 76b1c66

File tree

3 files changed

+91
-3
lines changed

3 files changed

+91
-3
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,9 @@ func ExampleClient() {
9797
| [FT.SUGGET](https://oss.redislabs.com/redisearch/Commands.html#ftsugget) | [SuggestOpts](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Autocompleter.SuggestOpts) |
9898
| [FT.SUGDEL](https://oss.redislabs.com/redisearch/Commands.html#ftsugdel) | [DeleteTerms](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Autocompleter.DeleteTerms) |
9999
| [FT.SUGLEN](https://oss.redislabs.com/redisearch/Commands.html#ftsuglen) | [Autocompleter.Length](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Autocompleter.Length) |
100-
| [FT.SYNADD](https://oss.redislabs.com/redisearch/Commands.html#ftsynadd) | N/A |
101-
| [FT.SYNUPDATE](https://oss.redislabs.com/redisearch/Commands.html#ftsynupdate) | N/A |
102-
| [FT.SYNDUMP](https://oss.redislabs.com/redisearch/Commands.html#ftsyndump) | N/A |
100+
| [FT.SYNADD](https://oss.redislabs.com/redisearch/Commands.html#ftsynadd) | [SynAdd](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Client.SynAdd) |
101+
| [FT.SYNUPDATE](https://oss.redislabs.com/redisearch/Commands.html#ftsynupdate) | [SynUpdate](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Client.SynUpdate) |
102+
| [FT.SYNDUMP](https://oss.redislabs.com/redisearch/Commands.html#ftsyndump) | [SynDump](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Client.SynDump) |
103103
| [FT.SPELLCHECK](https://oss.redislabs.com/redisearch/Commands.html#ftspellcheck) | [SpellCheck](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Client.SpellCheck) |
104104
| [FT.DICTADD](https://oss.redislabs.com/redisearch/Commands.html#ftdictadd) | [DictAdd](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Client.DictAdd) |
105105
| [FT.DICTDEL](https://oss.redislabs.com/redisearch/Commands.html#ftdictdel) | [DictDel](https://godoc.org/github.com/RediSearch/redisearch-go/redisearch#Client.DictDel) |

redisearch/client.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,3 +539,49 @@ func (i *Client) GetTagVals(index string, filedName string) ([]string, error) {
539539
args := redis.Args{index, filedName}
540540
return redis.Strings(conn.Do("FT.TAGVALS", args...))
541541
}
542+
543+
// Adds a synonym group.
544+
func (i *Client) SynAdd(indexName string, terms []string) (int64, error) {
545+
conn := i.pool.Get()
546+
defer conn.Close()
547+
548+
args := redis.Args{indexName}.AddFlat(terms)
549+
return redis.Int64(conn.Do("FT.SYNADD", args...))
550+
}
551+
552+
// Updates a synonym group.
553+
func (i *Client) SynUpdate(indexName string, synonymGroupId int64, terms []string) (string, error) {
554+
conn := i.pool.Get()
555+
defer conn.Close()
556+
557+
args := redis.Args{indexName, synonymGroupId}.AddFlat(terms)
558+
return redis.String(conn.Do("FT.SYNUPDATE", args...))
559+
}
560+
561+
// Dumps the contents of a synonym group.
562+
func (i *Client) SynDump(indexName string) (map[string][]int64, error) {
563+
conn := i.pool.Get()
564+
defer conn.Close()
565+
566+
args := redis.Args{indexName}
567+
values, err := redis.Values(conn.Do("FT.SYNDUMP", args...))
568+
if err != nil {
569+
return nil, err
570+
}
571+
572+
valLen := len(values)
573+
if valLen%2 != 0 {
574+
return nil, errors.New("SynDump: expects even number of values result")
575+
}
576+
577+
m := make(map[string][]int64, valLen/2)
578+
for i := 0; i < valLen; i += 2 {
579+
key := values[i].([]byte)
580+
gids, err := redis.Int64s(values[i+1], nil)
581+
if err != nil {
582+
return nil, err
583+
}
584+
m[string(key)] = gids
585+
}
586+
return m, nil
587+
}

redisearch/client_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,3 +470,45 @@ func TestClient_GetTagVals(t *testing.T) {
470470
assert.NotNil(t, err)
471471
assert.Nil(t, tags)
472472
}
473+
474+
func TestClient_SynAdd(t *testing.T) {
475+
c := createClient("testsynadd")
476+
477+
sc := NewSchema(DefaultOptions).
478+
AddField(NewTextField("name")).
479+
AddField(NewTextField("addr"))
480+
c.Drop()
481+
err := c.CreateIndex(sc)
482+
assert.Nil(t, err)
483+
484+
gid, err := c.SynAdd("testsynadd", []string{"girl", "baby"})
485+
assert.Nil(t, err)
486+
assert.True(t, gid >= 0)
487+
ret, err := c.SynUpdate("testsynadd", gid, []string{"girl", "baby"})
488+
assert.Nil(t, err)
489+
assert.Equal(t, "OK", ret)
490+
}
491+
492+
func TestClient_SynDump(t *testing.T) {
493+
c := createClient("testsyndump")
494+
495+
sc := NewSchema(DefaultOptions).
496+
AddField(NewTextField("name")).
497+
AddField(NewTextField("addr"))
498+
c.Drop()
499+
err := c.CreateIndex(sc)
500+
assert.Nil(t, err)
501+
502+
gid, err := c.SynAdd("testsyndump", []string{"girl", "baby"})
503+
assert.Nil(t, err)
504+
assert.True(t, gid >= 0)
505+
506+
gid2, err := c.SynAdd("testsyndump", []string{"child"})
507+
508+
m, err := c.SynDump("testsyndump")
509+
assert.Contains(t, m, "baby")
510+
assert.Contains(t, m, "girl")
511+
assert.Contains(t, m, "child")
512+
assert.Equal(t, gid, m["baby"][0])
513+
assert.Equal(t, gid2, m["child"][0])
514+
}

0 commit comments

Comments
 (0)