Skip to content

Commit 11d6421

Browse files
committed
WIP: fix reading FT.CONFIG with RESP3
1 parent 53bd68c commit 11d6421

File tree

3 files changed

+88
-17
lines changed

3 files changed

+88
-17
lines changed

command.go

+32-15
Original file line numberDiff line numberDiff line change
@@ -3863,29 +3863,46 @@ func (cmd *MapMapStringInterfaceCmd) Val() map[string]interface{} {
38633863
}
38643864

38653865
func (cmd *MapMapStringInterfaceCmd) readReply(rd *proto.Reader) (err error) {
3866-
n, err := rd.ReadArrayLen()
3866+
data, err := rd.ReadReply()
38673867
if err != nil {
38683868
return err
38693869
}
3870+
resultMap := map[string]interface{}{}
38703871

3871-
data := make(map[string]interface{}, n/2)
3872-
for i := 0; i < n; i += 2 {
3873-
_, err := rd.ReadArrayLen()
3874-
if err != nil {
3875-
cmd.err = err
3876-
}
3877-
key, err := rd.ReadString()
3878-
if err != nil {
3879-
cmd.err = err
3872+
switch midResponse := data.(type) {
3873+
case map[interface{}]interface{}:
3874+
for k, v := range midResponse {
3875+
stringKey, ok := k.(string)
3876+
if !ok {
3877+
return fmt.Errorf("redis: invalid map key %#v", k)
3878+
}
3879+
resultMap[stringKey] = v
38803880
}
3881-
value, err := rd.ReadString()
3882-
if err != nil {
3883-
cmd.err = err
3881+
case []interface{}: // resp2
3882+
n := len(midResponse)
3883+
for i := 0; i < n; i++ {
3884+
finalArr, ok := midResponse[i].([]interface{})
3885+
if !ok {
3886+
return fmt.Errorf("redis: unexpected response %#v", data)
3887+
}
3888+
m := len(finalArr)
3889+
if m%2 != 0 {
3890+
return fmt.Errorf("redis: unexpected response %#v", data)
3891+
}
3892+
3893+
for j := 0; j < m; j += 2 {
3894+
stringKey, ok := finalArr[j].(string)
3895+
if !ok {
3896+
return fmt.Errorf("redis: invalid map key %#v", finalArr[i])
3897+
}
3898+
resultMap[stringKey] = finalArr[j+1]
3899+
}
38843900
}
3885-
data[key] = value
3901+
default:
3902+
return fmt.Errorf("redis: unexpected response %#v", data)
38863903
}
38873904

3888-
cmd.val = data
3905+
cmd.val = resultMap
38893906
return nil
38903907
}
38913908

commands_test.go

+54-2
Original file line numberDiff line numberDiff line change
@@ -379,11 +379,63 @@ var _ = Describe("Commands", func() {
379379
Expect(configSet.Val()).To(Equal("OK"))
380380
})
381381

382+
It("should ConfigSet FT DIALECT", func() {
383+
SkipBeforeRedisMajor(8, "Config doesn't include modules before Redis 8")
384+
defaultState, err := client.ConfigGet(ctx, "search-default-dialect").Result()
385+
Expect(err).NotTo(HaveOccurred())
386+
387+
// set to 3
388+
res, err := client.ConfigSet(ctx, "search-default-dialect", "3").Result()
389+
Expect(err).NotTo(HaveOccurred())
390+
Expect(res).To(BeEquivalentTo("OK"))
391+
392+
defDialect, err := client.FTConfigGet(ctx, "DEFAULT_DIALECT").Result()
393+
Expect(err).NotTo(HaveOccurred())
394+
Expect(defDialect).To(BeEquivalentTo(map[string]interface{}{"DEFAULT_DIALECT": "3"}))
395+
396+
resGet, err := client.ConfigGet(ctx, "search-default-dialect").Result()
397+
Expect(err).NotTo(HaveOccurred())
398+
Expect(resGet).To(BeEquivalentTo(map[string]string{"search-default-dialect": "3"}))
399+
400+
// set to 2
401+
res, err = client.ConfigSet(ctx, "search-default-dialect", "2").Result()
402+
Expect(err).NotTo(HaveOccurred())
403+
Expect(res).To(BeEquivalentTo("OK"))
404+
405+
defDialect, err = client.FTConfigGet(ctx, "DEFAULT_DIALECT").Result()
406+
Expect(err).NotTo(HaveOccurred())
407+
Expect(defDialect).To(BeEquivalentTo(map[string]interface{}{"DEFAULT_DIALECT": "2"}))
408+
409+
// set to 1
410+
res, err = client.ConfigSet(ctx, "search-default-dialect", "1").Result()
411+
Expect(err).NotTo(HaveOccurred())
412+
Expect(res).To(BeEquivalentTo("OK"))
413+
414+
defDialect, err = client.FTConfigGet(ctx, "DEFAULT_DIALECT").Result()
415+
Expect(err).NotTo(HaveOccurred())
416+
Expect(defDialect).To(BeEquivalentTo(map[string]interface{}{"DEFAULT_DIALECT": "1"}))
417+
418+
resGet, err = client.ConfigGet(ctx, "search-default-dialect").Result()
419+
Expect(err).NotTo(HaveOccurred())
420+
Expect(resGet).To(BeEquivalentTo(map[string]string{"search-default-dialect": "1"}))
421+
422+
// set to default
423+
res, err = client.ConfigSet(ctx, "search-default-dialect", defaultState["search-default-dialect"]).Result()
424+
Expect(err).NotTo(HaveOccurred())
425+
Expect(res).To(BeEquivalentTo("OK"))
426+
})
427+
428+
It("should ConfigSet fail for ReadOnly", func() {
429+
SkipBeforeRedisMajor(8, "Config doesn't include modules before Redis 8")
430+
_, err := client.ConfigSet(ctx, "search-max-doctablesize", "100000").Result()
431+
Expect(err).To(HaveOccurred())
432+
})
433+
382434
It("should ConfigSet Modules", func() {
383435
SkipBeforeRedisMajor(8, "Config doesn't include modules before Redis 8")
384436
defaults := map[string]string{}
385437
expected := map[string]string{
386-
"search-min-prefix": "32",
438+
"search-timeout": "100",
387439
"ts-retention-policy": "2",
388440
"bf-error-rate": "0.13",
389441
"cf-initial-size": "64",
@@ -423,7 +475,7 @@ var _ = Describe("Commands", func() {
423475
It("should Fail ConfigSet Modules", func() {
424476
SkipBeforeRedisMajor(8, "Config doesn't include modules before Redis 8")
425477
expected := map[string]string{
426-
"search-min-prefix": "-32",
478+
"search-timeout": "-100",
427479
"ts-retention-policy": "-10",
428480
"bf-error-rate": "1.5",
429481
"cf-initial-size": "-10",

search_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,7 @@ var _ = Describe("RediSearch commands Resp 2", Label("search"), func() {
457457
})
458458

459459
It("should FTConfigSet and FTConfigGet ", Label("search", "ftconfigget", "ftconfigset", "NonRedisEnterprise"), func() {
460+
SkipAfterRedisMajor(7, "FT.CONFIG is moved to Config for redis 8")
460461
val, err := client.FTConfigSet(ctx, "TIMEOUT", "100").Result()
461462
Expect(err).NotTo(HaveOccurred())
462463
Expect(val).To(BeEquivalentTo("OK"))
@@ -1013,6 +1014,7 @@ var _ = Describe("RediSearch commands Resp 2", Label("search"), func() {
10131014
})
10141015

10151016
It("should FTConfigSet and FTConfigGet dialect", Label("search", "ftconfigget", "ftconfigset", "NonRedisEnterprise"), func() {
1017+
SkipAfterRedisMajor(7, "FT.CONFIG is moved to Config for redis 8")
10161018
res, err := client.FTConfigSet(ctx, "DEFAULT_DIALECT", "1").Result()
10171019
Expect(err).NotTo(HaveOccurred())
10181020
Expect(res).To(BeEquivalentTo("OK"))

0 commit comments

Comments
 (0)