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 9c1739b..7e49ccd 100644 --- a/src/main/java/ch/psi/daq/queryrest/config/QueryRestConfig.java +++ b/src/main/java/ch/psi/daq/queryrest/config/QueryRestConfig.java @@ -1,7 +1,6 @@ package ch.psi.daq.queryrest.config; -import java.util.Arrays; -import java.util.List; +import java.util.LinkedHashSet; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; @@ -15,7 +14,6 @@ import org.springframework.util.StringUtils; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Sets; import ch.psi.daq.common.statistic.StorelessStatistics; import ch.psi.daq.domain.cassandra.ChannelEvent; @@ -64,12 +62,14 @@ public class QueryRestConfig { } @Bean - private Set defaultResponseFields() { - List defaultFields = Arrays.asList( - StringUtils.commaDelimitedListToStringArray( - env.getProperty("queryrest.default.response.fields") - )); - Set defaultResponseFields = Sets.newHashSet(defaultFields.iterator()); + public Set defaultResponseFields() { + String[] responseFields = StringUtils.commaDelimitedListToStringArray(env.getProperty("queryrest.default.response.fields")); + // preserve order + LinkedHashSet defaultResponseFields = new LinkedHashSet<>(responseFields.length); + for (String field : defaultResponseFields) { + defaultResponseFields.add(field); + } + return 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 d0b4d47..e8f5ad1 100644 --- a/src/main/java/ch/psi/daq/queryrest/response/ResponseStreamWriter.java +++ b/src/main/java/ch/psi/daq/queryrest/response/ResponseStreamWriter.java @@ -1,11 +1,8 @@ -/** - * - */ package ch.psi.daq.queryrest.response; import java.io.IOException; +import java.util.LinkedHashSet; import java.util.Set; -import java.util.stream.Collectors; import java.util.stream.Stream; import javax.servlet.ServletResponse; @@ -24,6 +21,7 @@ import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import ch.psi.daq.domain.cassandra.DataEvent; import ch.psi.daq.query.model.AbstractQuery; +import ch.psi.daq.query.model.AggregationEnum; /** * Takes a Java 8 stream and writes it to the output stream provided by the {@link ServletResponse} @@ -41,6 +39,7 @@ public class ResponseStreamWriter { @Autowired private Set defaultResponseFields; + /** * Responding with the the contents of the stream by writing into the output stream of the * {@link ServletResponse}. @@ -52,17 +51,13 @@ public class ResponseStreamWriter { */ public void respond(Stream stream, AbstractQuery query, ServletResponse response) throws IOException { - Set includedFields = query.getFields(); - if (includedFields == null) { - includedFields = defaultResponseFields; - } + Set includedFields = query.getFieldsOrDefault(defaultResponseFields); if (query.getAggregations() != null) { - includedFields.addAll(query.getAggregations() - .stream() - .map(a -> { - return a.getType().toString(); - }).collect(Collectors.toSet())); + includedFields = new LinkedHashSet(includedFields); + for (AggregationEnum aggregation : query.getAggregations()) { + includedFields.add(aggregation.name()); + } } ObjectWriter writer = configureWriter(includedFields); respondInternal(stream, response, writer); 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 a043ba0..8a8ad74 100644 --- a/src/test/java/ch/psi/daq/test/queryrest/DaqWebMvcConfig.java +++ b/src/test/java/ch/psi/daq/test/queryrest/DaqWebMvcConfig.java @@ -1,12 +1,15 @@ package ch.psi.daq.test.queryrest; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; +import ch.psi.daq.query.processor.QueryProcessor; import ch.psi.daq.queryrest.config.QueryRestConfig; import ch.psi.daq.test.cassandra.config.LocalCassandraTestConfig; +import ch.psi.daq.test.queryrest.query.DummyQueryProcessor; @Configuration @Import(value = {LocalCassandraTestConfig.class, QueryRestConfig.class}) @@ -14,4 +17,9 @@ import ch.psi.daq.test.cassandra.config.LocalCassandraTestConfig; public class DaqWebMvcConfig extends WebMvcConfigurationSupport { // add test-specific beans and configurations here + + @Bean + public QueryProcessor queryProcessor() { + return new DummyQueryProcessor(); + } } \ No newline at end of file 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 af31866..c3c774d 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 @@ -16,15 +16,12 @@ import com.google.common.collect.Sets; import ch.psi.daq.cassandra.reader.Ordering; import ch.psi.daq.query.model.AggregationType; -import ch.psi.daq.query.model.BinningStrategyEnum; import ch.psi.daq.query.model.PulseRangeQuery; import ch.psi.daq.query.model.TimeRangeQuery; -import ch.psi.daq.query.range.QueryRange; -import ch.psi.daq.query.range.QueryRangeImpl; import ch.psi.daq.test.queryrest.AbstractDaqRestTest; /** - * Tests the {@link DaqController} implementation. + * Tests the {@link DaqController} implementation. */ public class DaqRestControllerTest extends AbstractDaqRestTest { @@ -32,85 +29,75 @@ public class DaqRestControllerTest extends AbstractDaqRestTest { @Test public void testPulseRangeQuery() throws Exception { - QueryRange range = new QueryRangeImpl(100l, 101l); PulseRangeQuery request = new PulseRangeQuery( - Ordering.desc, //ordering - Lists.newArrayList(), // channels, DummyQueryProcessor simply returns a fixed list - Sets.newLinkedHashSet(DEFAULT_PROPERTIES), // fields - BinningStrategyEnum.count, 100, - false, - AggregationType.index, - null, - range); - + 101 + ); + request.setOrdering(Ordering.desc); + request.setFields(Sets.newLinkedHashSet(DEFAULT_PROPERTIES)); + request.setNrOfBins(100); + request.setAggregateChannels(false); + request.setAggregationType(AggregationType.index); + String content = mapper.writeValueAsString(request); this.mockMvc - .perform(MockMvcRequestBuilders.post("/pulserange") - .contentType(MediaType.APPLICATION_JSON) - .content(content)) - - .andDo(MockMvcResultHandlers.print()) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$").isArray()) - .andExpect(MockMvcResultMatchers.jsonPath("$[0]").exists()) - .andExpect(MockMvcResultMatchers.jsonPath("$[0].pulseId").value(100)) - .andExpect(MockMvcResultMatchers.jsonPath("$[0].channel").value("testChannel1")); + .perform(MockMvcRequestBuilders.post("/pulserange") + .contentType(MediaType.APPLICATION_JSON) + .content(content)) + + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.jsonPath("$").isArray()) + .andExpect(MockMvcResultMatchers.jsonPath("$[0]").exists()) + .andExpect(MockMvcResultMatchers.jsonPath("$[0].pulseId").value(100)) + .andExpect(MockMvcResultMatchers.jsonPath("$[0].channel").value("testChannel1")); } - + @Test public void testTimeRangeQuery() throws Exception { - long startTime = new Date().getTime(); long endTime = startTime + TimeUnit.SECONDS.toMillis(1); - QueryRange range = new QueryRangeImpl(startTime, 0, endTime, 0); - TimeRangeQuery request = new TimeRangeQuery( - Ordering.asc, - Lists.newArrayList("test"), - Sets.newLinkedHashSet(DEFAULT_PROPERTIES), - BinningStrategyEnum.count, - 100, - false, - AggregationType.index, - null, // aggregations - range, - null, // startMillis - null); + TimeRangeQuery request = new TimeRangeQuery( + startTime, + endTime, + "test"); + request.setOrdering(Ordering.asc); + request.setFields(Sets.newLinkedHashSet(DEFAULT_PROPERTIES)); + request.setNrOfBins(100); + request.setAggregateChannels(false); + request.setAggregationType(AggregationType.index); + String content = mapper.writeValueAsString(request); System.out.println(content); - + this.mockMvc - .perform(MockMvcRequestBuilders.post("/timerange") - .contentType(MediaType.APPLICATION_JSON) - .content(content)) - + .perform(MockMvcRequestBuilders.post("/timerange") + .contentType(MediaType.APPLICATION_JSON) + .content(content)) + .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$").isArray()) .andExpect(MockMvcResultMatchers.jsonPath("$[0]").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$[0].channel").value("testChannel1")); } - + @Test public void testMapper() throws JsonProcessingException { long startTime = new Date().getTime(); long endTime = startTime + TimeUnit.SECONDS.toMillis(1); - QueryRange range = new QueryRangeImpl(startTime, 0, endTime, 0); TimeRangeQuery request = new TimeRangeQuery( - Ordering.asc, - Lists.newArrayList("test"), - Sets.newLinkedHashSet(DEFAULT_PROPERTIES), - BinningStrategyEnum.count, - 100, - false, - AggregationType.index, - null, // aggregations - range, - null, // startMillis - null); - + startTime, + endTime, + "test"); + request.setOrdering(Ordering.asc); + request.setFields(Sets.newLinkedHashSet(DEFAULT_PROPERTIES)); + request.setNrOfBins(100); + request.setAggregateChannels(false); + request.setAggregationType(AggregationType.index); + String content = mapper.writeValueAsString(request); System.out.println(content); }