11package org .evomaster .client .java .controller .internal .db .redis ;
22
33import org .evomaster .client .java .controller .internal .TaintHandlerExecutionTracer ;
4+ import org .evomaster .client .java .controller .redis .RedisKeyValueStore ;
45import org .evomaster .client .java .controller .redis .ReflectionBasedRedisClient ;
56import org .evomaster .client .java .controller .redis .RedisHeuristicsCalculator ;
6- import org .evomaster .client .java .controller .redis .RedisInfo ;
7+ import org .evomaster .client .java .controller .redis .RedisValueData ;
78import org .evomaster .client .java .instrumentation .RedisCommand ;
89import org .evomaster .client .java .utils .SimpleLogger ;
910
@@ -82,35 +83,34 @@ private RedisDistanceWithMetrics computeDistance(RedisCommand redisCommand, Refl
8283 switch (type ) {
8384 case KEYS :
8485 case EXISTS : {
85- List < RedisInfo > redisInfo = createRedisInfoForAllKeys (redisClient );
86- return calculator .computeDistance (redisCommand , redisInfo );
86+ RedisKeyValueStore redisKeyValueStore = createRedisInfoForAllKeys (redisClient );
87+ return calculator .computeDistance (redisCommand , redisKeyValueStore );
8788 }
8889
8990 case GET : {
90- List < RedisInfo > redisInfo = createRedisInfoForKeysByType (REDIS_STRING_TYPE , redisClient );
91- return calculator .computeDistance (redisCommand , redisInfo );
91+ RedisKeyValueStore redisKeyValueStore = createRedisInfoForKeysByType (REDIS_STRING_TYPE , redisClient );
92+ return calculator .computeDistance (redisCommand , redisKeyValueStore );
9293 }
9394
9495 case HGET : {
95- String field = redisCommand .extractArgs ().get (1 );
96- List <RedisInfo > redisInfo = createRedisInfoForKeysByField (field , redisClient );
97- return calculator .computeDistance (redisCommand , redisInfo );
96+ RedisKeyValueStore redisKeyValueStore = createRedisInfoForKeysByField (redisClient );
97+ return calculator .computeDistance (redisCommand , redisKeyValueStore );
9898 }
9999
100100 case HGETALL : {
101- List < RedisInfo > redisInfo = createRedisInfoForKeysByType (REDIS_HASH_TYPE , redisClient );
102- return calculator .computeDistance (redisCommand , redisInfo );
101+ RedisKeyValueStore redisKeyValueStore = createRedisInfoForKeysByType (REDIS_HASH_TYPE , redisClient );
102+ return calculator .computeDistance (redisCommand , redisKeyValueStore );
103103 }
104104
105105 case SMEMBERS : {
106- List < RedisInfo > redisInfo = createRedisInfoForKeysByType (REDIS_SET_TYPE , redisClient );
107- return calculator .computeDistance (redisCommand , redisInfo );
106+ RedisKeyValueStore redisKeyValueStore = createRedisInfoForKeysByType (REDIS_SET_TYPE , redisClient );
107+ return calculator .computeDistance (redisCommand , redisKeyValueStore );
108108 }
109109
110110 case SINTER : {
111111 List <String > keys = redisCommand .extractArgs ();
112- List < RedisInfo > redisInfo = createRedisInfoForIntersection (keys , redisClient );
113- return calculator .computeDistance (redisCommand , redisInfo );
112+ RedisKeyValueStore redisKeyValueStore = createRedisInfoForIntersection (keys , redisClient );
113+ return calculator .computeDistance (redisCommand , redisKeyValueStore );
114114 }
115115
116116 default :
@@ -122,35 +122,48 @@ private RedisDistanceWithMetrics computeDistance(RedisCommand redisCommand, Refl
122122 }
123123 }
124124
125- private List <RedisInfo > createRedisInfoForIntersection (List <String > keys , ReflectionBasedRedisClient redisClient ) {
126- List <RedisInfo > redisData = new ArrayList <>();
127- keys .forEach (
128- key -> redisData .add (new RedisInfo (key , redisClient .getType (key ), redisClient .getSetMembers (key ))
125+ private RedisKeyValueStore createRedisInfoForIntersection (List <String > commandKeys , ReflectionBasedRedisClient redisClient ) {
126+ Set <String > keySet = redisClient .getKeysByType (REDIS_SET_TYPE );
127+
128+ //A Map structure is introduced here using the same keys that are stored in REDIS.
129+ //The value for each one, since each key represents a SET, correspond to the members of that given set.
130+ Map <String , RedisValueData > redisData = new HashMap <>();
131+ keySet .forEach (
132+ key -> redisData .put (key , new RedisValueData (redisClient .getSetMembers (key ))
129133 ));
130- return redisData ;
134+ return new RedisKeyValueStore ( redisData ) ;
131135 }
132136
133- private List < RedisInfo > createRedisInfoForAllKeys (ReflectionBasedRedisClient redisClient ) {
137+ private RedisKeyValueStore createRedisInfoForAllKeys (ReflectionBasedRedisClient redisClient ) {
134138 Set <String > keys = redisClient .getAllKeys ();
135- List <RedisInfo > redisData = new ArrayList <>();
139+
140+ //A Map structure is introduced here using the same keys that are stored in REDIS.
141+ //No value is needed in this case.
142+ Map <String , RedisValueData > redisData = new HashMap <>();
136143 keys .forEach (
137- key -> redisData .add ( new RedisInfo ( key ) )
144+ key -> redisData .put ( key , null )
138145 );
139- return redisData ;
146+ return new RedisKeyValueStore ( redisData ) ;
140147 }
141148
142- private List < RedisInfo > createRedisInfoForKeysByType (String type , ReflectionBasedRedisClient redisClient ) {
149+ private RedisKeyValueStore createRedisInfoForKeysByType (String type , ReflectionBasedRedisClient redisClient ) {
143150 Set <String > keys = redisClient .getKeysByType (type );
144- List <RedisInfo > redisData = new ArrayList <>();
145- keys .forEach (key -> redisData .add (new RedisInfo (key )));
146- return redisData ;
151+
152+ //A Map structure is introduced here using the same keys that are stored in REDIS.
153+ //No value is needed in this case.
154+ Map <String , RedisValueData > redisData = new HashMap <>();
155+ keys .forEach (key -> redisData .put (key , null ));
156+ return new RedisKeyValueStore (redisData );
147157 }
148158
149- private List < RedisInfo > createRedisInfoForKeysByField (String field , ReflectionBasedRedisClient redisClient ) {
159+ private RedisKeyValueStore createRedisInfoForKeysByField (ReflectionBasedRedisClient redisClient ) {
150160 Set <String > keys = redisClient .getKeysByType (REDIS_HASH_TYPE );
151- List <RedisInfo > redisData = new ArrayList <>();
152- keys .forEach (key -> redisData .add (new RedisInfo (key , redisClient .getHashFields (key ))));
153- return redisData ;
161+
162+ //A Map structure is introduced here using the same keys that are stored in REDIS.
163+ //The value for each one, since each key is of type HASH, correspond to the fields stored for that given key.
164+ Map <String , RedisValueData > redisData = new HashMap <>();
165+ keys .forEach (key -> redisData .put (key , new RedisValueData (redisClient .getHashFields (key ))));
166+ return new RedisKeyValueStore (redisData );
154167 }
155168
156169 public void setRedisClient (ReflectionBasedRedisClient redisClient ) {
0 commit comments