From 47d921e1a4afb4d013a78932d6b20436f474666a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=A4rki?= Date: Fri, 31 Jul 2015 12:50:29 +0200 Subject: [PATCH 1/3] ATEST-128 --- .../test/queryrest/controller/DaqRestControllerTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/ch/psi/daq/test/queryrest/controller/DaqRestControllerTest.java b/src/test/java/ch/psi/daq/test/queryrest/controller/DaqRestControllerTest.java index ac061eb..4878a63 100644 --- a/src/test/java/ch/psi/daq/test/queryrest/controller/DaqRestControllerTest.java +++ b/src/test/java/ch/psi/daq/test/queryrest/controller/DaqRestControllerTest.java @@ -17,7 +17,7 @@ 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.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); } From 2dc1b4bfb6eda43be9283907c79e9b418d78195a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=A4rki?= Date: Wed, 5 Aug 2015 14:06:06 +0200 Subject: [PATCH 2/3] ATEST-128 First working impl. --- .../java/ch/psi/daq/test/queryrest/DaqWebMvcConfig.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/ch/psi/daq/test/queryrest/DaqWebMvcConfig.java b/src/test/java/ch/psi/daq/test/queryrest/DaqWebMvcConfig.java index 00c82ef..9bc39dd 100644 --- a/src/test/java/ch/psi/daq/test/queryrest/DaqWebMvcConfig.java +++ b/src/test/java/ch/psi/daq/test/queryrest/DaqWebMvcConfig.java @@ -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(); } } \ No newline at end of file From c5b8c55970f24f7ae7e5a9e6a9f54b063289325b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=A4rki?= Date: Fri, 7 Aug 2015 08:38:37 +0200 Subject: [PATCH 3/3] ATEST-128 --- .settings/org.eclipse.jdt.core.prefs | 2 +- Readme.md | 6 +-- .../daq/queryrest/config/QueryRestConfig.java | 4 +- .../controller/QueryRestController.java | 2 +- .../{ => validator}/QueryValidator.java | 43 ++++++------------- .../response/ResponseStreamWriter.java | 2 +- .../controller/DaqRestControllerTest.java | 6 +-- 7 files changed, 23 insertions(+), 42 deletions(-) rename src/main/java/ch/psi/daq/queryrest/controller/{ => validator}/QueryValidator.java (54%) diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index dc55a29..f2a0ff4 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -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 diff --git a/Readme.md b/Readme.md index 543e57d..34627fd 100644 --- a/Readme.md +++ b/Readme.md @@ -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. diff --git a/src/main/java/ch/psi/daq/queryrest/config/QueryRestConfig.java b/src/main/java/ch/psi/daq/queryrest/config/QueryRestConfig.java index 67e8622..e6bcb27 100644 --- a/src/main/java/ch/psi/daq/queryrest/config/QueryRestConfig.java +++ b/src/main/java/ch/psi/daq/queryrest/config/QueryRestConfig.java @@ -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; diff --git a/src/main/java/ch/psi/daq/queryrest/controller/QueryRestController.java b/src/main/java/ch/psi/daq/queryrest/controller/QueryRestController.java index 4dfc83a..ebc5ee5 100644 --- a/src/main/java/ch/psi/daq/queryrest/controller/QueryRestController.java +++ b/src/main/java/ch/psi/daq/queryrest/controller/QueryRestController.java @@ -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; diff --git a/src/main/java/ch/psi/daq/queryrest/controller/QueryValidator.java b/src/main/java/ch/psi/daq/queryrest/controller/validator/QueryValidator.java similarity index 54% rename from src/main/java/ch/psi/daq/queryrest/controller/QueryValidator.java rename to src/main/java/ch/psi/daq/queryrest/controller/validator/QueryValidator.java index b7d4422..bdefba0 100644 --- a/src/main/java/ch/psi/daq/queryrest/controller/QueryValidator.java +++ b/src/main/java/ch/psi/daq/queryrest/controller/validator/QueryValidator.java @@ -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 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)); } diff --git a/src/main/java/ch/psi/daq/queryrest/response/ResponseStreamWriter.java b/src/main/java/ch/psi/daq/queryrest/response/ResponseStreamWriter.java index 8918b7b..973ea78 100644 --- a/src/main/java/ch/psi/daq/queryrest/response/ResponseStreamWriter.java +++ b/src/main/java/ch/psi/daq/queryrest/response/ResponseStreamWriter.java @@ -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} diff --git a/src/test/java/ch/psi/daq/test/queryrest/controller/DaqRestControllerTest.java b/src/test/java/ch/psi/daq/test/queryrest/controller/DaqRestControllerTest.java index 5ec47e6..eeb644e 100644 --- a/src/test/java/ch/psi/daq/test/queryrest/controller/DaqRestControllerTest.java +++ b/src/test/java/ch/psi/daq/test/queryrest/controller/DaqRestControllerTest.java @@ -13,9 +13,9 @@ 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.CassandraTestAdmin; import ch.psi.daq.test.queryrest.AbstractDaqRestTest;