Skip to content

Commit

Permalink
Always display sub plan link in QueryMetricsDetailListResponse, fix l…
Browse files Browse the repository at this point in the history
…ogic for sub plans in QueryMetricCombiner, include some metric fields in html of BaseQueryMetricSubplanResponse, make BaseQueryMetricSubplanResponse abstract
  • Loading branch information
billoley committed Sep 25, 2023
1 parent 8ca296d commit 15c0ee3
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 119 deletions.
Original file line number Diff line number Diff line change
@@ -1,36 +1,34 @@
package datawave.microservice.querymetric;

import datawave.webservice.HtmlProvider;
import datawave.webservice.query.QueryImpl;
import datawave.webservice.result.BaseResponse;
import org.apache.commons.text.StringEscapeUtils;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlTransient;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class BaseQueryMetricSubplanResponse<T extends BaseQueryMetric> extends BaseResponse implements HtmlProvider {
public abstract class BaseQueryMetricSubplanResponse<T extends BaseQueryMetric> extends BaseResponse implements HtmlProvider {

private static final long serialVersionUID = 1L;
private static final String TITLE = "Query Subplans";
private static final String TITLE = "Query Metrics / Subplans";
private static final String EMPTY = "";
@XmlElementWrapper(name = "querySubplans")
@XmlElement(name = "querySubplan")
protected List<T> result = null;
@XmlElement
protected int numResults = 0;
@XmlTransient
private boolean administratorMode = false;
@XmlTransient
private boolean isGeoQuery = false;

private static String numToString(long number) {
return (number == -1 || number == 0) ? "" : Long.toString(number);
}

public List<T> getResult() {
return result;
}
Expand All @@ -48,14 +46,6 @@ public void setNumResults(int numResults) {
this.numResults = numResults;
}

public boolean isAdministratorMode() {
return administratorMode;
}

public void setAdministratorMode(boolean administratorMode) {
this.administratorMode = administratorMode;
}

public boolean isGeoQuery() {
return isGeoQuery;
}
Expand Down Expand Up @@ -95,48 +85,76 @@ public String getHeadContent() {

@Override
public String getMainContent() {
StringBuilder builder = new StringBuilder(), pageTimesBuilder = new StringBuilder();

builder.append("<table>\n");
builder.append("<tr>");
builder.append("<th>Subplan(s)</th>");

pageTimesBuilder.append("<table>\n");

builder.append(pageTimesBuilder);

TreeMap<Date,T> metricMap = new TreeMap<>(Collections.reverseOrder());

for (T metric : this.getResult()) {
metricMap.put(metric.getCreateDate(), metric);
}

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HHmmss");
StringBuilder builder = new StringBuilder();
int x = 0;
for (T metric : metricMap.values()) {
builder.append("<table>\n");
builder.append("<tr>");
builder.append("<th>Visibility</th>");
builder.append("<th>Query Date</th>");
builder.append("<th>User</th>");
builder.append("<th>UserDN</th>");
builder.append("<th>Query ID</th>");
builder.append("<th>Query Logic</th>");
builder.append("<th id=\"query-header\">Query</th>");
builder.append("<th>Query Plan</th>");
builder.append("</tr>");

Set<QueryImpl.Parameter> parameters = metric.getParameters();
// highlight alternating rows
if (x % 2 == 0) {
builder.append("<tr class=\"highlight\">\n");
} else {
builder.append("<tr>\n");
}
x++;

builder.append("<td>").append(metric.getColumnVisibility()).append("</td>");
builder.append("<td style=\"min-width:125px !important;\">").append(sdf.format(metric.getCreateDate())).append("</td>");
builder.append("<td>").append(metric.getUser()).append("</td>");
String userDN = metric.getUserDN();
builder.append("<td style=\"min-width:500px !important;\">").append(userDN == null ? "" : userDN).append("</td>");
builder.append("<td>").append(metric.getQueryId()).append("</td>");
builder.append("<td>").append(metric.getQueryLogic()).append("</td>");
builder.append(isJexlQuery(parameters) ? "<td style=\"white-space: pre; word-wrap: break-word;\">" : "<td style=\"word-wrap: break-word;\">")
.append(StringEscapeUtils.escapeHtml4(metric.getQuery())).append("</td>");
builder.append("<td style=\"white-space: pre; word-wrap: break-word;\">").append(StringEscapeUtils.escapeHtml4(metric.getPlan())).append("</td>");
builder.append("</tr>\n");
builder.append("</table>\n");

builder.append("<br/>");
builder.append("<table>\n");
builder.append("<tr><th>Range</th><th>Sub Plan</th></tr>");
if (metric.getSubPlans() != null && !metric.getSubPlans().isEmpty()) {
for (Map.Entry<String,String> subplan : metric.getSubPlans().entrySet()) {
builder.append("<td>").append(subplan.getKey()).append(subplan.getValue()).append("</td>");
int s = 0;
for (Map.Entry<String, String> e : metric.getSubPlans().entrySet()) {
// highlight alternating rows
if (s % 2 == 0) {
builder.append("<tr class=\"highlight\">");
} else {
builder.append("<tr>");
}
builder.append("<td>").append(e.getKey()).append("</td>");
builder.append("<td>").append(e.getValue()).append("</td>");
builder.append("\n</tr>\n");
s++;
}
} else {
builder.append("<td>NONE<td/>");
builder.append("<tr><td colspan=\"2\">NONE<td/></tr>");
}

builder.append("\n</tr>\n");
builder.append("</td></tr>\n");
builder.append("</table>\n");
builder.append("\n<br/><br/>\n");
}

builder.append("</table>\n<br/>\n");
pageTimesBuilder.append("</table>\n");

builder.append(pageTimesBuilder);

return builder.toString();
}

private static boolean isJexlQuery(Set<QueryImpl.Parameter> params) {
return params.stream().anyMatch(p -> p.getParameterName().equals("query.syntax") && p.getParameterValue().equals("JEXL"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,8 @@ public String getMainContent() {
builder.append(isJexlQuery(parameters) ? "<td style=\"white-space: pre; word-wrap: break-word;\">" : "<td style=\"word-wrap: break-word;\">")
.append(StringEscapeUtils.escapeHtml4(metric.getQuery())).append("</td>");
builder.append("<td style=\"white-space: pre; word-wrap: break-word;\">").append(StringEscapeUtils.escapeHtml4(metric.getPlan())).append("</td>");
if (metric.getSubPlans() != null && !metric.getSubPlans().isEmpty()) {
builder.append("<td style=\"white-space: pre; word-wrap: break-word;\">").append("<a href=\"/DataWave/Query/Metrics/id/")
.append(metric.getQueryId()).append("/subplans\"> Subplan(s)</a>").append("</td>");
} else {
builder.append("<td/>");
}
builder.append("<td style=\"white-space: pre; word-wrap: break-word;\">").append("<a href=\"/DataWave/Query/Metrics/id/")
.append(metric.getQueryId()).append("/subplans\">Subplan(s)</a>").append("</td>");
builder.append("<td>").append(metric.getQueryName()).append("</td>");

String beginDate = metric.getBeginDate() == null ? "" : sdf.format(metric.getBeginDate());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,83 +1,15 @@
package datawave.microservice.querymetric;

import datawave.webservice.query.QueryImpl.Parameter;
import datawave.microservice.querymetric.BaseQueryMetric.PageMetric;
import datawave.microservice.querymetric.BaseQueryMetric.Prediction;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;

import javax.xml.bind.annotation.XmlAccessOrder;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorOrder;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TreeMap;
import java.util.Map;
import java.util.stream.Collectors;

@XmlRootElement(name = "QueryMetricListResponse")
@XmlAccessorType(XmlAccessType.NONE)
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class QueryMetricsSubplanResponse extends QueryMetricListResponse {
public class QueryMetricsSubplanResponse extends BaseQueryMetricSubplanResponse<QueryMetric> {

private static final long serialVersionUID = 1L;

private static final String TITLE = "Query Subplans";

@Override
public String getTitle() {
return TITLE;
}

@Override
public String getMainContent() {
StringBuilder builder = new StringBuilder(), pageTimesBuilder = new StringBuilder();

builder.append("<table>\n");
builder.append("<tr>");
builder.append("<th>Subplan(s)</th>");

pageTimesBuilder.append("<table>\n");

builder.append(pageTimesBuilder);

TreeMap<Date,QueryMetric> metricMap = new TreeMap<>(Collections.reverseOrder());

for (QueryMetric metric : this.getResult()) {
metricMap.put(metric.getCreateDate(), metric);
}

int x = 0;
for (QueryMetric metric : metricMap.values()) {
// highlight alternating rows
if (x % 2 == 0) {
builder.append("<tr class=\"highlight\">\n");
} else {
builder.append("<tr>\n");
}
x++;
if (metric.getSubPlans() != null && !metric.getSubPlans().isEmpty()) {
for (Map.Entry<String,String> subplan : metric.getSubPlans().entrySet()) {
builder.append("<td>").append(subplan.getKey()).append(subplan.getValue()).append("</td>");
}
} else {
builder.append("<td>NONE<td/>");
}

builder.append("\n</tr>\n");
}

builder.append("</table>\n<br/>\n");
pageTimesBuilder.append("</table>\n");

builder.append(pageTimesBuilder);

return builder.toString();
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package datawave.microservice.querymetric.factory;

import datawave.microservice.querymetric.BaseQueryMetricSubplanResponse;
import datawave.microservice.querymetric.QueryMetricsSubplanResponse;

public class QueryMetricSubplanResponseFactory implements BaseQueryMetricSubplanResponseFactory {

@Override
public BaseQueryMetricSubplanResponse createSubplanResponse() {
return new BaseQueryMetricSubplanResponse();
return new QueryMetricsSubplanResponse();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -188,11 +188,13 @@ public T combineMetrics(T updatedQueryMetric, T cachedQueryMetric, QueryMetricTy
combinedMetric.setPlan(updatedQueryMetric.getPlan());
}
// only update once
if (combinedMetric.getSubPlans() == null && updatedQueryMetric.getSubPlans() != null) {
if ((combinedMetric.getSubPlans() == null || combinedMetric.getSubPlans().isEmpty()) && updatedQueryMetric.getSubPlans() != null
&& !updatedQueryMetric.getSubPlans().isEmpty()) {
combinedMetric.setSubPlans(updatedQueryMetric.getSubPlans());
}
// only update once
if (combinedMetric.getPredictions() == null && updatedQueryMetric.getPredictions() != null) {
if ((combinedMetric.getPredictions() == null || combinedMetric.getPredictions().isEmpty()) && updatedQueryMetric.getPredictions() != null
&& !updatedQueryMetric.getPredictions().isEmpty()) {
combinedMetric.setPredictions(updatedQueryMetric.getPredictions());
}
// use the max numUpdates
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,11 @@
import datawave.microservice.querymetric.QueryMetricFactory;
import datawave.microservice.querymetric.QueryMetricType;
import datawave.microservice.querymetric.QueryMetricsSummaryResponse;
import datawave.microservice.querymetric.QueryMetricsSubplanResponse;
import datawave.microservice.querymetric.config.QueryMetricHandlerProperties;
import datawave.microservice.querymetric.factory.QueryMetricQueryLogicFactory;
import datawave.query.QueryParameters;
import datawave.query.iterator.QueryOptions;
import datawave.query.language.parser.jexl.LuceneToJexlQueryParser;
import datawave.query.map.SimpleQueryGeometryHandler;
import datawave.security.authorization.DatawavePrincipal;
import datawave.security.authorization.DatawaveUser;
import datawave.security.authorization.SubjectIssuerDNPair;
Expand Down

0 comments on commit 15c0ee3

Please sign in to comment.