redict/tests/support/response_transformers.tcl
Drew DeVault 50ee0f5be8 all: let's go LGPL over GPL
Based on feedback from interested parties
2024-03-21 20:11:44 +01:00

97 lines
3.1 KiB
Tcl

# Copyright (C) 2009-2023 Redict Ltd.
# SPDX-FileCopyrightText: 2024 Redict Contributors
# SPDX-FileCopyrightText: 2024 Salvatore Sanfilippo <antirez at gmail dot com>
#
# SPDX-License-Identifier: BSD-3-Clause
# SPDX-License-Identifier: LGPL-3.0-only
package require Tcl 8.5
namespace eval response_transformers {}
# Transform a map response into an array of tuples (tuple = array with 2 elements)
# Used for XREAD[GROUP]
proc transfrom_map_to_tupple_array {argv response} {
set tuparray {}
foreach {key val} $response {
set tmp {}
lappend tmp $key
lappend tmp $val
lappend tuparray $tmp
}
return $tuparray
}
# Transform an array of tuples to a flat array
proc transfrom_tuple_array_to_flat_array {argv response} {
set flatarray {}
foreach pair $response {
lappend flatarray {*}$pair
}
return $flatarray
}
# With HRANDFIELD, we only need to transform the response if the request had WITHVALUES
# (otherwise the returned response is a flat array in both RESPs)
proc transfrom_hrandfield_command {argv response} {
foreach ele $argv {
if {[string compare -nocase $ele "WITHVALUES"] == 0} {
return [transfrom_tuple_array_to_flat_array $argv $response]
}
}
return $response
}
# With some zset commands, we only need to transform the response if the request had WITHSCORES
# (otherwise the returned response is a flat array in both RESPs)
proc transfrom_zset_withscores_command {argv response} {
foreach ele $argv {
if {[string compare -nocase $ele "WITHSCORES"] == 0} {
return [transfrom_tuple_array_to_flat_array $argv $response]
}
}
return $response
}
# With ZPOPMIN/ZPOPMAX, we only need to transform the response if the request had COUNT (3rd arg)
# (otherwise the returned response is a flat array in both RESPs)
proc transfrom_zpopmin_zpopmax {argv response} {
if {[llength $argv] == 3} {
return [transfrom_tuple_array_to_flat_array $argv $response]
}
return $response
}
set ::trasformer_funcs {
XREAD transfrom_map_to_tupple_array
XREADGROUP transfrom_map_to_tupple_array
HRANDFIELD transfrom_hrandfield_command
ZRANDMEMBER transfrom_zset_withscores_command
ZRANGE transfrom_zset_withscores_command
ZRANGEBYSCORE transfrom_zset_withscores_command
ZRANGEBYLEX transfrom_zset_withscores_command
ZREVRANGE transfrom_zset_withscores_command
ZREVRANGEBYSCORE transfrom_zset_withscores_command
ZREVRANGEBYLEX transfrom_zset_withscores_command
ZUNION transfrom_zset_withscores_command
ZDIFF transfrom_zset_withscores_command
ZINTER transfrom_zset_withscores_command
ZPOPMIN transfrom_zpopmin_zpopmax
ZPOPMAX transfrom_zpopmin_zpopmax
}
proc ::response_transformers::transform_response_if_needed {id argv response} {
if {![::redict::should_transform_to_resp2 $id] || $::redict::readraw($id)} {
return $response
}
set key [string toupper [lindex $argv 0]]
if {![dict exists $::trasformer_funcs $key]} {
return $response
}
set transform [dict get $::trasformer_funcs $key]
return [$transform $argv $response]
}