ATEST-594
This commit is contained in:
+97
-94
@@ -26,9 +26,7 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
|
||||
import ch.psi.daq.common.ordering.Ordering;
|
||||
import ch.psi.daq.common.time.TimeUtils;
|
||||
import ch.psi.daq.domain.config.DomainConfig;
|
||||
import ch.psi.daq.domain.query.DAQQueries;
|
||||
import ch.psi.daq.domain.query.DAQQuery;
|
||||
import ch.psi.daq.domain.query.DAQQueryElement;
|
||||
import ch.psi.daq.domain.query.operation.Aggregation;
|
||||
import ch.psi.daq.domain.query.operation.AggregationDescriptor;
|
||||
import ch.psi.daq.domain.query.operation.AggregationType;
|
||||
@@ -323,98 +321,103 @@ public class QueryRestControllerCsvTest extends AbstractDaqRestTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPulseRangeQueries() throws Exception {
|
||||
List<String> channels = Arrays.asList(TEST_CHANNEL_01, TEST_CHANNEL_02);
|
||||
String testChannel3 = "testChannel3";
|
||||
DAQQueries request = new DAQQueries(
|
||||
new DAQQueryElement(
|
||||
new RequestRangePulseId(
|
||||
0,
|
||||
1),
|
||||
channels),
|
||||
new DAQQueryElement(
|
||||
new RequestRangePulseId(
|
||||
0,
|
||||
1),
|
||||
testChannel3));
|
||||
request.setResponse(new CSVHTTPResponse());
|
||||
channels = Arrays.asList(TEST_CHANNEL_01, TEST_CHANNEL_02, testChannel3);
|
||||
|
||||
LinkedHashSet<QueryField> queryFields = new LinkedHashSet<>();
|
||||
queryFields.add(QueryField.channel);
|
||||
queryFields.add(QueryField.pulseId);
|
||||
queryFields.add(QueryField.iocSeconds);
|
||||
queryFields.add(QueryField.iocMillis);
|
||||
queryFields.add(QueryField.globalSeconds);
|
||||
queryFields.add(QueryField.globalMillis);
|
||||
queryFields.add(QueryField.shape);
|
||||
queryFields.add(QueryField.eventCount);
|
||||
queryFields.add(QueryField.value);
|
||||
for (DAQQueryElement element : request) {
|
||||
element.setFields(queryFields);
|
||||
}
|
||||
|
||||
String content = mapper.writeValueAsString(request);
|
||||
System.out.println(content);
|
||||
|
||||
MvcResult result = this.mockMvc
|
||||
.perform(MockMvcRequestBuilders
|
||||
.post(DomainConfig.PATH_QUERIES)
|
||||
.contentType(MediaType.APPLICATION_JSON)
|
||||
.content(content))
|
||||
.andDo(MockMvcResultHandlers.print())
|
||||
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||
.andReturn();
|
||||
|
||||
String response = result.getResponse().getContentAsString();
|
||||
System.out.println("Response: " + response);
|
||||
|
||||
CSVFormat csvFormat = CSVFormat.EXCEL.withDelimiter(CSVResponseStreamWriter.DELIMITER_CVS);
|
||||
StringReader reader = new StringReader(response);
|
||||
CSVParser csvParser = new CSVParser(reader, csvFormat);
|
||||
|
||||
try {
|
||||
long pulse = 0;
|
||||
int totalRows = 2;
|
||||
|
||||
List<CSVRecord> records = csvParser.getRecords();
|
||||
assertEquals(totalRows + 1, records.size());
|
||||
// remove header
|
||||
CSVRecord record = records.remove(0);
|
||||
assertEquals(queryFields.size() * channels.size(), record.size());
|
||||
int column = 0;
|
||||
for (String channel : channels) {
|
||||
for (QueryField queryField : queryFields) {
|
||||
assertEquals(channel + CSVResponseStreamWriter.DELIMITER_CHANNELNAME_FIELDNAME + queryField.name(),
|
||||
record.get(column++));
|
||||
}
|
||||
}
|
||||
|
||||
for (int row = 0; row < totalRows; ++row) {
|
||||
record = records.get(row);
|
||||
|
||||
assertEquals(queryFields.size() * channels.size(), record.size());
|
||||
|
||||
column = 0;
|
||||
for (String channel : channels) {
|
||||
assertEquals(channel, record.get(column++));
|
||||
assertEquals("" + pulse, record.get(column++));
|
||||
assertEquals(TimeUtils.getTimeStr(TestTimeUtils.getTimeFromPulseId(pulse)), record.get(column++));
|
||||
assertEquals("" + TimeUtils.getMillis(TestTimeUtils.getTimeFromPulseId(pulse)), record.get(column++));
|
||||
assertEquals(TimeUtils.getTimeStr(TestTimeUtils.getTimeFromPulseId(pulse)), record.get(column++));
|
||||
assertEquals("" + TimeUtils.getMillis(TestTimeUtils.getTimeFromPulseId(pulse)), record.get(column++));
|
||||
assertEquals("[1]", record.get(column++));
|
||||
assertEquals("1", record.get(column++));
|
||||
assertEquals("" + pulse, record.get(column++));
|
||||
}
|
||||
++pulse;
|
||||
}
|
||||
} finally {
|
||||
reader.close();
|
||||
csvParser.close();
|
||||
}
|
||||
}
|
||||
// @Test
|
||||
// public void testPulseRangeQueries() throws Exception {
|
||||
// List<String> channels = Arrays.asList(TEST_CHANNEL_01, TEST_CHANNEL_02);
|
||||
// String testChannel3 = "testChannel3";
|
||||
// DAQQueries request = new DAQQueries(
|
||||
// new DAQQueryElement(
|
||||
// new RequestRangePulseId(
|
||||
// 0,
|
||||
// 1),
|
||||
// channels),
|
||||
// new DAQQueryElement(
|
||||
// new RequestRangePulseId(
|
||||
// 0,
|
||||
// 1),
|
||||
// testChannel3));
|
||||
// request.setResponse(new CSVHTTPResponse());
|
||||
// channels = Arrays.asList(TEST_CHANNEL_01, TEST_CHANNEL_02, testChannel3);
|
||||
//
|
||||
// LinkedHashSet<QueryField> queryFields = new LinkedHashSet<>();
|
||||
// queryFields.add(QueryField.channel);
|
||||
// queryFields.add(QueryField.pulseId);
|
||||
// queryFields.add(QueryField.iocSeconds);
|
||||
// queryFields.add(QueryField.iocMillis);
|
||||
// queryFields.add(QueryField.globalSeconds);
|
||||
// queryFields.add(QueryField.globalMillis);
|
||||
// queryFields.add(QueryField.shape);
|
||||
// queryFields.add(QueryField.eventCount);
|
||||
// queryFields.add(QueryField.value);
|
||||
// for (DAQQueryElement element : request) {
|
||||
// element.setFields(queryFields);
|
||||
// }
|
||||
//
|
||||
// String content = mapper.writeValueAsString(request);
|
||||
// System.out.println(content);
|
||||
//
|
||||
// MvcResult result = this.mockMvc
|
||||
// .perform(MockMvcRequestBuilders
|
||||
// .post(DomainConfig.PATH_QUERIES)
|
||||
// .contentType(MediaType.APPLICATION_JSON)
|
||||
// .content(content))
|
||||
// .andDo(MockMvcResultHandlers.print())
|
||||
// .andExpect(MockMvcResultMatchers.status().isOk())
|
||||
// .andReturn();
|
||||
//
|
||||
// String response = result.getResponse().getContentAsString();
|
||||
// System.out.println("Response: " + response);
|
||||
//
|
||||
// CSVFormat csvFormat = CSVFormat.EXCEL.withDelimiter(CSVResponseStreamWriter.DELIMITER_CVS);
|
||||
// StringReader reader = new StringReader(response);
|
||||
// CSVParser csvParser = new CSVParser(reader, csvFormat);
|
||||
//
|
||||
// try {
|
||||
// long pulse = 0;
|
||||
// int totalRows = 2;
|
||||
//
|
||||
// List<CSVRecord> records = csvParser.getRecords();
|
||||
// assertEquals(totalRows + 1, records.size());
|
||||
// // remove header
|
||||
// CSVRecord record = records.remove(0);
|
||||
// assertEquals(queryFields.size() * channels.size(), record.size());
|
||||
// int column = 0;
|
||||
// for (String channel : channels) {
|
||||
// for (QueryField queryField : queryFields) {
|
||||
// assertEquals(channel + CSVResponseStreamWriter.DELIMITER_CHANNELNAME_FIELDNAME +
|
||||
// queryField.name(),
|
||||
// record.get(column++));
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// for (int row = 0; row < totalRows; ++row) {
|
||||
// record = records.get(row);
|
||||
//
|
||||
// assertEquals(queryFields.size() * channels.size(), record.size());
|
||||
//
|
||||
// column = 0;
|
||||
// for (String channel : channels) {
|
||||
// assertEquals(channel, record.get(column++));
|
||||
// assertEquals("" + pulse, record.get(column++));
|
||||
// assertEquals(TimeUtils.getTimeStr(TestTimeUtils.getTimeFromPulseId(pulse)),
|
||||
// record.get(column++));
|
||||
// assertEquals("" + TimeUtils.getMillis(TestTimeUtils.getTimeFromPulseId(pulse)),
|
||||
// record.get(column++));
|
||||
// assertEquals(TimeUtils.getTimeStr(TestTimeUtils.getTimeFromPulseId(pulse)),
|
||||
// record.get(column++));
|
||||
// assertEquals("" + TimeUtils.getMillis(TestTimeUtils.getTimeFromPulseId(pulse)),
|
||||
// record.get(column++));
|
||||
// assertEquals("[1]", record.get(column++));
|
||||
// assertEquals("1", record.get(column++));
|
||||
// assertEquals("" + pulse, record.get(column++));
|
||||
// }
|
||||
// ++pulse;
|
||||
// }
|
||||
// } finally {
|
||||
// reader.close();
|
||||
// csvParser.close();
|
||||
// }
|
||||
// }
|
||||
|
||||
@Test
|
||||
public void testPulseRangeQueryWaveform() throws Exception {
|
||||
|
||||
+2139
File diff suppressed because it is too large
Load Diff
+10
-9
@@ -373,15 +373,16 @@ public class QueryRestControllerJsonTest 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(10))
|
||||
// .andExpect(MockMvcResultMatchers.jsonPath("$[1].data[0].globalMillis").value(100))
|
||||
// .andExpect(MockMvcResultMatchers.jsonPath("$[1].data[1].pulseId").value(11))
|
||||
// .andExpect(MockMvcResultMatchers.jsonPath("$[1].data[1].globalMillis").value(110))
|
||||
;
|
||||
.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(
|
||||
TestTimeUtils.getTimeStr(1, 10000000)));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -84,8 +84,8 @@ public abstract class AbstractStreamEventReader implements StreamEventReader<Cha
|
||||
"Float64Waveform",
|
||||
"StringScalar");
|
||||
}
|
||||
|
||||
protected void init(Backend backend){
|
||||
|
||||
protected void init(Backend backend) {
|
||||
this.backend = backend;
|
||||
this.dataGen = testBackendAccess.getTestDataGen(backend);
|
||||
this.testChannelName = backend.getKey() + "_TestChannel_";
|
||||
@@ -120,7 +120,8 @@ public abstract class AbstractStreamEventReader implements StreamEventReader<Cha
|
||||
|
||||
@Override
|
||||
public Stream<ChannelEvent> getEventStream(TimeRangeQuery query) {
|
||||
return getDummyEventStream(query.getChannel(), query.getStartMillis() / 10, query.getEndMillis() / 10)
|
||||
return getDummyEventStream(query.getChannel(), getBackend(), query.getStartMillis() / 10,
|
||||
query.getEndMillis() / 10)
|
||||
.filter(query.getFilterOrDefault(EventQuery.NO_OP_FILTER));
|
||||
}
|
||||
|
||||
@@ -136,39 +137,50 @@ public abstract class AbstractStreamEventReader implements StreamEventReader<Cha
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Stream<ChannelEvent> getDummyEventStream(String channelParam, long startIndex, long endIndex,
|
||||
public static Stream<ChannelEvent> getDummyEventStream(String channelParam, Backend backend, long startIndex,
|
||||
long endIndex,
|
||||
String... columns) {
|
||||
String channelLower = channelParam.toLowerCase();
|
||||
String channel =
|
||||
(columns == null || columns.length == 0 || ArrayUtils.contains(columns, FieldNames.FIELD_CHANNEL)) ? channelParam
|
||||
: null;
|
||||
|
||||
Stream<Long> rangeStream;
|
||||
LongStream millisRangeStream = null;
|
||||
|
||||
if (channelParam.contains("[") && channelParam.contains("]")) {
|
||||
rangeStream =
|
||||
millisRangeStream =
|
||||
Arrays.stream(
|
||||
channelParam.substring(
|
||||
channelParam.indexOf("[") + 1,
|
||||
channelParam.indexOf("]"))
|
||||
.split(",")
|
||||
)
|
||||
.map(str -> str.trim())
|
||||
.map(Long::parseLong);
|
||||
.mapToLong(str -> Long.parseLong(str.trim()) * 10);
|
||||
} else if (channelParam.contains("{") && channelParam.contains("}")) {
|
||||
millisRangeStream =
|
||||
Arrays.stream(
|
||||
channelParam.substring(
|
||||
channelParam.indexOf("{") + 1,
|
||||
channelParam.indexOf("}"))
|
||||
.split(",")
|
||||
)
|
||||
.mapToLong(str -> Long.parseLong(str));
|
||||
} else {
|
||||
rangeStream = LongStream.rangeClosed(startIndex, endIndex).boxed();
|
||||
millisRangeStream = LongStream.rangeClosed(startIndex * 10, endIndex * 10)
|
||||
.filter(val -> val % 10 == 0);
|
||||
}
|
||||
|
||||
Stream<ChannelEvent> eventStream =
|
||||
rangeStream.map(
|
||||
i -> {
|
||||
millisRangeStream.mapToObj(
|
||||
millis -> {
|
||||
long i = millis / 10;
|
||||
BigDecimal iocTime =
|
||||
(columns == null || columns.length == 0 || ArrayUtils.contains(columns,
|
||||
FieldNames.FIELD_IOC_TIME)) ? TimeUtils.getTimeFromMillis(i * 10, 0)
|
||||
FieldNames.FIELD_IOC_TIME)) ? TimeUtils.getTimeFromMillis(millis, 0)
|
||||
: PropertiesUtils.DEFAULT_VALUE_DECIMAL;
|
||||
BigDecimal globalTime =
|
||||
(columns == null || columns.length == 0 || ArrayUtils.contains(columns,
|
||||
FieldNames.FIELD_GLOBAL_TIME)) ? TimeUtils.getTimeFromMillis(i * 10, 0)
|
||||
FieldNames.FIELD_GLOBAL_TIME)) ? TimeUtils.getTimeFromMillis(millis, 0)
|
||||
: PropertiesUtils.DEFAULT_VALUE_DECIMAL;
|
||||
long pulseId =
|
||||
(columns == null || columns.length == 0 || ArrayUtils.contains(columns,
|
||||
@@ -180,6 +192,7 @@ public abstract class AbstractStreamEventReader implements StreamEventReader<Cha
|
||||
value[1] = i;
|
||||
return new ChannelEventImpl(
|
||||
channel,
|
||||
backend,
|
||||
iocTime,
|
||||
pulseId,
|
||||
globalTime,
|
||||
@@ -196,6 +209,7 @@ public abstract class AbstractStreamEventReader implements StreamEventReader<Cha
|
||||
value[1] = i;
|
||||
return new ChannelEventImpl(
|
||||
channel,
|
||||
backend,
|
||||
iocTime,
|
||||
pulseId,
|
||||
globalTime,
|
||||
@@ -206,6 +220,7 @@ public abstract class AbstractStreamEventReader implements StreamEventReader<Cha
|
||||
} else {
|
||||
return new ChannelEventImpl(
|
||||
channel,
|
||||
backend,
|
||||
iocTime,
|
||||
pulseId,
|
||||
globalTime,
|
||||
@@ -219,7 +234,7 @@ public abstract class AbstractStreamEventReader implements StreamEventReader<Cha
|
||||
}
|
||||
|
||||
private List<? extends DataEvent> getDummyEvents(String channel, long startIndex, long endIndex, String... columns) {
|
||||
return getDummyEventStream(channel, startIndex, endIndex, columns).collect(Collectors.toList());
|
||||
return getDummyEventStream(channel, getBackend(), startIndex, endIndex, columns).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -293,6 +308,7 @@ public abstract class AbstractStreamEventReader implements StreamEventReader<Cha
|
||||
i -> i * 10,
|
||||
i -> 0,
|
||||
i -> i,
|
||||
getBackend(),
|
||||
query.getChannel()).stream();
|
||||
}
|
||||
|
||||
@@ -390,16 +406,18 @@ public abstract class AbstractStreamEventReader implements StreamEventReader<Cha
|
||||
|
||||
@Override
|
||||
public void truncateCache() {}
|
||||
|
||||
|
||||
@Override
|
||||
public CompletableFuture<MetaPulseId> getStartMetaPulseIdAsync(PulseIdRangeQuery query) {
|
||||
return CompletableFuture.completedFuture(new MetaPulseIdImpl(query.getChannel(), query.getStartPulseId(),
|
||||
return CompletableFuture.completedFuture(new MetaPulseIdImpl(query.getChannel(), getBackend(), query
|
||||
.getStartPulseId(),
|
||||
TimeUtils.getTimeFromMillis(query.getStartPulseId() * 10, 0)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<MetaPulseId> getEndMetaPulseIdAsync(PulseIdRangeQuery query) {
|
||||
return CompletableFuture.completedFuture(new MetaPulseIdImpl(query.getChannel(), query.getEndPulseId(),
|
||||
return CompletableFuture.completedFuture(new MetaPulseIdImpl(query.getChannel(), getBackend(), query
|
||||
.getEndPulseId(),
|
||||
TimeUtils.getTimeFromMillis(query.getEndPulseId() * 10, 0)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ public class DummyArchiverApplianceReader implements DataReader {
|
||||
|
||||
@Override
|
||||
public Stream<? extends StreamEvent> getEventStream(TimeRangeQuery query) {
|
||||
return DummyCassandraReader.getDummyEventStream(query.getChannel(), query.getStartMillis() / 10,
|
||||
return DummyCassandraReader.getDummyEventStream(query.getChannel(), getBackend(), query.getStartMillis() / 10,
|
||||
query.getEndMillis() / 10)
|
||||
.filter(query.getFilterOrDefault(EventQuery.NO_OP_FILTER));
|
||||
}
|
||||
|
||||
@@ -64,13 +64,13 @@ public class DummyCassandraReader extends AbstractStreamEventReader implements C
|
||||
|
||||
@Override
|
||||
public CompletableFuture<MetaPulseId> getStartMetaPulseIdAsync(PulseIdRangeQuery query) {
|
||||
return CompletableFuture.completedFuture(new MetaPulseIdImpl(query.getChannel(), query.getStartPulseId(),
|
||||
return CompletableFuture.completedFuture(new MetaPulseIdImpl(query.getChannel(), getBackend(), query.getStartPulseId(),
|
||||
TimeUtils.getTimeFromMillis(query.getStartPulseId() * 10, 0)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<MetaPulseId> getEndMetaPulseIdAsync(PulseIdRangeQuery query) {
|
||||
return CompletableFuture.completedFuture(new MetaPulseIdImpl(query.getChannel(), query.getEndPulseId(),
|
||||
return CompletableFuture.completedFuture(new MetaPulseIdImpl(query.getChannel(), getBackend(), query.getEndPulseId(),
|
||||
TimeUtils.getTimeFromMillis(query.getEndPulseId() * 10, 0)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
import ch.psi.daq.domain.query.DAQQuery;
|
||||
import ch.psi.daq.domain.query.operation.Compression;
|
||||
import ch.psi.daq.domain.query.operation.Response;
|
||||
import ch.psi.daq.domain.query.response.Response;
|
||||
import ch.psi.daq.domain.request.range.RequestRangePulseId;
|
||||
import ch.psi.daq.queryrest.response.csv.CSVHTTPResponse;
|
||||
import ch.psi.daq.queryrest.response.json.JSONHTTPResponse;
|
||||
|
||||
Reference in New Issue
Block a user