Merge pull request #11 in ST/ch.psi.daq.queryrest from ATEST-128 to master

# By Fabian Märki
# Via Fabian Märki
* commit '6ce4d1553bbd36e55f8c2f2071377d5a208bf0ec':
  ATEST-128
  ATEST-128 First working impl.
  ATEST-128
This commit is contained in:
Märki Fabian
2015-08-07 10:30:55 +02:00
8 changed files with 30 additions and 49 deletions

View File

@ -1,5 +1,5 @@
#
#Fri Jul 24 14:48:03 CEST 2015
#Thu Aug 06 09:29:10 CEST 2015
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve

View File

@ -132,9 +132,9 @@ Queries are defined using JSON.
There exist following fields:
- **channels**: Array of channel names to be queried.
- **startPulseId** and **endPulseId** : A pulse-id range query with start and end pulse-id.
- **startMillis/[startNanos]** and **endMillis/[endNanos]**: A time range query with start and end milliseconds since January 1, 1970 (the UNIX/JAVA epoch) and optionally supplemented with the nanosecond offset to the milliseconds (range [0..999999]).
- **startDate/[startNanos]** and **endDate/[endNanos]**: A time range query with start and end date (format yyyy/MM/dd HH:mm:ss.SSS or dd.MM.yyyy HH:mm:ss.SSS) and optionally supplemented with the nanosecond offset to the milliseconds (range [0..999999]).
- **startPulseId** and **endPulseId** : A pulse-id range request with start and end pulse-id.
- **startMillis/[startNanos]** and **endMillis/[endNanos]**: A time range request with start and end milliseconds since January 1, 1970 (the UNIX/JAVA epoch) and optionally supplemented with the nanosecond offset to the milliseconds (range [0..999999]).
- **startDate/[startNanos]** and **endDate/[endNanos]**: A time range request with start and end date (format yyyy/MM/dd HH:mm:ss.SSS or dd.MM.yyyy HH:mm:ss.SSS) and optionally supplemented with the nanosecond offset to the milliseconds (range [0..999999]).
- **ordering**: The ordering of the data (see [here](https://github.psi.ch/projects/ST/repos/ch.psi.daq.common/browse/src/main/java/ch/psi/daq/common/ordering/Ordering.java) for possible values).
- **fields**: The requested fields (see [here](https://github.psi.ch/projects/ST/repos/ch.psi.daq.query/browse/src/main/java/ch/psi/daq/query/model/QueryField.java) for possible values).
- **nrOfBins**: Activates data binning. Specifies the number of bins the pulse/time range should be devided into.

View File

@ -34,11 +34,11 @@ import ch.psi.daq.domain.DataEvent;
import ch.psi.daq.query.analyzer.QueryAnalyzer;
import ch.psi.daq.query.analyzer.QueryAnalyzerImpl;
import ch.psi.daq.query.config.QueryConfig;
import ch.psi.daq.query.model.AbstractQuery;
import ch.psi.daq.query.model.Aggregation;
import ch.psi.daq.query.model.Query;
import ch.psi.daq.query.model.QueryField;
import ch.psi.daq.queryrest.controller.QueryValidator;
import ch.psi.daq.query.model.impl.AbstractQuery;
import ch.psi.daq.queryrest.controller.validator.QueryValidator;
import ch.psi.daq.queryrest.model.PropertyFilterMixin;
import ch.psi.daq.queryrest.response.JsonStreamSerializer;
import ch.psi.daq.queryrest.response.ResponseStreamWriter;

View File

@ -26,11 +26,11 @@ import org.springframework.web.bind.annotation.RestController;
import ch.psi.daq.cassandra.util.test.CassandraDataGen;
import ch.psi.daq.domain.DataEvent;
import ch.psi.daq.query.analyzer.QueryAnalyzer;
import ch.psi.daq.query.model.AbstractQuery;
import ch.psi.daq.query.model.Aggregation;
import ch.psi.daq.query.model.DBMode;
import ch.psi.daq.query.model.Query;
import ch.psi.daq.query.model.QueryField;
import ch.psi.daq.query.model.impl.AbstractQuery;
import ch.psi.daq.query.processor.QueryProcessor;
import ch.psi.daq.queryrest.config.QueryRestConfig;
import ch.psi.daq.queryrest.model.ChannelsRequest;

View File

@ -1,7 +1,4 @@
/**
*
*/
package ch.psi.daq.queryrest.controller;
package ch.psi.daq.queryrest.controller.validator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
@ -12,18 +9,15 @@ import javax.annotation.Resource;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import ch.psi.daq.query.model.AbstractQuery;
import ch.psi.daq.query.model.AbstractTimeRangeQuery;
import ch.psi.daq.query.model.Aggregation;
import ch.psi.daq.query.model.DBMode;
import ch.psi.daq.query.model.QueryField;
import ch.psi.daq.query.range.QueryRange;
import ch.psi.daq.query.model.impl.AbstractQuery;
import ch.psi.daq.cassandra.request.Request;
import ch.psi.daq.cassandra.request.range.RequestRangeTime;
import ch.psi.daq.cassandra.request.validate.RequestValidator;
import ch.psi.daq.queryrest.config.QueryRestConfig;
/**
* @author zellweger_c
*
*/
public class QueryValidator implements Validator {
@Resource(name = QueryRestConfig.BEAN_NAME_DEFAULT_RESPONSE_FIELDS)
@ -31,6 +25,8 @@ public class QueryValidator implements Validator {
@Resource(name = QueryRestConfig.BEAN_NAME_DEFAULT_RESPONSE_AGGREGATIONS)
private Set<Aggregation> defaultResponseAggregations;
private RequestValidator requestValidator = new RequestValidator();
/**
* {@inheritDoc}
@ -47,32 +43,17 @@ public class QueryValidator implements Validator {
public void validate(Object target, Errors errors) {
AbstractQuery query = (AbstractQuery) target;
QueryRange queryRange = query.getQueryRange();
if (!queryRange.isPulseIdRangeDefined() && !queryRange.isTimeRangeDefined()) {
errors.reject("", "Either time or pulseId range must be defined by the query!");
}
if (queryRange.isPulseIdRangeDefined()) {
if (queryRange.getStartPulseId() > queryRange.getEndPulseId()) {
errors.rejectValue("pulseId", "pulseId", "Start pulse-id must be smaller or equals end pulse-id!");
}
} else if (queryRange.isTimeRangeDefined()) {
if (queryRange.getStartMillis() > queryRange.getEndMillis()) {
errors.rejectValue("millis", "millis", "Start millis must be smaller or equals to end millis!");
} else if (queryRange.getStartMillis() == queryRange.getEndMillis()
&& queryRange.getStartNanos() > queryRange.getEndNanos()) {
errors.rejectValue("nanos", "nanos", "Start nanos must be smaller or equals to end nanos!");
}
}
Request request = query.getRequest();
requestValidator.validate(request, errors);
if (DBMode.archiverappliance.equals(query.getDBMode())) {
if (!(query instanceof AbstractTimeRangeQuery)) {
if (!(request.getRequestRange() instanceof RequestRangeTime)) {
errors.reject("", "ArchiverAppliance supports time range queries only!");
}
}
// set default values (if not set)
if (query.getFields() == null || query.getFields().isEmpty()) {
query.setFields(new LinkedHashSet<>(defaultResponseFields));
}

View File

@ -21,9 +21,9 @@ import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import ch.psi.daq.query.model.AbstractQuery;
import ch.psi.daq.query.model.Aggregation;
import ch.psi.daq.query.model.QueryField;
import ch.psi.daq.query.model.impl.AbstractQuery;
/**
* Takes a Java 8 stream and writes it to the output stream provided by the {@link ServletResponse}

View File

@ -12,8 +12,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupp
import ch.psi.daq.domain.reader.DataReader;
import ch.psi.daq.query.processor.QueryProcessor;
import ch.psi.daq.query.processor.QueryProcessorLocal;
import ch.psi.daq.test.cassandra.admin.CassandraAdmin;
import ch.psi.daq.test.cassandra.admin.CassandraAdminImpl;
import ch.psi.daq.test.cassandra.admin.CassandraTestAdmin;
import ch.psi.daq.test.cassandra.admin.CassandraTestAdminImpl;
import ch.psi.daq.test.query.config.LocalQueryTestConfig;
import ch.psi.daq.test.queryrest.query.DummyDataReader;
@ -42,7 +42,7 @@ public class DaqWebMvcConfig extends WebMvcConfigurationSupport {
}
@Bean
public CassandraAdmin cassandraAdmin() {
return new CassandraAdminImpl();
public CassandraTestAdmin cassandraTestAdmin() {
return new CassandraTestAdminImpl();
}
}

View File

@ -13,11 +13,11 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import ch.psi.daq.cassandra.util.test.CassandraDataGen;
import ch.psi.daq.common.ordering.Ordering;
import ch.psi.daq.query.model.AggregationType;
import ch.psi.daq.query.model.PulseRangeQuery;
import ch.psi.daq.query.model.TimeRangeQuery;
import ch.psi.daq.query.model.TimeRangeQueryDate;
import ch.psi.daq.query.model.impl.PulseRangeQuery;
import ch.psi.daq.query.model.impl.TimeRangeQuery;
import ch.psi.daq.query.model.impl.TimeRangeQueryDate;
import ch.psi.daq.queryrest.controller.QueryRestController;
import ch.psi.daq.test.cassandra.admin.CassandraAdmin;
import ch.psi.daq.test.cassandra.admin.CassandraTestAdmin;
import ch.psi.daq.test.queryrest.AbstractDaqRestTest;
/**
@ -26,7 +26,7 @@ import ch.psi.daq.test.queryrest.AbstractDaqRestTest;
public class DaqRestControllerTest extends AbstractDaqRestTest {
@Resource
private CassandraAdmin cassandraAdmin;
private CassandraTestAdmin cassandraTestAdmin;
@Resource
private CassandraDataGen dataGen;
@ -39,7 +39,7 @@ public class DaqRestControllerTest extends AbstractDaqRestTest {
@Before
public void setUp() throws Exception {
if (!initialized) {
cassandraAdmin.truncateAll();
cassandraTestAdmin.truncateAll();
dataGen.writeData(DATA_REPLICATION, 100, 2, TEST_CHANNEL_NAMES);
}