Skip to content

Commit 824d65a

Browse files
committed
[fix] always serialize statistics (fixes #5829)
Signed-off-by: Patrick Reinhart <[email protected]>
1 parent 7a5025b commit 824d65a

File tree

1 file changed

+49
-40
lines changed

1 file changed

+49
-40
lines changed

exist-core/src/main/java/org/exist/xquery/PerformanceStatsImpl.java

Lines changed: 49 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@
4848
*/
4949
@NotThreadSafe
5050
public class PerformanceStatsImpl implements PerformanceStats {
51+
public static final String CDATA = "CDATA";
52+
public static final String SOURCE = "source";
53+
public static final String ELAPSED = "elapsed";
54+
public static final String CALLS = "calls";
55+
public static final String QUERY = "query";
56+
public static final String NAME = "name";
57+
public static final String TYPE = "type";
5158

5259
private static class IndexStats {
5360

@@ -363,48 +370,50 @@ private FunctionStats[] sort() {
363370

364371
@Override
365372
public void serialize(final MemTreeBuilder builder) {
366-
builder.startElement(new QName(XML_ELEMENT_CALLS, XML_NAMESPACE, XML_PREFIX), null);
367-
if (isEnabled()) {
368-
final AttributesImpl attrs = new AttributesImpl();
369-
for (final QueryStats stats : queries.values()) {
370-
attrs.clear();
371-
attrs.addAttribute("", "source", "source", "CDATA", stats.source);
372-
attrs.addAttribute("", "elapsed", "elapsed", "CDATA", Double.toString(stats.executionTime / 1000.0));
373-
attrs.addAttribute("", "calls", "calls", "CDATA", Integer.toString(stats.callCount));
374-
builder.startElement(new QName("query", XML_NAMESPACE, XML_PREFIX), attrs);
375-
builder.endElement();
373+
final AttributesImpl attrs = new AttributesImpl();
374+
375+
builder.startElement(new QName(XML_ELEMENT_CALLS, XML_NAMESPACE, XML_PREFIX), attrs);
376+
// query statistics
377+
for (final QueryStats stats : queries.values()) {
378+
attrs.clear();
379+
attrs.addAttribute("", SOURCE, SOURCE, CDATA, stats.source);
380+
attrs.addAttribute("", ELAPSED, ELAPSED, CDATA, Double.toString(stats.executionTime / 1000.0));
381+
attrs.addAttribute("", CALLS, CALLS, CDATA, Integer.toString(stats.callCount));
382+
builder.startElement(new QName(QUERY, XML_NAMESPACE, XML_PREFIX), attrs);
383+
builder.endElement();
384+
}
385+
// function statistics
386+
for (final FunctionStats stats : functions.values()) {
387+
attrs.clear();
388+
attrs.addAttribute("", NAME, NAME, CDATA, stats.qname.getStringValue());
389+
attrs.addAttribute("", ELAPSED, ELAPSED, CDATA, Double.toString(stats.executionTime / 1000.0));
390+
attrs.addAttribute("", CALLS, CALLS, CDATA, Integer.toString(stats.callCount));
391+
if (stats.source != null) {
392+
attrs.addAttribute("", SOURCE, SOURCE, CDATA, stats.source);
376393
}
377-
for (final FunctionStats stats : functions.values()) {
378-
attrs.clear();
379-
attrs.addAttribute("", "name", "name", "CDATA", stats.qname.getStringValue());
380-
attrs.addAttribute("", "elapsed", "elapsed", "CDATA", Double.toString(stats.executionTime / 1000.0));
381-
attrs.addAttribute("", "calls", "calls", "CDATA", Integer.toString(stats.callCount));
382-
if (stats.source != null) {
383-
attrs.addAttribute("", "source", "source", "CDATA", stats.source);
384-
}
385-
builder.startElement(new QName("function", XML_NAMESPACE, XML_PREFIX), attrs);
386-
builder.endElement();
387-
}
388-
for (final IndexStats stats : indexStats.values()) {
389-
attrs.clear();
390-
attrs.addAttribute("", "type", "type", "CDATA", stats.indexType);
391-
attrs.addAttribute("", "source", "source", "CDATA", stats.source + " [" + stats.line + ":" +
392-
stats.column + "]");
393-
attrs.addAttribute("", "elapsed", "elapsed", "CDATA", Double.toString(stats.executionTime / 1000.0));
394-
attrs.addAttribute("", "calls", "calls", "CDATA", Integer.toString(stats.usageCount));
395-
attrs.addAttribute("", "optimization-level", "optimization", "CDATA", stats.indexOptimizationLevel.name());
396-
builder.startElement(new QName("index", XML_NAMESPACE, XML_PREFIX), attrs);
397-
builder.endElement();
398-
}
399-
for (final OptimizationStats stats : optimizations) {
400-
attrs.clear();
401-
attrs.addAttribute("", "type", "type", "CDATA", stats.type.toString());
402-
if (stats.source != null) {
403-
attrs.addAttribute("", "source", "source", "CDATA", stats.source + " [" + stats.line + ":" + stats.column + "]");
404-
}
405-
builder.startElement(new QName("optimization", XML_NAMESPACE, XML_PREFIX), attrs);
406-
builder.endElement();
394+
builder.startElement(new QName("function", XML_NAMESPACE, XML_PREFIX), attrs);
395+
builder.endElement();
396+
}
397+
// index statistics
398+
for (final IndexStats stats : indexStats.values()) {
399+
attrs.clear();
400+
attrs.addAttribute("", TYPE, TYPE, CDATA, stats.indexType);
401+
attrs.addAttribute("", SOURCE, SOURCE, CDATA, "%s [%s:%s]".formatted(stats.source, stats.line, stats.column));
402+
attrs.addAttribute("", ELAPSED, ELAPSED, CDATA, Double.toString(stats.executionTime / 1000.0));
403+
attrs.addAttribute("", CALLS, CALLS, CDATA, Integer.toString(stats.usageCount));
404+
attrs.addAttribute("", "optimization-level", "optimization", CDATA, stats.indexOptimizationLevel.name());
405+
builder.startElement(new QName("index", XML_NAMESPACE, XML_PREFIX), attrs);
406+
builder.endElement();
407+
}
408+
// optimization statistics
409+
for (final OptimizationStats stats : optimizations) {
410+
attrs.clear();
411+
attrs.addAttribute("", TYPE, TYPE, CDATA, stats.type.toString());
412+
if (stats.source != null) {
413+
attrs.addAttribute("", SOURCE, SOURCE, CDATA, "%s [%s:%s]".formatted(stats.source, stats.line, stats.column));
407414
}
415+
builder.startElement(new QName("optimization", XML_NAMESPACE, XML_PREFIX), attrs);
416+
builder.endElement();
408417
}
409418
builder.endElement();
410419
}

0 commit comments

Comments
 (0)