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 a26fbc3..67e8622 100644 --- a/src/main/java/ch/psi/daq/queryrest/config/QueryRestConfig.java +++ b/src/main/java/ch/psi/daq/queryrest/config/QueryRestConfig.java @@ -30,9 +30,9 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import ch.psi.daq.cassandra.util.test.CassandraDataGen; import ch.psi.daq.common.json.deserialize.AttributeBasedDeserializer; import ch.psi.daq.common.statistic.StorelessStatistics; -import ch.psi.daq.domain.cassandra.DataEvent; -import ch.psi.daq.query.analyzer.CassandraQueryAnalyzer; +import ch.psi.daq.domain.DataEvent; import ch.psi.daq.query.analyzer.QueryAnalyzer; +import ch.psi.daq.query.analyzer.QueryAnalyzerImpl; import ch.psi.daq.query.config.QueryConfig; import ch.psi.daq.query.model.AbstractQuery; import ch.psi.daq.query.model.Aggregation; @@ -119,7 +119,7 @@ public class QueryRestConfig extends WebMvcConfigurerAdapter { @Bean public Function queryAnalizerFactory() { - return (query) -> new CassandraQueryAnalyzer(query); + return (query) -> new QueryAnalyzerImpl(query); } @Bean 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 9f84211..3cde28d 100644 --- a/src/main/java/ch/psi/daq/queryrest/controller/QueryRestController.java +++ b/src/main/java/ch/psi/daq/queryrest/controller/QueryRestController.java @@ -24,14 +24,16 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import ch.psi.daq.cassandra.util.test.CassandraDataGen; -import ch.psi.daq.domain.cassandra.DataEvent; +import ch.psi.daq.domain.DataEvent; import ch.psi.daq.query.analyzer.QueryAnalyzer; import ch.psi.daq.query.model.AbstractQuery; import ch.psi.daq.query.model.Aggregation; +import ch.psi.daq.query.model.DBMode; import ch.psi.daq.query.model.Query; import ch.psi.daq.query.model.QueryField; import ch.psi.daq.query.processor.QueryProcessor; import ch.psi.daq.queryrest.config.QueryRestConfig; +import ch.psi.daq.queryrest.model.ChannelsRequest; import ch.psi.daq.queryrest.response.ResponseStreamWriter; @RestController @@ -40,7 +42,6 @@ public class QueryRestController { private static final Logger LOGGER = LoggerFactory.getLogger(QueryRestController.class); public static final String CHANNELS = "channels"; - public static final String CHANNELS_REGEX = CHANNELS + "/{regex}"; public static final String QUERY = "query"; @Resource @@ -50,14 +51,17 @@ public class QueryRestController { private ResponseStreamWriter responseStreamWriter; @Resource - private QueryProcessor queryProcessor; + private QueryProcessor cassandraQueryProcessor; + + @Resource + private QueryProcessor archiverApplianceQueryProcessor; @Resource private Function queryAnalizerFactory; @Resource(name = QueryRestConfig.BEAN_NAME_DEFAULT_RESPONSE_FIELDS) private Set defaultResponseFields; - + @Resource(name = QueryRestConfig.BEAN_NAME_DEFAULT_RESPONSE_AGGREGATIONS) private Set defaultResponseAggregations; @@ -72,30 +76,23 @@ public class QueryRestController { @RequestMapping( value = CHANNELS, - consumes = {MediaType.APPLICATION_JSON_VALUE}, - method = RequestMethod.GET) - public @ResponseBody Collection getChannels() throws Throwable { + method = {RequestMethod.GET, RequestMethod.POST}, + produces = {MediaType.APPLICATION_JSON_VALUE}) + public @ResponseBody Collection getChannels(@RequestBody(required = false) ChannelsRequest request) + throws Throwable { + // in case not specified use default (e.g. GET) + if (request == null) { + request = new ChannelsRequest(); + } + try { - return queryProcessor.getChannels(); + return getQueryProcessor(request.getDbMode()).getChannels(request.getRegex()); } catch (Throwable t) { LOGGER.error("Failed to query channel names.", t); throw t; } } - @RequestMapping( - value = CHANNELS_REGEX, - method = RequestMethod.POST, - consumes = {MediaType.APPLICATION_JSON_VALUE}) - public @ResponseBody Collection getChannels(@RequestBody String regex) throws Throwable { - try { - return queryProcessor.getChannels(regex); - } catch (Throwable t) { - LOGGER.error("Failed to query channel names with regex '{}'.", regex, t); - throw t; - } - } - @RequestMapping( value = QUERY, method = RequestMethod.POST, @@ -108,7 +105,7 @@ public class QueryRestController { queryAnalizer.validate(); // all the magic happens here - Stream>> channelToDataEvents = queryProcessor.process(queryAnalizer); + Stream>> channelToDataEvents = getQueryProcessor(query.getDBMode()).process(queryAnalizer); // do post-process Stream> channelToData = queryAnalizer.postProcess(channelToDataEvents); @@ -121,6 +118,16 @@ public class QueryRestController { } } + private QueryProcessor getQueryProcessor(DBMode dbMode) { + if (DBMode.databuffer.equals(dbMode)) { + return cassandraQueryProcessor; + } else if (DBMode.archiverappliance.equals(dbMode)) { + return archiverApplianceQueryProcessor; + } else { + LOGGER.error("Unknown DBMode '{}'!", dbMode); + throw new IllegalArgumentException(String.format("Unknown DBMode '%s'", dbMode)); + } + } // ========================================================================================== // TODO: This is simply for initial / rudimentary testing - remove once further evolved diff --git a/src/main/java/ch/psi/daq/queryrest/model/ChannelsRequest.java b/src/main/java/ch/psi/daq/queryrest/model/ChannelsRequest.java new file mode 100644 index 0000000..7474428 --- /dev/null +++ b/src/main/java/ch/psi/daq/queryrest/model/ChannelsRequest.java @@ -0,0 +1,37 @@ +package ch.psi.daq.queryrest.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import ch.psi.daq.query.model.DBMode; + +// as RequestBody due to special chars in regex +@JsonInclude(Include.NON_DEFAULT) +public class ChannelsRequest { + private DBMode dbMode = DBMode.databuffer; + // null for no regex + private String regex = null; + + public ChannelsRequest() {} + + public ChannelsRequest(DBMode dbMode, String regex) { + this.regex = regex; + this.dbMode = dbMode; + } + + public DBMode getDbMode() { + return dbMode; + } + + public void setDbMode(DBMode dbMode) { + this.dbMode = dbMode; + } + + public String getRegex() { + return regex; + } + + public void setRegex(String regex) { + this.regex = regex; + } +} 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 da82d6e..00c82ef 100644 --- a/src/test/java/ch/psi/daq/test/queryrest/DaqWebMvcConfig.java +++ b/src/test/java/ch/psi/daq/test/queryrest/DaqWebMvcConfig.java @@ -9,9 +9,9 @@ import org.springframework.context.annotation.PropertySources; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; -import ch.psi.daq.cassandra.reader.DataReader; +import ch.psi.daq.domain.reader.DataReader; import ch.psi.daq.query.processor.QueryProcessor; -import ch.psi.daq.query.processor.cassandra.CassandraQueryProcessorLocal; +import ch.psi.daq.query.processor.QueryProcessorLocal; import ch.psi.daq.test.cassandra.admin.CassandraAdmin; import ch.psi.daq.test.cassandra.admin.CassandraAdminImpl; import ch.psi.daq.test.query.config.LocalQueryTestConfig; @@ -33,7 +33,7 @@ public class DaqWebMvcConfig extends WebMvcConfigurationSupport { @Bean public QueryProcessor queryProcessor() { - return new CassandraQueryProcessorLocal(); + return new QueryProcessorLocal(new DummyDataReader()); } @Bean diff --git a/src/test/java/ch/psi/daq/test/queryrest/query/DummyDataReader.java b/src/test/java/ch/psi/daq/test/queryrest/query/DummyDataReader.java index fd67fd9..e55cf11 100644 --- a/src/test/java/ch/psi/daq/test/queryrest/query/DummyDataReader.java +++ b/src/test/java/ch/psi/daq/test/queryrest/query/DummyDataReader.java @@ -7,10 +7,10 @@ import java.util.stream.Stream; import com.google.common.collect.Lists; -import ch.psi.daq.cassandra.reader.DataReader; import ch.psi.daq.common.ordering.Ordering; +import ch.psi.daq.domain.DataEvent; import ch.psi.daq.domain.cassandra.ChannelEvent; -import ch.psi.daq.domain.cassandra.DataEvent; +import ch.psi.daq.domain.reader.DataReader; public class DummyDataReader implements DataReader {