ATEST-627

This commit is contained in:
Fabian Märki
2016-12-08 15:51:55 +01:00
parent a77c5665be
commit 101af582d2
7 changed files with 149 additions and 22 deletions

View File

@ -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

View File

@ -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<QueryField> getQueryFieldValues() {
return Lists.newArrayList(QueryField.values());
return Arrays.stream(QueryField.values())
.filter(queryField -> queryField.isPublish())
.collect(Collectors.toList());
}
/**

View File

@ -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);
}
}
}

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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<ChannelEvent> {
private static final Random random = new Random(0);
@ -122,7 +124,9 @@ public abstract class AbstractStreamEventReader implements StreamEventReader<Cha
public Stream<ChannelEvent> 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<ChannelEvent> getEventStream(EventQuery eventQuery, Stream<? extends StreamEventQuery> queryProviders) {
@ -201,12 +205,14 @@ public abstract class AbstractStreamEventReader implements StreamEventReader<Cha
);
} else if (channelLower.contains("image")) {
int x = 4;
int y = 8;
int x = 80;
int y = 40;
int[] shape = new int[] {x, y};
long[] value = random.longs(x * y).toArray();
value[0] = i;
value[1] = i;
short[] value = new short[x * y];
IntStream.range(0, value.length)
.forEach(index -> value[index] = UShortByteValueConverter.convertVal(random.nextInt()));
value[0] = UShortByteValueConverter.convertVal((int) i);
value[1] = UShortByteValueConverter.convertVal((int) i);
return new ChannelEventImpl(
channel,
backend,

View File

@ -55,7 +55,9 @@ public class DummyArchiverApplianceReader implements DataReader {
public Stream<? extends StreamEvent> 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