in core/src/main/java/org/apache/sling/cms/core/models/QueryDebugger.java [72:137]
public QueryDebugger(@Self SlingHttpServletRequest request) {
Optional<String> statementParam = Optional.ofNullable(request.getParameter("statement"));
String language = Optional.ofNullable(request.getParameter("language")).orElse(Query.JCR_SQL2);
int limit = Optional.ofNullable(request.getParameter("sample")).map(s -> Integer.parseInt(s, 10)).orElse(0);
boolean lenabled = false;
long lestimate = 0;
long lduration = -1;
String lplan = null;
String lexception = null;
String lstatement = null;
try {
if (statementParam.isPresent()) {
QueryManager queryManager = request.getResourceResolver().adaptTo(Session.class).getWorkspace()
.getQueryManager();
Query explainQuery = queryManager.createQuery("explain measure " + statementParam.get(), language);
Row row = explainQuery.execute().getRows().nextRow();
lplan = row.getValue("plan").getString();
lstatement = statementParam.get();
if (limit > 0) {
lenabled = true;
long start = System.currentTimeMillis();
Query query = queryManager.createQuery(statementParam.get(), language);
query.setLimit(limit);
QueryResult queryResult = query.execute();
RowIterator rowIterator = queryResult.getRows();
lestimate = rowIterator.getSize();
lduration = System.currentTimeMillis() - start;
while (rowIterator.hasNext()) {
Optional.ofNullable(rowIterator.nextRow())
.map(n -> {
try {
return request.getResourceResolver().getResource(n.getPath());
} catch (RepositoryException e) {
log.warn("Exception getting path from row: {}", n, e);
return null;
}
})
.ifPresent(results::add);
}
}
}
} catch (RepositoryException re) {
lexception = re.toString();
log.warn("Failed to debug query: {}", statementParam, re);
} finally {
this.plan = lplan;
this.duration = lduration;
this.exception = lexception;
this.statement = lstatement;
this.estimatedSize = lestimate;
this.enabled = lenabled;
}
try {
collectMbeanData("PopularQueries", popularQueries);
collectMbeanData("SlowQueries", slowQueries);
} catch (MBeanException | MalformedObjectNameException | InstanceNotFoundException | AttributeNotFoundException
| NullPointerException | ReflectionException e) {
log.warn("Failed to load mBean data", e);
}
}