mirror of https://github.com/go-redis/redis.git
Compare commits
1 Commits
7e6a725360
...
ca352ceb1d
Author | SHA1 | Date |
---|---|---|
Flc゛ | ca352ceb1d |
|
@ -54,7 +54,6 @@ stunnel
|
||||||
SynDump
|
SynDump
|
||||||
TCP
|
TCP
|
||||||
TLS
|
TLS
|
||||||
UnstableResp
|
|
||||||
uri
|
uri
|
||||||
URI
|
URI
|
||||||
url
|
url
|
||||||
|
@ -63,5 +62,3 @@ RedisStack
|
||||||
RedisGears
|
RedisGears
|
||||||
RedisTimeseries
|
RedisTimeseries
|
||||||
RediSearch
|
RediSearch
|
||||||
RawResult
|
|
||||||
RawVal
|
|
15
README.md
15
README.md
|
@ -186,21 +186,6 @@ rdb := redis.NewClient(&redis.Options{
|
||||||
#### Unstable RESP3 Structures for RediSearch Commands
|
#### Unstable RESP3 Structures for RediSearch Commands
|
||||||
When integrating Redis with application functionalities using RESP3, it's important to note that some response structures aren't final yet. This is especially true for more complex structures like search and query results. We recommend using RESP2 when using the search and query capabilities, but we plan to stabilize the RESP3-based API-s in the coming versions. You can find more guidance in the upcoming release notes.
|
When integrating Redis with application functionalities using RESP3, it's important to note that some response structures aren't final yet. This is especially true for more complex structures like search and query results. We recommend using RESP2 when using the search and query capabilities, but we plan to stabilize the RESP3-based API-s in the coming versions. You can find more guidance in the upcoming release notes.
|
||||||
|
|
||||||
To enable unstable RESP3, set the option in your client configuration:
|
|
||||||
|
|
||||||
```go
|
|
||||||
redis.NewClient(&redis.Options{
|
|
||||||
UnstableResp3: true,
|
|
||||||
})
|
|
||||||
```
|
|
||||||
**Note:** When UnstableResp3 mode is enabled, it's necessary to use RawResult() and RawVal() to retrieve a raw data.
|
|
||||||
Since, raw response is the only option for unstable search commands Val() and Result() calls wouldn't have any affect on them:
|
|
||||||
|
|
||||||
```go
|
|
||||||
res1, err := client.FTSearchWithArgs(ctx, "txt", "foo bar", &redis.FTSearchOptions{}).RawResult()
|
|
||||||
val1 := client.FTSearchWithArgs(ctx, "txt", "foo bar", &redis.FTSearchOptions{}).RawVal()
|
|
||||||
```
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Please see [out contributing guidelines](CONTRIBUTING.md) to help us improve this library!
|
Please see [out contributing guidelines](CONTRIBUTING.md) to help us improve this library!
|
||||||
|
|
54
command.go
54
command.go
|
@ -1403,63 +1403,27 @@ func (cmd *MapStringSliceInterfaceCmd) Val() map[string][]interface{} {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cmd *MapStringSliceInterfaceCmd) readReply(rd *proto.Reader) (err error) {
|
func (cmd *MapStringSliceInterfaceCmd) readReply(rd *proto.Reader) (err error) {
|
||||||
readType, err := rd.PeekReplyType()
|
n, err := rd.ReadMapLen()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
cmd.val = make(map[string][]interface{}, n)
|
||||||
cmd.val = make(map[string][]interface{})
|
for i := 0; i < n; i++ {
|
||||||
|
k, err := rd.ReadString()
|
||||||
if readType == proto.RespMap {
|
|
||||||
n, err := rd.ReadMapLen()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for i := 0; i < n; i++ {
|
nn, err := rd.ReadArrayLen()
|
||||||
k, err := rd.ReadString()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
nn, err := rd.ReadArrayLen()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
cmd.val[k] = make([]interface{}, nn)
|
|
||||||
for j := 0; j < nn; j++ {
|
|
||||||
value, err := rd.ReadReply()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
cmd.val[k][j] = value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if readType == proto.RespArray {
|
|
||||||
// RESP2 response
|
|
||||||
n, err := rd.ReadArrayLen()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
cmd.val[k] = make([]interface{}, nn)
|
||||||
for i := 0; i < n; i++ {
|
for j := 0; j < nn; j++ {
|
||||||
// Each entry in this array is itself an array with key details
|
value, err := rd.ReadReply()
|
||||||
itemLen, err := rd.ReadArrayLen()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
cmd.val[k][j] = value
|
||||||
key, err := rd.ReadString()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
cmd.val[key] = make([]interface{}, 0, itemLen-1)
|
|
||||||
for j := 1; j < itemLen; j++ {
|
|
||||||
// Read the inner array for timestamp-value pairs
|
|
||||||
data, err := rd.ReadReply()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
cmd.val[key] = append(cmd.val[key], data)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -319,69 +319,37 @@ func (cmd *BFInfoCmd) Result() (BFInfo, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cmd *BFInfoCmd) readReply(rd *proto.Reader) (err error) {
|
func (cmd *BFInfoCmd) readReply(rd *proto.Reader) (err error) {
|
||||||
result := BFInfo{}
|
n, err := rd.ReadMapLen()
|
||||||
|
|
||||||
// Create a mapping from key names to pointers of struct fields
|
|
||||||
respMapping := map[string]*int64{
|
|
||||||
"Capacity": &result.Capacity,
|
|
||||||
"CAPACITY": &result.Capacity,
|
|
||||||
"Size": &result.Size,
|
|
||||||
"SIZE": &result.Size,
|
|
||||||
"Number of filters": &result.Filters,
|
|
||||||
"FILTERS": &result.Filters,
|
|
||||||
"Number of items inserted": &result.ItemsInserted,
|
|
||||||
"ITEMS": &result.ItemsInserted,
|
|
||||||
"Expansion rate": &result.ExpansionRate,
|
|
||||||
"EXPANSION": &result.ExpansionRate,
|
|
||||||
}
|
|
||||||
|
|
||||||
// Helper function to read and assign a value based on the key
|
|
||||||
readAndAssignValue := func(key string) error {
|
|
||||||
fieldPtr, exists := respMapping[key]
|
|
||||||
if !exists {
|
|
||||||
return fmt.Errorf("redis: BLOOM.INFO unexpected key %s", key)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read the integer and assign to the field via pointer dereferencing
|
|
||||||
val, err := rd.ReadInt()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
*fieldPtr = val
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
readType, err := rd.PeekReplyType()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(cmd.args) > 2 && readType == proto.RespArray {
|
var key string
|
||||||
n, err := rd.ReadArrayLen()
|
var result BFInfo
|
||||||
|
for f := 0; f < n; f++ {
|
||||||
|
key, err = rd.ReadString()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if key, ok := cmd.args[2].(string); ok && n == 1 {
|
|
||||||
if err := readAndAssignValue(key); err != nil {
|
switch key {
|
||||||
return err
|
case "Capacity":
|
||||||
}
|
result.Capacity, err = rd.ReadInt()
|
||||||
} else {
|
case "Size":
|
||||||
return fmt.Errorf("redis: BLOOM.INFO invalid argument key type")
|
result.Size, err = rd.ReadInt()
|
||||||
|
case "Number of filters":
|
||||||
|
result.Filters, err = rd.ReadInt()
|
||||||
|
case "Number of items inserted":
|
||||||
|
result.ItemsInserted, err = rd.ReadInt()
|
||||||
|
case "Expansion rate":
|
||||||
|
result.ExpansionRate, err = rd.ReadInt()
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("redis: BLOOM.INFO unexpected key %s", key)
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
n, err := rd.ReadMapLen()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
key, err := rd.ReadString()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := readAndAssignValue(key); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.val = result
|
cmd.val = result
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue