optimize redis test data lua shell

This commit is contained in:
douxu 2025-12-04 17:26:35 +08:00
parent b99c03296a
commit 46e72ce588
6 changed files with 1170 additions and 186 deletions

View File

@ -4,21 +4,37 @@ package constants
const ( const (
// RedisAllGridSetKey define redis set key which store all grid keys // RedisAllGridSetKey define redis set key which store all grid keys
RedisAllGridSetKey = "grid_keys" RedisAllGridSetKey = "grid_keys"
// RedisSpecGridZoneSetKey define redis set key which store all zone keys under specific grid
RedisSpecGridZoneSetKey = "grid_%s_zones_keys"
// RedisAllZoneSetKey define redis set key which store all zone keys // RedisAllZoneSetKey define redis set key which store all zone keys
RedisAllZoneSetKey = "zone_keys" RedisAllZoneSetKey = "zone_keys"
// RedisSpecZoneStationSetKey define redis set key which store all station keys under specific zone
RedisSpecZoneStationSetKey = "zone_%s_stations_keys"
// RedisAllStationSetKey define redis set key which store all station keys // RedisAllStationSetKey define redis set key which store all station keys
RedisAllStationSetKey = "station_keys" RedisAllStationSetKey = "station_keys"
// RedisSpecStationComponentSetKey define redis set key which store all component keys under specific station
RedisSpecStationComponentSetKey = "station_%s_components_keys"
// RedisAllComponentSetKey define redis set key which store all component keys // RedisAllCompNSPathSetKey define redis set key which store all component nspath keys
RedisAllComponentSetKey = "component_keys" RedisAllCompNSPathSetKey = "component_nspath_keys"
// RedisSpecComponentSetKey define redis set key which store all component keys under specific zone
RedisSpecComponentSetKey = "zone_%s_components_keys" // RedisAllCompTagSetKey define redis set key which store all component tag keys
RedisAllCompTagSetKey = "component_tag_keys"
// RedisAllConfigSetKey define redis set key which store all config keys
RedisAllConfigSetKey = "config_keys"
// RedisAllMeasTagSetKey define redis set key which store all measurement tag keys
RedisAllMeasTagSetKey = "measurement_tag_keys"
// RedisSpecGridZoneSetKey define redis set key which store all zone keys under specific grid
RedisSpecGridZoneSetKey = "%s_zones_keys"
// RedisSpecZoneStationSetKey define redis set key which store all station keys under specific zone
RedisSpecZoneStationSetKey = "%s_stations_keys"
// RedisSpecStationCompNSPATHSetKey define redis set key which store all component nspath keys under specific station
RedisSpecStationCompNSPATHSetKey = "%s_components_nspath_keys"
// RedisSpecStationCompTagSetKey define redis set key which store all component tag keys under specific station
RedisSpecStationCompTagSetKey = "%s_components_tag_keys"
// RedisSpecCompTagMeasSetKey define redis set key which store all measurement keys under specific component tag
RedisSpecCompTagMeasSetKey = "%s_measurement_keys"
) )

View File

@ -172,25 +172,777 @@ VALUES (
Redis数据脚本 Redis数据脚本
```Lua ```Lua
redis.call('SADD', 'grid_keys', 'transformfeeder1_220', 'transformfeeder1_220_35', 'transformfeeder1_220_36') redis.call('SADD', 'grid_keys', 'grid1', 'grid2', 'grid3')
redis.call('SADD', 'grid_transformfeeder1_220_zones_keys', 'I_A_rms', 'I_B_rms', 'I_C_rms') redis.call('SADD', 'zone_keys', 'zone1_1', 'zone1_2', 'zone1_3', 'zone2_1', 'zone2_2', 'zone2_3', 'zone3_1', 'zone3_2', 'zone3_3')
redis.call('SADD', 'grid_transformfeeder1_220_35_zones_keys', 'I_A_rms', 'I_B_rms', 'I_C_rms') redis.call('SADD', 'station_keys', 'station1_1_1', 'station1_1_2', 'station1_1_3', 'station1_2_1', 'station1_2_2', 'station1_2_3', 'station1_3_1', 'station1_3_2', 'station1_3_3')
redis.call('SADD', 'grid_transformfeeder1_220_36_zones_keys', 'I_A_rms', 'I_B_rms', 'I_C_rms') redis.call('SADD', 'station_keys', 'station2_1_1', 'station2_1_2', 'station2_1_3', 'station2_2_1', 'station2_2_2', 'station2_2_3', 'station2_3_1', 'station2_3_2', 'station2_3_3')
redis.call('SADD', 'station_keys', 'station3_1_1', 'station3_1_2', 'station3_1_3', 'station3_2_1', 'station3_2_2', 'station3_2_3', 'station3_3_1', 'station3_3_2', 'station3_3_3')
redis.call('SADD', 'component_nspath_keys',
-- 对应 station1_1_1
'ns1_1_1_1', 'ns1_1_1_2', 'ns1_1_1_3',
-- 对应 station1_1_2
'ns1_1_2_1', 'ns1_1_2_2', 'ns1_1_2_3',
-- 对应 station1_1_3
'ns1_1_3_1', 'ns1_1_3_2', 'ns1_1_3_3',
-- 对应 station1_2_1
'ns1_2_1_1', 'ns1_2_1_2', 'ns1_2_1_3',
-- 对应 station1_2_2
'ns1_2_2_1', 'ns1_2_2_2', 'ns1_2_2_3',
-- 对应 station1_2_3
'ns1_2_3_1', 'ns1_2_3_2', 'ns1_2_3_3',
-- 对应 station1_3_1
'ns1_3_1_1', 'ns1_3_1_2', 'ns1_3_1_3',
-- 对应 station1_3_2
'ns1_3_2_1', 'ns1_3_2_2', 'ns1_3_2_3',
-- 对应 station1_3_3
'ns1_3_3_1', 'ns1_3_3_2', 'ns1_3_3_3'
)
redis.call('SADD', 'component_nspath_keys',
-- 对应 station2_1_1
'ns2_1_1_1', 'ns2_1_1_2', 'ns2_1_1_3',
-- 对应 station2_1_2
'ns2_1_2_1', 'ns2_1_2_2', 'ns2_1_2_3',
-- 对应 station2_1_3
'ns2_1_3_1', 'ns2_1_3_2', 'ns2_1_3_3',
-- 对应 station2_2_1
'ns2_2_1_1', 'ns2_2_1_2', 'ns2_2_1_3',
-- 对应 station2_2_2
'ns2_2_2_1', 'ns2_2_2_2', 'ns2_2_2_3',
-- 对应 station2_2_3
'ns2_2_3_1', 'ns2_2_3_2', 'ns2_2_3_3',
-- 对应 station2_3_1
'ns2_3_1_1', 'ns2_3_1_2', 'ns2_3_1_3',
-- 对应 station2_3_2
'ns2_3_2_1', 'ns2_3_2_2', 'ns2_3_2_3',
-- 对应 station2_3_3
'ns2_3_3_1', 'ns2_3_3_2', 'ns2_3_3_3'
)
redis.call('SADD', 'component_nspath_keys',
-- 对应 station3_1_1
'ns3_1_1_1', 'ns3_1_1_2', 'ns3_1_1_3',
-- 对应 station3_1_2
'ns3_1_2_1', 'ns3_1_2_2', 'ns3_1_2_3',
-- 对应 station3_1_3
'ns3_1_3_1', 'ns3_1_3_2', 'ns3_1_3_3',
-- 对应 station3_2_1
'ns3_2_1_1', 'ns3_2_1_2', 'ns3_2_1_3',
-- 对应 station3_2_2
'ns3_2_2_1', 'ns3_2_2_2', 'ns3_2_2_3',
-- 对应 station3_2_3
'ns3_2_3_1', 'ns3_2_3_2', 'ns3_2_3_3',
-- 对应 station3_3_1
'ns3_3_1_1', 'ns3_3_1_2', 'ns3_3_1_3',
-- 对应 station3_3_2
'ns3_3_2_1', 'ns3_3_2_2', 'ns3_3_2_3',
-- 对应 station3_3_3
'ns3_3_3_1', 'ns3_3_3_2', 'ns3_3_3_3'
)
redis.call('SADD', 'component_tag_keys',
'cmptag1_1_1_1_1', 'cmptag1_1_1_1_2', 'cmptag1_1_1_1_3',
'cmptag1_1_1_2_1', 'cmptag1_1_1_2_2', 'cmptag1_1_1_2_3',
'cmptag1_1_1_3_1', 'cmptag1_1_1_3_2', 'cmptag1_1_1_3_3',
'cmptag1_1_2_1_1', 'cmptag1_1_2_1_2', 'cmptag1_1_2_1_3',
'cmptag1_1_2_2_1', 'cmptag1_1_2_2_2', 'cmptag1_1_2_2_3',
'cmptag1_1_2_3_1', 'cmptag1_1_2_3_2', 'cmptag1_1_2_3_3',
'cmptag1_1_3_1_1', 'cmptag1_1_3_1_2', 'cmptag1_1_3_1_3',
'cmptag1_1_3_2_1', 'cmptag1_1_3_2_2', 'cmptag1_1_3_2_3',
'cmptag1_1_3_3_1', 'cmptag1_1_3_3_2', 'cmptag1_1_3_3_3',
'cmptag1_2_1_1_1', 'cmptag1_2_1_1_2', 'cmptag1_2_1_1_3',
'cmptag1_2_1_2_1', 'cmptag1_2_1_2_2', 'cmptag1_2_1_2_3',
'cmptag1_2_1_3_1', 'cmptag1_2_1_3_2', 'cmptag1_2_1_3_3',
'cmptag1_2_2_1_1', 'cmptag1_2_2_1_2', 'cmptag1_2_2_1_3',
'cmptag1_2_2_2_1', 'cmptag1_2_2_2_2', 'cmptag1_2_2_2_3',
'cmptag1_2_2_3_1', 'cmptag1_2_2_3_2', 'cmptag1_2_2_3_3',
'cmptag1_2_3_1_1', 'cmptag1_2_3_1_2', 'cmptag1_2_3_1_3',
'cmptag1_2_3_2_1', 'cmptag1_2_3_2_2', 'cmptag1_2_3_2_3',
'cmptag1_2_3_3_1', 'cmptag1_2_3_3_2', 'cmptag1_2_3_3_3',
'cmptag1_3_1_1_1', 'cmptag1_3_1_1_2', 'cmptag1_3_1_1_3',
'cmptag1_3_1_2_1', 'cmptag1_3_1_2_2', 'cmptag1_3_1_2_3',
'cmptag1_3_1_3_1', 'cmptag1_3_1_3_2', 'cmptag1_3_1_3_3',
'cmptag1_3_2_1_1', 'cmptag1_3_2_1_2', 'cmptag1_3_2_1_3',
'cmptag1_3_2_2_1', 'cmptag1_3_2_2_2', 'cmptag1_3_2_2_3',
'cmptag1_3_2_3_1', 'cmptag1_3_2_3_2', 'cmptag1_3_2_3_3',
'cmptag1_3_3_1_1', 'cmptag1_3_3_1_2', 'cmptag1_3_3_1_3',
'cmptag1_3_3_2_1', 'cmptag1_3_3_2_2', 'cmptag1_3_3_2_3',
'cmptag1_3_3_3_1', 'cmptag1_3_3_3_2', 'cmptag1_3_3_3_3'
)
redis.call('SADD', 'component_tag_keys',
'cmptag2_1_1_1_1', 'cmptag2_1_1_1_2', 'cmptag2_1_1_1_3',
'cmptag2_1_1_2_1', 'cmptag2_1_1_2_2', 'cmptag2_1_1_2_3',
'cmptag2_1_1_3_1', 'cmptag2_1_1_3_2', 'cmptag2_1_1_3_3',
'cmptag2_1_2_1_1', 'cmptag2_1_2_1_2', 'cmptag2_1_2_1_3',
'cmptag2_1_2_2_1', 'cmptag2_1_2_2_2', 'cmptag2_1_2_2_3',
'cmptag2_1_2_3_1', 'cmptag2_1_2_3_2', 'cmptag2_1_2_3_3',
'cmptag2_1_3_1_1', 'cmptag2_1_3_1_2', 'cmptag2_1_3_1_3',
'cmptag2_1_3_2_1', 'cmptag2_1_3_2_2', 'cmptag2_1_3_2_3',
'cmptag2_1_3_3_1', 'cmptag2_1_3_3_2', 'cmptag2_1_3_3_3',
'cmptag2_2_1_1_1', 'cmptag2_2_1_1_2', 'cmptag2_2_1_1_3',
'cmptag2_2_1_2_1', 'cmptag2_2_1_2_2', 'cmptag2_2_1_2_3',
'cmptag2_2_1_3_1', 'cmptag2_2_1_3_2', 'cmptag2_2_1_3_3',
'cmptag2_2_2_1_1', 'cmptag2_2_2_1_2', 'cmptag2_2_2_1_3',
'cmptag2_2_2_2_1', 'cmptag2_2_2_2_2', 'cmptag2_2_2_2_3',
'cmptag2_2_2_3_1', 'cmptag2_2_2_3_2', 'cmptag2_2_2_3_3',
'cmptag2_2_3_1_1', 'cmptag2_2_3_1_2', 'cmptag2_2_3_1_3',
'cmptag2_2_3_2_1', 'cmptag2_2_3_2_2', 'cmptag2_2_3_2_3',
'cmptag2_2_3_3_1', 'cmptag2_2_3_3_2', 'cmptag2_2_3_3_3',
'cmptag2_3_1_1_1', 'cmptag2_3_1_1_2', 'cmptag2_3_1_1_3',
'cmptag2_3_1_2_1', 'cmptag2_3_1_2_2', 'cmptag2_3_1_2_3',
'cmptag2_3_1_3_1', 'cmptag2_3_1_3_2', 'cmptag2_3_1_3_3',
'cmptag2_3_2_1_1', 'cmptag2_3_2_1_2', 'cmptag2_3_2_1_3',
'cmptag2_3_2_2_1', 'cmptag2_3_2_2_2', 'cmptag2_3_2_2_3',
'cmptag2_3_2_3_1', 'cmptag2_3_2_3_2', 'cmptag2_3_2_3_3',
'cmptag2_3_3_1_1', 'cmptag2_3_3_1_2', 'cmptag2_3_3_1_3',
'cmptag2_3_3_2_1', 'cmptag2_3_3_2_2', 'cmptag2_3_3_2_3',
'cmptag2_3_3_3_1', 'cmptag2_3_3_3_2', 'cmptag2_3_3_3_3'
)
redis.call('SADD', 'component_tag_keys',
'cmptag3_1_1_1_1', 'cmptag3_1_1_1_2', 'cmptag3_1_1_1_3',
'cmptag3_1_1_2_1', 'cmptag3_1_1_2_2', 'cmptag3_1_1_2_3',
'cmptag3_1_1_3_1', 'cmptag3_1_1_3_2', 'cmptag3_1_1_3_3',
'cmptag3_1_2_1_1', 'cmptag3_1_2_1_2', 'cmptag3_1_2_1_3',
'cmptag3_1_2_2_1', 'cmptag3_1_2_2_2', 'cmptag3_1_2_2_3',
'cmptag3_1_2_3_1', 'cmptag3_1_2_3_2', 'cmptag3_1_2_3_3',
'cmptag3_1_3_1_1', 'cmptag3_1_3_1_2', 'cmptag3_1_3_1_3',
'cmptag3_1_3_2_1', 'cmptag3_1_3_2_2', 'cmptag3_1_3_2_3',
'cmptag3_1_3_3_1', 'cmptag3_1_3_3_2', 'cmptag3_1_3_3_3',
'cmptag3_2_1_1_1', 'cmptag3_2_1_1_2', 'cmptag3_2_1_1_3',
'cmptag3_2_1_2_1', 'cmptag3_2_1_2_2', 'cmptag3_2_1_2_3',
'cmptag3_2_1_3_1', 'cmptag3_2_1_3_2', 'cmptag3_2_1_3_3',
'cmptag3_2_2_1_1', 'cmptag3_2_2_1_2', 'cmptag3_2_2_1_3',
'cmptag3_2_2_2_1', 'cmptag3_2_2_2_2', 'cmptag3_2_2_2_3',
'cmptag3_2_2_3_1', 'cmptag3_2_2_3_2', 'cmptag3_2_2_3_3',
'cmptag3_2_3_1_1', 'cmptag3_2_3_1_2', 'cmptag3_2_3_1_3',
'cmptag3_2_3_2_1', 'cmptag3_2_3_2_2', 'cmptag3_2_3_2_3',
'cmptag3_2_3_3_1', 'cmptag3_2_3_3_2', 'cmptag3_2_3_3_3',
'cmptag3_3_1_1_1', 'cmptag3_3_1_1_2', 'cmptag3_3_1_1_3',
'cmptag3_3_1_2_1', 'cmptag3_3_1_2_2', 'cmptag3_3_1_2_3',
'cmptag3_3_1_3_1', 'cmptag3_3_1_3_2', 'cmptag3_3_1_3_3',
'cmptag3_3_2_1_1', 'cmptag3_3_2_1_2', 'cmptag3_3_2_1_3',
'cmptag3_3_2_2_1', 'cmptag3_3_2_2_2', 'cmptag3_3_2_2_3',
'cmptag3_3_2_3_1', 'cmptag3_3_2_3_2', 'cmptag3_3_2_3_3',
'cmptag3_3_3_1_1', 'cmptag3_3_3_1_2', 'cmptag3_3_3_1_3',
'cmptag3_3_3_2_1', 'cmptag3_3_3_2_2', 'cmptag3_3_3_2_3',
'cmptag3_3_3_3_1', 'cmptag3_3_3_3_2', 'cmptag3_3_3_3_3'
)
redis.call('SADD', 'config_keys', 'component', 'base_extend', 'rated', 'setup', 'model', 'stable', 'bay', 'craft', 'integrity', 'behavior')
redis.call('SADD', 'measurement_tag_keys',
'meas1_1_1_1_1_1', 'meas1_1_1_1_1_2', 'meas1_1_1_1_1_3', 'meas1_1_1_1_2_1', 'meas1_1_1_1_2_2', 'meas1_1_1_1_2_3', 'meas1_1_1_1_3_1', 'meas1_1_1_1_3_2', 'meas1_1_1_1_3_3',
'meas1_1_1_2_1_1', 'meas1_1_1_2_1_2', 'meas1_1_1_2_1_3', 'meas1_1_1_2_2_1', 'meas1_1_1_2_2_2', 'meas1_1_1_2_2_3', 'meas1_1_1_2_3_1', 'meas1_1_1_2_3_2', 'meas1_1_1_2_3_3',
'meas1_1_1_3_1_1', 'meas1_1_1_3_1_2', 'meas1_1_1_3_1_3', 'meas1_1_1_3_2_1', 'meas1_1_1_3_2_2', 'meas1_1_1_3_2_3', 'meas1_1_1_3_3_1', 'meas1_1_1_3_3_2', 'meas1_1_1_3_3_3',
'meas1_1_2_1_1_1', 'meas1_1_2_1_1_2', 'meas1_1_2_1_1_3', 'meas1_1_2_1_2_1', 'meas1_1_2_1_2_2', 'meas1_1_2_1_2_3', 'meas1_1_2_1_3_1', 'meas1_1_2_1_3_2', 'meas1_1_2_1_3_3',
'meas1_1_2_2_1_1', 'meas1_1_2_2_1_2', 'meas1_1_2_2_1_3', 'meas1_1_2_2_2_1', 'meas1_1_2_2_2_2', 'meas1_1_2_2_2_3', 'meas1_1_2_2_3_1', 'meas1_1_2_2_3_2', 'meas1_1_2_2_3_3',
'meas1_1_2_3_1_1', 'meas1_1_2_3_1_2', 'meas1_1_2_3_1_3', 'meas1_1_2_3_2_1', 'meas1_1_2_3_2_2', 'meas1_1_2_3_2_3', 'meas1_1_2_3_3_1', 'meas1_1_2_3_3_2', 'meas1_1_2_3_3_3',
'meas1_1_3_1_1_1', 'meas1_1_3_1_1_2', 'meas1_1_3_1_1_3', 'meas1_1_3_1_2_1', 'meas1_1_3_1_2_2', 'meas1_1_3_1_2_3', 'meas1_1_3_1_3_1', 'meas1_1_3_1_3_2', 'meas1_1_3_1_3_3',
'meas1_1_3_2_1_1', 'meas1_1_3_2_1_2', 'meas1_1_3_2_1_3', 'meas1_1_3_2_2_1', 'meas1_1_3_2_2_2', 'meas1_1_3_2_2_3', 'meas1_1_3_2_3_1', 'meas1_1_3_2_3_2', 'meas1_1_3_2_3_3',
'meas1_1_3_3_1_1', 'meas1_1_3_3_1_2', 'meas1_1_3_3_1_3', 'meas1_1_3_3_2_1', 'meas1_1_3_3_2_2', 'meas1_1_3_3_2_3', 'meas1_1_3_3_3_1', 'meas1_1_3_3_3_2', 'meas1_1_3_3_3_3',
'meas1_2_1_1_1_1', 'meas1_2_1_1_1_2', 'meas1_2_1_1_1_3', 'meas1_2_1_1_2_1', 'meas1_2_1_1_2_2', 'meas1_2_1_1_2_3', 'meas1_2_1_1_3_1', 'meas1_2_1_1_3_2', 'meas1_2_1_1_3_3',
'meas1_2_1_2_1_1', 'meas1_2_1_2_1_2', 'meas1_2_1_2_1_3', 'meas1_2_1_2_2_1', 'meas1_2_1_2_2_2', 'meas1_2_1_2_2_3', 'meas1_2_1_2_3_1', 'meas1_2_1_2_3_2', 'meas1_2_1_2_3_3',
'meas1_2_1_3_1_1', 'meas1_2_1_3_1_2', 'meas1_2_1_3_1_3', 'meas1_2_1_3_2_1', 'meas1_2_1_3_2_2', 'meas1_2_1_3_2_3', 'meas1_2_1_3_3_1', 'meas1_2_1_3_3_2', 'meas1_2_1_3_3_3',
'meas1_2_2_1_1_1', 'meas1_2_2_1_1_2', 'meas1_2_2_1_1_3', 'meas1_2_2_1_2_1', 'meas1_2_2_1_2_2', 'meas1_2_2_1_2_3', 'meas1_2_2_1_3_1', 'meas1_2_2_1_3_2', 'meas1_2_2_1_3_3',
'meas1_2_2_2_1_1', 'meas1_2_2_2_1_2', 'meas1_2_2_2_1_3', 'meas1_2_2_2_2_1', 'meas1_2_2_2_2_2', 'meas1_2_2_2_2_3', 'meas1_2_2_2_3_1', 'meas1_2_2_2_3_2', 'meas1_2_2_2_3_3',
'meas1_2_2_3_1_1', 'meas1_2_2_3_1_2', 'meas1_2_2_3_1_3', 'meas1_2_2_3_2_1', 'meas1_2_2_3_2_2', 'meas1_2_2_3_2_3', 'meas1_2_2_3_3_1', 'meas1_2_2_3_3_2', 'meas1_2_2_3_3_3',
'meas1_2_3_1_1_1', 'meas1_2_3_1_1_2', 'meas1_2_3_1_1_3', 'meas1_2_3_1_2_1', 'meas1_2_3_1_2_2', 'meas1_2_3_1_2_3', 'meas1_2_3_1_3_1', 'meas1_2_3_1_3_2', 'meas1_2_3_1_3_3',
'meas1_2_3_2_1_1', 'meas1_2_3_2_1_2', 'meas1_2_3_2_1_3', 'meas1_2_3_2_2_1', 'meas1_2_3_2_2_2', 'meas1_2_3_2_2_3', 'meas1_2_3_2_3_1', 'meas1_2_3_2_3_2', 'meas1_2_3_2_3_3',
'meas1_2_3_3_1_1', 'meas1_2_3_3_1_2', 'meas1_2_3_3_1_3', 'meas1_2_3_3_2_1', 'meas1_2_3_3_2_2', 'meas1_2_3_3_2_3', 'meas1_2_3_3_3_1', 'meas1_2_3_3_3_2', 'meas1_2_3_3_3_3',
'meas1_3_1_1_1_1', 'meas1_3_1_1_1_2', 'meas1_3_1_1_1_3', 'meas1_3_1_1_2_1', 'meas1_3_1_1_2_2', 'meas1_3_1_1_2_3', 'meas1_3_1_1_3_1', 'meas1_3_1_1_3_2', 'meas1_3_1_1_3_3',
'meas1_3_1_2_1_1', 'meas1_3_1_2_1_2', 'meas1_3_1_2_1_3', 'meas1_3_1_2_2_1', 'meas1_3_1_2_2_2', 'meas1_3_1_2_2_3', 'meas1_3_1_2_3_1', 'meas1_3_1_2_3_2', 'meas1_3_1_2_3_3',
'meas1_3_1_3_1_1', 'meas1_3_1_3_1_2', 'meas1_3_1_3_1_3', 'meas1_3_1_3_2_1', 'meas1_3_1_3_2_2', 'meas1_3_1_3_2_3', 'meas1_3_1_3_3_1', 'meas1_3_1_3_3_2', 'meas1_3_1_3_3_3',
'meas1_3_2_1_1_1', 'meas1_3_2_1_1_2', 'meas1_3_2_1_1_3', 'meas1_3_2_1_2_1', 'meas1_3_2_1_2_2', 'meas1_3_2_1_2_3', 'meas1_3_2_1_3_1', 'meas1_3_2_1_3_2', 'meas1_3_2_1_3_3',
'meas1_3_2_2_1_1', 'meas1_3_2_2_1_2', 'meas1_3_2_2_1_3', 'meas1_3_2_2_2_1', 'meas1_3_2_2_2_2', 'meas1_3_2_2_2_3', 'meas1_3_2_2_3_1', 'meas1_3_2_2_3_2', 'meas1_3_2_2_3_3',
'meas1_3_2_3_1_1', 'meas1_3_2_3_1_2', 'meas1_3_2_3_1_3', 'meas1_3_2_3_2_1', 'meas1_3_2_3_2_2', 'meas1_3_2_3_2_3', 'meas1_3_2_3_3_1', 'meas1_3_2_3_3_2', 'meas1_3_2_3_3_3',
'meas1_3_3_1_1_1', 'meas1_3_3_1_1_2', 'meas1_3_3_1_1_3', 'meas1_3_3_1_2_1', 'meas1_3_3_1_2_2', 'meas1_3_3_1_2_3', 'meas1_3_3_1_3_1', 'meas1_3_3_1_3_2', 'meas1_3_3_1_3_3',
'meas1_3_3_2_1_1', 'meas1_3_3_2_1_2', 'meas1_3_3_2_1_3', 'meas1_3_3_2_2_1', 'meas1_3_3_2_2_2', 'meas1_3_3_2_2_3', 'meas1_3_3_2_3_1', 'meas1_3_3_2_3_2', 'meas1_3_3_2_3_3',
'meas1_3_3_3_1_1', 'meas1_3_3_3_1_2', 'meas1_3_3_3_1_3', 'meas1_3_3_3_2_1', 'meas1_3_3_3_2_2', 'meas1_3_3_3_2_3', 'meas1_3_3_3_3_1', 'meas1_3_3_3_3_2', 'meas1_3_3_3_3_3'
)
redis.call('SADD', 'measurement_tag_keys',
'meas2_1_1_1_1_1', 'meas2_1_1_1_1_2', 'meas2_1_1_1_1_3', 'meas2_1_1_1_2_1', 'meas2_1_1_1_2_2', 'meas2_1_1_1_2_3', 'meas2_1_1_1_3_1', 'meas2_1_1_1_3_2', 'meas2_1_1_1_3_3',
'meas2_1_1_2_1_1', 'meas2_1_1_2_1_2', 'meas2_1_1_2_1_3', 'meas2_1_1_2_2_1', 'meas2_1_1_2_2_2', 'meas2_1_1_2_2_3', 'meas2_1_1_2_3_1', 'meas2_1_1_2_3_2', 'meas2_1_1_2_3_3',
'meas2_1_1_3_1_1', 'meas2_1_1_3_1_2', 'meas2_1_1_3_1_3', 'meas2_1_1_3_2_1', 'meas2_1_1_3_2_2', 'meas2_1_1_3_2_3', 'meas2_1_1_3_3_1', 'meas2_1_1_3_3_2', 'meas2_1_1_3_3_3',
'meas2_1_2_1_1_1', 'meas2_1_2_1_1_2', 'meas2_1_2_1_1_3', 'meas2_1_2_1_2_1', 'meas2_1_2_1_2_2', 'meas2_1_2_1_2_3', 'meas2_1_2_1_3_1', 'meas2_1_2_1_3_2', 'meas2_1_2_1_3_3',
'meas2_1_2_2_1_1', 'meas2_1_2_2_1_2', 'meas2_1_2_2_1_3', 'meas2_1_2_2_2_1', 'meas2_1_2_2_2_2', 'meas2_1_2_2_2_3', 'meas2_1_2_2_3_1', 'meas2_1_2_2_3_2', 'meas2_1_2_2_3_3',
'meas2_1_2_3_1_1', 'meas2_1_2_3_1_2', 'meas2_1_2_3_1_3', 'meas2_1_2_3_2_1', 'meas2_1_2_3_2_2', 'meas2_1_2_3_2_3', 'meas2_1_2_3_3_1', 'meas2_1_2_3_3_2', 'meas2_1_2_3_3_3',
'meas2_1_3_1_1_1', 'meas2_1_3_1_1_2', 'meas2_1_3_1_1_3', 'meas2_1_3_1_2_1', 'meas2_1_3_1_2_2', 'meas2_1_3_1_2_3', 'meas2_1_3_1_3_1', 'meas2_1_3_1_3_2', 'meas2_1_3_1_3_3',
'meas2_1_3_2_1_1', 'meas2_1_3_2_1_2', 'meas2_1_3_2_1_3', 'meas2_1_3_2_2_1', 'meas2_1_3_2_2_2', 'meas2_1_3_2_2_3', 'meas2_1_3_2_3_1', 'meas2_1_3_2_3_2', 'meas2_1_3_2_3_3',
'meas2_1_3_3_1_1', 'meas2_1_3_3_1_2', 'meas2_1_3_3_1_3', 'meas2_1_3_3_2_1', 'meas2_1_3_3_2_2', 'meas2_1_3_3_2_3', 'meas2_1_3_3_3_1', 'meas2_1_3_3_3_2', 'meas2_1_3_3_3_3',
'meas2_2_1_1_1_1', 'meas2_2_1_1_1_2', 'meas2_2_1_1_1_3', 'meas2_2_1_1_2_1', 'meas2_2_1_1_2_2', 'meas2_2_1_1_2_3', 'meas2_2_1_1_3_1', 'meas2_2_1_1_3_2', 'meas2_2_1_1_3_3',
'meas2_2_1_2_1_1', 'meas2_2_1_2_1_2', 'meas2_2_1_2_1_3', 'meas2_2_1_2_2_1', 'meas2_2_1_2_2_2', 'meas2_2_1_2_2_3', 'meas2_2_1_2_3_1', 'meas2_2_1_2_3_2', 'meas2_2_1_2_3_3',
'meas2_2_1_3_1_1', 'meas2_2_1_3_1_2', 'meas2_2_1_3_1_3', 'meas2_2_1_3_2_1', 'meas2_2_1_3_2_2', 'meas2_2_1_3_2_3', 'meas2_2_1_3_3_1', 'meas2_2_1_3_3_2', 'meas2_2_1_3_3_3',
'meas2_2_2_1_1_1', 'meas2_2_2_1_1_2', 'meas2_2_2_1_1_3', 'meas2_2_2_1_2_1', 'meas2_2_2_1_2_2', 'meas2_2_2_1_2_3', 'meas2_2_2_1_3_1', 'meas2_2_2_1_3_2', 'meas2_2_2_1_3_3',
'meas2_2_2_2_1_1', 'meas2_2_2_2_1_2', 'meas2_2_2_2_1_3', 'meas2_2_2_2_2_1', 'meas2_2_2_2_2_2', 'meas2_2_2_2_2_3', 'meas2_2_2_2_3_1', 'meas2_2_2_2_3_2', 'meas2_2_2_2_3_3',
'meas2_2_2_3_1_1', 'meas2_2_2_3_1_2', 'meas2_2_2_3_1_3', 'meas2_2_2_3_2_1', 'meas2_2_2_3_2_2', 'meas2_2_2_3_2_3', 'meas2_2_2_3_3_1', 'meas2_2_2_3_3_2', 'meas2_2_2_3_3_3',
'meas2_2_3_1_1_1', 'meas2_2_3_1_1_2', 'meas2_2_3_1_1_3', 'meas2_2_3_1_2_1', 'meas2_2_3_1_2_2', 'meas2_2_3_1_2_3', 'meas2_2_3_1_3_1', 'meas2_2_3_1_3_2', 'meas2_2_3_1_3_3',
'meas2_2_3_2_1_1', 'meas2_2_3_2_1_2', 'meas2_2_3_2_1_3', 'meas2_2_3_2_2_1', 'meas2_2_3_2_2_2', 'meas2_2_3_2_2_3', 'meas2_2_3_2_3_1', 'meas2_2_3_2_3_2', 'meas2_2_3_2_3_3',
'meas2_2_3_3_1_1', 'meas2_2_3_3_1_2', 'meas2_2_3_3_1_3', 'meas2_2_3_3_2_1', 'meas2_2_3_3_2_2', 'meas2_2_3_3_2_3', 'meas2_2_3_3_3_1', 'meas2_2_3_3_3_2', 'meas2_2_3_3_3_3',
'meas2_3_1_1_1_1', 'meas2_3_1_1_1_2', 'meas2_3_1_1_1_3', 'meas2_3_1_1_2_1', 'meas2_3_1_1_2_2', 'meas2_3_1_1_2_3', 'meas2_3_1_1_3_1', 'meas2_3_1_1_3_2', 'meas2_3_1_1_3_3',
'meas2_3_1_2_1_1', 'meas2_3_1_2_1_2', 'meas2_3_1_2_1_3', 'meas2_3_1_2_2_1', 'meas2_3_1_2_2_2', 'meas2_3_1_2_2_3', 'meas2_3_1_2_3_1', 'meas2_3_1_2_3_2', 'meas2_3_1_2_3_3',
'meas2_3_1_3_1_1', 'meas2_3_1_3_1_2', 'meas2_3_1_3_1_3', 'meas2_3_1_3_2_1', 'meas2_3_1_3_2_2', 'meas2_3_1_3_2_3', 'meas2_3_1_3_3_1', 'meas2_3_1_3_3_2', 'meas2_3_1_3_3_3',
'meas2_3_2_1_1_1', 'meas2_3_2_1_1_2', 'meas2_3_2_1_1_3', 'meas2_3_2_1_2_1', 'meas2_3_2_1_2_2', 'meas2_3_2_1_2_3', 'meas2_3_2_1_3_1', 'meas2_3_2_1_3_2', 'meas2_3_2_1_3_3',
'meas2_3_2_2_1_1', 'meas2_3_2_2_1_2', 'meas2_3_2_2_1_3', 'meas2_3_2_2_2_1', 'meas2_3_2_2_2_2', 'meas2_3_2_2_2_3', 'meas2_3_2_2_3_1', 'meas2_3_2_2_3_2', 'meas2_3_2_2_3_3',
'meas2_3_2_3_1_1', 'meas2_3_2_3_1_2', 'meas2_3_2_3_1_3', 'meas2_3_2_3_2_1', 'meas2_3_2_3_2_2', 'meas2_3_2_3_2_3', 'meas2_3_2_3_3_1', 'meas2_3_2_3_3_2', 'meas2_3_2_3_3_3',
'meas2_3_3_1_1_1', 'meas2_3_3_1_1_2', 'meas2_3_3_1_1_3', 'meas2_3_3_1_2_1', 'meas2_3_3_1_2_2', 'meas2_3_3_1_2_3', 'meas2_3_3_1_3_1', 'meas2_3_3_1_3_2', 'meas2_3_3_1_3_3',
'meas2_3_3_2_1_1', 'meas2_3_3_2_1_2', 'meas2_3_3_2_1_3', 'meas2_3_3_2_2_1', 'meas2_3_3_2_2_2', 'meas2_3_3_2_2_3', 'meas2_3_3_2_3_1', 'meas2_3_3_2_3_2', 'meas2_3_3_2_3_3',
'meas2_3_3_3_1_1', 'meas2_3_3_3_1_2', 'meas2_3_3_3_1_3', 'meas2_3_3_3_2_1', 'meas2_3_3_3_2_2', 'meas2_3_3_3_2_3', 'meas2_3_3_3_3_1', 'meas2_3_3_3_3_2', 'meas2_3_3_3_3_3'
)
redis.call('SADD', 'measurement_tag_keys',
'meas3_1_1_1_1_1', 'meas3_1_1_1_1_2', 'meas3_1_1_1_1_3', 'meas3_1_1_1_2_1', 'meas3_1_1_1_2_2', 'meas3_1_1_1_2_3', 'meas3_1_1_1_3_1', 'meas3_1_1_1_3_2', 'meas3_1_1_1_3_3',
'meas3_1_1_2_1_1', 'meas3_1_1_2_1_2', 'meas3_1_1_2_1_3', 'meas3_1_1_2_2_1', 'meas3_1_1_2_2_2', 'meas3_1_1_2_2_3', 'meas3_1_1_2_3_1', 'meas3_1_1_2_3_2', 'meas3_1_1_2_3_3',
'meas3_1_1_3_1_1', 'meas3_1_1_3_1_2', 'meas3_1_1_3_1_3', 'meas3_1_1_3_2_1', 'meas3_1_1_3_2_2', 'meas3_1_1_3_2_3', 'meas3_1_1_3_3_1', 'meas3_1_1_3_3_2', 'meas3_1_1_3_3_3',
'meas3_1_2_1_1_1', 'meas3_1_2_1_1_2', 'meas3_1_2_1_1_3', 'meas3_1_2_1_2_1', 'meas3_1_2_1_2_2', 'meas3_1_2_1_2_3', 'meas3_1_2_1_3_1', 'meas3_1_2_1_3_2', 'meas3_1_2_1_3_3',
'meas3_1_2_2_1_1', 'meas3_1_2_2_1_2', 'meas3_1_2_2_1_3', 'meas3_1_2_2_2_1', 'meas3_1_2_2_2_2', 'meas3_1_2_2_2_3', 'meas3_1_2_2_3_1', 'meas3_1_2_2_3_2', 'meas3_1_2_2_3_3',
'meas3_1_2_3_1_1', 'meas3_1_2_3_1_2', 'meas3_1_2_3_1_3', 'meas3_1_2_3_2_1', 'meas3_1_2_3_2_2', 'meas3_1_2_3_2_3', 'meas3_1_2_3_3_1', 'meas3_1_2_3_3_2', 'meas3_1_2_3_3_3',
'meas3_1_3_1_1_1', 'meas3_1_3_1_1_2', 'meas3_1_3_1_1_3', 'meas3_1_3_1_2_1', 'meas3_1_3_1_2_2', 'meas3_1_3_1_2_3', 'meas3_1_3_1_3_1', 'meas3_1_3_1_3_2', 'meas3_1_3_1_3_3',
'meas3_1_3_2_1_1', 'meas3_1_3_2_1_2', 'meas3_1_3_2_1_3', 'meas3_1_3_2_2_1', 'meas3_1_3_2_2_2', 'meas3_1_3_2_2_3', 'meas3_1_3_2_3_1', 'meas3_1_3_2_3_2', 'meas3_1_3_2_3_3',
'meas3_1_3_3_1_1', 'meas3_1_3_3_1_2', 'meas3_1_3_3_1_3', 'meas3_1_3_3_2_1', 'meas3_1_3_3_2_2', 'meas3_1_3_3_2_3', 'meas3_1_3_3_3_1', 'meas3_1_3_3_3_2', 'meas3_1_3_3_3_3',
'meas3_2_1_1_1_1', 'meas3_2_1_1_1_2', 'meas3_2_1_1_1_3', 'meas3_2_1_1_2_1', 'meas3_2_1_1_2_2', 'meas3_2_1_1_2_3', 'meas3_2_1_1_3_1', 'meas3_2_1_1_3_2', 'meas3_2_1_1_3_3',
'meas3_2_1_2_1_1', 'meas3_2_1_2_1_2', 'meas3_2_1_2_1_3', 'meas3_2_1_2_2_1', 'meas3_2_1_2_2_2', 'meas3_2_1_2_2_3', 'meas3_2_1_2_3_1', 'meas3_2_1_2_3_2', 'meas3_2_1_2_3_3',
'meas3_2_1_3_1_1', 'meas3_2_1_3_1_2', 'meas3_2_1_3_1_3', 'meas3_2_1_3_2_1', 'meas3_2_1_3_2_2', 'meas3_2_1_3_2_3', 'meas3_2_1_3_3_1', 'meas3_2_1_3_3_2', 'meas3_2_1_3_3_3',
'meas3_2_2_1_1_1', 'meas3_2_2_1_1_2', 'meas3_2_2_1_1_3', 'meas3_2_2_1_2_1', 'meas3_2_2_1_2_2', 'meas3_2_2_1_2_3', 'meas3_2_2_1_3_1', 'meas3_2_2_1_3_2', 'meas3_2_2_1_3_3',
'meas3_2_2_2_1_1', 'meas3_2_2_2_1_2', 'meas3_2_2_2_1_3', 'meas3_2_2_2_2_1', 'meas3_2_2_2_2_2', 'meas3_2_2_2_2_3', 'meas3_2_2_2_3_1', 'meas3_2_2_2_3_2', 'meas3_2_2_2_3_3',
'meas3_2_2_3_1_1', 'meas3_2_2_3_1_2', 'meas3_2_2_3_1_3', 'meas3_2_2_3_2_1', 'meas3_2_2_3_2_2', 'meas3_2_2_3_2_3', 'meas3_2_2_3_3_1', 'meas3_2_2_3_3_2', 'meas3_2_2_3_3_3',
'meas3_2_3_1_1_1', 'meas3_2_3_1_1_2', 'meas3_2_3_1_1_3', 'meas3_2_3_1_2_1', 'meas3_2_3_1_2_2', 'meas3_2_3_1_2_3', 'meas3_2_3_1_3_1', 'meas3_2_3_1_3_2', 'meas3_2_3_1_3_3',
'meas3_2_3_2_1_1', 'meas3_2_3_2_1_2', 'meas3_2_3_2_1_3', 'meas3_2_3_2_2_1', 'meas3_2_3_2_2_2', 'meas3_2_3_2_2_3', 'meas3_2_3_2_3_1', 'meas3_2_3_2_3_2', 'meas3_2_3_2_3_3',
'meas3_2_3_3_1_1', 'meas3_2_3_3_1_2', 'meas3_2_3_3_1_3', 'meas3_2_3_3_2_1', 'meas3_2_3_3_2_2', 'meas3_2_3_3_2_3', 'meas3_2_3_3_3_1', 'meas3_2_3_3_3_2', 'meas3_2_3_3_3_3',
'meas3_3_1_1_1_1', 'meas3_3_1_1_1_2', 'meas3_3_1_1_1_3', 'meas3_3_1_1_2_1', 'meas3_3_1_1_2_2', 'meas3_3_1_1_2_3', 'meas3_3_1_1_3_1', 'meas3_3_1_1_3_2', 'meas3_3_1_1_3_3',
'meas3_3_1_2_1_1', 'meas3_3_1_2_1_2', 'meas3_3_1_2_1_3', 'meas3_3_1_2_2_1', 'meas3_3_1_2_2_2', 'meas3_3_1_2_2_3', 'meas3_3_1_2_3_1', 'meas3_3_1_2_3_2', 'meas3_3_1_2_3_3',
'meas3_3_1_3_1_1', 'meas3_3_1_3_1_2', 'meas3_3_1_3_1_3', 'meas3_3_1_3_2_1', 'meas3_3_1_3_2_2', 'meas3_3_1_3_2_3', 'meas3_3_1_3_3_1', 'meas3_3_1_3_3_2', 'meas3_3_1_3_3_3',
'meas3_3_2_1_1_1', 'meas3_3_2_1_1_2', 'meas3_3_2_1_1_3', 'meas3_3_2_1_2_1', 'meas3_3_2_1_2_2', 'meas3_3_2_1_2_3', 'meas3_3_2_1_3_1', 'meas3_3_2_1_3_2', 'meas3_3_2_1_3_3',
'meas3_3_2_2_1_1', 'meas3_3_2_2_1_2', 'meas3_3_2_2_1_3', 'meas3_3_2_2_2_1', 'meas3_3_2_2_2_2', 'meas3_3_2_2_2_3', 'meas3_3_2_2_3_1', 'meas3_3_2_2_3_2', 'meas3_3_2_2_3_3',
'meas3_3_2_3_1_1', 'meas3_3_2_3_1_2', 'meas3_3_2_3_1_3', 'meas3_3_2_3_2_1', 'meas3_3_2_3_2_2', 'meas3_3_2_3_2_3', 'meas3_3_2_3_3_1', 'meas3_3_2_3_3_2', 'meas3_3_2_3_3_3',
'meas3_3_3_1_1_1', 'meas3_3_3_1_1_2', 'meas3_3_3_1_1_3', 'meas3_3_3_1_2_1', 'meas3_3_3_1_2_2', 'meas3_3_3_1_2_3', 'meas3_3_3_1_3_1', 'meas3_3_3_1_3_2', 'meas3_3_3_1_3_3',
'meas3_3_3_2_1_1', 'meas3_3_3_2_1_2', 'meas3_3_3_2_1_3', 'meas3_3_3_2_2_1', 'meas3_3_3_2_2_2', 'meas3_3_3_2_2_3', 'meas3_3_3_2_3_1', 'meas3_3_3_2_3_2', 'meas3_3_3_2_3_3',
'meas3_3_3_3_1_1', 'meas3_3_3_3_1_2', 'meas3_3_3_3_1_3', 'meas3_3_3_3_2_1', 'meas3_3_3_3_2_2', 'meas3_3_3_3_2_3', 'meas3_3_3_3_3_1', 'meas3_3_3_3_3_2', 'meas3_3_3_3_3_3'
)
redis.call('SADD', 'grid1_zones_keys', 'zone1_1', 'zone1_2', 'zone1_3')
redis.call('SADD', 'grid2_zones_keys', 'zone2_1', 'zone2_2', 'zone2_3')
redis.call('SADD', 'grid3_zones_keys', 'zone3_1', 'zone3_2', 'zone3_3')
redis.call('SADD', 'zone1_1_stations_keys', 'station1_1_1', 'station1_1_2', 'station1_1_3')
redis.call('SADD', 'zone1_2_stations_keys', 'station1_2_1', 'station1_2_2', 'station1_2_3')
redis.call('SADD', 'zone1_3_stations_keys', 'station1_3_1', 'station1_3_2', 'station1_3_3')
redis.call('SADD', 'zone2_1_stations_keys', 'station2_1_1', 'station2_1_2', 'station2_1_3')
redis.call('SADD', 'zone2_2_stations_keys', 'station2_2_1', 'station2_2_2', 'station2_2_3')
redis.call('SADD', 'zone2_3_stations_keys', 'station2_3_1', 'station2_3_2', 'station2_3_3')
redis.call('SADD', 'zone3_1_stations_keys', 'station3_1_1', 'station3_1_2', 'station3_1_3')
redis.call('SADD', 'zone3_2_stations_keys', 'station3_2_1', 'station3_2_2', 'station3_2_3')
redis.call('SADD', 'zone3_3_stations_keys', 'station3_3_1', 'station3_3_2', 'station3_3_3')
redis.call('SADD', 'station1_1_1_components_nspath_keys', 'ns1_1_1_1', 'ns1_1_1_2', 'ns1_1_1_3')
redis.call('SADD', 'station1_1_2_components_nspath_keys', 'ns1_1_2_1', 'ns1_1_2_2', 'ns1_1_2_3')
redis.call('SADD', 'station1_1_3_components_nspath_keys', 'ns1_1_3_1', 'ns1_1_3_2', 'ns1_1_3_3')
redis.call('SADD', 'station1_2_1_components_nspath_keys', 'ns1_2_1_1', 'ns1_2_1_2', 'ns1_2_1_3')
redis.call('SADD', 'station1_2_2_components_nspath_keys', 'ns1_2_2_1', 'ns1_2_2_2', 'ns1_2_2_3')
redis.call('SADD', 'station1_2_3_components_nspath_keys', 'ns1_2_3_1', 'ns1_2_3_2', 'ns1_2_3_3')
redis.call('SADD', 'station1_3_1_components_nspath_keys', 'ns1_3_1_1', 'ns1_3_1_2', 'ns1_3_1_3')
redis.call('SADD', 'station1_3_2_components_nspath_keys', 'ns1_3_2_1', 'ns1_3_2_2', 'ns1_3_2_3')
redis.call('SADD', 'station1_3_3_components_nspath_keys', 'ns1_3_3_1', 'ns1_3_3_2', 'ns1_3_3_3')
redis.call('SADD', 'station2_1_1_components_nspath_keys', 'ns2_1_1_1', 'ns2_1_1_2', 'ns2_1_1_3')
redis.call('SADD', 'station2_1_2_components_nspath_keys', 'ns2_1_2_1', 'ns2_1_2_2', 'ns2_1_2_3')
redis.call('SADD', 'station2_1_3_components_nspath_keys', 'ns2_1_3_1', 'ns2_1_3_2', 'ns2_1_3_3')
redis.call('SADD', 'station2_2_1_components_nspath_keys', 'ns2_2_1_1', 'ns2_2_1_2', 'ns2_2_1_3')
redis.call('SADD', 'station2_2_2_components_nspath_keys', 'ns2_2_2_1', 'ns2_2_2_2', 'ns2_2_2_3')
redis.call('SADD', 'station2_2_3_components_nspath_keys', 'ns2_2_3_1', 'ns2_2_3_2', 'ns2_2_3_3')
redis.call('SADD', 'station2_3_1_components_nspath_keys', 'ns2_3_1_1', 'ns2_3_1_2', 'ns2_3_1_3')
redis.call('SADD', 'station2_3_2_components_nspath_keys', 'ns2_3_2_1', 'ns2_3_2_2', 'ns2_3_2_3')
redis.call('SADD', 'station2_3_3_components_nspath_keys', 'ns2_3_3_1', 'ns2_3_3_2', 'ns2_3_3_3')
redis.call('SADD', 'station3_1_1_components_nspath_keys', 'ns3_1_1_1', 'ns3_1_1_2', 'ns3_1_1_3')
redis.call('SADD', 'station3_1_2_components_nspath_keys', 'ns3_1_2_1', 'ns3_1_2_2', 'ns3_1_2_3')
redis.call('SADD', 'station3_1_3_components_nspath_keys', 'ns3_1_3_1', 'ns3_1_3_2', 'ns3_1_3_3')
redis.call('SADD', 'station3_2_1_components_nspath_keys', 'ns3_2_1_1', 'ns3_2_1_2', 'ns3_2_1_3')
redis.call('SADD', 'station3_2_2_components_nspath_keys', 'ns3_2_2_1', 'ns3_2_2_2', 'ns3_2_2_3')
redis.call('SADD', 'station3_2_3_components_nspath_keys', 'ns3_2_3_1', 'ns3_2_3_2', 'ns3_2_3_3')
redis.call('SADD', 'station3_3_1_components_nspath_keys', 'ns3_3_1_1', 'ns3_3_1_2', 'ns3_3_1_3')
redis.call('SADD', 'station3_3_2_components_nspath_keys', 'ns3_3_2_1', 'ns3_3_2_2', 'ns3_3_2_3')
redis.call('SADD', 'station3_3_3_components_nspath_keys', 'ns3_3_3_1', 'ns3_3_3_2', 'ns3_3_3_3')
redis.call('SADD', 'station1_1_1_components_nspath_keys', 'ns1_1_1_1', 'ns1_1_1_2', 'ns1_1_1_3')
redis.call('SADD', 'station1_1_2_components_nspath_keys', 'ns1_1_2_1', 'ns1_1_2_2', 'ns1_1_2_3')
redis.call('SADD', 'station1_1_3_components_nspath_keys', 'ns1_1_3_1', 'ns1_1_3_2', 'ns1_1_3_3')
redis.call('SADD', 'station1_2_1_components_nspath_keys', 'ns1_2_1_1', 'ns1_2_1_2', 'ns1_2_1_3')
redis.call('SADD', 'station1_2_2_components_nspath_keys', 'ns1_2_2_1', 'ns1_2_2_2', 'ns1_2_2_3')
redis.call('SADD', 'station1_2_3_components_nspath_keys', 'ns1_2_3_1', 'ns1_2_3_2', 'ns1_2_3_3')
redis.call('SADD', 'station1_3_1_components_nspath_keys', 'ns1_3_1_1', 'ns1_3_1_2', 'ns1_3_1_3')
redis.call('SADD', 'station1_3_2_components_nspath_keys', 'ns1_3_2_1', 'ns1_3_2_2', 'ns1_3_2_3')
redis.call('SADD', 'station1_3_3_components_nspath_keys', 'ns1_3_3_1', 'ns1_3_3_2', 'ns1_3_3_3')
redis.call('SADD', 'station2_1_1_components_nspath_keys', 'ns2_1_1_1', 'ns2_1_1_2', 'ns2_1_1_3')
redis.call('SADD', 'station2_1_2_components_nspath_keys', 'ns2_1_2_1', 'ns2_1_2_2', 'ns2_1_2_3')
redis.call('SADD', 'station2_1_3_components_nspath_keys', 'ns2_1_3_1', 'ns2_1_3_2', 'ns2_1_3_3')
redis.call('SADD', 'station2_2_1_components_nspath_keys', 'ns2_2_1_1', 'ns2_2_1_2', 'ns2_2_1_3')
redis.call('SADD', 'station2_2_2_components_nspath_keys', 'ns2_2_2_1', 'ns2_2_2_2', 'ns2_2_2_3')
redis.call('SADD', 'station2_2_3_components_nspath_keys', 'ns2_2_3_1', 'ns2_2_3_2', 'ns2_2_3_3')
redis.call('SADD', 'station2_3_1_components_nspath_keys', 'ns2_3_1_1', 'ns2_3_1_2', 'ns2_3_1_3')
redis.call('SADD', 'station2_3_2_components_nspath_keys', 'ns2_3_2_1', 'ns2_3_2_2', 'ns2_3_2_3')
redis.call('SADD', 'station2_3_3_components_nspath_keys', 'ns2_3_3_1', 'ns2_3_3_2', 'ns2_3_3_3')
redis.call('SADD', 'station3_1_1_components_nspath_keys', 'ns3_1_1_1', 'ns3_1_1_2', 'ns3_1_1_3')
redis.call('SADD', 'station3_1_2_components_nspath_keys', 'ns3_1_2_1', 'ns3_1_2_2', 'ns3_1_2_3')
redis.call('SADD', 'station3_1_3_components_nspath_keys', 'ns3_1_3_1', 'ns3_1_3_2', 'ns3_1_3_3')
redis.call('SADD', 'station3_2_1_components_nspath_keys', 'ns3_2_1_1', 'ns3_2_1_2', 'ns3_2_1_3')
redis.call('SADD', 'station3_2_2_components_nspath_keys', 'ns3_2_2_1', 'ns3_2_2_2', 'ns3_2_2_3')
redis.call('SADD', 'station3_2_3_components_nspath_keys', 'ns3_2_3_1', 'ns3_2_3_2', 'ns3_2_3_3')
redis.call('SADD', 'station3_3_1_components_nspath_keys', 'ns3_3_1_1', 'ns3_3_1_2', 'ns3_3_1_3')
redis.call('SADD', 'station3_3_2_components_nspath_keys', 'ns3_3_2_1', 'ns3_3_2_2', 'ns3_3_2_3')
redis.call('SADD', 'station3_3_3_components_nspath_keys', 'ns3_3_3_1', 'ns3_3_3_2', 'ns3_3_3_3')
redis.call('SADD', 'ns1_1_1_1_components_tag_keys', 'comptag1_1_1_1_1', 'comptag1_1_1_1_2' 'comptag1_1_1_1_3')
redis.call('SADD', 'ns1_1_1_2_components_tag_keys', 'comptag1_1_1_2_1', 'comptag1_1_1_2_2', 'comptag1_1_1_2_3')
redis.call('SADD', 'ns1_1_1_3_components_tag_keys', 'comptag1_1_1_3_1', 'comptag1_1_1_3_2', 'comptag1_1_1_3_3')
redis.call('SADD', 'ns1_1_2_1_components_tag_keys', 'comptag1_1_2_1_1', 'comptag1_1_2_1_2', 'comptag1_1_2_1_3')
redis.call('SADD', 'ns1_1_2_2_components_tag_keys', 'comptag1_1_2_2_1', 'comptag1_1_2_2_2', 'comptag1_1_2_2_3')
redis.call('SADD', 'ns1_1_2_3_components_tag_keys', 'comptag1_1_2_3_1', 'comptag1_1_2_3_2', 'comptag1_1_2_3_3')
redis.call('SADD', 'ns1_1_3_1_components_tag_keys', 'comptag1_1_3_1_1', 'comptag1_1_3_1_2', 'comptag1_1_3_1_3')
redis.call('SADD', 'ns1_1_3_2_components_tag_keys', 'comptag1_1_3_2_1', 'comptag1_1_3_2_2', 'comptag1_1_3_2_3')
redis.call('SADD', 'ns1_1_3_3_components_tag_keys', 'comptag1_1_3_3_1', 'comptag1_1_3_3_2', 'comptag1_1_3_3_3')
redis.call('SADD', 'ns1_2_1_1_components_tag_keys', 'comptag1_2_1_1_1', 'comptag1_2_1_1_2', 'comptag1_2_1_1_3')
redis.call('SADD', 'ns1_2_1_2_components_tag_keys', 'comptag1_2_1_2_1', 'comptag1_2_1_2_2', 'comptag1_2_1_2_3')
redis.call('SADD', 'ns1_2_1_3_components_tag_keys', 'comptag1_2_1_3_1', 'comptag1_2_1_3_2', 'comptag1_2_1_3_3')
redis.call('SADD', 'ns1_2_2_1_components_tag_keys', 'comptag1_2_2_1_1', 'comptag1_2_2_1_2', 'comptag1_2_2_1_3')
redis.call('SADD', 'ns1_2_2_2_components_tag_keys', 'comptag1_2_2_2_1', 'comptag1_2_2_2_2', 'comptag1_2_2_2_3')
redis.call('SADD', 'ns1_2_2_3_components_tag_keys', 'comptag1_2_2_3_1', 'comptag1_2_2_3_2', 'comptag1_2_2_3_3')
redis.call('SADD', 'ns1_2_3_1_components_tag_keys', 'comptag1_2_3_1_1', 'comptag1_2_3_1_2', 'comptag1_2_3_1_3')
redis.call('SADD', 'ns1_2_3_2_components_tag_keys', 'comptag1_2_3_2_1', 'comptag1_2_3_2_2', 'comptag1_2_3_2_3')
redis.call('SADD', 'ns1_2_3_3_components_tag_keys', 'comptag1_2_3_3_1', 'comptag1_2_3_3_2', 'comptag1_2_3_3_3')
redis.call('SADD', 'ns1_3_1_1_components_tag_keys', 'comptag1_3_1_1_1', 'comptag1_3_1_1_2', 'comptag1_3_1_1_3')
redis.call('SADD', 'ns1_3_1_2_components_tag_keys', 'comptag1_3_1_2_1', 'comptag1_3_1_2_2', 'comptag1_3_1_2_3')
redis.call('SADD', 'ns1_3_1_3_components_tag_keys', 'comptag1_3_1_3_1', 'comptag1_3_1_3_2', 'comptag1_3_1_3_3')
redis.call('SADD', 'ns1_3_2_1_components_tag_keys', 'comptag1_3_2_1_1', 'comptag1_3_2_1_2', 'comptag1_3_2_1_3')
redis.call('SADD', 'ns1_3_2_2_components_tag_keys', 'comptag1_3_2_2_1', 'comptag1_3_2_2_2', 'comptag1_3_2_2_3')
redis.call('SADD', 'ns1_3_2_3_components_tag_keys', 'comptag1_3_2_3_1', 'comptag1_3_2_3_2', 'comptag1_3_2_3_3')
redis.call('SADD', 'ns1_3_2_1_components_tag_keys', 'comptag1_3_2_1_1', 'comptag1_3_2_1_2', 'comptag1_3_2_1_3')
redis.call('SADD', 'ns1_3_2_2_components_tag_keys', 'comptag1_3_2_2_1', 'comptag1_3_2_2_2', 'comptag1_3_2_2_3')
redis.call('SADD', 'ns1_3_2_3_components_tag_keys', 'comptag1_3_2_3_1', 'comptag1_3_2_3_2', 'comptag1_3_2_3_3')
redis.call('SADD', 'ns2_1_1_1_components_tag_keys', 'comptag2_1_1_1_1', 'comptag2_1_1_1_2', 'comptag2_1_1_1_3')
redis.call('SADD', 'ns2_1_1_2_components_tag_keys', 'comptag2_1_1_2_1', 'comptag2_1_1_2_2', 'comptag2_1_1_2_3')
redis.call('SADD', 'ns2_1_1_3_components_tag_keys', 'comptag2_1_1_3_1', 'comptag2_1_1_3_2', 'comptag2_1_1_3_3')
redis.call('SADD', 'ns2_1_2_1_components_tag_keys', 'comptag2_1_2_1_1', 'comptag2_1_2_1_2', 'comptag2_1_2_1_3')
redis.call('SADD', 'ns2_1_2_2_components_tag_keys', 'comptag2_1_2_2_1', 'comptag2_1_2_2_2', 'comptag2_1_2_2_3')
redis.call('SADD', 'ns2_1_2_3_components_tag_keys', 'comptag2_1_2_3_1', 'comptag2_1_2_3_2', 'comptag2_1_2_3_3')
redis.call('SADD', 'ns2_1_3_1_components_tag_keys', 'comptag2_1_3_1_1', 'comptag2_1_3_1_2', 'comptag2_1_3_1_3')
redis.call('SADD', 'ns2_1_3_2_components_tag_keys', 'comptag2_1_3_2_1', 'comptag2_1_3_2_2', 'comptag2_1_3_2_3')
redis.call('SADD', 'ns2_1_3_3_components_tag_keys', 'comptag2_1_3_3_1', 'comptag2_1_3_3_2', 'comptag2_1_3_3_3')
redis.call('SADD', 'ns2_2_1_1_components_tag_keys', 'comptag2_2_1_1_1', 'comptag2_2_1_1_2', 'comptag2_2_1_1_3')
redis.call('SADD', 'ns2_2_1_2_components_tag_keys', 'comptag2_2_1_2_1', 'comptag2_2_1_2_2', 'comptag2_2_1_2_3')
redis.call('SADD', 'ns2_2_1_3_components_tag_keys', 'comptag2_2_1_3_1', 'comptag2_2_1_3_2', 'comptag2_2_1_3_3')
redis.call('SADD', 'ns2_2_2_1_components_tag_keys', 'comptag2_2_2_1_1', 'comptag2_2_2_1_2', 'comptag2_2_2_1_3')
redis.call('SADD', 'ns2_2_2_2_components_tag_keys', 'comptag2_2_2_2_1', 'comptag2_2_2_2_2', 'comptag2_2_2_2_3')
redis.call('SADD', 'ns2_2_2_3_components_tag_keys', 'comptag2_2_2_3_1', 'comptag2_2_2_3_2', 'comptag2_2_2_3_3')
redis.call('SADD', 'ns2_2_3_1_components_tag_keys', 'comptag2_2_3_1_1', 'comptag2_2_3_1_2', 'comptag2_2_3_1_3')
redis.call('SADD', 'ns2_2_3_2_components_tag_keys', 'comptag2_2_3_2_1', 'comptag2_2_3_2_2', 'comptag2_2_3_2_3')
redis.call('SADD', 'ns2_2_3_3_components_tag_keys', 'comptag2_2_3_3_1', 'comptag2_2_3_3_2', 'comptag2_2_3_3_3')
redis.call('SADD', 'ns2_3_1_1_components_tag_keys', 'comptag2_3_1_1_1', 'comptag2_3_1_1_2', 'comptag2_3_1_1_3')
redis.call('SADD', 'ns2_3_1_2_components_tag_keys', 'comptag2_3_1_2_1', 'comptag2_3_1_2_2', 'comptag2_3_1_2_3')
redis.call('SADD', 'ns2_3_1_3_components_tag_keys', 'comptag2_3_1_3_1', 'comptag2_3_1_3_2', 'comptag2_3_1_3_3')
redis.call('SADD', 'ns2_3_2_1_components_tag_keys', 'comptag2_3_2_1_1', 'comptag2_3_2_1_2', 'comptag2_3_2_1_3')
redis.call('SADD', 'ns2_3_2_2_components_tag_keys', 'comptag2_3_2_2_1', 'comptag2_3_2_2_2', 'comptag2_3_2_2_3')
redis.call('SADD', 'ns2_3_2_3_components_tag_keys', 'comptag2_3_2_3_1', 'comptag2_3_2_3_2', 'comptag2_3_2_3_3')
redis.call('SADD', 'ns2_3_2_1_components_tag_keys', 'comptag2_3_2_1_1', 'comptag2_3_2_1_2', 'comptag2_3_2_1_3')
redis.call('SADD', 'ns2_3_2_2_components_tag_keys', 'comptag2_3_2_2_1', 'comptag2_3_2_2_2', 'comptag2_3_2_2_3')
redis.call('SADD', 'ns2_3_2_3_components_tag_keys', 'comptag2_3_2_3_1', 'comptag2_3_2_3_2', 'comptag2_3_2_3_3')
redis.call('SADD', 'ns3_1_1_1_components_tag_keys', 'comptag3_1_1_1_1', 'comptag3_1_1_1_2', 'comptag3_1_1_1_3')
redis.call('SADD', 'ns3_1_1_2_components_tag_keys', 'comptag3_1_1_2_1', 'comptag3_1_1_2_2', 'comptag3_1_1_2_3')
redis.call('SADD', 'ns3_1_1_3_components_tag_keys', 'comptag3_1_1_3_1', 'comptag3_1_1_3_2', 'comptag3_1_1_3_3')
redis.call('SADD', 'ns3_1_2_1_components_tag_keys', 'comptag3_1_2_1_1', 'comptag3_1_2_1_2', 'comptag3_1_2_1_3')
redis.call('SADD', 'ns3_1_2_2_components_tag_keys', 'comptag3_1_2_2_1', 'comptag3_1_2_2_2', 'comptag3_1_2_2_3')
redis.call('SADD', 'ns3_1_2_3_components_tag_keys', 'comptag3_1_2_3_1', 'comptag3_1_2_3_2', 'comptag3_1_2_3_3')
redis.call('SADD', 'ns3_1_3_1_components_tag_keys', 'comptag3_1_3_1_1', 'comptag3_1_3_1_2', 'comptag3_1_3_1_3')
redis.call('SADD', 'ns3_1_3_2_components_tag_keys', 'comptag3_1_3_2_1', 'comptag3_1_3_2_2', 'comptag3_1_3_2_3')
redis.call('SADD', 'ns3_1_3_3_components_tag_keys', 'comptag3_1_3_3_1', 'comptag3_1_3_3_2', 'comptag3_1_3_3_3')
redis.call('SADD', 'ns3_2_1_1_components_tag_keys', 'comptag3_2_1_1_1', 'comptag3_2_1_1_2', 'comptag3_2_1_1_3')
redis.call('SADD', 'ns3_2_1_2_components_tag_keys', 'comptag3_2_1_2_1', 'comptag3_2_1_2_2', 'comptag3_2_1_2_3')
redis.call('SADD', 'ns3_2_1_3_components_tag_keys', 'comptag3_2_1_3_1', 'comptag3_2_1_3_2', 'comptag3_2_1_3_3')
redis.call('SADD', 'ns3_2_2_1_components_tag_keys', 'comptag3_2_2_1_1', 'comptag3_2_2_1_2', 'comptag3_2_2_1_3')
redis.call('SADD', 'ns3_2_2_2_components_tag_keys', 'comptag3_2_2_2_1', 'comptag3_2_2_2_2', 'comptag3_2_2_2_3')
redis.call('SADD', 'ns3_2_2_3_components_tag_keys', 'comptag3_2_2_3_1', 'comptag3_2_2_3_2', 'comptag3_2_2_3_3')
redis.call('SADD', 'ns3_2_3_1_components_tag_keys', 'comptag3_2_3_1_1', 'comptag3_2_3_1_2', 'comptag3_2_3_1_3')
redis.call('SADD', 'ns3_2_3_2_components_tag_keys', 'comptag3_2_3_2_1', 'comptag3_2_3_2_2', 'comptag3_2_3_2_3')
redis.call('SADD', 'ns3_2_3_3_components_tag_keys', 'comptag3_2_3_3_1', 'comptag3_2_3_3_2', 'comptag3_2_3_3_3')
redis.call('SADD', 'ns3_3_1_1_components_tag_keys', 'comptag3_3_1_1_1', 'comptag3_3_1_1_2', 'comptag3_3_1_1_3')
redis.call('SADD', 'ns3_3_1_2_components_tag_keys', 'comptag3_3_1_2_1', 'comptag3_3_1_2_2', 'comptag3_3_1_2_3')
redis.call('SADD', 'ns3_3_1_3_components_tag_keys', 'comptag3_3_1_3_1', 'comptag3_3_1_3_2', 'comptag3_3_1_3_3')
redis.call('SADD', 'ns3_3_2_1_components_tag_keys', 'comptag3_3_2_1_1', 'comptag3_3_2_1_2', 'comptag3_3_2_1_3')
redis.call('SADD', 'ns3_3_2_2_components_tag_keys', 'comptag3_3_2_2_1', 'comptag3_3_2_2_2', 'comptag3_3_2_2_3')
redis.call('SADD', 'ns3_3_2_3_components_tag_keys', 'comptag3_3_2_3_1', 'comptag3_3_2_3_2', 'comptag3_3_2_3_3')
redis.call('SADD', 'ns3_3_3_1_components_tag_keys', 'comptag3_3_3_1_1', 'comptag3_3_3_1_2', 'comptag3_3_3_1_3')
redis.call('SADD', 'ns3_3_3_2_components_tag_keys', 'comptag3_3_3_2_1', 'comptag3_3_3_2_2', 'comptag3_3_3_2_3')
redis.call('SADD', 'ns3_3_3_3_components_tag_keys', 'comptag3_3_3_3_1', 'comptag3_3_3_3_2', 'comptag3_3_3_3_3')
redis.call('SADD', 'comptag1_1_1_1_2_measurement_keys', 'meas1_1_1_1_2_1', 'meas1_1_1_1_2_2', 'meas1_1_1_1_2_3')
redis.call('SADD', 'comptag1_1_1_1_3_measurement_keys', 'meas1_1_1_1_3_1', 'meas1_1_1_1_3_2', 'meas1_1_1_1_3_3')
redis.call('SADD', 'comptag1_1_1_2_1_measurement_keys', 'meas1_1_1_2_1_1', 'meas1_1_1_2_1_2', 'meas1_1_1_2_1_3')
redis.call('SADD', 'comptag1_1_1_2_2_measurement_keys', 'meas1_1_1_2_2_1', 'meas1_1_1_2_2_2', 'meas1_1_1_2_2_3')
redis.call('SADD', 'comptag1_1_1_2_3_measurement_keys', 'meas1_1_1_2_3_1', 'meas1_1_1_2_3_2', 'meas1_1_1_2_3_3')
redis.call('SADD', 'comptag1_1_1_3_1_measurement_keys', 'meas1_1_1_3_1_1', 'meas1_1_1_3_1_2', 'meas1_1_1_3_1_3')
redis.call('SADD', 'comptag1_1_1_3_2_measurement_keys', 'meas1_1_1_3_2_1', 'meas1_1_1_3_2_2', 'meas1_1_1_3_2_3')
redis.call('SADD', 'comptag1_1_1_3_3_measurement_keys', 'meas1_1_1_3_3_1', 'meas1_1_1_3_3_2', 'meas1_1_1_3_3_3')
redis.call('SADD', 'comptag1_1_2_1_1_measurement_keys', 'meas1_1_2_1_1_1', 'meas1_1_2_1_1_2', 'meas1_1_2_1_1_3')
redis.call('SADD', 'comptag1_1_2_1_2_measurement_keys', 'meas1_1_2_1_2_1', 'meas1_1_2_1_2_2', 'meas1_1_2_1_2_3')
redis.call('SADD', 'comptag1_1_2_1_3_measurement_keys', 'meas1_1_2_1_3_1', 'meas1_1_2_1_3_2', 'meas1_1_2_1_3_3')
redis.call('SADD', 'comptag1_1_2_2_1_measurement_keys', 'meas1_1_2_2_1_1', 'meas1_1_2_2_1_2', 'meas1_1_2_2_1_3')
redis.call('SADD', 'comptag1_1_2_2_2_measurement_keys', 'meas1_1_2_2_2_1', 'meas1_1_2_2_2_2', 'meas1_1_2_2_2_3')
redis.call('SADD', 'comptag1_1_2_2_3_measurement_keys', 'meas1_1_2_2_3_1', 'meas1_1_2_2_3_2', 'meas1_1_2_2_3_3')
redis.call('SADD', 'comptag1_1_2_3_1_measurement_keys', 'meas1_1_2_3_1_1', 'meas1_1_2_3_1_2', 'meas1_1_2_3_1_3')
redis.call('SADD', 'comptag1_1_2_3_2_measurement_keys', 'meas1_1_2_3_2_1', 'meas1_1_2_3_2_2', 'meas1_1_2_3_2_3')
redis.call('SADD', 'comptag1_1_2_3_3_measurement_keys', 'meas1_1_2_3_3_1', 'meas1_1_2_3_3_2', 'meas1_1_2_3_3_3')
redis.call('SADD', 'comptag1_1_3_1_1_measurement_keys', 'meas1_1_3_1_1_1', 'meas1_1_3_1_1_2', 'meas1_1_3_1_1_3')
redis.call('SADD', 'comptag1_1_3_1_2_measurement_keys', 'meas1_1_3_1_2_1', 'meas1_1_3_1_2_2', 'meas1_1_3_1_2_3')
redis.call('SADD', 'comptag1_1_3_1_3_measurement_keys', 'meas1_1_3_1_3_1', 'meas1_1_3_1_3_2', 'meas1_1_3_1_3_3')
redis.call('SADD', 'comptag1_1_3_2_1_measurement_keys', 'meas1_1_3_2_1_1', 'meas1_1_3_2_1_2', 'meas1_1_3_2_1_3')
redis.call('SADD', 'comptag1_1_3_2_2_measurement_keys', 'meas1_1_3_2_2_1', 'meas1_1_3_2_2_2', 'meas1_1_3_2_2_3')
redis.call('SADD', 'comptag1_1_3_2_3_measurement_keys', 'meas1_1_3_2_3_1', 'meas1_1_3_2_3_2', 'meas1_1_3_2_3_3')
redis.call('SADD', 'comptag1_1_3_3_1_measurement_keys', 'meas1_1_3_3_1_1', 'meas1_1_3_3_1_2', 'meas1_1_3_3_1_3')
redis.call('SADD', 'comptag1_1_3_3_2_measurement_keys', 'meas1_1_3_3_2_1', 'meas1_1_3_3_2_2', 'meas1_1_3_3_2_3')
redis.call('SADD', 'comptag1_1_3_3_3_measurement_keys', 'meas1_1_3_3_3_1', 'meas1_1_3_3_3_2', 'meas1_1_3_3_3_3')
redis.call('SADD', 'comptag1_2_1_1_1_measurement_keys', 'meas1_2_1_1_1_1', 'meas1_2_1_1_1_2', 'meas1_2_1_1_1_3')
redis.call('SADD', 'comptag1_2_1_1_2_measurement_keys', 'meas1_2_1_1_2_1', 'meas1_2_1_1_2_2', 'meas1_2_1_1_2_3')
redis.call('SADD', 'comptag1_2_1_1_3_measurement_keys', 'meas1_2_1_1_3_1', 'meas1_2_1_1_3_2', 'meas1_2_1_1_3_3')
redis.call('SADD', 'comptag1_2_1_2_1_measurement_keys', 'meas1_2_1_2_1_1', 'meas1_2_1_2_1_2', 'meas1_2_1_2_1_3')
redis.call('SADD', 'comptag1_2_1_2_2_measurement_keys', 'meas1_2_1_2_2_1', 'meas1_2_1_2_2_2', 'meas1_2_1_2_2_3')
redis.call('SADD', 'comptag1_2_1_2_3_measurement_keys', 'meas1_2_1_2_3_1', 'meas1_2_1_2_3_2', 'meas1_2_1_2_3_3')
redis.call('SADD', 'comptag1_2_1_3_1_measurement_keys', 'meas1_2_1_3_1_1', 'meas1_2_1_3_1_2', 'meas1_2_1_3_1_3')
redis.call('SADD', 'comptag1_2_1_3_2_measurement_keys', 'meas1_2_1_3_2_1', 'meas1_2_1_3_2_2', 'meas1_2_1_3_2_3')
redis.call('SADD', 'comptag1_2_1_3_3_measurement_keys', 'meas1_2_1_3_3_1', 'meas1_2_1_3_3_2', 'meas1_2_1_3_3_3')
redis.call('SADD', 'comptag1_2_2_1_1_measurement_keys', 'meas1_2_2_1_1_1', 'meas1_2_2_1_1_2', 'meas1_2_2_1_1_3')
redis.call('SADD', 'comptag1_2_2_1_2_measurement_keys', 'meas1_2_2_1_2_1', 'meas1_2_2_1_2_2', 'meas1_2_2_1_2_3')
redis.call('SADD', 'comptag1_2_2_1_3_measurement_keys', 'meas1_2_2_1_3_1', 'meas1_2_2_1_3_2', 'meas1_2_2_1_3_3')
redis.call('SADD', 'comptag1_2_2_2_1_measurement_keys', 'meas1_2_2_2_1_1', 'meas1_2_2_2_1_2', 'meas1_2_2_2_1_3')
redis.call('SADD', 'comptag1_2_2_2_2_measurement_keys', 'meas1_2_2_2_2_1', 'meas1_2_2_2_2_2', 'meas1_2_2_2_2_3')
redis.call('SADD', 'comptag1_2_2_2_3_measurement_keys', 'meas1_2_2_2_3_1', 'meas1_2_2_2_3_2', 'meas1_2_2_2_3_3')
redis.call('SADD', 'comptag1_2_2_3_1_measurement_keys', 'meas1_2_2_3_1_1', 'meas1_2_2_3_1_2', 'meas1_2_2_3_1_3')
redis.call('SADD', 'comptag1_2_2_3_2_measurement_keys', 'meas1_2_2_3_2_1', 'meas1_2_2_3_2_2', 'meas1_2_2_3_2_3')
redis.call('SADD', 'comptag1_2_2_3_3_measurement_keys', 'meas1_2_2_3_3_1', 'meas1_2_2_3_3_2', 'meas1_2_2_3_3_3')
redis.call('SADD', 'comptag1_2_3_1_1_measurement_keys', 'meas1_2_3_1_1_1', 'meas1_2_3_1_1_2', 'meas1_2_3_1_1_3')
redis.call('SADD', 'comptag1_2_3_1_2_measurement_keys', 'meas1_2_3_1_2_1', 'meas1_2_3_1_2_2', 'meas1_2_3_1_2_3')
redis.call('SADD', 'comptag1_2_3_1_3_measurement_keys', 'meas1_2_3_1_3_1', 'meas1_2_3_1_3_2', 'meas1_2_3_1_3_3')
redis.call('SADD', 'comptag1_2_3_2_1_measurement_keys', 'meas1_2_3_2_1_1', 'meas1_2_3_2_1_2', 'meas1_2_3_2_1_3')
redis.call('SADD', 'comptag1_2_3_2_2_measurement_keys', 'meas1_2_3_2_2_1', 'meas1_2_3_2_2_2', 'meas1_2_3_2_2_3')
redis.call('SADD', 'comptag1_2_3_2_3_measurement_keys', 'meas1_2_3_2_3_1', 'meas1_2_3_2_3_2', 'meas1_2_3_2_3_3')
redis.call('SADD', 'comptag1_2_3_3_1_measurement_keys', 'meas1_2_3_3_1_1', 'meas1_2_3_3_1_2', 'meas1_2_3_3_1_3')
redis.call('SADD', 'comptag1_2_3_3_2_measurement_keys', 'meas1_2_3_3_2_1', 'meas1_2_3_3_2_2', 'meas1_2_3_3_2_3')
redis.call('SADD', 'comptag1_2_3_3_3_measurement_keys', 'meas1_2_3_3_3_1', 'meas1_2_3_3_3_2', 'meas1_2_3_3_3_3')
redis.call('SADD', 'comptag1_3_1_1_1_measurement_keys', 'meas1_3_1_1_1_1', 'meas1_3_1_1_1_2', 'meas1_3_1_1_1_3')
redis.call('SADD', 'comptag1_3_1_1_2_measurement_keys', 'meas1_3_1_1_2_1', 'meas1_3_1_1_2_2', 'meas1_3_1_1_2_3')
redis.call('SADD', 'comptag1_3_1_1_3_measurement_keys', 'meas1_3_1_1_3_1', 'meas1_3_1_1_3_2', 'meas1_3_1_1_3_3')
redis.call('SADD', 'comptag1_3_1_2_1_measurement_keys', 'meas1_3_1_2_1_1', 'meas1_3_1_2_1_2', 'meas1_3_1_2_1_3')
redis.call('SADD', 'comptag1_3_1_2_2_measurement_keys', 'meas1_3_1_2_2_1', 'meas1_3_1_2_2_2', 'meas1_3_1_2_2_3')
redis.call('SADD', 'comptag1_3_1_2_3_measurement_keys', 'meas1_3_1_2_3_1', 'meas1_3_1_2_3_2', 'meas1_3_1_2_3_3')
redis.call('SADD', 'comptag1_3_1_3_1_measurement_keys', 'meas1_3_1_3_1_1', 'meas1_3_1_3_1_2', 'meas1_3_1_3_1_3')
redis.call('SADD', 'comptag1_3_1_3_2_measurement_keys', 'meas1_3_1_3_2_1', 'meas1_3_1_3_2_2', 'meas1_3_1_3_2_3')
redis.call('SADD', 'comptag1_3_1_3_3_measurement_keys', 'meas1_3_1_3_3_1', 'meas1_3_1_3_3_2', 'meas1_3_1_3_3_3')
redis.call('SADD', 'comptag1_3_2_1_1_measurement_keys', 'meas1_3_2_1_1_1', 'meas1_3_2_1_1_2', 'meas1_3_2_1_1_3')
redis.call('SADD', 'comptag1_3_2_1_2_measurement_keys', 'meas1_3_2_1_2_1', 'meas1_3_2_1_2_2', 'meas1_3_2_1_2_3')
redis.call('SADD', 'comptag1_3_2_1_3_measurement_keys', 'meas1_3_2_1_3_1', 'meas1_3_2_1_3_2', 'meas1_3_2_1_3_3')
redis.call('SADD', 'comptag1_3_2_2_1_measurement_keys', 'meas1_3_2_2_1_1', 'meas1_3_2_2_1_2', 'meas1_3_2_2_1_3')
redis.call('SADD', 'comptag1_3_2_2_2_measurement_keys', 'meas1_3_2_2_2_1', 'meas1_3_2_2_2_2', 'meas1_3_2_2_2_3')
redis.call('SADD', 'comptag1_3_2_2_3_measurement_keys', 'meas1_3_2_2_3_1', 'meas1_3_2_2_3_2', 'meas1_3_2_2_3_3')
redis.call('SADD', 'comptag1_3_2_3_1_measurement_keys', 'meas1_3_2_3_1_1', 'meas1_3_2_3_1_2', 'meas1_3_2_3_1_3')
redis.call('SADD', 'comptag1_3_2_3_2_measurement_keys', 'meas1_3_2_3_2_1', 'meas1_3_2_3_2_2', 'meas1_3_2_3_2_3')
redis.call('SADD', 'comptag1_3_2_3_3_measurement_keys', 'meas1_3_2_3_3_1', 'meas1_3_2_3_3_2', 'meas1_3_2_3_3_3')
redis.call('SADD', 'comptag1_3_3_1_1_measurement_keys', 'meas1_3_3_1_1_1', 'meas1_3_3_1_1_2', 'meas1_3_3_1_1_3')
redis.call('SADD', 'comptag1_3_3_1_2_measurement_keys', 'meas1_3_3_1_2_1', 'meas1_3_3_1_2_2', 'meas1_3_3_1_2_3')
redis.call('SADD', 'comptag1_3_3_1_3_measurement_keys', 'meas1_3_3_1_3_1', 'meas1_3_3_1_3_2', 'meas1_3_3_1_3_3')
redis.call('SADD', 'comptag1_3_3_2_1_measurement_keys', 'meas1_3_3_2_1_1', 'meas1_3_3_2_1_2', 'meas1_3_3_2_1_3')
redis.call('SADD', 'comptag1_3_3_2_2_measurement_keys', 'meas1_3_3_2_2_1', 'meas1_3_3_2_2_2', 'meas1_3_3_2_2_3')
redis.call('SADD', 'comptag1_3_3_2_3_measurement_keys', 'meas1_3_3_2_3_1', 'meas1_3_3_2_3_2', 'meas1_3_3_2_3_3')
redis.call('SADD', 'comptag1_3_3_3_1_measurement_keys', 'meas1_3_3_3_1_1', 'meas1_3_3_3_1_2', 'meas1_3_3_3_1_3')
redis.call('SADD', 'comptag1_3_3_3_2_measurement_keys', 'meas1_3_3_3_2_1', 'meas1_3_3_3_2_2', 'meas1_3_3_3_2_3')
redis.call('SADD', 'comptag1_3_3_3_3_measurement_keys', 'meas1_3_3_3_3_1', 'meas1_3_3_3_3_2', 'meas1_3_3_3_3_3')
redis.call('SADD', 'comptag2_1_1_1_1_measurement_keys', 'meas2_1_1_1_1_1', 'meas2_1_1_1_1_2', 'meas2_1_1_1_1_3')
redis.call('SADD', 'comptag2_1_1_1_2_measurement_keys', 'meas2_1_1_1_2_1', 'meas2_1_1_1_2_2', 'meas2_1_1_1_2_3')
redis.call('SADD', 'comptag2_1_1_1_3_measurement_keys', 'meas2_1_1_1_3_1', 'meas2_1_1_1_3_2', 'meas2_1_1_1_3_3')
redis.call('SADD', 'comptag2_1_1_2_1_measurement_keys', 'meas2_1_1_2_1_1', 'meas2_1_1_2_1_2', 'meas2_1_1_2_1_3')
redis.call('SADD', 'comptag2_1_1_2_2_measurement_keys', 'meas2_1_1_2_2_1', 'meas2_1_1_2_2_2', 'meas2_1_1_2_2_3')
redis.call('SADD', 'comptag2_1_1_2_3_measurement_keys', 'meas2_1_1_2_3_1', 'meas2_1_1_2_3_2', 'meas2_1_1_2_3_3')
redis.call('SADD', 'comptag2_1_1_3_1_measurement_keys', 'meas2_1_1_3_1_1', 'meas2_1_1_3_1_2', 'meas2_1_1_3_1_3')
redis.call('SADD', 'comptag2_1_1_3_2_measurement_keys', 'meas2_1_1_3_2_1', 'meas2_1_1_3_2_2', 'meas2_1_1_3_2_3')
redis.call('SADD', 'comptag2_1_1_3_3_measurement_keys', 'meas2_1_1_3_3_1', 'meas2_1_1_3_3_2', 'meas2_1_1_3_3_3')
redis.call('SADD', 'comptag2_1_2_1_1_measurement_keys', 'meas2_1_2_1_1_1', 'meas2_1_2_1_1_2', 'meas2_1_2_1_1_3')
redis.call('SADD', 'comptag2_1_2_1_2_measurement_keys', 'meas2_1_2_1_2_1', 'meas2_1_2_1_2_2', 'meas2_1_2_1_2_3')
redis.call('SADD', 'comptag2_1_2_1_3_measurement_keys', 'meas2_1_2_1_3_1', 'meas2_1_2_1_3_2', 'meas2_1_2_1_3_3')
redis.call('SADD', 'comptag2_1_2_2_1_measurement_keys', 'meas2_1_2_2_1_1', 'meas2_1_2_2_1_2', 'meas2_1_2_2_1_3')
redis.call('SADD', 'comptag2_1_2_2_2_measurement_keys', 'meas2_1_2_2_2_1', 'meas2_1_2_2_2_2', 'meas2_1_2_2_2_3')
redis.call('SADD', 'comptag2_1_2_2_3_measurement_keys', 'meas2_1_2_2_3_1', 'meas2_1_2_2_3_2', 'meas2_1_2_2_3_3')
redis.call('SADD', 'comptag2_1_2_3_1_measurement_keys', 'meas2_1_2_3_1_1', 'meas2_1_2_3_1_2', 'meas2_1_2_3_1_3')
redis.call('SADD', 'comptag2_1_2_3_2_measurement_keys', 'meas2_1_2_3_2_1', 'meas2_1_2_3_2_2', 'meas2_1_2_3_2_3')
redis.call('SADD', 'comptag2_1_2_3_3_measurement_keys', 'meas2_1_2_3_3_1', 'meas2_1_2_3_3_2', 'meas2_1_2_3_3_3')
redis.call('SADD', 'comptag2_1_3_1_1_measurement_keys', 'meas2_1_3_1_1_1', 'meas2_1_3_1_1_2', 'meas2_1_3_1_1_3')
redis.call('SADD', 'comptag2_1_3_1_2_measurement_keys', 'meas2_1_3_1_2_1', 'meas2_1_3_1_2_2', 'meas2_1_3_1_2_3')
redis.call('SADD', 'comptag2_1_3_1_3_measurement_keys', 'meas2_1_3_1_3_1', 'meas2_1_3_1_3_2', 'meas2_1_3_1_3_3')
redis.call('SADD', 'comptag2_1_3_2_1_measurement_keys', 'meas2_1_3_2_1_1', 'meas2_1_3_2_1_2', 'meas2_1_3_2_1_3')
redis.call('SADD', 'comptag2_1_3_2_2_measurement_keys', 'meas2_1_3_2_2_1', 'meas2_1_3_2_2_2', 'meas2_1_3_2_2_3')
redis.call('SADD', 'comptag2_1_3_2_3_measurement_keys', 'meas2_1_3_2_3_1', 'meas2_1_3_2_3_2', 'meas2_1_3_2_3_3')
redis.call('SADD', 'comptag2_1_3_3_1_measurement_keys', 'meas2_1_3_3_1_1', 'meas2_1_3_3_1_2', 'meas2_1_3_3_1_3')
redis.call('SADD', 'comptag2_1_3_3_2_measurement_keys', 'meas2_1_3_3_2_1', 'meas2_1_3_3_2_2', 'meas2_1_3_3_2_3')
redis.call('SADD', 'comptag2_1_3_3_3_measurement_keys', 'meas2_1_3_3_3_1', 'meas2_1_3_3_3_2', 'meas2_1_3_3_3_3')
redis.call('SADD', 'comptag2_2_1_1_1_measurement_keys', 'meas2_2_1_1_1_1', 'meas2_2_1_1_1_2', 'meas2_2_1_1_1_3')
redis.call('SADD', 'comptag2_2_1_1_2_measurement_keys', 'meas2_2_1_1_2_1', 'meas2_2_1_1_2_2', 'meas2_2_1_1_2_3')
redis.call('SADD', 'comptag2_2_1_1_3_measurement_keys', 'meas2_2_1_1_3_1', 'meas2_2_1_1_3_2', 'meas2_2_1_1_3_3')
redis.call('SADD', 'comptag2_2_1_2_1_measurement_keys', 'meas2_2_1_2_1_1', 'meas2_2_1_2_1_2', 'meas2_2_1_2_1_3')
redis.call('SADD', 'comptag2_2_1_2_2_measurement_keys', 'meas2_2_1_2_2_1', 'meas2_2_1_2_2_2', 'meas2_2_1_2_2_3')
redis.call('SADD', 'comptag2_2_1_2_3_measurement_keys', 'meas2_2_1_2_3_1', 'meas2_2_1_2_3_2', 'meas2_2_1_2_3_3')
redis.call('SADD', 'comptag2_2_1_3_1_measurement_keys', 'meas2_2_1_3_1_1', 'meas2_2_1_3_1_2', 'meas2_2_1_3_1_3')
redis.call('SADD', 'comptag2_2_1_3_2_measurement_keys', 'meas2_2_1_3_2_1', 'meas2_2_1_3_2_2', 'meas2_2_1_3_2_3')
redis.call('SADD', 'comptag2_2_1_3_3_measurement_keys', 'meas2_2_1_3_3_1', 'meas2_2_1_3_3_2', 'meas2_2_1_3_3_3')
redis.call('SADD', 'comptag2_2_2_1_1_measurement_keys', 'meas2_2_2_1_1_1', 'meas2_2_2_1_1_2', 'meas2_2_2_1_1_3')
redis.call('SADD', 'comptag2_2_2_1_2_measurement_keys', 'meas2_2_2_1_2_1', 'meas2_2_2_1_2_2', 'meas2_2_2_1_2_3')
redis.call('SADD', 'comptag2_2_2_1_3_measurement_keys', 'meas2_2_2_1_3_1', 'meas2_2_2_1_3_2', 'meas2_2_2_1_3_3')
redis.call('SADD', 'comptag2_2_2_2_1_measurement_keys', 'meas2_2_2_2_1_1', 'meas2_2_2_2_1_2', 'meas2_2_2_2_1_3')
redis.call('SADD', 'comptag2_2_2_2_2_measurement_keys', 'meas2_2_2_2_2_1', 'meas2_2_2_2_2_2', 'meas2_2_2_2_2_3')
redis.call('SADD', 'comptag2_2_2_2_3_measurement_keys', 'meas2_2_2_2_3_1', 'meas2_2_2_2_3_2', 'meas2_2_2_2_3_3')
redis.call('SADD', 'comptag2_2_2_3_1_measurement_keys', 'meas2_2_2_3_1_1', 'meas2_2_2_3_1_2', 'meas2_2_2_3_1_3')
redis.call('SADD', 'comptag2_2_2_3_2_measurement_keys', 'meas2_2_2_3_2_1', 'meas2_2_2_3_2_2', 'meas2_2_2_3_2_3')
redis.call('SADD', 'comptag2_2_2_3_3_measurement_keys', 'meas2_2_2_3_3_1', 'meas2_2_2_3_3_2', 'meas2_2_2_3_3_3')
redis.call('SADD', 'comptag2_2_3_1_1_measurement_keys', 'meas2_2_3_1_1_1', 'meas2_2_3_1_1_2', 'meas2_2_3_1_1_3')
redis.call('SADD', 'comptag2_2_3_1_2_measurement_keys', 'meas2_2_3_1_2_1', 'meas2_2_3_1_2_2', 'meas2_2_3_1_2_3')
redis.call('SADD', 'comptag2_2_3_1_3_measurement_keys', 'meas2_2_3_1_3_1', 'meas2_2_3_1_3_2', 'meas2_2_3_1_3_3')
redis.call('SADD', 'comptag2_2_3_2_1_measurement_keys', 'meas2_2_3_2_1_1', 'meas2_2_3_2_1_2', 'meas2_2_3_2_1_3')
redis.call('SADD', 'comptag2_2_3_2_2_measurement_keys', 'meas2_2_3_2_2_1', 'meas2_2_3_2_2_2', 'meas2_2_3_2_2_3')
redis.call('SADD', 'comptag2_2_3_2_3_measurement_keys', 'meas2_2_3_2_3_1', 'meas2_2_3_2_3_2', 'meas2_2_3_2_3_3')
redis.call('SADD', 'comptag2_2_3_3_1_measurement_keys', 'meas2_2_3_3_1_1', 'meas2_2_3_3_1_2', 'meas2_2_3_3_1_3')
redis.call('SADD', 'comptag2_2_3_3_2_measurement_keys', 'meas2_2_3_3_2_1', 'meas2_2_3_3_2_2', 'meas2_2_3_3_2_3')
redis.call('SADD', 'comptag2_2_3_3_3_measurement_keys', 'meas2_2_3_3_3_1', 'meas2_2_3_3_3_2', 'meas2_2_3_3_3_3')
redis.call('SADD', 'comptag2_3_1_1_1_measurement_keys', 'meas2_3_1_1_1_1', 'meas2_3_1_1_1_2', 'meas2_3_1_1_1_3')
redis.call('SADD', 'comptag2_3_1_1_2_measurement_keys', 'meas2_3_1_1_2_1', 'meas2_3_1_1_2_2', 'meas2_3_1_1_2_3')
redis.call('SADD', 'comptag2_3_1_1_3_measurement_keys', 'meas2_3_1_1_3_1', 'meas2_3_1_1_3_2', 'meas2_3_1_1_3_3')
redis.call('SADD', 'comptag2_3_1_2_1_measurement_keys', 'meas2_3_1_2_1_1', 'meas2_3_1_2_1_2', 'meas2_3_1_2_1_3')
redis.call('SADD', 'comptag2_3_1_2_2_measurement_keys', 'meas2_3_1_2_2_1', 'meas2_3_1_2_2_2', 'meas2_3_1_2_2_3')
redis.call('SADD', 'comptag2_3_1_2_3_measurement_keys', 'meas2_3_1_2_3_1', 'meas2_3_1_2_3_2', 'meas2_3_1_2_3_3')
redis.call('SADD', 'comptag2_3_1_3_1_measurement_keys', 'meas2_3_1_3_1_1', 'meas2_3_1_3_1_2', 'meas2_3_1_3_1_3')
redis.call('SADD', 'comptag2_3_1_3_2_measurement_keys', 'meas2_3_1_3_2_1', 'meas2_3_1_3_2_2', 'meas2_3_1_3_2_3')
redis.call('SADD', 'comptag2_3_1_3_3_measurement_keys', 'meas2_3_1_3_3_1', 'meas2_3_1_3_3_2', 'meas2_3_1_3_3_3')
redis.call('SADD', 'comptag2_3_2_1_1_measurement_keys', 'meas2_3_2_1_1_1', 'meas2_3_2_1_1_2', 'meas2_3_2_1_1_3')
redis.call('SADD', 'comptag2_3_2_1_2_measurement_keys', 'meas2_3_2_1_2_1', 'meas2_3_2_1_2_2', 'meas2_3_2_1_2_3')
redis.call('SADD', 'comptag2_3_2_1_3_measurement_keys', 'meas2_3_2_1_3_1', 'meas2_3_2_1_3_2', 'meas2_3_2_1_3_3')
redis.call('SADD', 'comptag2_3_2_2_1_measurement_keys', 'meas2_3_2_2_1_1', 'meas2_3_2_2_1_2', 'meas2_3_2_2_1_3')
redis.call('SADD', 'comptag2_3_2_2_2_measurement_keys', 'meas2_3_2_2_2_1', 'meas2_3_2_2_2_2', 'meas2_3_2_2_2_3')
redis.call('SADD', 'comptag2_3_2_2_3_measurement_keys', 'meas2_3_2_2_3_1', 'meas2_3_2_2_3_2', 'meas2_3_2_2_3_3')
redis.call('SADD', 'comptag2_3_2_3_1_measurement_keys', 'meas2_3_2_3_1_1', 'meas2_3_2_3_1_2', 'meas2_3_2_3_1_3')
redis.call('SADD', 'comptag2_3_2_3_2_measurement_keys', 'meas2_3_2_3_2_1', 'meas2_3_2_3_2_2', 'meas2_3_2_3_2_3')
redis.call('SADD', 'comptag2_3_2_3_3_measurement_keys', 'meas2_3_2_3_3_1', 'meas2_3_2_3_3_2', 'meas2_3_2_3_3_3')
redis.call('SADD', 'comptag2_3_3_1_1_measurement_keys', 'meas2_3_3_1_1_1', 'meas2_3_3_1_1_2', 'meas2_3_3_1_1_3')
redis.call('SADD', 'comptag2_3_3_1_2_measurement_keys', 'meas2_3_3_1_2_1', 'meas2_3_3_1_2_2', 'meas2_3_3_1_2_3')
redis.call('SADD', 'comptag2_3_3_1_3_measurement_keys', 'meas2_3_3_1_3_1', 'meas2_3_3_1_3_2', 'meas2_3_3_1_3_3')
redis.call('SADD', 'comptag2_3_3_2_1_measurement_keys', 'meas2_3_3_2_1_1', 'meas2_3_3_2_1_2', 'meas2_3_3_2_1_3')
redis.call('SADD', 'comptag2_3_3_2_2_measurement_keys', 'meas2_3_3_2_2_1', 'meas2_3_3_2_2_2', 'meas2_3_3_2_2_3')
redis.call('SADD', 'comptag2_3_3_2_3_measurement_keys', 'meas2_3_3_2_3_1', 'meas2_3_3_2_3_2', 'meas2_3_3_2_3_3')
redis.call('SADD', 'comptag2_3_3_3_1_measurement_keys', 'meas2_3_3_3_1_1', 'meas2_3_3_3_1_2', 'meas2_3_3_3_1_3')
redis.call('SADD', 'comptag2_3_3_3_2_measurement_keys', 'meas2_3_3_3_2_1', 'meas2_3_3_3_2_2', 'meas2_3_3_3_2_3')
redis.call('SADD', 'comptag2_3_3_3_3_measurement_keys', 'meas2_3_3_3_3_1', 'meas2_3_3_3_3_2', 'meas2_3_3_3_3_3')
redis.call('SADD', 'comptag3_1_1_1_1_measurement_keys', 'meas3_1_1_1_1_1', 'meas3_1_1_1_1_2', 'meas3_1_1_1_1_3')
redis.call('SADD', 'comptag3_1_1_1_2_measurement_keys', 'meas3_1_1_1_2_1', 'meas3_1_1_1_2_2', 'meas3_1_1_1_2_3')
redis.call('SADD', 'comptag3_1_1_1_3_measurement_keys', 'meas3_1_1_1_3_1', 'meas3_1_1_1_3_2', 'meas3_1_1_1_3_3')
redis.call('SADD', 'comptag3_1_1_2_1_measurement_keys', 'meas3_1_1_2_1_1', 'meas3_1_1_2_1_2', 'meas3_1_1_2_1_3')
redis.call('SADD', 'comptag3_1_1_2_2_measurement_keys', 'meas3_1_1_2_2_1', 'meas3_1_1_2_2_2', 'meas3_1_1_2_2_3')
redis.call('SADD', 'comptag3_1_1_2_3_measurement_keys', 'meas3_1_1_2_3_1', 'meas3_1_1_2_3_2', 'meas3_1_1_2_3_3')
redis.call('SADD', 'comptag3_1_1_3_1_measurement_keys', 'meas3_1_1_3_1_1', 'meas3_1_1_3_1_2', 'meas3_1_1_3_1_3')
redis.call('SADD', 'comptag3_1_1_3_2_measurement_keys', 'meas3_1_1_3_2_1', 'meas3_1_1_3_2_2', 'meas3_1_1_3_2_3')
redis.call('SADD', 'comptag3_1_1_3_3_measurement_keys', 'meas3_1_1_3_3_1', 'meas3_1_1_3_3_2', 'meas3_1_1_3_3_3')
redis.call('SADD', 'comptag3_1_3_1_1_measurement_keys', 'meas3_1_3_1_1_1', 'meas3_1_3_1_1_2', 'meas3_1_3_1_1_3')
redis.call('SADD', 'comptag3_1_3_1_2_measurement_keys', 'meas3_1_3_1_2_1', 'meas3_1_3_1_2_2', 'meas3_1_3_1_2_3')
redis.call('SADD', 'comptag3_1_3_1_3_measurement_keys', 'meas3_1_3_1_3_1', 'meas3_1_3_1_3_2', 'meas3_1_3_1_3_3')
redis.call('SADD', 'comptag3_1_3_2_1_measurement_keys', 'meas3_1_3_2_1_1', 'meas3_1_3_2_1_2', 'meas3_1_3_2_1_3')
redis.call('SADD', 'comptag3_1_3_2_2_measurement_keys', 'meas3_1_3_2_2_1', 'meas3_1_3_2_2_2', 'meas3_1_3_2_2_3')
redis.call('SADD', 'comptag3_1_3_2_3_measurement_keys', 'meas3_1_3_2_3_1', 'meas3_1_3_2_3_2', 'meas3_1_3_2_3_3')
redis.call('SADD', 'comptag3_1_3_3_1_measurement_keys', 'meas3_1_3_3_1_1', 'meas3_1_3_3_1_2', 'meas3_1_3_3_1_3')
redis.call('SADD', 'comptag3_1_3_3_2_measurement_keys', 'meas3_1_3_3_2_1', 'meas3_1_3_3_2_2', 'meas3_1_3_3_2_3')
redis.call('SADD', 'comptag3_1_3_3_3_measurement_keys', 'meas3_1_3_3_3_1', 'meas3_1_3_3_3_2', 'meas3_1_3_3_3_3')
redis.call('SADD', 'comptag3_2_1_1_1_measurement_keys', 'meas3_2_1_1_1_1', 'meas3_2_1_1_1_2', 'meas3_2_1_1_1_3')
redis.call('SADD', 'comptag3_2_1_1_2_measurement_keys', 'meas3_2_1_1_2_1', 'meas3_2_1_1_2_2', 'meas3_2_1_1_2_3')
redis.call('SADD', 'comptag3_2_1_1_3_measurement_keys', 'meas3_2_1_1_3_1', 'meas3_2_1_1_3_2', 'meas3_2_1_1_3_3')
redis.call('SADD', 'comptag3_2_1_2_1_measurement_keys', 'meas3_2_1_2_1_1', 'meas3_2_1_2_1_2', 'meas3_2_1_2_1_3')
redis.call('SADD', 'comptag3_2_1_2_2_measurement_keys', 'meas3_2_1_2_2_1', 'meas3_2_1_2_2_2', 'meas3_2_1_2_2_3')
redis.call('SADD', 'comptag3_2_1_2_3_measurement_keys', 'meas3_2_1_2_3_1', 'meas3_2_1_2_3_2', 'meas3_2_1_2_3_3')
redis.call('SADD', 'comptag3_2_1_3_1_measurement_keys', 'meas3_2_1_3_1_1', 'meas3_2_1_3_1_2', 'meas3_2_1_3_1_3')
redis.call('SADD', 'comptag3_2_1_3_2_measurement_keys', 'meas3_2_1_3_2_1', 'meas3_2_1_3_2_2', 'meas3_2_1_3_2_3')
redis.call('SADD', 'comptag3_2_1_3_3_measurement_keys', 'meas3_2_1_3_3_1', 'meas3_2_1_3_3_2', 'meas3_2_1_3_3_3')
redis.call('SADD', 'comptag3_2_2_1_1_measurement_keys', 'meas3_2_2_1_1_1', 'meas3_2_2_1_1_2', 'meas3_2_2_1_1_3')
redis.call('SADD', 'comptag3_2_2_1_2_measurement_keys', 'meas3_2_2_1_2_1', 'meas3_2_2_1_2_2', 'meas3_2_2_1_2_3')
redis.call('SADD', 'comptag3_2_2_1_3_measurement_keys', 'meas3_2_2_1_3_1', 'meas3_2_2_1_3_2', 'meas3_2_2_1_3_3')
redis.call('SADD', 'comptag3_2_2_2_1_measurement_keys', 'meas3_2_2_2_1_1', 'meas3_2_2_2_1_2', 'meas3_2_2_2_1_3')
redis.call('SADD', 'comptag3_2_2_2_2_measurement_keys', 'meas3_2_2_2_2_1', 'meas3_2_2_2_2_2', 'meas3_2_2_2_2_3')
redis.call('SADD', 'comptag3_2_2_2_3_measurement_keys', 'meas3_2_2_2_3_1', 'meas3_2_2_2_3_2', 'meas3_2_2_2_3_3')
redis.call('SADD', 'comptag3_2_2_3_1_measurement_keys', 'meas3_2_2_3_1_1', 'meas3_2_2_3_1_2', 'meas3_2_2_3_1_3')
redis.call('SADD', 'comptag3_2_2_3_2_measurement_keys', 'meas3_2_2_3_2_1', 'meas3_2_2_3_2_2', 'meas3_2_2_3_2_3')
redis.call('SADD', 'comptag3_2_2_3_3_measurement_keys', 'meas3_2_2_3_3_1', 'meas3_2_2_3_3_2', 'meas3_2_2_3_3_3')
redis.call('SADD', 'comptag3_2_3_1_1_measurement_keys', 'meas3_2_3_1_1_1', 'meas3_2_3_1_1_2', 'meas3_2_3_1_1_3')
redis.call('SADD', 'comptag3_2_3_1_2_measurement_keys', 'meas3_2_3_1_2_1', 'meas3_2_3_1_2_2', 'meas3_2_3_1_2_3')
redis.call('SADD', 'comptag3_2_3_1_3_measurement_keys', 'meas3_2_3_1_3_1', 'meas3_2_3_1_3_2', 'meas3_2_3_1_3_3')
redis.call('SADD', 'comptag3_2_3_2_1_measurement_keys', 'meas3_2_3_2_1_1', 'meas3_2_3_2_1_2', 'meas3_2_3_2_1_3')
redis.call('SADD', 'comptag3_2_3_2_2_measurement_keys', 'meas3_2_3_2_2_1', 'meas3_2_3_2_2_2', 'meas3_2_3_2_2_3')
redis.call('SADD', 'comptag3_2_3_2_3_measurement_keys', 'meas3_2_3_2_3_1', 'meas3_2_3_2_3_2', 'meas3_2_3_2_3_3')
redis.call('SADD', 'comptag3_2_3_3_1_measurement_keys', 'meas3_2_3_3_1_1', 'meas3_2_3_3_1_2', 'meas3_2_3_3_1_3')
redis.call('SADD', 'comptag3_2_3_3_2_measurement_keys', 'meas3_2_3_3_2_1', 'meas3_2_3_3_2_2', 'meas3_2_3_3_2_3')
redis.call('SADD', 'comptag3_2_3_3_3_measurement_keys', 'meas3_2_3_3_3_1', 'meas3_2_3_3_3_2', 'meas3_2_3_3_3_3')
redis.call('SADD', 'comptag3_3_1_1_1_measurement_keys', 'meas3_3_1_1_1_1', 'meas3_3_1_1_1_2', 'meas3_3_1_1_1_3')
redis.call('SADD', 'comptag3_3_1_1_2_measurement_keys', 'meas3_3_1_1_2_1', 'meas3_3_1_1_2_2', 'meas3_3_1_1_2_3')
redis.call('SADD', 'comptag3_3_1_1_3_measurement_keys', 'meas3_3_1_1_3_1', 'meas3_3_1_1_3_2', 'meas3_3_1_1_3_3')
redis.call('SADD', 'comptag3_3_1_2_1_measurement_keys', 'meas3_3_1_2_1_1', 'meas3_3_1_2_1_2', 'meas3_3_1_2_1_3')
redis.call('SADD', 'comptag3_3_1_2_2_measurement_keys', 'meas3_3_1_2_2_1', 'meas3_3_1_2_2_2', 'meas3_3_1_2_2_3')
redis.call('SADD', 'comptag3_3_1_2_3_measurement_keys', 'meas3_3_1_2_3_1', 'meas3_3_1_2_3_2', 'meas3_3_1_2_3_3')
redis.call('SADD', 'comptag3_3_1_3_1_measurement_keys', 'meas3_3_1_3_1_1', 'meas3_3_1_3_1_2', 'meas3_3_1_3_1_3')
redis.call('SADD', 'comptag3_3_1_3_2_measurement_keys', 'meas3_3_1_3_2_1', 'meas3_3_1_3_2_2', 'meas3_3_1_3_2_3')
redis.call('SADD', 'comptag3_3_1_3_3_measurement_keys', 'meas3_3_1_3_3_1', 'meas3_3_1_3_3_2', 'meas3_3_1_3_3_3')
redis.call('SADD', 'comptag3_3_2_1_1_measurement_keys', 'meas3_3_2_1_1_1', 'meas3_3_2_1_1_2', 'meas3_3_2_1_1_3')
redis.call('SADD', 'comptag3_3_2_1_2_measurement_keys', 'meas3_3_2_1_2_1', 'meas3_3_2_1_2_2', 'meas3_3_2_1_2_3')
redis.call('SADD', 'comptag3_3_2_1_3_measurement_keys', 'meas3_3_2_1_3_1', 'meas3_3_2_1_3_2', 'meas3_3_2_1_3_3')
redis.call('SADD', 'comptag3_3_2_2_1_measurement_keys', 'meas3_3_2_2_1_1', 'meas3_3_2_2_1_2', 'meas3_3_2_2_1_3')
redis.call('SADD', 'comptag3_3_2_2_2_measurement_keys', 'meas3_3_2_2_2_1', 'meas3_3_2_2_2_2', 'meas3_3_2_2_2_3')
redis.call('SADD', 'comptag3_3_2_2_3_measurement_keys', 'meas3_3_2_2_3_1', 'meas3_3_2_2_3_2', 'meas3_3_2_2_3_3')
redis.call('SADD', 'comptag3_3_2_3_1_measurement_keys', 'meas3_3_2_3_1_1', 'meas3_3_2_3_1_2', 'meas3_3_2_3_1_3')
redis.call('SADD', 'comptag3_3_2_3_2_measurement_keys', 'meas3_3_2_3_2_1', 'meas3_3_2_3_2_2', 'meas3_3_2_3_2_3')
redis.call('SADD', 'comptag3_3_2_3_3_measurement_keys', 'meas3_3_2_3_3_1', 'meas3_3_2_3_3_2', 'meas3_3_2_3_3_3')
redis.call('SADD', 'comptag3_3_3_1_1_measurement_keys', 'meas3_3_3_1_1_1', 'meas3_3_3_1_1_2', 'meas3_3_3_1_1_3')
redis.call('SADD', 'comptag3_3_3_1_2_measurement_keys', 'meas3_3_3_1_2_1', 'meas3_3_3_1_2_2', 'meas3_3_3_1_2_3')
redis.call('SADD', 'comptag3_3_3_1_3_measurement_keys', 'meas3_3_3_1_3_1', 'meas3_3_3_1_3_2', 'meas3_3_3_1_3_3')
redis.call('SADD', 'comptag3_3_3_2_1_measurement_keys', 'meas3_3_3_2_1_1', 'meas3_3_3_2_1_2', 'meas3_3_3_2_1_3')
redis.call('SADD', 'comptag3_3_3_2_2_measurement_keys', 'meas3_3_3_2_2_1', 'meas3_3_3_2_2_2', 'meas3_3_3_2_2_3')
redis.call('SADD', 'comptag3_3_3_2_3_measurement_keys', 'meas3_3_3_2_3_1', 'meas3_3_3_2_3_2', 'meas3_3_3_2_3_3')
redis.call('SADD', 'comptag3_3_3_3_1_measurement_keys', 'meas3_3_3_3_1_1', 'meas3_3_3_3_1_2', 'meas3_3_3_3_1_3')
redis.call('SADD', 'comptag3_3_3_3_2_measurement_keys', 'meas3_3_3_3_2_1', 'meas3_3_3_3_2_2', 'meas3_3_3_3_2_3')
redis.call('SADD', 'comptag3_3_3_3_3_measurement_keys', 'meas3_3_3_3_3_1', 'meas3_3_3_3_3_2', 'meas3_3_3_3_3_3')
local dict_key = 'search_suggestions_dict' local dict_key = 'search_suggestions_dict'
redis.call('FT.SUGADD', dict_key, 'grid1', 1)
redis.call('FT.SUGADD', dict_key, 'grid2', 1)
redis.call('FT.SUGADD', dict_key, 'grid3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone2_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone2_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone2_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone3_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone3_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone3_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1.station1_1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1.station1_1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1.station1_1_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_2.station1_2_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_2.station1_2_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_2.station1_2_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_3.station1_3_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_3.station1_3_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_3.station1_3_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone2_1.station2_1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone2_1.station2_1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone2_1.station2_1_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone2_2.station2_2_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone2_2.station2_2_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone2_2.station2_2_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone2_3.station2_3_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone2_3.station2_3_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone2_3.station2_3_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone3_1.station3_1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone3_1.station3_1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone3_1.station3_1_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone3_2.station3_2_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone3_2.station3_2_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone3_2.station3_2_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone3_3.station3_3_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone3_3.station3_3_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone3_3.station3_3_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone1_1.station1_1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone1_1.station1_1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone1_1.station1_1_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone1_2.station1_2_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone1_2.station1_2_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone1_2.station1_2_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone1_3.station1_3_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone1_3.station1_3_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone1_3.station1_3_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone2_1.station2_1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone2_1.station2_1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone2_1.station2_1_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone2_2.station2_2_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone2_2.station2_2_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone2_2.station2_2_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone2_3.station2_3_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone2_3.station2_3_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone2_3.station2_3_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone3_1.station3_1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone3_1.station3_1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone3_1.station3_1_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone3_2.station3_2_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone3_2.station3_2_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone3_2.station3_2_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone3_3.station3_3_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone3_3.station3_3_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid2.zone3_3.station3_3_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone1_1.station1_1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone1_1.station1_1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone1_1.station1_1_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone1_2.station1_2_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone1_2.station1_2_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone1_2.station1_2_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone1_3.station1_3_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone1_3.station1_3_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone1_3.station1_3_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone2_1.station2_1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone2_1.station2_1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone2_1.station2_1_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone2_2.station2_2_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone2_2.station2_2_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone2_2.station2_2_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone2_3.station2_3_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone2_3.station2_3_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone2_3.station2_3_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone3_1.station3_1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone3_1.station3_1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone3_1.station3_1_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone3_2.station3_2_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone3_2.station3_2_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone3_2.station3_2_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone3_3.station3_3_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone3_3.station3_3_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid3.zone3_3.station3_3_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1.station1_1_1.ns1_1_1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1.station1_1_1.ns1_1_1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1.station1_1_1.ns1_1_1_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1.station1_1_2.ns1_1_1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1.station1_1_2.ns1_1_1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1.station1_1_2.ns1_1_1_3', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1.station1_1_3.ns1_1_1_1', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1.station1_1_3.ns1_1_1_2', 1)
redis.call('FT.SUGADD', dict_key, 'grid1.zone1_1.station1_1_3.ns1_1_1_3', 1)
redis.call('FT.SUGADD', dict_key, 'transformfeeder1_220', 1)
redis.call('FT.SUGADD', dict_key, 'transformfeeder1_220_35', 1)
redis.call('FT.SUGADD', dict_key, 'transformfeeder1_220_36', 1)
redis.call('FT.SUGADD', dict_key, 'transformfeeder1_220.I_A_rms', 1)
redis.call('FT.SUGADD', dict_key, 'transformfeeder1_220.I_B_rms', 1)
redis.call('FT.SUGADD', dict_key, 'transformfeeder1_220.I_C_rms', 1)
redis.call('FT.SUGADD', dict_key, 'transformfeeder1_220_35.I_A_rms', 1)
redis.call('FT.SUGADD', dict_key, 'transformfeeder1_220_35.I_B_rms', 1)
redis.call('FT.SUGADD', dict_key, 'transformfeeder1_220_35.I_C_rms', 1)
redis.call('FT.SUGADD', dict_key, 'transformfeeder1_220_36.I_A_rms', 1)
redis.call('FT.SUGADD', dict_key, 'transformfeeder1_220_36.I_B_rms', 1)
redis.call('FT.SUGADD', dict_key, 'transformfeeder1_220_36.I_C_rms', 1)
return 'OK' return 'OK'
``` ```

View File

@ -7,6 +7,7 @@ import (
"modelRT/logger" "modelRT/logger"
"modelRT/model" "modelRT/model"
"modelRT/network" "modelRT/network"
"modelRT/util"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@ -17,19 +18,19 @@ import (
// @Tags Measurement Recommend // @Tags Measurement Recommend
// @Accept json // @Accept json
// @Produce json // @Produce json
// @Param input query string true "推荐关键词,例如 'trans' 或 'transformfeeder1_220.'" Example("trans") // @Param input query string true "推荐关键词,例如 'grid1' 或 'grid1.'" Example("grid1")
// @Success 200 {object} network.SuccessResponse{payload=network.MeasurementRecommendPayload} "返回推荐列表成功" // @Success 200 {object} network.SuccessResponse{payload=network.MeasurementRecommendPayload} "返回推荐列表成功"
// //
// @Example 200 { // @Example 200 {
// "code": 200, // "code": 200,
// "msg": "success", // "msg": "success",
// "payload": { // "payload": {
// "input": "transformfeeder1_220.", // "input": "grid1.zone1.station1.ns1.tag1.bay.",
// "offset": 21, // "offset": 21,
// "recommended_list": [ // "recommended_list": [
// "I_A_rms", // "I11_A_rms",
// "I_B_rms", // "I11_B_rms.",
// "I_C_rms", // "I11_C_rms.",
// ] // ]
// } // }
// } // }
@ -71,7 +72,7 @@ func MeasurementRecommendHandler(c *gin.Context) {
if isFuzzy { if isFuzzy {
var maxOffset int var maxOffset int
for index, recommend := range recommends { for index, recommend := range recommends {
offset := model.GetLongestCommonPrefixLength(request.Input, recommend) offset := util.GetLongestCommonPrefixLength(request.Input, recommend)
if index == 0 || offset > maxOffset { if index == 0 || offset > maxOffset {
maxOffset = offset maxOffset = offset
} }
@ -80,7 +81,7 @@ func MeasurementRecommendHandler(c *gin.Context) {
} else { } else {
var minOffset int var minOffset int
for index, recommend := range recommends { for index, recommend := range recommends {
offset := model.GetLongestCommonPrefixLength(request.Input, recommend) offset := util.GetLongestCommonPrefixLength(request.Input, recommend)
if index == 0 || offset < minOffset { if index == 0 || offset < minOffset {
minOffset = offset minOffset = offset
} }

View File

@ -27,6 +27,203 @@ func InitAutocompleterWithPool(pool *redigo.Pool) {
func RedisSearchRecommend(ctx context.Context, input string) ([]string, bool, error) { func RedisSearchRecommend(ctx context.Context, input string) ([]string, bool, error) {
rdb := diagram.GetRedisClientInstance() rdb := diagram.GetRedisClientInstance()
if input == "" {
// return all grid tagname
return getKeyBySpecificsLevel(ctx, rdb, 1, input)
}
inputSlice := strings.Split(input, ".")
inputSliceLen := len(inputSlice)
switch inputSliceLen {
case 1:
// grid tagname search
gridSearchInput := inputSlice[0]
gridExists, err := rdb.SIsMember(ctx, constants.RedisAllGridSetKey, gridSearchInput).Result()
if err != nil {
logger.Error(ctx, "check grid key exist failed ", "grid_key", input, "error", err)
return []string{}, false, err
}
if gridExists {
return []string{"."}, false, nil
}
// start grid tagname fuzzy search
recommends, err := runFuzzySearch(ctx, gridSearchInput, inputSliceLen)
if err != nil {
logger.Error(ctx, "fuzzy search failed for level 1", "search_input", gridSearchInput, "error", err)
return []string{}, false, err
}
if len(recommends) > 0 {
return recommends, true, nil
}
return []string{}, true, nil
case 2:
return handleLevelFuzzySearch(ctx, rdb, 2, constants.RedisAllZoneSetKey, inputSlice)
case 3:
return handleLevelFuzzySearch(ctx, rdb, 3, constants.RedisAllStationSetKey, inputSlice)
case 4:
return handleLevelFuzzySearch(ctx, rdb, 4, constants.RedisAllCompNSPathSetKey, inputSlice)
case 5:
return handleLevelFuzzySearch(ctx, rdb, 5, constants.RedisAllCompTagSetKey, inputSlice)
case 6:
return handleLevelFuzzySearch(ctx, rdb, 6, constants.RedisAllConfigSetKey, inputSlice)
case 7:
return handleLevelFuzzySearch(ctx, rdb, 7, constants.RedisAllMeasTagSetKey, inputSlice)
default:
logger.Error(ctx, "unsupport length of search input", "input_len", inputSliceLen)
return []string{}, false, nil
}
}
func getKeyBySpecificsLevel(ctx context.Context, rdb *redis.Client, inputLen int, input string) ([]string, bool, error) {
queryKey := getSpecificKeyByLength(inputLen, input)
results, err := rdb.SMembers(ctx, queryKey).Result()
if err != nil {
return []string{}, false, fmt.Errorf("get all keys failed, error: %w", err)
}
return results, false, nil
}
func combineQueryResultByInput(inputSliceLen int, inputSlice []string, queryResults []string) []string {
prefixs := make([]string, 0, len(inputSlice))
recommandResults := make([]string, 0, len(queryResults))
switch inputSliceLen {
case 2:
prefixs = []string{inputSlice[0]}
case 3:
prefixs = inputSlice[0:2]
case 4:
prefixs = inputSlice[0:3]
case 5:
prefixs = inputSlice[0:4]
case 6:
prefixs = inputSlice[0:5]
case 7:
prefixs = inputSlice[0:6]
default:
return []string{}
}
for _, queryResult := range queryResults {
combineStrs := make([]string, 0, len(inputSlice))
combineStrs = append(combineStrs, prefixs...)
combineStrs = append(combineStrs, queryResult)
recommandResult := strings.Join(combineStrs, ".")
recommandResults = append(recommandResults, recommandResult)
}
return recommandResults
}
func getSpecificKeyByLength(inputLen int, input string) string {
switch inputLen {
case 1:
return constants.RedisAllGridSetKey
case 2:
return fmt.Sprintf(constants.RedisSpecGridZoneSetKey, input)
case 3:
return fmt.Sprintf(constants.RedisSpecZoneStationSetKey, input)
case 4:
return fmt.Sprintf(constants.RedisSpecStationCompNSPATHSetKey, input)
case 5:
return fmt.Sprintf(constants.RedisSpecStationCompTagSetKey, input)
case 6:
return constants.RedisAllConfigSetKey
case 7:
return fmt.Sprintf(constants.RedisSpecCompTagMeasSetKey, input)
default:
return constants.RedisAllGridSetKey
}
}
// handleLevelFuzzySearch define func to process recommendation logic for specific levels(level >= 2)
func handleLevelFuzzySearch(ctx context.Context, rdb *redis.Client, level int, keySetKey string, inputSlice []string) ([]string, bool, error) {
searchInputIndex := level - 1
searchInput := inputSlice[searchInputIndex]
if searchInput == "" {
var specificalKey string
specificalKeyIndex := searchInputIndex - 1
if specificalKeyIndex >= 0 {
specificalKey = inputSlice[specificalKeyIndex]
}
allResults, isFuzzy, err := getKeyBySpecificsLevel(ctx, rdb, level, specificalKey)
if err != nil {
return []string{}, false, err
}
recommandResults := combineQueryResultByInput(level, inputSlice, allResults)
return recommandResults, isFuzzy, nil
}
keyExists, err := rdb.SIsMember(ctx, keySetKey, searchInput).Result()
if err != nil {
logger.Error(ctx, "check key exist failed ", "key", searchInput, "error", err)
return []string{}, false, err
}
if keyExists {
return []string{"."}, false, nil
}
// start redis fuzzy search
recommends, err := runFuzzySearch(ctx, searchInput, level)
if err != nil {
logger.Error(ctx, "fuzzy search failed for level", "level", level, "search_input", searchInput, "error", err)
return []string{}, false, err
}
if len(recommends) == 0 {
logger.Error(ctx, "fuzzy search without result", "level", level, "search_input", searchInput, "error", err)
return []string{}, true, nil
}
return combineQueryResultByInput(level, inputSlice, recommends), true, nil
}
// runFuzzySearch define func to process redis fuzzy search
func runFuzzySearch(ctx context.Context, searchInput string, inputSliceLen int) ([]string, error) {
searchInputLen := len(searchInput)
for searchInputLen != 0 {
results, err := ac.SuggestOpts(searchInput, redisearch.SuggestOptions{
Num: math.MaxInt16,
Fuzzy: true,
WithScores: false,
WithPayloads: false,
})
if err != nil {
logger.Error(ctx, "query key by redis fuzzy search failed", "query_key", searchInput, "error", err)
return nil, fmt.Errorf("redisearch suggest failed: %w", err)
}
if len(results) == 0 {
// 如果没有结果,退一步(删除最后一个字节)并继续循环
// TODO 考虑使用其他方式代替 for 循环退一字节的查询方式
searchInput = searchInput[:len(searchInput)-1]
searchInputLen = len(searchInput)
continue
}
var recommends []string
for _, result := range results {
termSlice := strings.Split(result.Term, ".")
if len(termSlice) <= inputSliceLen {
recommends = append(recommends, result.Term)
}
}
return recommends, nil
}
return []string{}, nil
}
// RedisSearchRecommend1 define func of redis search by input string and return recommend results
func RedisSearchRecommend1(ctx context.Context, input string) ([]string, bool, error) {
rdb := diagram.GetRedisClientInstance()
if input == "" { if input == "" {
// 返回所有 grid 名 // 返回所有 grid 名
return getKeyBySpecificsLevel(ctx, rdb, 1, input) return getKeyBySpecificsLevel(ctx, rdb, 1, input)
@ -37,7 +234,7 @@ func RedisSearchRecommend(ctx context.Context, input string) ([]string, bool, er
switch inputSliceLen { switch inputSliceLen {
case 1: case 1:
// grid search // grid tagname search
gridSearchInput := inputSlice[0] gridSearchInput := inputSlice[0]
gridExists, err := rdb.SIsMember(ctx, constants.RedisAllGridSetKey, gridSearchInput).Result() gridExists, err := rdb.SIsMember(ctx, constants.RedisAllGridSetKey, gridSearchInput).Result()
if err != nil { if err != nil {
@ -49,7 +246,7 @@ func RedisSearchRecommend(ctx context.Context, input string) ([]string, bool, er
return []string{"."}, false, err return []string{"."}, false, err
} }
// start grid fuzzy search // start grid tagname fuzzy search
searchInput := gridSearchInput searchInput := gridSearchInput
searchInputLen := len(searchInput) searchInputLen := len(searchInput)
for searchInputLen != 0 && !gridExists { for searchInputLen != 0 && !gridExists {
@ -82,7 +279,7 @@ func RedisSearchRecommend(ctx context.Context, input string) ([]string, bool, er
return recommends, true, nil return recommends, true, nil
} }
case 2: case 2:
// zone search // zone tagname search
zoneSearchInput := inputSlice[1] zoneSearchInput := inputSlice[1]
if zoneSearchInput == "" { if zoneSearchInput == "" {
specificalGrid := inputSlice[0] specificalGrid := inputSlice[0]
@ -101,7 +298,7 @@ func RedisSearchRecommend(ctx context.Context, input string) ([]string, bool, er
return []string{"."}, false, err return []string{"."}, false, err
} }
// start zone fuzzy search // start zone tagname fuzzy search
searchInput := zoneSearchInput searchInput := zoneSearchInput
searchInputLen := len(searchInput) searchInputLen := len(searchInput)
for searchInputLen != 0 && !zoneExists { for searchInputLen != 0 && !zoneExists {
@ -134,9 +331,8 @@ func RedisSearchRecommend(ctx context.Context, input string) ([]string, bool, er
return combineQueryResultByInput(inputSliceLen, inputSlice, recommends), true, nil return combineQueryResultByInput(inputSliceLen, inputSlice, recommends), true, nil
} }
case 3: case 3:
// station search // station tagname search
stationSearchInput := inputSlice[2] stationSearchInput := inputSlice[2]
fmt.Println(stationSearchInput)
if stationSearchInput == "" { if stationSearchInput == "" {
specificalZone := inputSlice[1] specificalZone := inputSlice[1]
allStations, isFuzzy, err := getKeyBySpecificsLevel(ctx, rdb, inputSliceLen, specificalZone) allStations, isFuzzy, err := getKeyBySpecificsLevel(ctx, rdb, inputSliceLen, specificalZone)
@ -154,7 +350,7 @@ func RedisSearchRecommend(ctx context.Context, input string) ([]string, bool, er
return []string{"."}, false, err return []string{"."}, false, err
} }
// start grid fuzzy search // start station tagname fuzzy search
searchInput := stationSearchInput searchInput := stationSearchInput
searchInputLen := len(searchInput) searchInputLen := len(searchInput)
for searchInputLen != 0 && !stationExists { for searchInputLen != 0 && !stationExists {
@ -188,28 +384,28 @@ func RedisSearchRecommend(ctx context.Context, input string) ([]string, bool, er
} }
case 4: case 4:
// component nspath search // component nspath search
componentSearchInput := inputSlice[3] compNSPSearchInput := inputSlice[3]
if componentSearchInput == "" { if compNSPSearchInput == "" {
specificalStation := inputSlice[1] specificalStation := inputSlice[2]
allComponents, isFuzzy, err := getKeyBySpecificsLevel(ctx, rdb, inputSliceLen, specificalStation) allCompNSPaths, isFuzzy, err := getKeyBySpecificsLevel(ctx, rdb, inputSliceLen, specificalStation)
recommandResults := combineQueryResultByInput(inputSliceLen, inputSlice, allComponents) recommandResults := combineQueryResultByInput(inputSliceLen, inputSlice, allCompNSPaths)
return recommandResults, isFuzzy, err return recommandResults, isFuzzy, err
} }
componentExists, err := rdb.SIsMember(ctx, constants.RedisAllStationSetKey, componentSearchInput).Result() compNSPathExists, err := rdb.SIsMember(ctx, constants.RedisAllCompNSPathSetKey, compNSPSearchInput).Result()
if err != nil { if err != nil {
logger.Error(ctx, "check component key exist failed ", "component_key", componentSearchInput, "error", err) logger.Error(ctx, "check component nspath key exist failed ", "component_nspath_key", compNSPSearchInput, "error", err)
return []string{}, false, err return []string{}, false, err
} }
if componentExists { if compNSPathExists {
return []string{"."}, false, err return []string{"."}, false, err
} }
// start grid fuzzy search // start grid fuzzy search
searchInput := componentSearchInput searchInput := compNSPSearchInput
searchInputLen := len(searchInput) searchInputLen := len(searchInput)
for searchInputLen != 0 && !componentExists { for searchInputLen != 0 && !compNSPathExists {
results, err := ac.SuggestOpts(searchInput, redisearch.SuggestOptions{ results, err := ac.SuggestOpts(searchInput, redisearch.SuggestOptions{
Num: math.MaxInt16, Num: math.MaxInt16,
Fuzzy: true, Fuzzy: true,
@ -217,7 +413,7 @@ func RedisSearchRecommend(ctx context.Context, input string) ([]string, bool, er
WithPayloads: false, WithPayloads: false,
}) })
if err != nil { if err != nil {
logger.Error(ctx, "query station key by redis fuzzy search failed", "query_key", searchInput, "error", err) logger.Error(ctx, "query component nspath key by redis fuzzy search failed", "query_key", searchInput, "error", err)
return []string{}, false, err return []string{}, false, err
} }
@ -241,47 +437,28 @@ func RedisSearchRecommend(ctx context.Context, input string) ([]string, bool, er
case 5: case 5:
// component tag search // component tag search
compTagSearchInput := inputSlice[4] compTagSearchInput := inputSlice[4]
fmt.Println(compTagSearchInput) if compTagSearchInput == "" {
case 6: // TODO 优化考虑是否使用 station 作为 key 的一部分
// configuration search specificalStation := inputSlice[2]
configSearchInput := inputSlice[5] allCompNSPaths, isFuzzy, err := getKeyBySpecificsLevel(ctx, rdb, inputSliceLen, specificalStation)
fmt.Println(configSearchInput) recommandResults := combineQueryResultByInput(inputSliceLen, inputSlice, allCompNSPaths)
case 7: return recommandResults, isFuzzy, err
// measurement search }
measSearchInput := inputSlice[6]
fmt.Println(measSearchInput) compTagExists, err := rdb.SIsMember(ctx, constants.RedisAllCompTagSetKey, compTagSearchInput).Result()
default:
lastInput := inputSlice[inputSliceLen-1]
// 判断 queryKey 是否是空值空值则返回上一级别下的所有key
if lastInput == "" {
setKey := getCombinedConstantsKeyByLength(inputSlice[inputSliceLen-2], inputSliceLen)
targetSet := diagram.NewRedisSet(ctx, setKey, 10, true)
keys, err := targetSet.SMembers(setKey)
if err != nil { if err != nil {
logger.Error(ctx, "get all recommend key by setKey failed", "set_key", setKey, "error", err) logger.Error(ctx, "check component tag key exist failed ", "component_tag_key", compTagSearchInput, "error", err)
return []string{}, false, fmt.Errorf("get all recommend key by setKey failed,%w", err) return []string{}, false, err
} }
var results []string if compTagExists {
for _, key := range keys { return []string{"."}, false, err
result := input + key
results = append(results, result)
}
return results, false, nil
} }
setKey := getCombinedConstantsKeyByLength(inputSlice[inputSliceLen-2], inputSliceLen) // start grid fuzzy search
targetSet := diagram.NewRedisSet(ctx, setKey, 10, true) searchInput := compTagSearchInput
exist, err := targetSet.SIsMember(setKey, lastInput) searchInputLen := len(searchInput)
if err != nil { for searchInputLen != 0 && !compTagExists {
logger.Error(ctx, "check keys exist failed", "set_key", setKey, "query_key", lastInput, "error", err)
return []string{}, false, fmt.Errorf("check keys failed,%w", err)
}
searchInput := input
inputLen := len(searchInput)
for inputLen != 0 && !exist {
logger.Info(ctx, "use fuzzy query", "input", input)
results, err := ac.SuggestOpts(searchInput, redisearch.SuggestOptions{ results, err := ac.SuggestOpts(searchInput, redisearch.SuggestOptions{
Num: math.MaxInt16, Num: math.MaxInt16,
Fuzzy: true, Fuzzy: true,
@ -289,113 +466,135 @@ func RedisSearchRecommend(ctx context.Context, input string) ([]string, bool, er
WithPayloads: false, WithPayloads: false,
}) })
if err != nil { if err != nil {
logger.Error(ctx, "query info by fuzzy failed", "query_key", input, "error", err) logger.Error(ctx, "query component tag key by redis fuzzy search failed", "query_key", searchInput, "error", err)
return []string{}, false, err return []string{}, false, err
} }
if len(results) == 0 { if len(results) == 0 {
searchInput = input[:inputLen-1] // TODO 考虑使用其他方式代替 for 循环退一字节的查询方式
inputLen = len(searchInput) searchInput = searchInput[:len(searchInput)-1]
searchInputLen = len(searchInput)
continue continue
} }
var terms []string var recommends []string
for _, result := range results { for _, result := range results {
terms = append(terms, result.Term) termSlice := strings.Split(result.Term, ".")
if len(termSlice) <= inputSliceLen {
recommends = append(recommends, result.Term)
} }
// 返回模糊查询结果
return terms, true, nil
} }
return []string{input}, false, nil // return fuzzy search results
return combineQueryResultByInput(inputSliceLen, inputSlice, recommends), true, nil
}
case 6:
// configuration search
// TODO 优化
configSearchInput := inputSlice[5]
if configSearchInput == "" {
allCompNSPaths, isFuzzy, err := getKeyBySpecificsLevel(ctx, rdb, inputSliceLen, "")
recommandResults := combineQueryResultByInput(inputSliceLen, inputSlice, allCompNSPaths)
return recommandResults, isFuzzy, err
}
configExists, err := rdb.SIsMember(ctx, constants.RedisAllConfigSetKey, configSearchInput).Result()
if err != nil {
logger.Error(ctx, "check config key exist failed ", "config_key", configSearchInput, "error", err)
return []string{}, false, err
}
if configExists {
return []string{"."}, false, err
}
// start grid fuzzy search
searchInput := configSearchInput
searchInputLen := len(searchInput)
for searchInputLen != 0 && !configExists {
results, err := ac.SuggestOpts(searchInput, redisearch.SuggestOptions{
Num: math.MaxInt16,
Fuzzy: true,
WithScores: false,
WithPayloads: false,
})
if err != nil {
logger.Error(ctx, "query config key by redis fuzzy search failed", "query_key", searchInput, "error", err)
return []string{}, false, err
}
if len(results) == 0 {
// TODO 考虑使用其他方式代替 for 循环退一字节的查询方式
searchInput = searchInput[:len(searchInput)-1]
searchInputLen = len(searchInput)
continue
}
var recommends []string
for _, result := range results {
termSlice := strings.Split(result.Term, ".")
if len(termSlice) <= inputSliceLen {
recommends = append(recommends, result.Term)
}
}
// return fuzzy search results
return combineQueryResultByInput(inputSliceLen, inputSlice, recommends), true, nil
}
case 7:
// measurement search
measSearchInput := inputSlice[6]
if measSearchInput == "" {
// use compoent tag for redis unique key prefix
specificalCompTag := inputSlice[4]
allMeasTags, isFuzzy, err := getKeyBySpecificsLevel(ctx, rdb, inputSliceLen, specificalCompTag)
recommandResults := combineQueryResultByInput(inputSliceLen, inputSlice, allMeasTags)
return recommandResults, isFuzzy, err
}
measTagExists, err := rdb.SIsMember(ctx, constants.RedisAllMeasTagSetKey, measSearchInput).Result()
if err != nil {
logger.Error(ctx, "check component tag key exist failed ", "component_tag_key", measSearchInput, "error", err)
return []string{}, false, err
}
if measTagExists {
return []string{"."}, false, err
}
// start measurement tag fuzzy search
searchInput := measSearchInput
searchInputLen := len(searchInput)
for searchInputLen != 0 && !measTagExists {
results, err := ac.SuggestOpts(searchInput, redisearch.SuggestOptions{
Num: math.MaxInt16,
Fuzzy: true,
WithScores: false,
WithPayloads: false,
})
if err != nil {
logger.Error(ctx, "query measurement tag key by redis fuzzy search failed", "query_key", searchInput, "error", err)
return []string{}, false, err
}
if len(results) == 0 {
// TODO 考虑使用其他方式代替 for 循环退一字节的查询方式
searchInput = searchInput[:len(searchInput)-1]
searchInputLen = len(searchInput)
continue
}
var recommends []string
for _, result := range results {
termSlice := strings.Split(result.Term, ".")
if len(termSlice) <= inputSliceLen {
recommends = append(recommends, result.Term)
}
}
// return fuzzy search results
return combineQueryResultByInput(inputSliceLen, inputSlice, recommends), true, nil
}
default:
logger.Error(ctx, "unsupport length of search input", "input_len", inputSliceLen)
return []string{}, false, nil
} }
return []string{}, false, nil return []string{}, false, nil
} }
func getKeyBySpecificsLevel(ctx context.Context, rdb *redis.Client, inputLen int, input string) ([]string, bool, error) {
queryKey := getSpecificKeyByLength(inputLen, input)
results, err := rdb.SMembers(ctx, queryKey).Result()
if err != nil {
return []string{}, false, fmt.Errorf("get all root keys failed, error: %w", err)
}
return results, false, nil
}
func combineQueryResultByInput(inputSliceLen int, inputSlice []string, queryResults []string) []string {
prefixs := make([]string, 0, len(inputSlice))
recommandResults := make([]string, 0, len(queryResults))
switch inputSliceLen {
case 2:
prefixs = []string{inputSlice[0]}
case 3:
prefixs = inputSlice[0:2]
default:
return []string{}
}
for _, queryResult := range queryResults {
combineStrs := make([]string, 0, len(inputSlice))
combineStrs = append(combineStrs, prefixs...)
combineStrs = append(combineStrs, queryResult)
recommandResult := strings.Join(combineStrs, ".")
recommandResults = append(recommandResults, recommandResult)
}
return recommandResults
}
func getConstantsKeyByLength(inputLen int) string {
switch inputLen {
case 1:
return constants.RedisAllGridSetKey
case 2:
return constants.RedisAllZoneSetKey
case 3:
return constants.RedisAllStationSetKey
case 4:
return constants.RedisAllComponentSetKey
default:
return constants.RedisAllGridSetKey
}
}
func getSpecificKeyByLength(inputLen int, input string) string {
switch inputLen {
case 1:
return constants.RedisAllGridSetKey
case 2:
return fmt.Sprintf(constants.RedisSpecGridZoneSetKey, input)
case 3:
return fmt.Sprintf(constants.RedisSpecZoneStationSetKey, input)
case 4:
return fmt.Sprintf(constants.RedisSpecStationComponentSetKey, input)
default:
return constants.RedisAllGridSetKey
}
}
func getCombinedConstantsKeyByLength(key string, inputLen int) string {
switch inputLen {
case 2:
return fmt.Sprintf(constants.RedisSpecGridZoneSetKey, key)
case 3:
return fmt.Sprintf(constants.RedisSpecZoneStationSetKey, key)
case 4:
return fmt.Sprintf(constants.RedisSpecStationComponentSetKey, key)
default:
return constants.RedisAllGridSetKey
}
}
// GetLongestCommonPrefixLength define func of get longest common prefix length between two strings
func GetLongestCommonPrefixLength(input string, recommendResult string) int {
if input == "" {
return 0
}
minLen := min(len(input), len(recommendResult))
for i := range minLen {
if input[i] != recommendResult[i] {
return i
}
}
return minLen
}

View File

@ -9,5 +9,5 @@ type MeasurementGetRequest struct {
// MeasurementRecommendRequest defines the request payload for an measurement recommend // MeasurementRecommendRequest defines the request payload for an measurement recommend
type MeasurementRecommendRequest struct { type MeasurementRecommendRequest struct {
Input string `form:"input,omitempty" example:"trans"` Input string `form:"input,omitempty" example:"grid1"`
} }

View File

@ -42,3 +42,19 @@ func DeduplicateAndReportDuplicates(targetsSlice []string, sourceSlice []string)
} }
return deduplicated, duplicates return deduplicated, duplicates
} }
// GetLongestCommonPrefixLength define func of get longest common prefix length between two strings
func GetLongestCommonPrefixLength(query string, result string) int {
if query == "" {
return 0
}
minLen := min(len(query), len(result))
for i := range minLen {
if query[i] != result[i] {
return i
}
}
return minLen
}