1
0
mirror of https://github.com/redis/go-redis.git synced 2025-04-17 20:17:02 +03:00

fix(search&aggregate):fix error overwrite and typo #3220 (#3224)

* fix (#3220)

* LOAD has NO AS param(https://redis.io/docs/latest/commands/ft.aggregate/)

* fix typo: WITHCOUT -> WITHCOUNT

* fix (#3220):

    * Compatible with known RediSearch issue in test

* fix (#3220)

    * fixed the calculation bug of the count of load params

* test should not include special condition

* return errors when they occur

---------

Co-authored-by: Nedyalko Dyakov <nedyalko.dyakov@gmail.com>
Co-authored-by: ofekshenawa <104765379+ofekshenawa@users.noreply.github.com>
This commit is contained in:
herodot 2025-02-20 21:55:49 +08:00 committed by GitHub
parent c29d399be6
commit 7e517ec4a1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 9 deletions

View File

@ -514,12 +514,16 @@ func FTAggregateQuery(query string, options *FTAggregateOptions) AggregateQuery
} }
if options.Load != nil { if options.Load != nil {
queryArgs = append(queryArgs, "LOAD", len(options.Load)) queryArgs = append(queryArgs, "LOAD", len(options.Load))
index, count := len(queryArgs)-1, 0
for _, load := range options.Load { for _, load := range options.Load {
queryArgs = append(queryArgs, load.Field) queryArgs = append(queryArgs, load.Field)
count++
if load.As != "" { if load.As != "" {
queryArgs = append(queryArgs, "AS", load.As) queryArgs = append(queryArgs, "AS", load.As)
count += 2
} }
} }
queryArgs[index] = count
} }
if options.Timeout > 0 { if options.Timeout > 0 {
@ -677,12 +681,10 @@ func (cmd *AggregateCmd) String() string {
func (cmd *AggregateCmd) readReply(rd *proto.Reader) (err error) { func (cmd *AggregateCmd) readReply(rd *proto.Reader) (err error) {
data, err := rd.ReadSlice() data, err := rd.ReadSlice()
if err != nil { if err != nil {
cmd.err = err
return err return err
} }
cmd.val, err = ProcessAggregateResult(data) cmd.val, err = ProcessAggregateResult(data)
if err != nil { if err != nil {
cmd.err = err
return err return err
} }
return nil return nil
@ -713,12 +715,16 @@ func (c cmdable) FTAggregateWithArgs(ctx context.Context, index string, query st
} }
if options.Load != nil { if options.Load != nil {
args = append(args, "LOAD", len(options.Load)) args = append(args, "LOAD", len(options.Load))
index, count := len(args)-1, 0
for _, load := range options.Load { for _, load := range options.Load {
args = append(args, load.Field) args = append(args, load.Field)
count++
if load.As != "" { if load.As != "" {
args = append(args, "AS", load.As) args = append(args, "AS", load.As)
count += 2
} }
} }
args[index] = count
} }
if options.Timeout > 0 { if options.Timeout > 0 {
args = append(args, "TIMEOUT", options.Timeout) args = append(args, "TIMEOUT", options.Timeout)
@ -1420,7 +1426,7 @@ func (cmd *FTInfoCmd) readReply(rd *proto.Reader) (err error) {
} }
cmd.val, err = parseFTInfo(data) cmd.val, err = parseFTInfo(data)
if err != nil { if err != nil {
cmd.err = err return err
} }
return nil return nil
@ -1513,12 +1519,11 @@ func (cmd *FTSpellCheckCmd) RawResult() (interface{}, error) {
func (cmd *FTSpellCheckCmd) readReply(rd *proto.Reader) (err error) { func (cmd *FTSpellCheckCmd) readReply(rd *proto.Reader) (err error) {
data, err := rd.ReadSlice() data, err := rd.ReadSlice()
if err != nil { if err != nil {
cmd.err = err return err
return nil
} }
cmd.val, err = parseFTSpellCheck(data) cmd.val, err = parseFTSpellCheck(data)
if err != nil { if err != nil {
cmd.err = err return err
} }
return nil return nil
} }
@ -1702,12 +1707,11 @@ func (cmd *FTSearchCmd) RawResult() (interface{}, error) {
func (cmd *FTSearchCmd) readReply(rd *proto.Reader) (err error) { func (cmd *FTSearchCmd) readReply(rd *proto.Reader) (err error) {
data, err := rd.ReadSlice() data, err := rd.ReadSlice()
if err != nil { if err != nil {
cmd.err = err return err
return nil
} }
cmd.val, err = parseFTSearch(data, cmd.options.NoContent, cmd.options.WithScores, cmd.options.WithPayloads, cmd.options.WithSortKeys) cmd.val, err = parseFTSearch(data, cmd.options.NoContent, cmd.options.WithScores, cmd.options.WithPayloads, cmd.options.WithSortKeys)
if err != nil { if err != nil {
cmd.err = err return err
} }
return nil return nil
} }

View File

@ -269,6 +269,8 @@ var _ = Describe("RediSearch commands Resp 2", Label("search"), func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(res1.Total).To(BeEquivalentTo(int64(1))) Expect(res1.Total).To(BeEquivalentTo(int64(1)))
_, err = client.FTSearch(ctx, "idx_not_exist", "only in the body").Result()
Expect(err).To(HaveOccurred())
}) })
It("should FTSpellCheck", Label("search", "ftcreate", "ftsearch", "ftspellcheck"), func() { It("should FTSpellCheck", Label("search", "ftcreate", "ftsearch", "ftspellcheck"), func() {
@ -643,11 +645,25 @@ var _ = Describe("RediSearch commands Resp 2", Label("search"), func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(res.Rows[0].Fields["t2"]).To(BeEquivalentTo("world")) Expect(res.Rows[0].Fields["t2"]).To(BeEquivalentTo("world"))
options = &redis.FTAggregateOptions{Load: []redis.FTAggregateLoad{{Field: "t2", As: "t2alias"}}}
res, err = client.FTAggregateWithArgs(ctx, "idx1", "*", options).Result()
Expect(err).NotTo(HaveOccurred())
Expect(res.Rows[0].Fields["t2alias"]).To(BeEquivalentTo("world"))
options = &redis.FTAggregateOptions{Load: []redis.FTAggregateLoad{{Field: "t1"}, {Field: "t2", As: "t2alias"}}}
res, err = client.FTAggregateWithArgs(ctx, "idx1", "*", options).Result()
Expect(err).NotTo(HaveOccurred())
Expect(res.Rows[0].Fields["t1"]).To(BeEquivalentTo("hello"))
Expect(res.Rows[0].Fields["t2alias"]).To(BeEquivalentTo("world"))
options = &redis.FTAggregateOptions{LoadAll: true} options = &redis.FTAggregateOptions{LoadAll: true}
res, err = client.FTAggregateWithArgs(ctx, "idx1", "*", options).Result() res, err = client.FTAggregateWithArgs(ctx, "idx1", "*", options).Result()
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(res.Rows[0].Fields["t1"]).To(BeEquivalentTo("hello")) Expect(res.Rows[0].Fields["t1"]).To(BeEquivalentTo("hello"))
Expect(res.Rows[0].Fields["t2"]).To(BeEquivalentTo("world")) Expect(res.Rows[0].Fields["t2"]).To(BeEquivalentTo("world"))
_, err = client.FTAggregateWithArgs(ctx, "idx_not_exist", "*", &redis.FTAggregateOptions{}).Result()
Expect(err).To(HaveOccurred())
}) })
It("should FTAggregate with scorer and addscores", Label("search", "ftaggregate", "NonRedisEnterprise"), func() { It("should FTAggregate with scorer and addscores", Label("search", "ftaggregate", "NonRedisEnterprise"), func() {
@ -1268,6 +1284,7 @@ var _ = Describe("RediSearch commands Resp 2", Label("search"), func() {
val, err = client.FTCreate(ctx, "idx_hash", ftCreateOptions, schema...).Result() val, err = client.FTCreate(ctx, "idx_hash", ftCreateOptions, schema...).Result()
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(val).To(Equal("OK")) Expect(val).To(Equal("OK"))
WaitForIndexing(client, "idx_hash")
ftSearchOptions := &redis.FTSearchOptions{ ftSearchOptions := &redis.FTSearchOptions{
DialectVersion: 4, DialectVersion: 4,