ATEST-627
This commit is contained in:
@ -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
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user