Skip to content

Commit 0e795e6

Browse files
committed
Refactor MongoHeuristicsCalculator: extract computeDistanceDocuments method for handling document calculations, rename method for better clarity, and update related tests.
1 parent 6b60f26 commit 0e795e6

4 files changed

Lines changed: 80 additions & 71 deletions

File tree

client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandler.java

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -144,32 +144,16 @@ private MongoDistanceWithMetrics computeFindDistance(MongoFindCommand info) {
144144
String databaseName = info.getDatabaseName();
145145
String collectionName = info.getCollectionName();
146146

147-
Object collection = getCollection(databaseName,collectionName);
147+
Object collection = getCollection(databaseName, collectionName);
148148
Iterable<?> documents = getDocuments(collection);
149149
boolean collectionIsEmpty = !documents.iterator().hasNext();
150150

151151
if (collectionIsEmpty) {
152152
emptyCollections.add(new MongoOperation(info.getCollectionName(), info.getQuery(), info.getDatabaseName(), info.getDocumentsType()));
153153
}
154154

155-
double min = Double.MAX_VALUE;
156-
int numberOfEvaluatedDocuments = 0;
157-
for (Object doc : documents) {
158-
numberOfEvaluatedDocuments += 1;
159-
double findDistance;
160-
try {
161-
findDistance = calculator.computeDistance(info.getQuery(), doc);
162-
} catch (Exception ex) {
163-
SimpleLogger.uniqueWarn("Failed to compute find: " + info.getQuery() + " with data " + doc);
164-
findDistance = Double.MAX_VALUE;
165-
}
166-
if (findDistance == 0) {
167-
return new MongoDistanceWithMetrics(0, numberOfEvaluatedDocuments);
168-
} else if (findDistance < min) {
169-
min = findDistance;
170-
}
171-
}
172-
return new MongoDistanceWithMetrics(min, numberOfEvaluatedDocuments);
155+
MongoDistanceWithMetrics mongoDistanceWithMetrics = calculator.computeDistanceDocuments(info.getQuery(), documents); // to update the metrics
156+
return mongoDistanceWithMetrics;
173157
}
174158

175159
private Object getCollection(String databaseName, String collectionName) {

client-java/controller/src/main/java/org/evomaster/client/java/controller/mongo/MongoHeuristicsCalculator.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package org.evomaster.client.java.controller.mongo;
22

3+
import org.evomaster.client.java.controller.internal.db.mongo.MongoDistanceWithMetrics;
34
import org.evomaster.client.java.controller.mongo.operations.*;
45
import org.evomaster.client.java.controller.mongo.operations.synthetic.*;
56
import org.evomaster.client.java.distance.heuristics.DistanceHelper;
67
import org.evomaster.client.java.distance.heuristics.TruthnessUtils;
78
import org.evomaster.client.java.sql.internal.TaintHandler;
9+
import org.evomaster.client.java.utils.SimpleLogger;
810

911
import static org.evomaster.client.java.controller.mongo.utils.BsonHelper.*;
1012
import static java.lang.Math.abs;
@@ -27,14 +29,37 @@ public MongoHeuristicsCalculator(TaintHandler taintHandler) {
2729
this.taintHandler = taintHandler;
2830
}
2931

32+
33+
public MongoDistanceWithMetrics computeDistanceDocuments(Object queryDocument, Iterable<?> documents) {
34+
double min = Double.MAX_VALUE;
35+
int numberOfEvaluatedDocuments = 0;
36+
for (Object doc : documents) {
37+
numberOfEvaluatedDocuments += 1;
38+
double findDistance;
39+
try {
40+
findDistance = this.computeHeuristicDocument(queryDocument, doc);
41+
} catch (Exception ex) {
42+
SimpleLogger.uniqueWarn("Failed to compute find: " + queryDocument + " with data " + doc);
43+
findDistance = Double.MAX_VALUE;
44+
}
45+
if (findDistance == 0) {
46+
return new MongoDistanceWithMetrics(0, numberOfEvaluatedDocuments);
47+
} else if (findDistance < min) {
48+
min = findDistance;
49+
}
50+
}
51+
return new MongoDistanceWithMetrics(min, numberOfEvaluatedDocuments);
52+
53+
}
54+
3055
/**
3156
* Compute a "branch" distance heuristics.
3257
*
3358
* @param query the QUERY clause which we want to resolve as true
3459
* @param doc a document in the database for which we want to calculate the distance
3560
* @return a branch distance, where 0 means that the document would make the QUERY resolve as true
3661
*/
37-
public double computeDistance(Object query, Object doc) {
62+
double computeHeuristicDocument(Object query, Object doc) {
3863
QueryOperation operation = getOperation(query);
3964
return computeHeuristicQueryOperation(operation, doc);
4065
}
@@ -201,9 +226,9 @@ private double calculateDistanceForInvertedAll(InvertedAllOperation<?> operation
201226
}
202227
}
203228

204-
private double computeHeuristic(SizeOperation operation, Object doc) {
229+
private double computeHeuristic(SizeOperation operation, Object bsonDocument) {
205230
Integer expectedSize = operation.getValue();
206-
Object actualValue = getValue(doc, operation.getFieldName());
231+
Object actualValue = getValue(bsonDocument, operation.getFieldName());
207232

208233
if (actualValue instanceof List<?>) {
209234
Integer actualSize = ((List<?>) actualValue).size();

client-java/controller/src/test/java/org/evomaster/client/java/controller/internal/db/mongo/MongoHandlerTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.mongodb.client.*;
44
import org.bson.Document;
55
import org.bson.conversions.Bson;
6+
import org.evomaster.client.java.controller.mongo.MongoHeuristicsCalculatorTest;
67
import org.evomaster.client.java.instrumentation.MongoFindCommand;
78
import org.junit.jupiter.api.BeforeAll;
89
import org.junit.jupiter.api.BeforeEach;

0 commit comments

Comments
 (0)