From c0825272f0330a792762b94f6abededc2e364a8d Mon Sep 17 00:00:00 2001 From: Alexander Szyrej Date: Wed, 3 Jun 2026 22:22:49 -0300 Subject: [PATCH 1/3] adding SADD action --- .../execution/RedisFailedCommand.java | 11 +- .../internal/db/redis/RedisHandler.java | 36 +++-- .../redis/RedisCommandExecutor.java | 3 + .../redis/ReflectionBasedRedisClient.java | 6 + .../java/controller/redis/dsl/RedisDsl.java | 17 +++ .../redis/dsl/RedisSequenceDsl.java | 9 ++ .../org/evomaster/core/output/RedisWriter.kt | 5 + .../core/redis/RedisDbActionTransformer.kt | 5 + .../core/redis/RedisInsertBuilder.kt | 130 ++++++++++-------- .../evomaster/core/redis/RedisSaddAction.kt | 39 ++++++ .../evomaster/core/output/RedisWriterTest.kt | 42 +++++- .../core/redis/RedisInsertBuilderTest.kt | 8 +- 12 files changed, 229 insertions(+), 82 deletions(-) create mode 100644 core/src/main/kotlin/org/evomaster/core/redis/RedisSaddAction.kt diff --git a/client-java/controller-api/src/main/java/org/evomaster/client/java/controller/api/dto/database/execution/RedisFailedCommand.java b/client-java/controller-api/src/main/java/org/evomaster/client/java/controller/api/dto/database/execution/RedisFailedCommand.java index dfcdc180c6..601cca9178 100644 --- a/client-java/controller-api/src/main/java/org/evomaster/client/java/controller/api/dto/database/execution/RedisFailedCommand.java +++ b/client-java/controller-api/src/main/java/org/evomaster/client/java/controller/api/dto/database/execution/RedisFailedCommand.java @@ -1,5 +1,8 @@ package org.evomaster.client.java.controller.api.dto.database.execution; +import java.util.ArrayList; +import java.util.List; + /** * Each time a Redis command is executed and returns no data, we keep track of which keys were involved, * as well as relevant information such as the command type. @@ -12,9 +15,9 @@ public class RedisFailedCommand { public String command; /** - * Key involved. Could be null if the command does not have a key in the arguments. For example: KEYS (pattern). + * Keys involved. Could be null if the command does not have any key in the arguments. For example: KEYS (pattern). */ - public String key; + public List keys; /** * Pattern involved. It'd only apply to commands with pattern like KEYS. @@ -28,9 +31,9 @@ public class RedisFailedCommand { public RedisFailedCommand() {} - public RedisFailedCommand(String command, String key, String pattern, String field) { + public RedisFailedCommand(String command, List keys, String pattern, String field) { this.command = command; - this.key = key; + this.keys = new ArrayList<>(keys); this.pattern = pattern; this.field = field; } diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java index f511c0fa7f..e6b9ce60cd 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java @@ -92,12 +92,12 @@ public void handle(RedisCommand info) { public List getEvaluatedRedisCommands() { operations.stream() - .filter(command -> command.getType().shouldCalculateHeuristic()) - .forEach(redisCommand -> { - RedisDistanceWithMetrics distanceWithMetrics = computeDistance(redisCommand, redisClient); - evaluatedRedisCommands.add(new RedisCommandEvaluation(redisCommand, distanceWithMetrics)); - registerFailedCommand(redisCommand, distanceWithMetrics.getDistance()); - }); + .filter(command -> command.getType().shouldCalculateHeuristic()) + .forEach(redisCommand -> { + RedisDistanceWithMetrics distanceWithMetrics = computeDistance(redisCommand, redisClient); + evaluatedRedisCommands.add(new RedisCommandEvaluation(redisCommand, distanceWithMetrics)); + registerFailedCommand(redisCommand, distanceWithMetrics.getDistance()); + }); operations.clear(); return evaluatedRedisCommands; @@ -105,9 +105,15 @@ public List getEvaluatedRedisCommands() { private void registerFailedCommand(RedisCommand redisCommand, double distance) { RedisCommand.RedisCommandType type = redisCommand.getType(); - if (distance > 0 && - type.equals(GET) || type.equals(KEYS) || type.equals(HGET) || type.equals(HGETALL)) { - //For this first iteration we'll only work on GET commands. + if (distance > 0 && ( + type.equals(GET) || + type.equals(HGET) || + type.equals(HGETALL) || + type.equals(KEYS) || + type.equals(SINTER) || + type.equals(SMEMBERS)) + ) { + // Further commands will be registered in future iterations. failedCommands.add(createFailedCommand(redisCommand)); } } @@ -117,13 +123,15 @@ private RedisFailedCommand createFailedCommand(RedisCommand redisCommand) { List args = redisCommand.extractArgs(); switch (type) { case GET: - case HGETALL: { + case HGETALL: + case SINTER: + case SMEMBERS: { if (args.isEmpty()) { throw new IllegalArgumentException("Command " + type.getLabel() + " has invalid arguments."); } return new RedisFailedCommand( type.getLabel().toUpperCase(), - args.get(0), + args, null, null); } @@ -134,7 +142,7 @@ private RedisFailedCommand createFailedCommand(RedisCommand redisCommand) { } return new RedisFailedCommand( type.getLabel().toUpperCase(), - null, + Collections.emptyList(), RedisUtils.redisPatternToRegex(args.get(0)), null); } @@ -145,7 +153,7 @@ private RedisFailedCommand createFailedCommand(RedisCommand redisCommand) { } return new RedisFailedCommand( type.getLabel().toUpperCase(), - args.get(0), + Collections.singletonList((args.get(0))), null, args.get(1)); } @@ -208,7 +216,7 @@ private RedisKeyValueStore createRedisInfoForIntersection(List commandKe Map redisData = new HashMap<>(); keySet.forEach( key -> redisData.put(key, new RedisValueData(redisClient.getSetMembers(key)) - )); + )); return new RedisKeyValueStore(redisData); } diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/RedisCommandExecutor.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/RedisCommandExecutor.java index d8d9c39411..3afa827406 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/RedisCommandExecutor.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/RedisCommandExecutor.java @@ -37,6 +37,9 @@ public static RedisInsertionResultsDto executeInsert( case "HSET": client.hashSet(dto.key, dto.field, dto.value); break; + case "SADD": + client.addMember(dto.key, dto.value); + break; default: throw new IllegalArgumentException( "Unsupported Redis command: " + dto.command); diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/ReflectionBasedRedisClient.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/ReflectionBasedRedisClient.java index e9c71e61bd..1aef7e5e28 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/ReflectionBasedRedisClient.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/ReflectionBasedRedisClient.java @@ -23,6 +23,7 @@ public class ReflectionBasedRedisClient { private static final String HGETALL_METHOD = "hgetall"; private static final String HSET_METHOD = "hset"; private static final String KEYS_METHOD = "keys"; + private static final String SADD_METHOD = "sadd"; private static final String SELECT_METHOD = "select"; private static final String SET_METHOD = "set"; private static final String SHUTDOWN_METHOD = "shutdown"; @@ -117,6 +118,11 @@ public void hashSet(String key, String field, String value) { invoke(HSET_METHOD, key, field, value); } + /** SADD key */ + public void addMember(String key, String member) { + invoke(SADD_METHOD, key, member); + } + /** SMEMBERS key */ public Set getSetMembers(String key) { Object result = invoke(SMEMBERS_METHOD, key); diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/dsl/RedisDsl.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/dsl/RedisDsl.java index 040f17f075..a01f3c012d 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/dsl/RedisDsl.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/dsl/RedisDsl.java @@ -71,6 +71,23 @@ public RedisStatementDsl hset(String key, String field, String value) { return this; } + @Override + public RedisStatementDsl sadd(String key, String member) { + checkDsl(); + if (key == null || key.isEmpty()) { + throw new IllegalArgumentException("Unspecified key"); + } + if (member == null || member.isEmpty()) { + throw new IllegalArgumentException("Unspecified member"); + } + RedisInsertionDto dto = new RedisInsertionDto(); + dto.command = "SADD"; + dto.key = key; + dto.value = member; + list.add(dto); + return this; + } + @Override public RedisSequenceDsl and() { return this; diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/dsl/RedisSequenceDsl.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/dsl/RedisSequenceDsl.java index 5908fd6c63..08b8bde873 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/dsl/RedisSequenceDsl.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/dsl/RedisSequenceDsl.java @@ -20,4 +20,13 @@ public interface RedisSequenceDsl { * @return a statement object on which the sequence can be continued or closed */ RedisStatementDsl hset(String key, String field, String value); + + /** + * An SADD operation on the Redis database. + * + * @param key the set key. + * @param member the new member in that set. + * @return a statement object on which the sequence can be continued or closed + */ + RedisStatementDsl sadd(String key, String member); } diff --git a/core/src/main/kotlin/org/evomaster/core/output/RedisWriter.kt b/core/src/main/kotlin/org/evomaster/core/output/RedisWriter.kt index 7ea7f82f62..0ddcadb5aa 100644 --- a/core/src/main/kotlin/org/evomaster/core/output/RedisWriter.kt +++ b/core/src/main/kotlin/org/evomaster/core/output/RedisWriter.kt @@ -57,6 +57,11 @@ object RedisWriter { val value = action.valueGene.getValueAsPrintableString(targetFormat = format) ".hset($key, \"$field\", $value)" } + is RedisSaddAction -> { + val key = action.keyGene.getValueAsPrintableString(targetFormat = format) + val member = action.memberGene.getValueAsPrintableString(targetFormat = format) + ".sadd($key, $member)" + } } lines.add( diff --git a/core/src/main/kotlin/org/evomaster/core/redis/RedisDbActionTransformer.kt b/core/src/main/kotlin/org/evomaster/core/redis/RedisDbActionTransformer.kt index 043e4f7991..abb1633155 100644 --- a/core/src/main/kotlin/org/evomaster/core/redis/RedisDbActionTransformer.kt +++ b/core/src/main/kotlin/org/evomaster/core/redis/RedisDbActionTransformer.kt @@ -22,6 +22,11 @@ object RedisDbActionTransformer { it.field = action.field it.value = action.valueGene.value } + is RedisSaddAction -> RedisInsertionDto().also { + it.command = "SADD" + it.key = action.keyGene.value + it.value = action.memberGene.value + } } } return dto diff --git a/core/src/main/kotlin/org/evomaster/core/redis/RedisInsertBuilder.kt b/core/src/main/kotlin/org/evomaster/core/redis/RedisInsertBuilder.kt index 26ce842dad..2483098b13 100644 --- a/core/src/main/kotlin/org/evomaster/core/redis/RedisInsertBuilder.kt +++ b/core/src/main/kotlin/org/evomaster/core/redis/RedisInsertBuilder.kt @@ -22,66 +22,80 @@ object RedisInsertBuilder { existingKeys: Set, randomness: Randomness ): List { + return failedCommands.flatMap { cmd -> + buildActionsForCommand(cmd, existingKeys, randomness) + } + } + + private fun buildActionsForCommand( + cmd: RedisFailedCommand, + existingKeys: Set, + randomness: Randomness + ): List { + val keys = cmd.keys ?: emptyList() - return failedCommands - .filter { it.key == null || it.key !in existingKeys } - .mapNotNull { cmd -> - when (cmd.command) { - "GET" -> { - val keyGene = StringGene("key", cmd.key) - val valueGene = StringGene("value").also { - it.randomize(randomness, false) - } - RedisSetAction( - keyGene = keyGene, - valueGene = valueGene - ) - } - "HGET" -> { - val keyGene = StringGene("key", cmd.key) - val valueGene = StringGene("value").also { - it.randomize(randomness, false) - } - RedisHsetAction( - keyGene = keyGene, - field = cmd.field, - valueGene = valueGene - ) - } - "HGETALL" -> { - val keyGene = StringGene("key", cmd.key) - val valueGene = StringGene("value").also { - it.randomize(randomness, false) - } - // field is unknown — using a placeholder so the key exists in Redis - RedisHsetAction( - keyGene = keyGene, - field = "field", - valueGene = valueGene - ) - } - "KEYS" -> { - val keyGene = StringGene("key").also { - it.addSpecializations("key", - listOf(StringSpecializationInfo(StringSpecialization.REGEX_WHOLE, cmd.pattern)), - randomness, - updateGlobalInfo = false, // should this be false? - enableConstraintHandling = false) - it.doInitialize(randomness) - } - val valueGene = StringGene("value").also { - it.randomize(randomness, false) - } - RedisSetAction( - keyGene = keyGene, - valueGene = valueGene - ) - } - else -> { - // unsupported command - null - } + return when (cmd.command) { + "GET" -> { + val key = keys.firstOrNull() ?: return emptyList() + if (key in existingKeys) return emptyList() + listOf(RedisSetAction( + keyGene = StringGene("key", key), + valueGene = StringGene("value").also { it.randomize(randomness, false) } + )) + } + "HGET" -> { + val key = keys.firstOrNull() ?: return emptyList() + if (key in existingKeys) return emptyList() + listOf(RedisHsetAction( + keyGene = StringGene("key", key), + field = cmd.field ?: "field", + valueGene = StringGene("value").also { it.randomize(randomness, false) } + )) + } + "HGETALL" -> { + val key = keys.firstOrNull() ?: return emptyList() + if (key in existingKeys) return emptyList() + listOf(RedisHsetAction( + keyGene = StringGene("key", key), + field = "field", + valueGene = StringGene("value").also { it.randomize(randomness, false) } + )) + } + "KEYS" -> { + val keyGene = StringGene("key").also { + it.addSpecializations( + "key", + listOf(StringSpecializationInfo(StringSpecialization.REGEX_WHOLE, cmd.pattern)), + randomness, + updateGlobalInfo = false, + enableConstraintHandling = false + ) + it.doInitialize(randomness) + } + listOf(RedisSetAction( + keyGene = keyGene, + valueGene = StringGene("value").also { it.randomize(randomness, false) } + )) + } + "SMEMBERS" -> { + val key = keys.firstOrNull() ?: return emptyList() + if (key in existingKeys) return emptyList() + listOf(RedisSaddAction( + keyGene = StringGene("key", key), + memberGene = StringGene("member").also { it.randomize(randomness, false) } + )) + } + "SINTER" -> { + if (keys.isEmpty()) return emptyList() + val sharedElement = StringGene("member").also { it.randomize(randomness, false) } + keys.map { key -> + RedisSaddAction( + keyGene = StringGene("key", key), + memberGene = sharedElement.copy() as StringGene + ) } } + else -> emptyList() + } } } \ No newline at end of file diff --git a/core/src/main/kotlin/org/evomaster/core/redis/RedisSaddAction.kt b/core/src/main/kotlin/org/evomaster/core/redis/RedisSaddAction.kt new file mode 100644 index 0000000000..76aaeba915 --- /dev/null +++ b/core/src/main/kotlin/org/evomaster/core/redis/RedisSaddAction.kt @@ -0,0 +1,39 @@ +package org.evomaster.core.redis + +import org.evomaster.core.search.action.Action +import org.evomaster.core.search.gene.Gene +import org.evomaster.core.search.gene.string.StringGene + +/** + * Represents a SADD action, generated from a failed SMEMBERS or SINTER command + * (failed meaning those commands return no data when executed). + * + *

For SMEMBERS, a single [RedisSaddAction] is generated for the observed key, + * inserting one element so the set is non-empty. + * + *

For SINTER, one [RedisSaddAction] is generated per key involved in the + * intersection, all sharing the same [elementGene] value so the intersection + * is guaranteed to be non-empty. + * + * @param keyGene the key of the set to insert into. + * @param elementGene gene representing the element to add to the set. + */ +class RedisSaddAction( + val keyGene: StringGene, + val memberGene: StringGene, + private val nameKey: String = keyGene.value +) : RedisDbAction() { + + init { + addChildren(listOf(keyGene, memberGene)) + } + + override fun getTargetKey() = keyGene.value + + override fun seeTopGenes(): List = listOf(keyGene, memberGene) + + override fun copyContent(): Action = + RedisSaddAction(keyGene.copy() as StringGene, memberGene.copy() as StringGene, nameKey) + + override fun getName() = "Redis_SADD_${nameKey}" +} \ No newline at end of file diff --git a/core/src/test/kotlin/org/evomaster/core/output/RedisWriterTest.kt b/core/src/test/kotlin/org/evomaster/core/output/RedisWriterTest.kt index 5ce8336ca1..070720747a 100644 --- a/core/src/test/kotlin/org/evomaster/core/output/RedisWriterTest.kt +++ b/core/src/test/kotlin/org/evomaster/core/output/RedisWriterTest.kt @@ -2,6 +2,7 @@ package org.evomaster.core.output import org.evomaster.core.redis.RedisDbActionResult import org.evomaster.core.redis.RedisHsetAction +import org.evomaster.core.redis.RedisSaddAction import org.evomaster.core.redis.RedisSetAction import org.evomaster.core.search.action.EvaluatedRedisDbAction import org.evomaster.core.search.gene.string.StringGene @@ -44,6 +45,22 @@ class RedisWriterTest { return EvaluatedRedisDbAction(action, result) } + private fun makeEvaluatedSadd( + key: String, + member: String, + success: Boolean = true + ): EvaluatedRedisDbAction { + val action = RedisSaddAction( + keyGene = StringGene("key", key), + memberGene = StringGene("value", member) + ) + action.setLocalId("test-redis-sadd-action") + val result = RedisDbActionResult(action.getLocalId()).also { + it.setInsertExecutionResult(success) + } + return EvaluatedRedisDbAction(action, result) + } + private fun writeKotlin( actions: List, insertionVars: MutableList> = mutableListOf(), @@ -103,6 +120,25 @@ class RedisWriterTest { assertTrue(output.contains("RedisInsertionResultsDto insertions_redis_result = controller.execInsertionsIntoRedisDatabase(insertions_redis)")) } + @Test + fun testKotlinFormatSingleSaddAction() { + val output = writeKotlin(listOf(makeEvaluatedSadd("set:1", "member"))) + + assertTrue(output.contains("val insertions_redis = redis()")) + assertTrue(output.contains(".sadd(\"set:1\", \"member\")")) + assertTrue(output.contains(".dtos()")) + assertTrue(output.contains("val insertions_redis_result = controller.execInsertionsIntoRedisDatabase(insertions_redis)")) + } + + @Test + fun testJavaFormatSingleSaddAction() { + val output = writeJava(listOf(makeEvaluatedSadd("set:1", "member"))) + + assertTrue(output.contains("List insertions_redis = redis()")) + assertTrue(output.contains(".sadd(\"set:1\", \"member\")")) + assertTrue(output.contains("RedisInsertionResultsDto insertions_redis_result = controller.execInsertionsIntoRedisDatabase(insertions_redis)")) + } + @Test fun testKotlinEscapesDollarSign() { val output = writeKotlin(listOf(makeEvaluatedSet("key", "\$HOME"))) @@ -153,10 +189,11 @@ class RedisWriterTest { } @Test - fun testMixedSetAndHsetActions() { + fun testMixedActions() { val actions = listOf( makeEvaluatedSet("string:key", "val"), - makeEvaluatedHset("hash:key", "field1", "val2") + makeEvaluatedHset("hash:key", "field1", "val2"), + makeEvaluatedSadd("set:key", "member") ) val output = writeKotlin(actions) @@ -164,5 +201,6 @@ class RedisWriterTest { assertTrue(output.contains(".set(\"string:key\", \"val\")")) assertTrue(output.contains(".and()")) assertTrue(output.contains(".hset(\"hash:key\", \"field1\", \"val2\")")) + assertTrue(output.contains(".sadd(\"set:key\", \"member\")")) } } \ No newline at end of file diff --git a/core/src/test/kotlin/org/evomaster/core/redis/RedisInsertBuilderTest.kt b/core/src/test/kotlin/org/evomaster/core/redis/RedisInsertBuilderTest.kt index ce8f1960a9..4d9bcadca8 100644 --- a/core/src/test/kotlin/org/evomaster/core/redis/RedisInsertBuilderTest.kt +++ b/core/src/test/kotlin/org/evomaster/core/redis/RedisInsertBuilderTest.kt @@ -11,18 +11,18 @@ class RedisInsertBuilderTest { private val randomness = Randomness().apply { updateSeed(42) } private fun getCommand(key: String) = RedisFailedCommand().also { - it.key = key + it.keys = listOf(key) it.command = "GET" } private fun hgetCommand(key: String, field: String) = RedisFailedCommand().also { - it.key = key + it.keys = listOf(key) it.field = field it.command = "HGET" } private fun hgetallCommand(key: String) = RedisFailedCommand().also { - it.key = key + it.keys = listOf(key) it.command = "HGETALL" } @@ -151,7 +151,7 @@ class RedisInsertBuilderTest { @Test fun testUnsupportedCommandSkippedSilently() { val unsupported = RedisFailedCommand().also { - it.key = "key:1" + it.keys = listOf("key:1") it.command = "UNKNOWN_CMD" } From ae3f701655721ffc20d98ffafdeb03d9ba098a09 Mon Sep 17 00:00:00 2001 From: Alexander Szyrej Date: Mon, 15 Jun 2026 01:44:11 -0300 Subject: [PATCH 2/3] minor refactors --- .../controller/internal/db/redis/RedisHandler.java | 12 ++++++------ .../java/controller/redis/dsl/RedisSequenceDsl.java | 4 ++-- .../problem/enterprise/service/EnterpriseFitness.kt | 4 ++-- .../kotlin/org/evomaster/core/redis/RedisDbAction.kt | 2 +- .../core/redis/RedisSaddFromSinterAction.kt | 2 +- .../evomaster/core/redis/RedisInsertBuilderTest.kt | 2 -- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java index e6b9ce60cd..1e5a127e73 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java @@ -92,12 +92,12 @@ public void handle(RedisCommand info) { public List getEvaluatedRedisCommands() { operations.stream() - .filter(command -> command.getType().shouldCalculateHeuristic()) - .forEach(redisCommand -> { - RedisDistanceWithMetrics distanceWithMetrics = computeDistance(redisCommand, redisClient); - evaluatedRedisCommands.add(new RedisCommandEvaluation(redisCommand, distanceWithMetrics)); - registerFailedCommand(redisCommand, distanceWithMetrics.getDistance()); - }); + .filter(command -> command.getType().shouldCalculateHeuristic()) + .forEach(redisCommand -> { + RedisDistanceWithMetrics distanceWithMetrics = computeDistance(redisCommand, redisClient); + evaluatedRedisCommands.add(new RedisCommandEvaluation(redisCommand, distanceWithMetrics)); + registerFailedCommand(redisCommand, distanceWithMetrics.getDistance()); + }); operations.clear(); return evaluatedRedisCommands; diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/dsl/RedisSequenceDsl.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/dsl/RedisSequenceDsl.java index 08b8bde873..e4526cf237 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/dsl/RedisSequenceDsl.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/redis/dsl/RedisSequenceDsl.java @@ -22,9 +22,9 @@ public interface RedisSequenceDsl { RedisStatementDsl hset(String key, String field, String value); /** - * An SADD operation on the Redis database. + * A SADD operation on the Redis database. * - * @param key the set key. + * @param key the set key. * @param member the new member in that set. * @return a statement object on which the sequence can be continued or closed */ diff --git a/core/src/main/kotlin/org/evomaster/core/problem/enterprise/service/EnterpriseFitness.kt b/core/src/main/kotlin/org/evomaster/core/problem/enterprise/service/EnterpriseFitness.kt index 503bdb5c29..213464fa7b 100644 --- a/core/src/main/kotlin/org/evomaster/core/problem/enterprise/service/EnterpriseFitness.kt +++ b/core/src/main/kotlin/org/evomaster/core/problem/enterprise/service/EnterpriseFitness.kt @@ -231,8 +231,8 @@ abstract class EnterpriseFitness : FitnessFunction() where T : Individual if (results?.executionResults != null) { var dtoIndex = 0 allRedisActions.forEachIndexed { actionIndex, action -> - // Now actions such as SaddFromSinter have multiple execution dtos. - val count = action.dtoCount() + // Now actions such as SaddFromSinter have multiple insertion dtos related. + val count = action.insertionsCount() val success = (dtoIndex until dtoIndex + count).all { results.executionResults[it] } diff --git a/core/src/main/kotlin/org/evomaster/core/redis/RedisDbAction.kt b/core/src/main/kotlin/org/evomaster/core/redis/RedisDbAction.kt index a0e467da51..3c203a3c3e 100644 --- a/core/src/main/kotlin/org/evomaster/core/redis/RedisDbAction.kt +++ b/core/src/main/kotlin/org/evomaster/core/redis/RedisDbAction.kt @@ -15,7 +15,7 @@ sealed class RedisDbAction : EnvironmentAction(listOf()) { */ open fun getTargetKey(): String? = null - open fun dtoCount(): Int = 1 + open fun insertionsCount(): Int = 1 override fun getActionGroupKey(): String = RedisDbAction::class.java.name } \ No newline at end of file diff --git a/core/src/main/kotlin/org/evomaster/core/redis/RedisSaddFromSinterAction.kt b/core/src/main/kotlin/org/evomaster/core/redis/RedisSaddFromSinterAction.kt index d3218150f6..f96a7b13cb 100644 --- a/core/src/main/kotlin/org/evomaster/core/redis/RedisSaddFromSinterAction.kt +++ b/core/src/main/kotlin/org/evomaster/core/redis/RedisSaddFromSinterAction.kt @@ -25,7 +25,7 @@ class RedisSaddFromSinterAction( override fun getTargetKey() = keys.joinToString(",") - override fun dtoCount(): Int = keys.size + override fun insertionsCount(): Int = keys.size override fun seeTopGenes(): List = listOf(memberGene) diff --git a/core/src/test/kotlin/org/evomaster/core/redis/RedisInsertBuilderTest.kt b/core/src/test/kotlin/org/evomaster/core/redis/RedisInsertBuilderTest.kt index d295c1a028..f567f13681 100644 --- a/core/src/test/kotlin/org/evomaster/core/redis/RedisInsertBuilderTest.kt +++ b/core/src/test/kotlin/org/evomaster/core/redis/RedisInsertBuilderTest.kt @@ -154,8 +154,6 @@ class RedisInsertBuilderTest { } } - // --- helpers --- - private fun getCommand(key: String) = RedisFailedCommand().also { it.keys = listOf(key) it.command = "GET" From 5f770443eea8e298671953a6eddd45dc110b1f68 Mon Sep 17 00:00:00 2001 From: Alexander Szyrej Date: Mon, 15 Jun 2026 01:46:18 -0300 Subject: [PATCH 3/3] minor refactor --- .../controller/internal/db/redis/RedisHandler.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java index 1e5a127e73..580d09bc23 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java @@ -215,8 +215,7 @@ private RedisKeyValueStore createRedisInfoForIntersection(List commandKe //The value for each one, since each key represents a SET, correspond to the members of that given set. Map redisData = new HashMap<>(); keySet.forEach( - key -> redisData.put(key, new RedisValueData(redisClient.getSetMembers(key)) - )); + key -> redisData.put(key, new RedisValueData(redisClient.getSetMembers(key)))); return new RedisKeyValueStore(redisData); } @@ -227,8 +226,7 @@ private RedisKeyValueStore createRedisInfoForAllKeys(ReflectionBasedRedisClient //No value is needed in this case. Map redisData = new HashMap<>(); keys.forEach( - key -> redisData.put(key, null) - ); + key -> redisData.put(key, null)); return new RedisKeyValueStore(redisData); } @@ -238,7 +236,8 @@ private RedisKeyValueStore createRedisInfoForKeysByType(String type, ReflectionB //A Map structure is introduced here using the same keys that are stored in REDIS. //No value is needed in this case. Map redisData = new HashMap<>(); - keys.forEach(key -> redisData.put(key, null)); + keys.forEach( + key -> redisData.put(key, null)); return new RedisKeyValueStore(redisData); } @@ -248,7 +247,8 @@ private RedisKeyValueStore createRedisInfoForKeysByField(ReflectionBasedRedisCli //A Map structure is introduced here using the same keys that are stored in REDIS. //The value for each one, since each key is of type HASH, correspond to the fields stored for that given key. Map redisData = new HashMap<>(); - keys.forEach(key -> redisData.put(key, new RedisValueData(redisClient.getHashFields(key)))); + keys.forEach( + key -> redisData.put(key, new RedisValueData(redisClient.getHashFields(key)))); return new RedisKeyValueStore(redisData); }