From 101af582d22b337d39bfa6f7094c9bfc166e659a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=A4rki?= Date: Thu, 8 Dec 2016 15:51:55 +0100 Subject: [PATCH] ATEST-627 --- .settings/org.eclipse.jdt.core.prefs | 2 +- .../controller/QueryRestController.java | 6 +- .../controller/validator/QueryValidator.java | 17 +++-- .../JsonQueryRestControllerTableTest.java | 55 +++++++++++++++ .../JsonQueryRestControllerTest.java | 69 ++++++++++++++++--- .../query/AbstractStreamEventReader.java | 18 +++-- .../query/DummyArchiverApplianceReader.java | 4 +- 7 files changed, 149 insertions(+), 22 deletions(-) diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index e886503..410566d 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,5 @@ # -#Wed Nov 23 17:35:46 CET 2016 +#Fri Dec 02 15:37:07 CET 2016 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/src/main/java/ch/psi/daq/queryrest/controller/QueryRestController.java b/src/main/java/ch/psi/daq/queryrest/controller/QueryRestController.java index c053c06..4ef0278 100644 --- a/src/main/java/ch/psi/daq/queryrest/controller/QueryRestController.java +++ b/src/main/java/ch/psi/daq/queryrest/controller/QueryRestController.java @@ -1,7 +1,9 @@ package ch.psi.daq.queryrest.controller; +import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; import javax.annotation.PostConstruct; import javax.annotation.Resource; @@ -236,7 +238,9 @@ public class QueryRestController { */ @RequestMapping(value = "queryfields", method = {RequestMethod.GET}, produces = {MediaType.APPLICATION_JSON_VALUE}) public @ResponseBody List getQueryFieldValues() { - return Lists.newArrayList(QueryField.values()); + return Arrays.stream(QueryField.values()) + .filter(queryField -> queryField.isPublish()) + .collect(Collectors.toList()); } /** diff --git a/src/main/java/ch/psi/daq/queryrest/controller/validator/QueryValidator.java b/src/main/java/ch/psi/daq/queryrest/controller/validator/QueryValidator.java index b2b8cdd..50ba2cd 100644 --- a/src/main/java/ch/psi/daq/queryrest/controller/validator/QueryValidator.java +++ b/src/main/java/ch/psi/daq/queryrest/controller/validator/QueryValidator.java @@ -79,11 +79,18 @@ public class QueryValidator implements Validator { if (query.getAggregation().getAggregations() == null || query.getAggregation().getAggregations().isEmpty()) { query.getAggregation().setAggregations(new ArrayList<>(defaultResponseAggregations)); } - - if (!query.getFields().contains(QueryField.value)) { - // without this field, json will not contain Stats (as - query.addField(QueryField.value); - } + + // without adding this field, user need to explicitly ask for value field when querying + // aggregations. + // if (!query.getFields().contains(QueryField.value)) { + // // without this field, json will not contain Stats + // query.addField(QueryField.value); + // } + } + + if (query.getValueTransformation() != null) { + // without this field, json will not contain transformedValue + query.addField(QueryField.transformedValue); } } } diff --git a/src/test/java/ch/psi/daq/test/queryrest/controller/JsonQueryRestControllerTableTest.java b/src/test/java/ch/psi/daq/test/queryrest/controller/JsonQueryRestControllerTableTest.java index 3e1e97e..0bd966b 100644 --- a/src/test/java/ch/psi/daq/test/queryrest/controller/JsonQueryRestControllerTableTest.java +++ b/src/test/java/ch/psi/daq/test/queryrest/controller/JsonQueryRestControllerTableTest.java @@ -1,5 +1,9 @@ package ch.psi.daq.test.queryrest.controller; +import static org.junit.Assert.assertTrue; + +import java.awt.Color; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashSet; @@ -13,10 +17,14 @@ import javax.annotation.Resource; import org.junit.After; import org.junit.Test; import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import com.jayway.jsonpath.Configuration; +import com.jayway.jsonpath.JsonPath; + import ch.psi.daq.common.ordering.Ordering; import ch.psi.daq.common.time.TimeUtils; import ch.psi.daq.domain.backend.Backend; @@ -32,6 +40,11 @@ import ch.psi.daq.domain.query.operation.AggregationDescriptor; import ch.psi.daq.domain.query.operation.AggregationType; import ch.psi.daq.domain.query.operation.Extrema; import ch.psi.daq.domain.query.operation.QueryField; +import ch.psi.daq.domain.query.transform.ValueTransformationSequence; +import ch.psi.daq.domain.query.transform.image.ImageEncodingValueTransformation; +import ch.psi.daq.domain.query.transform.image.ImageDownScaleValueTransformation; +import ch.psi.daq.domain.query.transform.image.ImageFormat; +import ch.psi.daq.domain.query.transform.image.encoding.Base64ImageEncoder; import ch.psi.daq.domain.request.range.RequestRangeDate; import ch.psi.daq.domain.request.range.RequestRangePulseId; import ch.psi.daq.domain.request.range.RequestRangeTime; @@ -2128,4 +2141,46 @@ public class JsonQueryRestControllerTableTest extends AbstractDaqRestTest { .andExpect(MockMvcResultMatchers.jsonPath("$.data[7]").doesNotExist()); } + + @Test + public void testValueTransformation_01() throws Exception { + String channelName = "TestImage"; + DAQQuery request = new DAQQuery( + new RequestRangePulseId( + 100, + 101), + channelName); + request.addField(QueryField.pulseId); + request.addField(QueryField.globalSeconds); + request.addField(QueryField.globalMillis); + request.addField(QueryField.iocSeconds); + request.addField(QueryField.iocMillis); + request.setMapping(new Mapping()); + request.setValueTransformation( + new ValueTransformationSequence( + new ImageDownScaleValueTransformation(8, Color.BLUE, Color.RED), + new ImageEncodingValueTransformation( + ImageFormat.PNG, + new Base64ImageEncoder(StandardCharsets.UTF_8, true, false)))); + + String content = mapper.writeValueAsString(request); + System.out.println(content); + + MvcResult result = this.mockMvc + .perform(MockMvcRequestBuilders + .post(DomainConfig.PATH_QUERY) + .contentType(MediaType.APPLICATION_JSON) + .content(content)) + .andReturn(); + String response = result.getResponse().getContentAsString(); + System.out.println("Response: " + response); + + String imageScheme = "data:image/png;charset=UTF-8;base64,"; + assertTrue(response.contains(imageScheme)); + Object document = Configuration.defaultConfiguration().jsonProvider().parse(response); + String image = JsonPath.read(document, "$.data[0][0].transformedValue"); + assertTrue(image.startsWith(imageScheme)); + image = JsonPath.read(document, "$.data[1][0].transformedValue"); + assertTrue(image.startsWith(imageScheme)); + } } diff --git a/src/test/java/ch/psi/daq/test/queryrest/controller/JsonQueryRestControllerTest.java b/src/test/java/ch/psi/daq/test/queryrest/controller/JsonQueryRestControllerTest.java index dab1ca2..f7cbed9 100644 --- a/src/test/java/ch/psi/daq/test/queryrest/controller/JsonQueryRestControllerTest.java +++ b/src/test/java/ch/psi/daq/test/queryrest/controller/JsonQueryRestControllerTest.java @@ -1,5 +1,9 @@ package ch.psi.daq.test.queryrest.controller; +import static org.junit.Assert.assertTrue; + +import java.awt.Color; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import javax.annotation.Resource; @@ -13,6 +17,9 @@ import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import com.jayway.jsonpath.Configuration; +import com.jayway.jsonpath.JsonPath; + import ch.psi.daq.common.ordering.Ordering; import ch.psi.daq.common.time.TimeUtils; import ch.psi.daq.domain.backend.Backend; @@ -28,6 +35,11 @@ import ch.psi.daq.domain.query.operation.AggregationType; import ch.psi.daq.domain.query.operation.Compression; import ch.psi.daq.domain.query.operation.Extrema; import ch.psi.daq.domain.query.operation.QueryField; +import ch.psi.daq.domain.query.transform.ValueTransformationSequence; +import ch.psi.daq.domain.query.transform.image.ImageEncodingValueTransformation; +import ch.psi.daq.domain.query.transform.image.ImageDownScaleValueTransformation; +import ch.psi.daq.domain.query.transform.image.ImageFormat; +import ch.psi.daq.domain.query.transform.image.encoding.Base64ImageEncoder; import ch.psi.daq.domain.request.range.RequestRangeDate; import ch.psi.daq.domain.request.range.RequestRangePulseId; import ch.psi.daq.domain.request.range.RequestRangeTime; @@ -373,15 +385,15 @@ public class JsonQueryRestControllerTest extends AbstractDaqRestTest { .andExpect(MockMvcResultMatchers.jsonPath("$[0].data[1].pulseId").value(101)) .andExpect(MockMvcResultMatchers.jsonPath("$[0].data[1].globalSeconds").value( TestTimeUtils.getTimeStr(1, 10000000))) - .andExpect(MockMvcResultMatchers.jsonPath("$[1]").exists()) - .andExpect(MockMvcResultMatchers.jsonPath("$[1].channel").isMap()) - .andExpect(MockMvcResultMatchers.jsonPath("$[1].channel.name").value(TEST_CHANNEL_02)) - .andExpect(MockMvcResultMatchers.jsonPath("$[1].data").isArray()) - .andExpect(MockMvcResultMatchers.jsonPath("$[1].data[0].pulseId").value(100)) - .andExpect(MockMvcResultMatchers.jsonPath("$[1].data[0].globalSeconds").value( + .andExpect(MockMvcResultMatchers.jsonPath("$[1]").exists()) + .andExpect(MockMvcResultMatchers.jsonPath("$[1].channel").isMap()) + .andExpect(MockMvcResultMatchers.jsonPath("$[1].channel.name").value(TEST_CHANNEL_02)) + .andExpect(MockMvcResultMatchers.jsonPath("$[1].data").isArray()) + .andExpect(MockMvcResultMatchers.jsonPath("$[1].data[0].pulseId").value(100)) + .andExpect(MockMvcResultMatchers.jsonPath("$[1].data[0].globalSeconds").value( TestTimeUtils.getTimeStr(1, 0))) - .andExpect(MockMvcResultMatchers.jsonPath("$[1].data[1].pulseId").value(101)) - .andExpect(MockMvcResultMatchers.jsonPath("$[1].data[1].globalSeconds").value( + .andExpect(MockMvcResultMatchers.jsonPath("$[1].data[1].pulseId").value(101)) + .andExpect(MockMvcResultMatchers.jsonPath("$[1].data[1].globalSeconds").value( TestTimeUtils.getTimeStr(1, 10000000))); } @@ -1120,4 +1132,45 @@ public class JsonQueryRestControllerTest extends AbstractDaqRestTest { .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().isBadRequest()); } + + @Test + public void testValueTransformation_01() throws Exception { + String channelName = "TestImage"; + DAQQuery request = new DAQQuery( + new RequestRangePulseId( + 100, + 101), + channelName); + request.addField(QueryField.pulseId); + request.addField(QueryField.globalSeconds); + request.addField(QueryField.globalMillis); + request.addField(QueryField.iocSeconds); + request.addField(QueryField.iocMillis); + request.setValueTransformation( + new ValueTransformationSequence( + new ImageDownScaleValueTransformation(8, Color.BLUE, Color.RED), + new ImageEncodingValueTransformation( + ImageFormat.PNG, + new Base64ImageEncoder(StandardCharsets.UTF_8, true, false)))); + + String content = mapper.writeValueAsString(request); + System.out.println(content); + + MvcResult result = this.mockMvc + .perform(MockMvcRequestBuilders + .post(DomainConfig.PATH_QUERY) + .contentType(MediaType.APPLICATION_JSON) + .content(content)) + .andReturn(); + String response = result.getResponse().getContentAsString(); + System.out.println("Response: " + response); + + String imageScheme = "data:image/png;charset=UTF-8;base64,"; + assertTrue(response.contains(imageScheme)); + Object document = Configuration.defaultConfiguration().jsonProvider().parse(response); + String image = JsonPath.read(document, "$[0].data[0].transformedValue"); + assertTrue(image.startsWith(imageScheme)); + image = JsonPath.read(document, "$[0].data[1].transformedValue"); + assertTrue(image.startsWith(imageScheme)); + } } diff --git a/src/test/java/ch/psi/daq/test/queryrest/query/AbstractStreamEventReader.java b/src/test/java/ch/psi/daq/test/queryrest/query/AbstractStreamEventReader.java index 8249ea1..57b6ec0 100644 --- a/src/test/java/ch/psi/daq/test/queryrest/query/AbstractStreamEventReader.java +++ b/src/test/java/ch/psi/daq/test/queryrest/query/AbstractStreamEventReader.java @@ -10,6 +10,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicLong; import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.LongStream; import java.util.stream.Stream; @@ -43,6 +44,7 @@ import ch.psi.daq.domain.reader.StreamEventReader; import ch.psi.daq.domain.test.backend.TestBackendAccess; import ch.psi.daq.domain.test.gen.TestDataGen; import ch.psi.daq.domain.utils.PropertiesUtils; +import ch.psi.data.stream.converters.impl.UShortByteValueConverter; public abstract class AbstractStreamEventReader implements StreamEventReader { private static final Random random = new Random(0); @@ -122,7 +124,9 @@ public abstract class AbstractStreamEventReader implements StreamEventReader getEventStream(TimeRangeQuery query) { return getDummyEventStream(query.getChannel(), getBackend(), query.getStartMillis() / 10, query.getEndMillis() / 10) - .filter(query.getFilterOrDefault(EventQuery.NO_OP_FILTER)); + .filter(query.getFilterOrDefault(EventQuery.NO_OP_FILTER)) + // misuse value modification + .peek(query.getValueTransformation()); } public Stream getEventStream(EventQuery eventQuery, Stream queryProviders) { @@ -201,12 +205,14 @@ public abstract class AbstractStreamEventReader implements StreamEventReader value[index] = UShortByteValueConverter.convertVal(random.nextInt())); + value[0] = UShortByteValueConverter.convertVal((int) i); + value[1] = UShortByteValueConverter.convertVal((int) i); return new ChannelEventImpl( channel, backend, diff --git a/src/test/java/ch/psi/daq/test/queryrest/query/DummyArchiverApplianceReader.java b/src/test/java/ch/psi/daq/test/queryrest/query/DummyArchiverApplianceReader.java index d1eaa90..c5bc357 100644 --- a/src/test/java/ch/psi/daq/test/queryrest/query/DummyArchiverApplianceReader.java +++ b/src/test/java/ch/psi/daq/test/queryrest/query/DummyArchiverApplianceReader.java @@ -55,7 +55,9 @@ public class DummyArchiverApplianceReader implements DataReader { public Stream getEventStream(TimeRangeQuery query) { return DummyCassandraReader.getDummyEventStream(query.getChannel(), getBackend(), query.getStartMillis() / 10, query.getEndMillis() / 10) - .filter(query.getFilterOrDefault(EventQuery.NO_OP_FILTER)); + .filter(query.getFilterOrDefault(EventQuery.NO_OP_FILTER)) + // misuse value modification + .peek(query.getValueTransformation()); } @Override