Skip to content

Commit 9a2b170

Browse files
authored
feat: add HGetDel, HGetEX, HGetEXWithArgs, HSetEX, and HSetEXWithArgs… (#831)
* feat: add HGetDel, HGetEX, HGetEXWithArgs, HSetEX, and HSetEXWithArgs commands Signed-off-by: Tsung-Han Ho (dalaoqi) <mystes3016@gmail.com> * feat: handle nil options in HGetEXWithArgs and HSetEXWithArgs methods --------- Signed-off-by: Tsung-Han Ho (dalaoqi) <mystes3016@gmail.com>
1 parent 25a7e96 commit 9a2b170

File tree

3 files changed

+160
-0
lines changed

3 files changed

+160
-0
lines changed

rueidiscompat/adapter.go

+91
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,11 @@ type CoreCmdable interface {
175175
HPExpireTime(ctx context.Context, key string, fields ...string) *IntSliceCmd
176176
HTTL(ctx context.Context, key string, fields ...string) *IntSliceCmd
177177
HPTTL(ctx context.Context, key string, fields ...string) *IntSliceCmd
178+
HGetDel(ctx context.Context, key string, fields ...string) *StringSliceCmd
179+
HGetEX(ctx context.Context, key string, fields ...string) *StringSliceCmd
180+
HGetEXWithArgs(ctx context.Context, key string, options *HGetEXOptions, fields ...string) *StringSliceCmd
181+
HSetEX(ctx context.Context, key string, fieldsAndValues ...string) *IntCmd
182+
HSetEXWithArgs(ctx context.Context, key string, options *HSetEXOptions, fieldsAndValues ...string) *IntCmd
178183

179184
BLPop(ctx context.Context, timeout time.Duration, keys ...string) *StringSliceCmd
180185
BLMPop(ctx context.Context, timeout time.Duration, direction string, count int64, keys ...string) *KeyValuesCmd
@@ -1555,6 +1560,92 @@ func (c *Compat) HPTTL(ctx context.Context, key string, fields ...string) *IntSl
15551560
return newIntSliceCmd(resp)
15561561
}
15571562

1563+
func (c *Compat) HGetDel(ctx context.Context, key string, fields ...string) *StringSliceCmd {
1564+
cmd := c.client.B().Hgetdel().Key(key).Fields().Numfields(int64(len(fields))).Field(fields...).Build()
1565+
resp := c.client.Do(ctx, cmd)
1566+
return newStringSliceCmd(resp)
1567+
}
1568+
1569+
func (c *Compat) HGetEX(ctx context.Context, key string, fields ...string) *StringSliceCmd {
1570+
cmd := c.client.B().Hgetex().Key(key).Fields().Numfields(int64(len(fields))).Field(fields...).Build()
1571+
resp := c.client.Do(ctx, cmd)
1572+
return newStringSliceCmd(resp)
1573+
}
1574+
1575+
func (c *Compat) HGetEXWithArgs(ctx context.Context, key string, options *HGetEXOptions, fields ...string) *StringSliceCmd {
1576+
if options == nil {
1577+
return c.HGetEX(ctx, key, fields...)
1578+
}
1579+
1580+
var cmd rueidis.Completed
1581+
if options.ExpirationType == HGetEXExpirationEX {
1582+
cmd = c.client.B().Hgetex().Key(key).Ex(options.ExpirationVal).Fields().Numfields(int64(len(fields))).Field(fields...).Build()
1583+
} else if options.ExpirationType == HGetEXExpirationPX {
1584+
cmd = c.client.B().Hgetex().Key(key).Px(options.ExpirationVal).Fields().Numfields(int64(len(fields))).Field(fields...).Build()
1585+
} else if options.ExpirationType == HGetEXExpirationEXAT {
1586+
cmd = c.client.B().Hgetex().Key(key).Exat(options.ExpirationVal).Fields().Numfields(int64(len(fields))).Field(fields...).Build()
1587+
} else if options.ExpirationType == HGetEXExpirationPXAT {
1588+
cmd = c.client.B().Hgetex().Key(key).Pxat(options.ExpirationVal).Fields().Numfields(int64(len(fields))).Field(fields...).Build()
1589+
} else if options.ExpirationType == HGetEXExpirationPERSIST {
1590+
cmd = c.client.B().Hgetex().Key(key).Persist().Fields().Numfields(int64(len(fields))).Field(fields...).Build()
1591+
}
1592+
resp := c.client.Do(ctx, cmd)
1593+
return newStringSliceCmd(resp)
1594+
}
1595+
1596+
func (c *Compat) HSetEX(ctx context.Context, key string, fieldsAndValues ...string) *IntCmd {
1597+
partial := c.client.B().Hsetex().Key(key).Fields().Numfields(int64(len(fieldsAndValues) / 2)).FieldValue()
1598+
1599+
for i := 0; i < len(fieldsAndValues); i += 2 {
1600+
partial = partial.FieldValue(fieldsAndValues[i], fieldsAndValues[i+1])
1601+
}
1602+
cmd := partial.Build()
1603+
1604+
resp := c.client.Do(ctx, cmd)
1605+
return newIntCmd(resp)
1606+
}
1607+
1608+
func (c *Compat) HSetEXWithArgs(ctx context.Context, key string, options *HSetEXOptions, fieldsAndValues ...string) *IntCmd {
1609+
if options == nil {
1610+
return c.HSetEX(ctx, key, fieldsAndValues...)
1611+
}
1612+
1613+
var partial cmds.HsetexFieldValue
1614+
if options.Condition == HSetEXFNX {
1615+
if options.ExpirationType == HSetEXExpirationEX {
1616+
partial = c.client.B().Hsetex().Key(key).Fnx().Ex(options.ExpirationVal).Fields().Numfields(int64(len(fieldsAndValues) / 2)).FieldValue()
1617+
} else if options.ExpirationType == HSetEXExpirationPX {
1618+
partial = c.client.B().Hsetex().Key(key).Fnx().Px(options.ExpirationVal).Fields().Numfields(int64(len(fieldsAndValues) / 2)).FieldValue()
1619+
} else if options.ExpirationType == HSetEXExpirationEXAT {
1620+
partial = c.client.B().Hsetex().Key(key).Fnx().Exat(options.ExpirationVal).Fields().Numfields(int64(len(fieldsAndValues) / 2)).FieldValue()
1621+
} else if options.ExpirationType == HSetEXExpirationPXAT {
1622+
partial = c.client.B().Hsetex().Key(key).Fnx().Pxat(options.ExpirationVal).Fields().Numfields(int64(len(fieldsAndValues) / 2)).FieldValue()
1623+
} else if options.ExpirationType == HSetEXExpirationKEEPTTL {
1624+
partial = c.client.B().Hsetex().Key(key).Fnx().Keepttl().Fields().Numfields(int64(len(fieldsAndValues) / 2)).FieldValue()
1625+
}
1626+
} else if options.Condition == HSetEXFXX {
1627+
if options.ExpirationType == HSetEXExpirationEX {
1628+
partial = c.client.B().Hsetex().Key(key).Fxx().Ex(options.ExpirationVal).Fields().Numfields(int64(len(fieldsAndValues) / 2)).FieldValue()
1629+
} else if options.ExpirationType == HSetEXExpirationPX {
1630+
partial = c.client.B().Hsetex().Key(key).Fxx().Px(options.ExpirationVal).Fields().Numfields(int64(len(fieldsAndValues) / 2)).FieldValue()
1631+
} else if options.ExpirationType == HSetEXExpirationEXAT {
1632+
partial = c.client.B().Hsetex().Key(key).Fxx().Exat(options.ExpirationVal).Fields().Numfields(int64(len(fieldsAndValues) / 2)).FieldValue()
1633+
} else if options.ExpirationType == HSetEXExpirationPXAT {
1634+
partial = c.client.B().Hsetex().Key(key).Fxx().Pxat(options.ExpirationVal).Fields().Numfields(int64(len(fieldsAndValues) / 2)).FieldValue()
1635+
} else if options.ExpirationType == HSetEXExpirationKEEPTTL {
1636+
partial = c.client.B().Hsetex().Key(key).Fxx().Keepttl().Fields().Numfields(int64(len(fieldsAndValues) / 2)).FieldValue()
1637+
}
1638+
}
1639+
1640+
for i := 0; i < len(fieldsAndValues); i += 2 {
1641+
partial = partial.FieldValue(fieldsAndValues[i], fieldsAndValues[i+1])
1642+
}
1643+
1644+
cmd := partial.Build()
1645+
resp := c.client.Do(ctx, cmd)
1646+
return newIntCmd(resp)
1647+
}
1648+
15581649
func (c *Compat) BLPop(ctx context.Context, timeout time.Duration, keys ...string) *StringSliceCmd {
15591650
cmd := c.client.B().Blpop().Key(keys...).Timeout(float64(formatSec(timeout))).Build()
15601651
resp := c.client.Do(ctx, cmd)

rueidiscompat/command.go

+39
Original file line numberDiff line numberDiff line change
@@ -2153,6 +2153,45 @@ type HExpireArgs struct {
21532153
LT bool
21542154
}
21552155

2156+
// ExpirationType represents an expiration option for the HGETEX command.
2157+
type HGetEXExpirationType string
2158+
2159+
const (
2160+
HGetEXExpirationEX HGetEXExpirationType = "EX"
2161+
HGetEXExpirationPX HGetEXExpirationType = "PX"
2162+
HGetEXExpirationEXAT HGetEXExpirationType = "EXAT"
2163+
HGetEXExpirationPXAT HGetEXExpirationType = "PXAT"
2164+
HGetEXExpirationPERSIST HGetEXExpirationType = "PERSIST"
2165+
)
2166+
2167+
type HSetEXCondition string
2168+
2169+
const (
2170+
HSetEXFNX HSetEXCondition = "FNX"
2171+
HSetEXFXX HSetEXCondition = "FXX"
2172+
)
2173+
2174+
type HGetEXOptions struct {
2175+
ExpirationType HGetEXExpirationType
2176+
ExpirationVal int64
2177+
}
2178+
2179+
type HSetEXExpirationType string
2180+
2181+
const (
2182+
HSetEXExpirationEX HSetEXExpirationType = "EX"
2183+
HSetEXExpirationPX HSetEXExpirationType = "PX"
2184+
HSetEXExpirationEXAT HSetEXExpirationType = "EXAT"
2185+
HSetEXExpirationPXAT HSetEXExpirationType = "PXAT"
2186+
HSetEXExpirationKEEPTTL HSetEXExpirationType = "KEEPTTL"
2187+
)
2188+
2189+
type HSetEXOptions struct {
2190+
Condition HSetEXCondition
2191+
ExpirationType HSetEXExpirationType
2192+
ExpirationVal int64
2193+
}
2194+
21562195
type Sort struct {
21572196
By string
21582197
Order string

rueidiscompat/pipeline.go

+30
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,36 @@ func (c *Pipeline) HPTTL(ctx context.Context, key string, fields ...string) *Int
751751
return ret
752752
}
753753

754+
func (c *Pipeline) HGetDel(ctx context.Context, key string, fields ...string) *StringSliceCmd {
755+
ret := c.comp.HGetDel(ctx, key, fields...)
756+
c.rets = append(c.rets, ret)
757+
return ret
758+
}
759+
760+
func (c *Pipeline) HGetEX(ctx context.Context, key string, fields ...string) *StringSliceCmd {
761+
ret := c.comp.HGetEX(ctx, key, fields...)
762+
c.rets = append(c.rets, ret)
763+
return ret
764+
}
765+
766+
func (c *Pipeline) HGetEXWithArgs(ctx context.Context, key string, options *HGetEXOptions, fields ...string) *StringSliceCmd {
767+
ret := c.comp.HGetEXWithArgs(ctx, key, options, fields...)
768+
c.rets = append(c.rets, ret)
769+
return ret
770+
}
771+
772+
func (c *Pipeline) HSetEX(ctx context.Context, key string, fieldsAndValues ...string) *IntCmd {
773+
ret := c.comp.HSetEX(ctx, key, fieldsAndValues...)
774+
c.rets = append(c.rets, ret)
775+
return ret
776+
}
777+
778+
func (c *Pipeline) HSetEXWithArgs(ctx context.Context, key string, options *HSetEXOptions, fieldsAndValues ...string) *IntCmd {
779+
ret := c.comp.HSetEXWithArgs(ctx, key, options, fieldsAndValues...)
780+
c.rets = append(c.rets, ret)
781+
return ret
782+
}
783+
754784
func (c *Pipeline) BLPop(ctx context.Context, timeout time.Duration, keys ...string) *StringSliceCmd {
755785
ret := c.comp.BLPop(ctx, timeout, keys...)
756786
c.rets = append(c.rets, ret)

0 commit comments

Comments
 (0)