in tools/query_breakdown/src/main/java/com/google/bigquery/QueryBreakdown.java [54:89]
public List<Node> run(String originalQuery, int runtimeLimit, int replacementLimit,
LocationTracker locationTracker) {
/* uses the loop function to generate and traverse the tree of possible error recoveries.
This will find the optimal solution or abort when timed out */
try {
SimpleTimeLimiter limiter = SimpleTimeLimiter.create(Executors.newSingleThreadExecutor());
limiter.runUninterruptiblyWithTimeout(
() -> loop(originalQuery, replacementLimit, root, 0, locationTracker),
runtimeLimit, TimeUnit.MILLISECONDS);
}
catch (TimeoutException te) {
// abort logic: returns current solution or deletes entire query
if (solution != null) {
return runTermination();
}
Pair first = locationTracker.getOriginalPosition(1, 1);
Pair last;
int numLines = locationTracker.getLocation().size();
if (locationTracker.getLocation().get(numLines - 1).size() == 0) {
last = locationTracker.getOriginalPosition(numLines - 1,
locationTracker.getLocation().get(numLines - 2).size());
}
else {
last = locationTracker.getOriginalPosition(numLines,
locationTracker.getLocation().get(numLines - 1).size());
}
Node deletionNode = new Node(null, first.getX(), first.getY(), last.getX(),
last.getY(), originalQuery.length());
List<Node> returnNodes = new ArrayList<>();
returnNodes.add(deletionNode);
finalString = "";
return returnNodes;
}
// correctly terminated
return runTermination();
}