From b5038fee5210bb3a70d059378f1535c878ca4767 Mon Sep 17 00:00:00 2001 From: Juan Pablo Galeotti Date: Sat, 11 Jul 2026 14:35:56 -0300 Subject: [PATCH 1/4] Refactor `MongoHeuristicsCalculator`: rename methods for improved consistency and clarity, update tests accordingly. --- .../internal/db/mongo/MongoHandler.java | 2 +- .../mongo/MongoHeuristicsCalculator.java | 107 +++++++++--------- .../internal/db/mongo/MongoHandlerTest.java | 2 +- ...ava => MongoHeuristicsCalculatorTest.java} | 92 +++++++-------- 4 files changed, 101 insertions(+), 102 deletions(-) rename client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/{MongoHeuristicCalculatorTest.java => MongoHeuristicsCalculatorTest.java} (83%) diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandler.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandler.java index 6c9336538d..7be596b391 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandler.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandler.java @@ -158,7 +158,7 @@ private MongoDistanceWithMetrics computeFindDistance(MongoFindCommand info) { numberOfEvaluatedDocuments += 1; double findDistance; try { - findDistance = calculator.computeExpression(info.getQuery(), doc); + findDistance = calculator.computeDistance(info.getQuery(), doc); } catch (Exception ex) { SimpleLogger.uniqueWarn("Failed to compute find: " + info.getQuery() + " with data " + doc); findDistance = Double.MAX_VALUE; diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/MongoHeuristicsCalculator.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/MongoHeuristicsCalculator.java index 5fcf0ef3c0..cdc177ee7a 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/MongoHeuristicsCalculator.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/MongoHeuristicsCalculator.java @@ -34,93 +34,92 @@ public MongoHeuristicsCalculator(TaintHandler taintHandler) { * @param doc a document in the database for which we want to calculate the distance * @return a branch distance, where 0 means that the document would make the QUERY resolve as true */ - public double computeExpression(Object query, Object doc) { - + public double computeDistance(Object query, Object doc) { QueryOperation operation = getOperation(query); - return computeHeuristic(operation, doc); + return computeHeuristicQueryOperation(operation, doc); } private QueryOperation getOperation(Object query) { return new QueryParser().parse(query); } - private double computeHeuristic(QueryOperation operation, Object doc) { + private double computeHeuristicQueryOperation(QueryOperation operation, Object doc) { if (operation instanceof EqualsOperation) { - return calculateDistanceForEquals((EqualsOperation) operation, doc); + return computeHeuristic((EqualsOperation) operation, doc); } else if (operation instanceof NotEqualsOperation) { - return calculateDistanceForNotEquals((NotEqualsOperation) operation, doc); + return computeHeuristic((NotEqualsOperation) operation, doc); } else if (operation instanceof GreaterThanOperation) { - return calculateDistanceForGreaterThan((GreaterThanOperation) operation, doc); + return computeHeuristic((GreaterThanOperation) operation, doc); } else if (operation instanceof GreaterThanEqualsOperation) { - return calculateDistanceForGreaterEqualsThan((GreaterThanEqualsOperation) operation, doc); + return computeHeuristic((GreaterThanEqualsOperation) operation, doc); } else if (operation instanceof LessThanOperation) { - return calculateDistanceForLessThan((LessThanOperation) operation, doc); + return computeHeuristic((LessThanOperation) operation, doc); } else if (operation instanceof LessThanEqualsOperation) { - return calculateDistanceForLessEqualsThan((LessThanEqualsOperation) operation, doc); + return computeHeuristic((LessThanEqualsOperation) operation, doc); } else if (operation instanceof AndOperation) { - return calculateDistanceForAnd((AndOperation) operation, doc); + return computeHeuristic((AndOperation) operation, doc); } else if (operation instanceof OrOperation) { - return calculateDistanceForOr((OrOperation) operation, doc); + return computeHeuristic((OrOperation) operation, doc); } else if (operation instanceof NorOperation) { - return calculateDistanceForNor((NorOperation) operation, doc); + return computeHeuristicNor((NorOperation) operation, doc); } else if (operation instanceof InOperation) { - return calculateDistanceForIn((InOperation) operation, doc); + return computeHeuristicIn((InOperation) operation, doc); } else if (operation instanceof NotInOperation) { - return calculateDistanceForNotIn((NotInOperation) operation, doc); + return computeHeuristic((NotInOperation) operation, doc); } else if (operation instanceof AllOperation) { - return calculateDistanceForAll((AllOperation) operation, doc); + return computeHeuristic((AllOperation) operation, doc); } else if (operation instanceof InvertedAllOperation) { return calculateDistanceForInvertedAll((InvertedAllOperation) operation, doc); } else if (operation instanceof SizeOperation) { - return calculateDistanceForSize((SizeOperation) operation, doc); + return computeHeuristic((SizeOperation) operation, doc); } else if (operation instanceof InvertedSizeOperation) { return calculateDistanceForInvertedSize((InvertedSizeOperation) operation, doc); } else if (operation instanceof ElemMatchOperation) { - return calculateDistanceForElemMatch((ElemMatchOperation) operation, doc); + return computeHeuristic((ElemMatchOperation) operation, doc); } else if (operation instanceof ExistsOperation) { - return calculateDistanceForExists((ExistsOperation) operation, doc); + return computeHeuristicExists((ExistsOperation) operation, doc); } else if (operation instanceof ModOperation) { - return calculateDistanceForMod((ModOperation) operation, doc); + return computeHeuristicMod((ModOperation) operation, doc); } else if (operation instanceof InvertedModOperation) { return calculateDistanceForInvertedMod((InvertedModOperation) operation, doc); } else if (operation instanceof NotOperation) { - return calculateDistanceForNot((NotOperation) operation, doc); + return computeHeuristic((NotOperation) operation, doc); } else if (operation instanceof TypeOperation) { - return calculateDistanceForType((TypeOperation) operation, doc); + return computeHeuristic((TypeOperation) operation, doc); } else if (operation instanceof InvertedTypeOperation) { return calculateDistanceForInvertedType((InvertedTypeOperation) operation, doc); } else if (operation instanceof NearSphereOperation) { - return calculateDistanceForNearSphere((NearSphereOperation) operation, doc); + return computeHeuristicNearSphere((NearSphereOperation) operation, doc); } else { return Double.MAX_VALUE; } } - private double calculateDistanceForEquals(EqualsOperation operation, Object doc) { - return calculateDistanceForComparisonOperation(operation, doc, (Math::abs)); + private double computeHeuristic(EqualsOperation operation, Object doc) { + return computeHeuristicComparison(operation, doc, (Math::abs)); } - private double calculateDistanceForNotEquals(NotEqualsOperation operation, Object doc) { - return calculateDistanceForComparisonOperation(operation, doc, ((dif) -> dif != 0.0 ? 0.0 : MIN_DISTANCE_TO_TRUE_VALUE)); + private double computeHeuristic(NotEqualsOperation operation, Object doc) { + return computeHeuristicComparison(operation, doc, ((dif) -> dif != 0.0 ? 0.0 : MIN_DISTANCE_TO_TRUE_VALUE)); } - private double calculateDistanceForGreaterThan(GreaterThanOperation operation, Object doc) { - return calculateDistanceForComparisonOperation(operation, doc, ((dif) -> dif > 0 ? 0.0 : 1.0 - dif)); + private double computeHeuristic(GreaterThanOperation operation, Object doc) { + return computeHeuristicComparison(operation, doc, ((dif) -> dif > 0 ? 0.0 : 1.0 - dif)); } - private double calculateDistanceForGreaterEqualsThan(GreaterThanEqualsOperation operation, Object doc) { - return calculateDistanceForComparisonOperation(operation, doc, ((dif) -> dif >= 0 ? 0.0 : -dif)); + private double computeHeuristic(GreaterThanEqualsOperation operation, Object doc) { + return computeHeuristicComparison(operation, doc, ((dif) -> dif >= 0 ? 0.0 : -dif)); } - private double calculateDistanceForLessThan(LessThanOperation operation, Object doc) { - return calculateDistanceForComparisonOperation(operation, doc, ((dif) -> dif < 0 ? 0.0 : 1.0 + dif)); + private double computeHeuristic(LessThanOperation operation, Object doc) { + return computeHeuristicComparison(operation, doc, ((dif) -> dif < 0 ? 0.0 : 1.0 + dif)); } - private double calculateDistanceForLessEqualsThan(LessThanEqualsOperation operation, Object doc) { - return calculateDistanceForComparisonOperation(operation, doc, ((dif) -> dif <= 0 ? 0.0 : dif)); + private double computeHeuristic(LessThanEqualsOperation operation, Object doc) { + return computeHeuristicComparison(operation, doc, ((dif) -> dif <= 0 ? 0.0 : dif)); } - private double calculateDistanceForComparisonOperation(ComparisonOperation operation, Object doc, DoubleUnaryOperator calculateDistance) { + private double computeHeuristicComparison(ComparisonOperation operation, Object doc, DoubleUnaryOperator calculateDistance) { Object expectedValue = operation.getValue(); String field = operation.getFieldName(); @@ -134,22 +133,22 @@ private double calculateDistanceForComparisonOperation(ComparisonOperation op return calculateDistance.applyAsDouble(dif); } - private double calculateDistanceForOr(OrOperation operation, Object doc) { + private double computeHeuristic(OrOperation operation, Object doc) { return operation.getConditions().stream() - .mapToDouble(condition -> computeHeuristic(condition, doc)) + .mapToDouble(condition -> computeHeuristicQueryOperation(condition, doc)) .min() .getAsDouble(); } - private double calculateDistanceForAnd(AndOperation operation, Object doc) { + private double computeHeuristic(AndOperation operation, Object doc) { return operation.getConditions() .stream() .mapToDouble(condition -> - TruthnessUtils.normalizeValue(computeHeuristic(condition, doc))) + TruthnessUtils.normalizeValue(computeHeuristicQueryOperation(condition, doc))) .sum(); } - private double calculateDistanceForIn(InOperation operation, Object doc) { + private double computeHeuristicIn(InOperation operation, Object doc) { List expectedValues = operation.getValues(); Object actualValue = getValue(doc, operation.getFieldName()); @@ -163,7 +162,7 @@ private double calculateDistanceForIn(InOperation operation, Object doc) { } } - private double calculateDistanceForNotIn(NotInOperation operation, Object doc) { + private double computeHeuristic(NotInOperation operation, Object doc) { List unexpectedValues = operation.getValues(); if (!documentContainsField(doc, operation.getFieldName())) return 0.0; @@ -175,7 +174,7 @@ private double calculateDistanceForNotIn(NotInOperation operation, Object doc return hasUnexpectedElement ? MIN_DISTANCE_TO_TRUE_VALUE : 0.0; } - private double calculateDistanceForAll(AllOperation operation, Object doc) { + private double computeHeuristic(AllOperation operation, Object doc) { List expectedValues = operation.getValues(); Object actualValues = getValue(doc, operation.getFieldName()); @@ -202,7 +201,7 @@ private double calculateDistanceForInvertedAll(InvertedAllOperation operation } } - private double calculateDistanceForSize(SizeOperation operation, Object doc) { + private double computeHeuristic(SizeOperation operation, Object doc) { Integer expectedSize = operation.getValue(); Object actualValue = getValue(doc, operation.getFieldName()); @@ -226,7 +225,7 @@ private double calculateDistanceForInvertedSize(InvertedSizeOperation operation, } } - private double calculateDistanceForElemMatch(ElemMatchOperation operation, Object doc) { + private double computeHeuristic(ElemMatchOperation operation, Object doc) { Object actualValue = getValue(doc, operation.getFieldName()); if (actualValue instanceof List) { @@ -235,7 +234,7 @@ private double calculateDistanceForElemMatch(ElemMatchOperation operation, Objec .mapToDouble(elem -> { Object newDoc = newDocument(doc); appendToDocument(newDoc, operation.getFieldName(), elem); - return computeHeuristic(operation.getCondition(), newDoc); + return computeHeuristicQueryOperation(operation.getCondition(), newDoc); }) .min() .getAsDouble(); @@ -244,7 +243,7 @@ private double calculateDistanceForElemMatch(ElemMatchOperation operation, Objec } } - private double calculateDistanceForExists(ExistsOperation operation, Object doc) { + private double computeHeuristicExists(ExistsOperation operation, Object doc) { String expectedField = operation.getFieldName(); Set actualFields = documentKeys(doc); @@ -258,7 +257,7 @@ private double calculateDistanceForExists(ExistsOperation operation, Object doc) } } - private double calculateDistanceForMod(ModOperation operation, Object doc) { + private double computeHeuristicMod(ModOperation operation, Object doc) { Long expectedRemainder = operation.getRemainder(); Object actualValue = getValue(doc, operation.getFieldName()); @@ -284,25 +283,25 @@ private double calculateDistanceForInvertedMod(InvertedModOperation operation, O } } - private double calculateDistanceForNot(NotOperation operation, Object doc) { + private double computeHeuristic(NotOperation operation, Object doc) { String fieldName = operation.getFieldName(); if (getValue(doc, fieldName) == null) return 0.0; QueryOperation condition = operation.getCondition(); QueryOperation invertedOperation = invertOperation(condition); - return computeHeuristic(invertedOperation, doc); + return computeHeuristicQueryOperation(invertedOperation, doc); } - private double calculateDistanceForNor(NorOperation operation, Object doc) { + private double computeHeuristicNor(NorOperation operation, Object doc) { return operation.getConditions() .stream() .mapToDouble(condition -> - TruthnessUtils.normalizeValue(computeHeuristic(invertOperation(condition), doc))) + TruthnessUtils.normalizeValue(computeHeuristicQueryOperation(invertOperation(condition), doc))) .sum(); } - private double calculateDistanceForType(TypeOperation operation, Object doc) { + private double computeHeuristic(TypeOperation operation, Object doc) { String field = operation.getFieldName(); String expectedType = getType(operation.getType()); Object value = getValue(doc, field); @@ -320,7 +319,7 @@ private double calculateDistanceForInvertedType(InvertedTypeOperation operation, return !Objects.equals(actualType, expectedType) ? 0.0 : MIN_DISTANCE_TO_TRUE_VALUE; } - private double calculateDistanceForNearSphere(NearSphereOperation operation, Object doc) { + private double computeHeuristicNearSphere(NearSphereOperation operation, Object doc) { String field = operation.getFieldName(); Object actualPoint = getValue(doc, field); diff --git a/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandlerTest.java b/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandlerTest.java index e4bfb07aa7..67645db1ae 100644 --- a/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandlerTest.java +++ b/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandlerTest.java @@ -69,7 +69,7 @@ public void testGetEvaluatedMongoCommands() { assertEquals(1, documents.size()); final Bson bsonQuery = eq("age", 18); - Document queryDocument = MongoHeuristicCalculatorTest.convertToDocument( bsonQuery); + Document queryDocument = MongoHeuristicsCalculatorTest.convertToDocument( bsonQuery); try (MongoCursor cursor = collection.find(queryDocument).iterator()) { assertFalse(cursor.hasNext()); diff --git a/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHeuristicCalculatorTest.java b/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHeuristicsCalculatorTest.java similarity index 83% rename from client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHeuristicCalculatorTest.java rename to client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHeuristicsCalculatorTest.java index b61f9c1604..ef28440429 100644 --- a/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHeuristicCalculatorTest.java +++ b/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHeuristicsCalculatorTest.java @@ -15,15 +15,15 @@ import static org.junit.jupiter.api.Assertions.*; -class MongoHeuristicCalculatorTest { +class MongoHeuristicsCalculatorTest { @Test public void testEquals() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.eq("age", 10); Bson bsonFalse = Filters.eq("age", 26); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(16.0, distanceNotMatch); } @@ -34,9 +34,9 @@ public void testNotEquals() { Bson bsonTrue1 = Filters.ne("age", 26); Bson bsonTrue2 = Filters.ne("some-field", 26); Bson bsonFalse = Filters.ne("age", 10); - Double distanceMatch1 = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue1), doc); - Double distanceMatch2 = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue2), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch1 = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue1), doc); + Double distanceMatch2 = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue2), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch1); assertEquals(0.0, distanceMatch2); assertEquals(1.0, distanceNotMatch); @@ -47,8 +47,8 @@ public void testGreaterThan() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.gt("age", 5); Bson bsonFalse = Filters.gt("age", 13); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(4.0, distanceNotMatch); } @@ -58,8 +58,8 @@ public void testGreaterThanEquals() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.gte("age", 5); Bson bsonFalse = Filters.gte("age", 13); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(3.0, distanceNotMatch); } @@ -69,8 +69,8 @@ public void testLessThan() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.lt("age", 11); Bson bsonFalse = Filters.lt("age", 7); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(4.0, distanceNotMatch); } @@ -80,8 +80,8 @@ public void testLessThanEquals() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.lte("age", 11); Bson bsonFalse = Filters.lte("age", 7); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(3.0, distanceNotMatch); } @@ -91,8 +91,8 @@ public void testOr() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.or(Filters.gt("age", 9), Filters.lt("age", 20)); Bson bsonFalse = Filters.or(Filters.gt("age", 17), Filters.lt("age", 8)); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(3.0, distanceNotMatch); } @@ -102,8 +102,8 @@ public void testAnd() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.and(Filters.gt("age", 9), Filters.lt("age", 20)); Bson bsonFalse = Filters.and(Filters.gt("age", 10), Filters.lt("age", 8)); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); Double expectedDistanceNotMatch = TruthnessUtils.normalizeValue(1.0) + TruthnessUtils.normalizeValue(3.0); assertEquals(expectedDistanceNotMatch, distanceNotMatch); @@ -113,7 +113,7 @@ public void testAnd() { public void testNorReturnsTrue() { Document doc = new Document().append("age", 25); Bson bsonTrue = Filters.nor(Filters.gt("age", 30), Filters.lt("age", 18)); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); assertEquals(0.0, distanceMatch); } @@ -121,7 +121,7 @@ public void testNorReturnsTrue() { public void testNorReturnsFalse() { Document doc = new Document().append("age", 35); Bson bsonFalse = Filters.nor(Filters.gt("age", 30), Filters.lt("age", 18)); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); Double expectedDistanceNotMatch = TruthnessUtils.normalizeValue(5.0) + TruthnessUtils.normalizeValue(0.0); assertEquals(expectedDistanceNotMatch, distanceNotMatch); } @@ -131,8 +131,8 @@ public void testImplicitAnd() { Document doc = new Document().append("age", 10).append("kg", 50); Bson bsonTrue = BsonDocument.parse("{age: 10, kg: {$gt: 40}}"); Bson bsonFalse = BsonDocument.parse("{age: 9, kg: {$gt: 40}}"); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); Double expectedDistanceNotMatch = TruthnessUtils.normalizeValue(1.0) + TruthnessUtils.normalizeValue(0.0); assertEquals(expectedDistanceNotMatch, distanceNotMatch); @@ -143,8 +143,8 @@ public void testIn() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.in("age", new ArrayList<>(Arrays.asList(1, 10, 8))); Bson bsonFalse = Filters.in("age", new ArrayList<>(Arrays.asList(1, 15))); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(5.0, distanceNotMatch); } @@ -154,8 +154,8 @@ public void testNotIn() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.nin("age", new ArrayList<>(Arrays.asList(1, 8))); Bson bsonFalse = Filters.nin("age", new ArrayList<>(Arrays.asList(1, 10))); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(1.0, distanceNotMatch); } @@ -165,8 +165,8 @@ public void testAll() { Document doc = new Document().append("employees", new ArrayList<>(Arrays.asList(1, 5, 6))); Bson bsonTrue = Filters.all("employees", new ArrayList<>(Arrays.asList(1, 5, 6))); Bson bsonFalse = Filters.all("employees", new ArrayList<>(Arrays.asList(1, 7, 8))); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); Double expectedDistanceNotMatch = TruthnessUtils.normalizeValue(0) + TruthnessUtils.normalizeValue(1) + TruthnessUtils.normalizeValue(2); assertEquals(expectedDistanceNotMatch, distanceNotMatch); @@ -177,8 +177,8 @@ public void testSize() { Document doc = new Document().append("employees", new ArrayList<>(Arrays.asList(1, 5, 6))); Bson bsonTrue = Filters.size("employees", 3); Bson bsonFalse = Filters.size("employees", 5); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(2.0, distanceNotMatch); } @@ -188,8 +188,8 @@ public void testMod() { Document doc = new Document().append("age", 20); Bson bsonTrue = Filters.mod("age", 3, 2); Bson bsonFalse = Filters.mod("age", 3, 0); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(2.0, distanceNotMatch); } @@ -199,8 +199,8 @@ public void testNot() { Document doc = new Document().append("age", 20); Bson bsonTrue = Filters.not(Filters.gt("age", 30)); Bson bsonFalse = Filters.not(Filters.gt("age", 10)); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(10.0, distanceNotMatch); } @@ -210,8 +210,8 @@ public void testExistsTrueVersion() { Document doc = new Document().append("age", 20); Bson bsonTrue = Filters.exists("age", true); Bson bsonFalse = Filters.exists("name", true); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(65563.0, distanceNotMatch); } @@ -221,8 +221,8 @@ public void testExistsFalseVersion() { Document doc = new Document().append("age", 20); Bson bsonTrue = Filters.exists("name", false); Bson bsonFalse = Filters.exists("age", false); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(1.0, distanceNotMatch); } @@ -232,8 +232,8 @@ public void testTypeExplicitVersion() { Document doc = new Document().append("age", 20); Bson bsonTrue = Filters.type("age", BsonType.INT32); Bson bsonFalse = Filters.type("age", BsonType.DOUBLE); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(65551.0, distanceNotMatch); } @@ -244,8 +244,8 @@ public void testTypeAliasVersion() { Document doc = new Document().append("age", 20); Bson bsonTrue = Filters.type("age", BsonType.INT32.name()); Bson bsonFalse = Filters.type("age", BsonType.DOUBLE.name()); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(65551.0, distanceNotMatch); } @@ -255,8 +255,8 @@ public void testElemMatch() { Document doc = new Document().append("years", new ArrayList<>(Arrays.asList(2002, 2010))); Bson bsonTrue = Filters.elemMatch("years", Filters.gt("years", 2009)); Bson bsonFalse = Filters.elemMatch("years", Filters.lt("years", 2001)); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(2.0, distanceNotMatch); } @@ -267,8 +267,8 @@ public void testNearSphere() { BsonDocument point = new BsonDocument().append("type", new BsonString("Point")).append("coordinates", new BsonArray(Arrays.asList(new BsonDouble(2.29441692356368), new BsonDouble(48.858504187164684)))); Bson bsonTrue = Filters.nearSphere("location", point, 6000000.0, 0.0); Bson bsonFalse = Filters.nearSphere("location", point, 5000000.0, 0.0); - Double distanceMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeExpression(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(837402.9310023151, distanceNotMatch); } From 6b60f26f482a4a2cf5ee326f966e2df17f8f2dc8 Mon Sep 17 00:00:00 2001 From: Juan Pablo Galeotti Date: Sat, 11 Jul 2026 17:51:46 -0300 Subject: [PATCH 2/4] Add tests for parsing invalid empty `$and`, `$or`, `$nor` queries and empty `$all` query scenario --- .../controller/mongo/QueryParserTest.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/client-java/controller/src/test/java/org/evomaster/client/java/controller/mongo/QueryParserTest.java b/client-java/controller/src/test/java/org/evomaster/client/java/controller/mongo/QueryParserTest.java index f598a5981c..4269168720 100644 --- a/client-java/controller/src/test/java/org/evomaster/client/java/controller/mongo/QueryParserTest.java +++ b/client-java/controller/src/test/java/org/evomaster/client/java/controller/mongo/QueryParserTest.java @@ -4,7 +4,9 @@ import org.evomaster.client.java.controller.mongo.operations.*; import org.junit.jupiter.api.Test; +import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashSet; import static org.junit.jupiter.api.Assertions.*; @@ -767,4 +769,50 @@ void testParseInvalidExistsNull() { QueryOperation operation = parser.parse(query); assertNull(operation); } + + @Test + void testParseInvalidEmptyAnd() { + Document query = new Document( + "$and", + new ArrayList() + ); + QueryOperation operation = parser.parse(query); + assertNull(operation); + } + + @Test + void testParseInvalidEmptyOr() { + Document query = new Document( + "$or", + new ArrayList() + ); + QueryOperation operation = parser.parse(query); + assertNull(operation); + } + @Test + void testParseInvalidEmptyNor() { + Document query = new Document( + "$nor", + new ArrayList() + ); + QueryOperation operation = parser.parse(query); + assertNull(operation); + } + + @Test + void testParseEmptyAll() { + Document query = new Document( + "results", + new Document("$all", new ArrayList()) + ); + QueryOperation operation = parser.parse(query); + assertNotNull(operation); + + assertTrue(operation instanceof AllOperation); + AllOperation all = (AllOperation) operation; + assertEquals("results", all.getFieldName()); + assertEquals(new ArrayList<>(), all.getValues()); + + } + } From 0e795e6ddbc2cb43e872d31a0ce4704c4aaf7813 Mon Sep 17 00:00:00 2001 From: Juan Pablo Galeotti Date: Sat, 11 Jul 2026 19:21:17 -0300 Subject: [PATCH 3/4] Refactor `MongoHeuristicsCalculator`: extract `computeDistanceDocuments` method for handling document calculations, rename method for better clarity, and update related tests. --- .../internal/db/mongo/MongoHandler.java | 22 +---- .../mongo/MongoHeuristicsCalculator.java | 31 +++++- .../internal/db/mongo/MongoHandlerTest.java | 1 + .../mongo/MongoHeuristicsCalculatorTest.java | 97 +++++++++---------- 4 files changed, 80 insertions(+), 71 deletions(-) rename client-java/controller/src/test/java/org/evomaster/client/java/controller/{internal/db => }/mongo/MongoHeuristicsCalculatorTest.java (80%) diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandler.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandler.java index 7be596b391..a1877e4752 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandler.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandler.java @@ -144,7 +144,7 @@ private MongoDistanceWithMetrics computeFindDistance(MongoFindCommand info) { String databaseName = info.getDatabaseName(); String collectionName = info.getCollectionName(); - Object collection = getCollection(databaseName,collectionName); + Object collection = getCollection(databaseName, collectionName); Iterable documents = getDocuments(collection); boolean collectionIsEmpty = !documents.iterator().hasNext(); @@ -152,24 +152,8 @@ private MongoDistanceWithMetrics computeFindDistance(MongoFindCommand info) { emptyCollections.add(new MongoOperation(info.getCollectionName(), info.getQuery(), info.getDatabaseName(), info.getDocumentsType())); } - double min = Double.MAX_VALUE; - int numberOfEvaluatedDocuments = 0; - for (Object doc : documents) { - numberOfEvaluatedDocuments += 1; - double findDistance; - try { - findDistance = calculator.computeDistance(info.getQuery(), doc); - } catch (Exception ex) { - SimpleLogger.uniqueWarn("Failed to compute find: " + info.getQuery() + " with data " + doc); - findDistance = Double.MAX_VALUE; - } - if (findDistance == 0) { - return new MongoDistanceWithMetrics(0, numberOfEvaluatedDocuments); - } else if (findDistance < min) { - min = findDistance; - } - } - return new MongoDistanceWithMetrics(min, numberOfEvaluatedDocuments); + MongoDistanceWithMetrics mongoDistanceWithMetrics = calculator.computeDistanceDocuments(info.getQuery(), documents); // to update the metrics + return mongoDistanceWithMetrics; } private Object getCollection(String databaseName, String collectionName) { diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/MongoHeuristicsCalculator.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/MongoHeuristicsCalculator.java index cdc177ee7a..4f95ffb55c 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/MongoHeuristicsCalculator.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/MongoHeuristicsCalculator.java @@ -1,10 +1,12 @@ package org.evomaster.client.java.controller.mongo; +import org.evomaster.client.java.controller.internal.db.mongo.MongoDistanceWithMetrics; import org.evomaster.client.java.controller.mongo.operations.*; import org.evomaster.client.java.controller.mongo.operations.synthetic.*; import org.evomaster.client.java.distance.heuristics.DistanceHelper; import org.evomaster.client.java.distance.heuristics.TruthnessUtils; import org.evomaster.client.java.sql.internal.TaintHandler; +import org.evomaster.client.java.utils.SimpleLogger; import static org.evomaster.client.java.controller.mongo.utils.BsonHelper.*; import static java.lang.Math.abs; @@ -27,6 +29,29 @@ public MongoHeuristicsCalculator(TaintHandler taintHandler) { this.taintHandler = taintHandler; } + + public MongoDistanceWithMetrics computeDistanceDocuments(Object queryDocument, Iterable documents) { + double min = Double.MAX_VALUE; + int numberOfEvaluatedDocuments = 0; + for (Object doc : documents) { + numberOfEvaluatedDocuments += 1; + double findDistance; + try { + findDistance = this.computeHeuristicDocument(queryDocument, doc); + } catch (Exception ex) { + SimpleLogger.uniqueWarn("Failed to compute find: " + queryDocument + " with data " + doc); + findDistance = Double.MAX_VALUE; + } + if (findDistance == 0) { + return new MongoDistanceWithMetrics(0, numberOfEvaluatedDocuments); + } else if (findDistance < min) { + min = findDistance; + } + } + return new MongoDistanceWithMetrics(min, numberOfEvaluatedDocuments); + + } + /** * Compute a "branch" distance heuristics. * @@ -34,7 +59,7 @@ public MongoHeuristicsCalculator(TaintHandler taintHandler) { * @param doc a document in the database for which we want to calculate the distance * @return a branch distance, where 0 means that the document would make the QUERY resolve as true */ - public double computeDistance(Object query, Object doc) { + double computeHeuristicDocument(Object query, Object doc) { QueryOperation operation = getOperation(query); return computeHeuristicQueryOperation(operation, doc); } @@ -201,9 +226,9 @@ private double calculateDistanceForInvertedAll(InvertedAllOperation operation } } - private double computeHeuristic(SizeOperation operation, Object doc) { + private double computeHeuristic(SizeOperation operation, Object bsonDocument) { Integer expectedSize = operation.getValue(); - Object actualValue = getValue(doc, operation.getFieldName()); + Object actualValue = getValue(bsonDocument, operation.getFieldName()); if (actualValue instanceof List) { Integer actualSize = ((List) actualValue).size(); diff --git a/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandlerTest.java b/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandlerTest.java index 67645db1ae..520af98645 100644 --- a/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandlerTest.java +++ b/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandlerTest.java @@ -3,6 +3,7 @@ import com.mongodb.client.*; import org.bson.Document; import org.bson.conversions.Bson; +import org.evomaster.client.java.controller.mongo.MongoHeuristicsCalculatorTest; import org.evomaster.client.java.instrumentation.MongoFindCommand; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; diff --git a/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHeuristicsCalculatorTest.java b/client-java/controller/src/test/java/org/evomaster/client/java/controller/mongo/MongoHeuristicsCalculatorTest.java similarity index 80% rename from client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHeuristicsCalculatorTest.java rename to client-java/controller/src/test/java/org/evomaster/client/java/controller/mongo/MongoHeuristicsCalculatorTest.java index ef28440429..a4466c8422 100644 --- a/client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHeuristicsCalculatorTest.java +++ b/client-java/controller/src/test/java/org/evomaster/client/java/controller/mongo/MongoHeuristicsCalculatorTest.java @@ -1,11 +1,10 @@ -package org.evomaster.client.java.controller.internal.db.mongo; +package org.evomaster.client.java.controller.mongo; import com.mongodb.client.model.Filters; import org.bson.*; import org.bson.codecs.DecoderContext; import org.bson.codecs.DocumentCodec; import org.bson.conversions.Bson; -import org.evomaster.client.java.controller.mongo.MongoHeuristicsCalculator; import org.evomaster.client.java.distance.heuristics.TruthnessUtils; import org.junit.jupiter.api.Test; @@ -15,15 +14,15 @@ import static org.junit.jupiter.api.Assertions.*; -class MongoHeuristicsCalculatorTest { +public class MongoHeuristicsCalculatorTest { @Test public void testEquals() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.eq("age", 10); Bson bsonFalse = Filters.eq("age", 26); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(16.0, distanceNotMatch); } @@ -34,9 +33,9 @@ public void testNotEquals() { Bson bsonTrue1 = Filters.ne("age", 26); Bson bsonTrue2 = Filters.ne("some-field", 26); Bson bsonFalse = Filters.ne("age", 10); - Double distanceMatch1 = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue1), doc); - Double distanceMatch2 = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue2), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch1 = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue1), doc); + Double distanceMatch2 = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue2), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch1); assertEquals(0.0, distanceMatch2); assertEquals(1.0, distanceNotMatch); @@ -47,8 +46,8 @@ public void testGreaterThan() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.gt("age", 5); Bson bsonFalse = Filters.gt("age", 13); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(4.0, distanceNotMatch); } @@ -58,8 +57,8 @@ public void testGreaterThanEquals() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.gte("age", 5); Bson bsonFalse = Filters.gte("age", 13); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(3.0, distanceNotMatch); } @@ -69,8 +68,8 @@ public void testLessThan() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.lt("age", 11); Bson bsonFalse = Filters.lt("age", 7); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(4.0, distanceNotMatch); } @@ -80,8 +79,8 @@ public void testLessThanEquals() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.lte("age", 11); Bson bsonFalse = Filters.lte("age", 7); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(3.0, distanceNotMatch); } @@ -91,8 +90,8 @@ public void testOr() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.or(Filters.gt("age", 9), Filters.lt("age", 20)); Bson bsonFalse = Filters.or(Filters.gt("age", 17), Filters.lt("age", 8)); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(3.0, distanceNotMatch); } @@ -102,8 +101,8 @@ public void testAnd() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.and(Filters.gt("age", 9), Filters.lt("age", 20)); Bson bsonFalse = Filters.and(Filters.gt("age", 10), Filters.lt("age", 8)); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); Double expectedDistanceNotMatch = TruthnessUtils.normalizeValue(1.0) + TruthnessUtils.normalizeValue(3.0); assertEquals(expectedDistanceNotMatch, distanceNotMatch); @@ -113,7 +112,7 @@ public void testAnd() { public void testNorReturnsTrue() { Document doc = new Document().append("age", 25); Bson bsonTrue = Filters.nor(Filters.gt("age", 30), Filters.lt("age", 18)); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); assertEquals(0.0, distanceMatch); } @@ -121,7 +120,7 @@ public void testNorReturnsTrue() { public void testNorReturnsFalse() { Document doc = new Document().append("age", 35); Bson bsonFalse = Filters.nor(Filters.gt("age", 30), Filters.lt("age", 18)); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); Double expectedDistanceNotMatch = TruthnessUtils.normalizeValue(5.0) + TruthnessUtils.normalizeValue(0.0); assertEquals(expectedDistanceNotMatch, distanceNotMatch); } @@ -131,8 +130,8 @@ public void testImplicitAnd() { Document doc = new Document().append("age", 10).append("kg", 50); Bson bsonTrue = BsonDocument.parse("{age: 10, kg: {$gt: 40}}"); Bson bsonFalse = BsonDocument.parse("{age: 9, kg: {$gt: 40}}"); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); Double expectedDistanceNotMatch = TruthnessUtils.normalizeValue(1.0) + TruthnessUtils.normalizeValue(0.0); assertEquals(expectedDistanceNotMatch, distanceNotMatch); @@ -143,8 +142,8 @@ public void testIn() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.in("age", new ArrayList<>(Arrays.asList(1, 10, 8))); Bson bsonFalse = Filters.in("age", new ArrayList<>(Arrays.asList(1, 15))); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(5.0, distanceNotMatch); } @@ -154,8 +153,8 @@ public void testNotIn() { Document doc = new Document().append("age", 10); Bson bsonTrue = Filters.nin("age", new ArrayList<>(Arrays.asList(1, 8))); Bson bsonFalse = Filters.nin("age", new ArrayList<>(Arrays.asList(1, 10))); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(1.0, distanceNotMatch); } @@ -165,8 +164,8 @@ public void testAll() { Document doc = new Document().append("employees", new ArrayList<>(Arrays.asList(1, 5, 6))); Bson bsonTrue = Filters.all("employees", new ArrayList<>(Arrays.asList(1, 5, 6))); Bson bsonFalse = Filters.all("employees", new ArrayList<>(Arrays.asList(1, 7, 8))); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); Double expectedDistanceNotMatch = TruthnessUtils.normalizeValue(0) + TruthnessUtils.normalizeValue(1) + TruthnessUtils.normalizeValue(2); assertEquals(expectedDistanceNotMatch, distanceNotMatch); @@ -177,8 +176,8 @@ public void testSize() { Document doc = new Document().append("employees", new ArrayList<>(Arrays.asList(1, 5, 6))); Bson bsonTrue = Filters.size("employees", 3); Bson bsonFalse = Filters.size("employees", 5); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(2.0, distanceNotMatch); } @@ -188,8 +187,8 @@ public void testMod() { Document doc = new Document().append("age", 20); Bson bsonTrue = Filters.mod("age", 3, 2); Bson bsonFalse = Filters.mod("age", 3, 0); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(2.0, distanceNotMatch); } @@ -199,8 +198,8 @@ public void testNot() { Document doc = new Document().append("age", 20); Bson bsonTrue = Filters.not(Filters.gt("age", 30)); Bson bsonFalse = Filters.not(Filters.gt("age", 10)); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(10.0, distanceNotMatch); } @@ -210,8 +209,8 @@ public void testExistsTrueVersion() { Document doc = new Document().append("age", 20); Bson bsonTrue = Filters.exists("age", true); Bson bsonFalse = Filters.exists("name", true); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(65563.0, distanceNotMatch); } @@ -221,8 +220,8 @@ public void testExistsFalseVersion() { Document doc = new Document().append("age", 20); Bson bsonTrue = Filters.exists("name", false); Bson bsonFalse = Filters.exists("age", false); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(1.0, distanceNotMatch); } @@ -232,8 +231,8 @@ public void testTypeExplicitVersion() { Document doc = new Document().append("age", 20); Bson bsonTrue = Filters.type("age", BsonType.INT32); Bson bsonFalse = Filters.type("age", BsonType.DOUBLE); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(65551.0, distanceNotMatch); } @@ -244,8 +243,8 @@ public void testTypeAliasVersion() { Document doc = new Document().append("age", 20); Bson bsonTrue = Filters.type("age", BsonType.INT32.name()); Bson bsonFalse = Filters.type("age", BsonType.DOUBLE.name()); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(65551.0, distanceNotMatch); } @@ -255,8 +254,8 @@ public void testElemMatch() { Document doc = new Document().append("years", new ArrayList<>(Arrays.asList(2002, 2010))); Bson bsonTrue = Filters.elemMatch("years", Filters.gt("years", 2009)); Bson bsonFalse = Filters.elemMatch("years", Filters.lt("years", 2001)); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(2.0, distanceNotMatch); } @@ -267,13 +266,13 @@ public void testNearSphere() { BsonDocument point = new BsonDocument().append("type", new BsonString("Point")).append("coordinates", new BsonArray(Arrays.asList(new BsonDouble(2.29441692356368), new BsonDouble(48.858504187164684)))); Bson bsonTrue = Filters.nearSphere("location", point, 6000000.0, 0.0); Bson bsonFalse = Filters.nearSphere("location", point, 5000000.0, 0.0); - Double distanceMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonTrue), doc); - Double distanceNotMatch = new MongoHeuristicsCalculator().computeDistance(convertToDocument(bsonFalse), doc); + Double distanceMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonTrue), doc); + Double distanceNotMatch = new MongoHeuristicsCalculator().computeHeuristicDocument(convertToDocument(bsonFalse), doc); assertEquals(0.0, distanceMatch); assertEquals(837402.9310023151, distanceNotMatch); } - static Document convertToDocument(Bson filter) { + public static Document convertToDocument(Bson filter) { BsonDocument bsonDocument = filter.toBsonDocument(); DocumentCodec documentCodec = new DocumentCodec(); return documentCodec.decode(bsonDocument.asBsonReader(), DecoderContext.builder().build()); From 315b7a469b7a1fa7fa1f615d3457f4a93ff5d719 Mon Sep 17 00:00:00 2001 From: Juan Pablo Galeotti Date: Tue, 21 Jul 2026 15:59:25 -0300 Subject: [PATCH 4/4] Refactor MongoDB query operations: introduce `QueryOperationWithField` to eliminate redundancy and unify field name handling across query operations. --- .../mongo/operations/AllOperation.java | 11 +++-------- .../mongo/operations/AndOperation.java | 4 ++-- .../mongo/operations/ComparisonOperation.java | 11 +++-------- .../mongo/operations/ElemMatchOperation.java | 11 +++-------- .../mongo/operations/EqualsOperation.java | 4 ++-- .../mongo/operations/ExistsOperation.java | 11 +++-------- .../operations/GreaterThanEqualsOperation.java | 4 ++-- .../mongo/operations/GreaterThanOperation.java | 4 ++-- .../mongo/operations/InOperation.java | 11 +++-------- .../mongo/operations/JsonSchemaOperation.java | 4 ++-- .../operations/LessThanEqualsOperation.java | 4 ++-- .../mongo/operations/LessThanOperation.java | 4 ++-- .../mongo/operations/ModOperation.java | 11 +++-------- .../mongo/operations/NearSphereOperation.java | 11 +++-------- .../mongo/operations/NorOperation.java | 4 ++-- .../mongo/operations/NotEqualsOperation.java | 4 ++-- .../mongo/operations/NotInOperation.java | 15 +++++---------- .../mongo/operations/NotOperation.java | 11 +++-------- .../mongo/operations/OrOperation.java | 4 ++-- .../mongo/operations/QueryOperation.java | 3 ++- .../operations/QueryOperationWithField.java | 18 ++++++++++++++++++ .../mongo/operations/SizeOperation.java | 11 +++-------- .../mongo/operations/TypeOperation.java | 11 +++-------- 23 files changed, 75 insertions(+), 111 deletions(-) create mode 100644 client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/QueryOperationWithField.java diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/AllOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/AllOperation.java index 6efb9021e8..22ba48a1bb 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/AllOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/AllOperation.java @@ -6,20 +6,15 @@ * Represent $all operation. * Matches arrays that contain all elements specified in the query. */ -public class AllOperation extends QueryOperation{ - private final String fieldName; +public class AllOperation extends QueryOperationWithField { private final List values; public AllOperation(String fieldName, List values) { - this.fieldName = fieldName; + super(fieldName); this.values = values; } - public String getFieldName() { - return fieldName; - } - public List getValues() { return values; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/AndOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/AndOperation.java index 8481b78c28..063edaa958 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/AndOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/AndOperation.java @@ -6,7 +6,7 @@ * Represent $and operation. * Joins query clauses with a logical AND returns all documents that match the conditions of all clauses. */ -public class AndOperation extends QueryOperation{ +public class AndOperation extends QueryOperation { private final List conditions; public AndOperation(List conditions) { @@ -16,4 +16,4 @@ public AndOperation(List conditions) { public List getConditions() { return conditions; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ComparisonOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ComparisonOperation.java index f975b7c393..c1b6bc74a4 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ComparisonOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ComparisonOperation.java @@ -1,19 +1,14 @@ package org.evomaster.client.java.controller.mongo.operations; -public abstract class ComparisonOperation extends QueryOperation{ - private final String fieldName; +public abstract class ComparisonOperation extends QueryOperationWithField { private final V value; ComparisonOperation(String fieldName, V value) { - this.fieldName = fieldName; + super(fieldName); this.value = value; } - public String getFieldName() { - return fieldName; - } - public V getValue() { return value; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ElemMatchOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ElemMatchOperation.java index bcf563c4e5..cca0aa5e09 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ElemMatchOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ElemMatchOperation.java @@ -5,20 +5,15 @@ * Selects documents if element in the array field matches all the specified $elemMatch conditions. * Here it only has one condition to match implementation in "com.mongodb.client.model.Filters" */ -public class ElemMatchOperation extends QueryOperation{ - private final String fieldName; +public class ElemMatchOperation extends QueryOperationWithField { private final QueryOperation condition; public ElemMatchOperation(String fieldName, QueryOperation condition) { - this.fieldName = fieldName; + super( fieldName); this.condition = condition; } - public String getFieldName() { - return fieldName; - } - public QueryOperation getCondition() { return condition; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/EqualsOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/EqualsOperation.java index 6395be3007..a3e3675170 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/EqualsOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/EqualsOperation.java @@ -4,8 +4,8 @@ * Represent $eq operation. * Matches documents where the value of a field equals the specified value. */ -public class EqualsOperation extends ComparisonOperation{ +public class EqualsOperation extends ComparisonOperation { public EqualsOperation(String fieldName, V value) { super(fieldName, value); } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ExistsOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ExistsOperation.java index 7e18f3cfc7..b6babb7a98 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ExistsOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ExistsOperation.java @@ -5,20 +5,15 @@ * When boolean is true, $exists matches the documents that contain the field. * When boolean is false, the query returns only the documents that do not contain the field. */ -public class ExistsOperation extends QueryOperation{ - private final String fieldName; +public class ExistsOperation extends QueryOperationWithField { private final Boolean bool; public ExistsOperation(String fieldName, Boolean bool) { - this.fieldName = fieldName; + super(fieldName); this.bool = bool; } - public String getFieldName() { - return fieldName; - } - public Boolean getBoolean() { return bool; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/GreaterThanEqualsOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/GreaterThanEqualsOperation.java index fed51aedba..2410daef22 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/GreaterThanEqualsOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/GreaterThanEqualsOperation.java @@ -4,8 +4,8 @@ * Represent $gte operation. * Selects the documents where the value of the field is greater than or equal to a specified value */ -public class GreaterThanEqualsOperation extends ComparisonOperation{ +public class GreaterThanEqualsOperation extends ComparisonOperation { public GreaterThanEqualsOperation(String fieldName, V value) { super(fieldName, value); } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/GreaterThanOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/GreaterThanOperation.java index d88ffb65c9..91e757548b 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/GreaterThanOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/GreaterThanOperation.java @@ -4,8 +4,8 @@ * Represent $gt operation. * Selects the documents where the value of the field is greater than or equal to a specified value */ -public class GreaterThanOperation extends ComparisonOperation{ +public class GreaterThanOperation extends ComparisonOperation { public GreaterThanOperation(String fieldName, V value) { super(fieldName, value); } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/InOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/InOperation.java index 868d183b7b..1d1d2fee83 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/InOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/InOperation.java @@ -6,20 +6,15 @@ * Represent $in operation. * Selects the documents where the value of a field equals any value in the specified array. */ -public class InOperation extends QueryOperation{ - private final String fieldName; +public class InOperation extends QueryOperationWithField { private final List values; public InOperation(String fieldName, List values) { - this.fieldName = fieldName; + super(fieldName); this.values = values; } - public String getFieldName() { - return fieldName; - } - public List getValues() { return values; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/JsonSchemaOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/JsonSchemaOperation.java index 01b5615a59..2ee3dedd34 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/JsonSchemaOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/JsonSchemaOperation.java @@ -4,7 +4,7 @@ * Represent $jsonSchema operation. * Matches documents that satisfy the specified JSON Schema. */ -public class JsonSchemaOperation extends QueryOperation{ +public class JsonSchemaOperation extends QueryOperation { private final Object schema; public JsonSchemaOperation(Object schema) { @@ -14,4 +14,4 @@ public JsonSchemaOperation(Object schema) { public Object getSchema() { return schema; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/LessThanEqualsOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/LessThanEqualsOperation.java index ce55ca3ed7..c3d2248a35 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/LessThanEqualsOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/LessThanEqualsOperation.java @@ -4,8 +4,8 @@ * Represent $lte operation. * Selects the documents where the value of the field is less than or equal to a specified value */ -public class LessThanEqualsOperation extends ComparisonOperation{ +public class LessThanEqualsOperation extends ComparisonOperation { public LessThanEqualsOperation(String fieldName, V value) { super(fieldName, value); } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/LessThanOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/LessThanOperation.java index a674743194..9b60061aec 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/LessThanOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/LessThanOperation.java @@ -4,8 +4,8 @@ * Represent $lt operation. * Selects the documents where the value of the field is less than to a specified value */ -public class LessThanOperation extends ComparisonOperation{ +public class LessThanOperation extends ComparisonOperation { public LessThanOperation(String fieldName, V value) { super(fieldName, value); } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ModOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ModOperation.java index 6bd9d494a6..607b7012c5 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ModOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/ModOperation.java @@ -4,21 +4,16 @@ * Represent $mod operation. * Select documents where the value of a field divided by a divisor has the specified remainder. */ -public class ModOperation extends QueryOperation{ - private final String fieldName; +public class ModOperation extends QueryOperationWithField { private final Long divisor; private final Long remainder; public ModOperation(String fieldName, Long divisor, Long remainder) { - this.fieldName = fieldName; + super(fieldName); this.divisor = divisor; this.remainder = remainder; } - public String getFieldName() { - return fieldName; - } - public Long getDivisor() { return divisor; } @@ -26,4 +21,4 @@ public Long getDivisor() { public Long getRemainder() { return remainder; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NearSphereOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NearSphereOperation.java index c5a9627648..e0c0b0677a 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NearSphereOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NearSphereOperation.java @@ -4,8 +4,7 @@ * Represent $nearSphere operation. * Specifies a point for which a geospatial query returns the documents from nearest to farthest. */ -public class NearSphereOperation extends QueryOperation { - private final String fieldName; +public class NearSphereOperation extends QueryOperationWithField { private final Double longitude; private final Double latitude; private final Double maxDistance; @@ -13,17 +12,13 @@ public class NearSphereOperation extends QueryOperation { public NearSphereOperation(String fieldName, Double longitude, Double latitude, Double maxDistance, Double minDistance) { - this.fieldName = fieldName; + super(fieldName); this.longitude = longitude; this.latitude = latitude; this.maxDistance = maxDistance; this.minDistance = minDistance; } - public String getFieldName() { - return fieldName; - } - public Double getLongitude() { return longitude; } @@ -39,4 +34,4 @@ public Double getMaxDistance() { public Double getMinDistance() { return minDistance; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NorOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NorOperation.java index f48472d6da..b5f0b28cb6 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NorOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NorOperation.java @@ -6,7 +6,7 @@ * Represent $nor operation. * Selects the documents that fail all the query expressions in the array. */ -public class NorOperation extends QueryOperation{ +public class NorOperation extends QueryOperation { private final List conditions; public NorOperation(List conditions) { @@ -16,4 +16,4 @@ public NorOperation(List conditions) { public List getConditions() { return conditions; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NotEqualsOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NotEqualsOperation.java index 2ec76bd890..a43cf8b906 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NotEqualsOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NotEqualsOperation.java @@ -5,8 +5,8 @@ * Selects the documents where the value of the field is not equal to the specified value. * This includes documents that do not contain the field. */ -public class NotEqualsOperation extends ComparisonOperation{ +public class NotEqualsOperation extends ComparisonOperation { public NotEqualsOperation(String fieldName, V value) { super(fieldName, value); } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NotInOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NotInOperation.java index 312a2e472b..ef400fa817 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NotInOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NotInOperation.java @@ -5,23 +5,18 @@ /** * Represent $nin operation. * Selects the documents where: - * - the field value is not in the specified array - * - the field does not exist. + * - the field value is not in the specified array + * - the field does not exist. */ -public class NotInOperation extends QueryOperation{ - private final String fieldName; +public class NotInOperation extends QueryOperationWithField { private final List values; public NotInOperation(String fieldName, List values) { - this.fieldName = fieldName; + super(fieldName); this.values = values; } - public String getFieldName() { - return fieldName; - } - public List getValues() { return values; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NotOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NotOperation.java index 41f9f23068..c367e3dacd 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NotOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/NotOperation.java @@ -4,20 +4,15 @@ * Represent $not operation. * Selects the documents that do not match the condition. */ -public class NotOperation extends QueryOperation { - private final String fieldName; +public class NotOperation extends QueryOperationWithField { private final QueryOperation condition; public NotOperation(String fieldName, QueryOperation condition) { - this.fieldName = fieldName; + super(fieldName); this.condition = condition; } - public String getFieldName() { - return fieldName; - } - public QueryOperation getCondition() { return condition; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/OrOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/OrOperation.java index 5e0ff7f40e..ff29a511a9 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/OrOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/OrOperation.java @@ -6,7 +6,7 @@ * Represent $or operation. * Selects the documents that satisfy at least one of the conditions. */ -public class OrOperation extends QueryOperation{ +public class OrOperation extends QueryOperation { private final List conditions; public OrOperation(List conditions) { @@ -16,4 +16,4 @@ public OrOperation(List conditions) { public List getConditions() { return conditions; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/QueryOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/QueryOperation.java index c8ea749e8a..ca5e7e6dcb 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/QueryOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/QueryOperation.java @@ -3,4 +3,5 @@ /** * Represents a MongoDB query operation. */ -abstract public class QueryOperation{} \ No newline at end of file +abstract public class QueryOperation { +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/QueryOperationWithField.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/QueryOperationWithField.java new file mode 100644 index 0000000000..484dd16ece --- /dev/null +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/QueryOperationWithField.java @@ -0,0 +1,18 @@ +package org.evomaster.client.java.controller.mongo.operations; + +import java.util.Objects; + +public abstract class QueryOperationWithField extends QueryOperation { + + private final String fieldName; + + public QueryOperationWithField(String fieldName) { + Objects.requireNonNull(fieldName); + + this.fieldName = fieldName; + } + + public String getFieldName() { + return fieldName; + } +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/SizeOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/SizeOperation.java index 58f87612d3..2ad195f63f 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/SizeOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/SizeOperation.java @@ -4,20 +4,15 @@ * Represent $size operation. * Matches any array with the number of elements specified by the argument. */ -public class SizeOperation extends QueryOperation { - private final String fieldName; +public class SizeOperation extends QueryOperationWithField { private final Integer value; public SizeOperation(String fieldName, Integer value) { - this.fieldName = fieldName; + super(fieldName); this.value = value; } - public String getFieldName() { - return fieldName; - } - public Integer getValue() { return value; } -} \ No newline at end of file +} diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/TypeOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/TypeOperation.java index 8d67d96a66..ae9570a404 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/TypeOperation.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/operations/TypeOperation.java @@ -5,20 +5,15 @@ * Represent $type operation. * Selects documents where the value of the field is an instance of the specified BSON type(s). */ -public class TypeOperation extends QueryOperation { - private final String fieldName; +public class TypeOperation extends QueryOperationWithField { private final Object type; public TypeOperation(String fieldName, Object type) { - this.fieldName = fieldName; + super(fieldName); this.type = type; } - public String getFieldName() { - return fieldName; - } - public Object getType() { return type; } -} \ No newline at end of file +}