ATEST-371

This commit is contained in:
Fabian Märki
2016-06-08 15:43:40 +02:00
parent b27b43a6f6
commit 24daa85e0b
8 changed files with 264 additions and 85 deletions
@@ -14,6 +14,7 @@ import ch.psi.daq.domain.query.DAQQuery;
import ch.psi.daq.domain.query.DAQQueryElement;
import ch.psi.daq.domain.query.operation.Aggregation;
import ch.psi.daq.domain.query.operation.QueryField;
import ch.psi.daq.domain.request.Request;
import ch.psi.daq.queryrest.config.QueryRestConfig;
public class QueryValidator implements Validator {
@@ -38,23 +39,46 @@ public class QueryValidator implements Validator {
@Override
public void validate(Object target, Errors errors) {
if (target instanceof DAQQuery) {
this.checkElement((DAQQuery) target);
}else if(target instanceof DAQQueries){
this.checkElement((DAQQuery) target, errors);
} else if (target instanceof DAQQueries) {
DAQQueries queries = (DAQQueries) target;
for (DAQQueryElement daqQueryElement : queries) {
this.checkElement(daqQueryElement);
this.checkElement(daqQueryElement, errors);
}
}
}
private void checkElement(DAQQueryElement query) {
private void checkElement(DAQQueryElement query, Errors errors) {
// set default values (if not set)
if (query.getFields() == null || query.getFields().isEmpty()) {
query.setFields(new LinkedHashSet<>(defaultResponseFields));
}
if (query.getAggregations() == null || query.getAggregations().isEmpty()) {
query.setAggregations(new ArrayList<>(defaultResponseAggregations));
if (query.getAggregation() != null) {
// check if only one binning element is defined
long msPerBin = query.getAggregation().getMsPerBin();
long pulsesPerBin = query.getAggregation().getPulsesPerBin();
int nrOfBins = query.getAggregation().getNrOfBins();
if ((msPerBin != Request.NOT_SET && (pulsesPerBin != Request.NOT_SET || nrOfBins != Request.NOT_SET))
|| (pulsesPerBin != Request.NOT_SET && (msPerBin != Request.NOT_SET || nrOfBins != Request.NOT_SET))
|| (nrOfBins != Request.NOT_SET && (msPerBin != Request.NOT_SET || pulsesPerBin != Request.NOT_SET))) {
errors.reject("msPerBin", "Only one binning element must be defined.");
errors.reject("pulsesPerBin", "Only one binning element must be defined.");
errors.reject("nrOfBins", "Only one binning element must be defined.");
}
if (query.getRange().isPulseIdRangeDefined() && msPerBin != Request.NOT_SET) {
errors.reject("msPerBin", "Pulse range queries only support pulse based binning.");
}
if (query.getRange().isTimeRangeDefined() && pulsesPerBin != Request.NOT_SET) {
errors.reject("pulsesPerBin", "Time range queries only support time based binning.");
}
// set default values (if not set)
if (query.getAggregation().getAggregations() == null || query.getAggregation().getAggregations().isEmpty()) {
query.getAggregation().setAggregations(new ArrayList<>(defaultResponseAggregations));
}
}
}
}
@@ -67,11 +67,11 @@ public class CSVHTTPResponse extends AbstractHTTPResponse {
protected void validateQueries(DAQQueries queries) {
for (DAQQueryElement query : queries) {
if (!(query.getAggregationType() == null || AggregationType.value.equals(query.getAggregationType()))) {
if (!(query.getAggregation() == null || AggregationType.value.equals(query.getAggregation().getAggregationType()))) {
// We allow only no aggregation or value aggregation as
// extrema: nested structure and not clear how to map it to one line
// index: value is an array of Statistics whose size is not clear at initialization time
String message = "CSV export does not support '" + query.getAggregationType() + "'";
String message = "CSV export does not support '" + query.getAggregation().getAggregationType() + "'";
LOGGER.warn(message);
throw new IllegalArgumentException(message);
}
@@ -151,7 +151,7 @@ public class CSVResponseStreamWriter implements ResponseStreamWriter {
private void setupChannelColumns(DAQQueryElement daqQuery, BackendQuery backendQuery, ChannelName channelName,
Collection<String> header, Collection<Pair<ChannelName, Function<DataEvent, String>>> accessors) {
Set<QueryField> queryFields = daqQuery.getFields();
List<Aggregation> aggregations = daqQuery.getAggregations();
List<Aggregation> aggregations = daqQuery.getAggregation() != null ? daqQuery.getAggregation().getAggregations() : null;
QueryAnalyzer queryAnalyzer = queryAnalizerFactory.apply(backendQuery);
@@ -165,7 +165,7 @@ public class CSVResponseStreamWriter implements ResponseStreamWriter {
}
if (aggregations != null && queryAnalyzer.isAggregationEnabled()) {
for (Aggregation aggregation : daqQuery.getAggregations()) {
for (Aggregation aggregation : aggregations) {
header.add(channelName.getName() + DELIMITER_CHANNELNAME_FIELDNAME + QueryField.value.name()
+ DELIMITER_CHANNELNAME_FIELDNAME + aggregation.name());
accessors.add(Pair.of(channelName, new AggregationStringifyer(aggregation.getAccessor(), EMPTY_VALUE)));
@@ -105,7 +105,7 @@ public class JSONResponseStreamWriter implements ResponseStreamWriter {
protected Set<String> getFields(DAQQueryElement query) {
Set<QueryField> queryFields = query.getFields();
List<Aggregation> aggregations = query.getAggregations();
List<Aggregation> aggregations = query.getAggregation() != null ? query.getAggregation().getAggregations() : null;
Set<String> includedFields =
new LinkedHashSet<String>(queryFields.size() + (aggregations != null ? aggregations.size() : 0));
@@ -114,7 +114,7 @@ public class JSONResponseStreamWriter implements ResponseStreamWriter {
includedFields.add(field.name());
}
if (aggregations != null) {
for (Aggregation aggregation : query.getAggregations()) {
for (Aggregation aggregation : aggregations) {
includedFields.add(aggregation.name());
}
}