Search in sources :

Example 1 with StreamMapperBuilder

use of com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.StreamMapperBuilder in project ma-modules-public by infiniteautomation.

the class PointValueRestController method getRollupPointValuesAsSingleArray.

@ApiOperation(value = "Rollup values for multiple data points, return in time ascending order", notes = "From time inclusive, To time exclusive. Return in single array.", response = PointValueTimeModel.class, responseContainer = "Array")
@RequestMapping(method = RequestMethod.GET, value = "/single-array/time-period/{xids}/{rollup}")
public Stream<StreamingMultiPointModel> getRollupPointValuesAsSingleArray(@ApiParam(value = "Point xids", required = true, allowMultiple = true) @PathVariable String[] xids, @ApiParam(value = "Rollup type") @PathVariable(value = "rollup") RollupEnum rollup, @ApiParam(value = "From time") @RequestParam(value = "from", required = false) @DateTimeFormat(iso = ISO.DATE_TIME) ZonedDateTime from, @ApiParam(value = "To time") @RequestParam(value = "to", required = false) @DateTimeFormat(iso = ISO.DATE_TIME) ZonedDateTime to, @ApiParam(value = "Time Period Type") @RequestParam(value = "timePeriodType", required = false) TimePeriodType timePeriodType, @ApiParam(value = "Time Periods") @RequestParam(value = "timePeriods", required = false) Integer timePeriods, @ApiParam(value = "Time zone") @RequestParam(value = "timezone", required = false) String timezone, @ApiParam(value = "Limit, limits returned array size") @RequestParam(value = "limit", required = false) Integer limit, @ApiParam(value = "Date Time format pattern for timestamps as strings, if not included epoch milli number is used") @RequestParam(value = "dateTimeFormat", required = false) String dateTimeFormat, @ApiParam(value = "Truncate the from time and expand to time based on the time period settings") @RequestParam(value = "truncate", required = false, defaultValue = "false") boolean truncate, @ApiParam(value = "Fields to be included in the returned data, default is TIMESTAMP,VALUE") @RequestParam(required = false) PointValueField[] fields, Locale locale) {
    var points = Arrays.stream(xids).distinct().map(dataPointService::get).collect(Collectors.toUnmodifiableSet());
    var mapperBuilder = new StreamMapperBuilder().withDataPoints(points).withRollup(rollup).withFields(fields).withDateTimeFormat(dateTimeFormat).withTimezone(timezone, from, to).withLocale(locale).withTimestampSource(TimestampSource.STATISTIC);
    var defaultMapper = mapperBuilder.build(DefaultStreamMapper::new);
    var aggregateMapper = mapperBuilder.build(AggregateValueMapper::new);
    from = from.withZoneSameInstant(defaultMapper.getZoneId());
    to = to.withZoneSameInstant(defaultMapper.getZoneId());
    TemporalAmount rollupPeriod;
    if (timePeriodType == null || timePeriods == null) {
        rollupPeriod = Duration.between(from, to);
    } else {
        if (truncate) {
            from = from.with(new TruncateTimePeriodAdjuster(timePeriodType.getChronoUnit(), timePeriods));
            to = to.with(new ExpandTimePeriodAdjuster(from, timePeriodType.getChronoUnit(), timePeriods));
        }
        rollupPeriod = timePeriodType.toTemporalAmount(timePeriods);
    }
    // limit is a total limit, however may as well limit per point
    var streamGenerator = rollupStream(from, to, limit, rollup, rollupPeriod, defaultMapper, aggregateMapper);
    var streams = points.stream().map(streamGenerator).collect(Collectors.toUnmodifiableList());
    // merge the streams and group by timestamp
    var mergedStream = MergingIterator.mergeStreams(streams, Comparator.comparingLong(StreamingPointValueTimeModel::getExactTimestamp));
    var grouped = TimestampGrouper.groupByTimestamp(mergedStream, defaultMapper::formatTime);
    return limit == null ? grouped : grouped.limit(limit);
}
Also used : DefaultStreamMapper(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.DefaultStreamMapper) ExpandTimePeriodAdjuster(com.infiniteautomation.mango.util.datetime.ExpandTimePeriodAdjuster) AggregateValueMapper(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.AggregateValueMapper) TemporalAmount(java.time.temporal.TemporalAmount) TruncateTimePeriodAdjuster(com.infiniteautomation.mango.util.datetime.TruncateTimePeriodAdjuster) StreamMapperBuilder(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.StreamMapperBuilder) ApiOperation(io.swagger.annotations.ApiOperation) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 2 with StreamMapperBuilder

use of com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.StreamMapperBuilder in project ma-modules-public by infiniteautomation.

the class PointValueRestController method getRollupPointValuesAsMultipleArrays.

@ApiOperation(value = "Rollup values for multiple data points, return in time ascending order", notes = "From time inclusive, To time exclusive.  Returns a map of xid to point value time arrays.", response = PointValueTimeModel.class, responseContainer = "Object")
@RequestMapping(method = RequestMethod.GET, value = "/multiple-arrays/time-period/{xids}/{rollup}")
public Map<String, Stream<StreamingPointValueTimeModel>> getRollupPointValuesAsMultipleArrays(@ApiParam(value = "Point xids", required = true, allowMultiple = true) @PathVariable String[] xids, @ApiParam(value = "Rollup type") @PathVariable(value = "rollup") RollupEnum rollup, @ApiParam(value = "From time") @RequestParam(value = "from", required = false) @DateTimeFormat(iso = ISO.DATE_TIME) ZonedDateTime from, @ApiParam(value = "To time") @RequestParam(value = "to", required = false) @DateTimeFormat(iso = ISO.DATE_TIME) ZonedDateTime to, @ApiParam(value = "Time Period Type") @RequestParam(value = "timePeriodType", required = false) TimePeriodType timePeriodType, @ApiParam(value = "Time Periods") @RequestParam(value = "timePeriods", required = false) Integer timePeriods, @ApiParam(value = "Time zone") @RequestParam(value = "timezone", required = false) String timezone, @ApiParam(value = "Limit (per series)") @RequestParam(value = "limit", required = false) Integer limit, @ApiParam(value = "Date Time format pattern for timestamps as strings, if not included epoch milli number is used") @RequestParam(value = "dateTimeFormat", required = false) String dateTimeFormat, @ApiParam(value = "Truncate the from time and expand to time based on the time period settings") @RequestParam(value = "truncate", required = false, defaultValue = "false") boolean truncate, @ApiParam(value = "Fields to be included in the returned data, default is TIMESTAMP,VALUE") @RequestParam(required = false) PointValueField[] fields, Locale locale) {
    var points = Arrays.stream(xids).distinct().map(dataPointService::get).collect(Collectors.toUnmodifiableSet());
    var mapperBuilder = new StreamMapperBuilder().withDataPoints(points).withRollup(rollup).withFields(fields).withDateTimeFormat(dateTimeFormat).withTimezone(timezone, from, to).withLocale(locale);
    var defaultMapper = mapperBuilder.build(DefaultStreamMapper::new);
    var aggregateMapper = mapperBuilder.build(AggregateValueMapper::new);
    from = from.withZoneSameInstant(defaultMapper.getZoneId());
    to = to.withZoneSameInstant(defaultMapper.getZoneId());
    TemporalAmount rollupPeriod;
    if (timePeriodType == null || timePeriods == null) {
        rollupPeriod = Duration.between(from, to);
    } else {
        if (truncate) {
            from = from.with(new TruncateTimePeriodAdjuster(timePeriodType.getChronoUnit(), timePeriods));
            to = to.with(new ExpandTimePeriodAdjuster(from, timePeriodType.getChronoUnit(), timePeriods));
        }
        rollupPeriod = timePeriodType.toTemporalAmount(timePeriods);
    }
    var streamGenerator = rollupStream(from, to, limit, rollup, rollupPeriod, defaultMapper, aggregateMapper);
    return points.stream().collect(Collectors.toUnmodifiableMap(DataPointVO::getXid, streamGenerator));
}
Also used : DefaultStreamMapper(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.DefaultStreamMapper) ExpandTimePeriodAdjuster(com.infiniteautomation.mango.util.datetime.ExpandTimePeriodAdjuster) AggregateValueMapper(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.AggregateValueMapper) TemporalAmount(java.time.temporal.TemporalAmount) TruncateTimePeriodAdjuster(com.infiniteautomation.mango.util.datetime.TruncateTimePeriodAdjuster) StreamMapperBuilder(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.StreamMapperBuilder) ApiOperation(io.swagger.annotations.ApiOperation) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 3 with StreamMapperBuilder

use of com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.StreamMapperBuilder in project ma-modules-public by infiniteautomation.

the class PointValueRestController method getLatestPointValues.

@ApiOperation(value = "Get latest values For 1 Data Point in time descending order", notes = "Optionally use memory cached values that are available on Interval Logged data points, < before time and optional limit")
@RequestMapping(method = RequestMethod.GET, value = "/latest/{xid}")
public Stream<StreamingPointValueTimeModel> getLatestPointValues(@ApiParam(value = "Point xid", required = true) @PathVariable String xid, @ApiParam(value = "Date Time format pattern for timestamps as strings, if not included epoch milli number is used") @RequestParam(value = "dateTimeFormat", required = false) String dateTimeFormat, @ApiParam(value = "Return values before this time") @RequestParam(value = "before", required = false) @DateTimeFormat(iso = ISO.DATE_TIME) ZonedDateTime before, @ApiParam(value = "Time zone") @RequestParam(value = "timezone", required = false) String timezone, @ApiParam(value = "Limit") @RequestParam(value = "limit", required = false) Integer limit, @ApiParam(value = "Use cached/intra-interval logging data, for best performance set the data point's cache size >= the the requested limit") @RequestParam(value = "useCache", required = false, defaultValue = "NONE") PointValueTimeCacheControl useCache, @ApiParam(value = "Tolerance for use in Simplify algorithm") @RequestParam(required = false) Double simplifyTolerance, @ApiParam(value = "Target number of values to return for use in Simplify algorithm") @RequestParam(required = false) Integer simplifyTarget, @ApiParam(value = "Fields to be included in the returned data, default is TIMESTAMP,VALUE") @RequestParam(required = false) PointValueField[] fields, Locale locale) {
    DataPointVO point = dataPointService.get(xid);
    var stream = latestStream(List.of(point), before, limit, useCache);
    stream = simplifyStream(stream, simplifyTolerance, simplifyTarget);
    DefaultStreamMapper mapper = new StreamMapperBuilder().withDataPoint(point).withFields(fields).withDateTimeFormat(dateTimeFormat).withTimezone(timezone, before).withLocale(locale).build(DefaultStreamMapper::new);
    return stream.map(mapper);
}
Also used : DataPointVO(com.serotonin.m2m2.vo.DataPointVO) DefaultStreamMapper(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.DefaultStreamMapper) StreamMapperBuilder(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.StreamMapperBuilder) ApiOperation(io.swagger.annotations.ApiOperation) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 4 with StreamMapperBuilder

use of com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.StreamMapperBuilder in project ma-modules-public by infiniteautomation.

the class PointValueRestController method getRollupPointValues.

@ApiOperation(value = "Rollup values For 1 Data Point, return in time ascending order", notes = "From time inclusive, To time exclusive.", response = PointValueTimeModel.class, responseContainer = "Array")
@RequestMapping(method = RequestMethod.GET, value = "/time-period/{xid}/{rollup}")
public Stream<StreamingPointValueTimeModel> getRollupPointValues(@ApiParam(value = "Point xid", required = true) @PathVariable String xid, @ApiParam(value = "Rollup type") @PathVariable(value = "rollup") RollupEnum rollup, @ApiParam(value = "Date Time format pattern for timestamps as strings, if not included epoch milli number is used") @RequestParam(value = "dateTimeFormat", required = false) String dateTimeFormat, @ApiParam(value = "From time") @RequestParam(value = "from") @DateTimeFormat(iso = ISO.DATE_TIME) ZonedDateTime from, @ApiParam(value = "To time") @RequestParam(value = "to") @DateTimeFormat(iso = ISO.DATE_TIME) ZonedDateTime to, @ApiParam(value = "Time zone") @RequestParam(value = "timezone", required = false) String timezone, @ApiParam(value = "Limit") @RequestParam(value = "limit", required = false) Integer limit, @ApiParam(value = "Time Period Type") @RequestParam(value = "timePeriodType", required = false) TimePeriodType timePeriodType, @ApiParam(value = "Time Periods") @RequestParam(value = "timePeriods", required = false) Integer timePeriods, @ApiParam(value = "Truncate the from time and expand to time based on the time period settings") @RequestParam(value = "truncate", required = false, defaultValue = "false") boolean truncate, @ApiParam(value = "Fields to be included in the returned data, default is TIMESTAMP,VALUE") @RequestParam(required = false) PointValueField[] fields, Locale locale) {
    DataPointVO point = dataPointService.get(xid);
    var mapperBuilder = new StreamMapperBuilder().withDataPoint(point).withRollup(rollup).withFields(fields).withDateTimeFormat(dateTimeFormat).withTimezone(timezone, from, to).withLocale(locale);
    var defaultMapper = mapperBuilder.build(DefaultStreamMapper::new);
    var aggregateMapper = mapperBuilder.build(AggregateValueMapper::new);
    from = from.withZoneSameInstant(defaultMapper.getZoneId());
    to = to.withZoneSameInstant(defaultMapper.getZoneId());
    TemporalAmount rollupPeriod;
    if (timePeriodType == null || timePeriods == null) {
        rollupPeriod = Duration.between(from, to);
    } else {
        if (truncate) {
            from = from.with(new TruncateTimePeriodAdjuster(timePeriodType.getChronoUnit(), timePeriods));
            to = to.with(new ExpandTimePeriodAdjuster(from, timePeriodType.getChronoUnit(), timePeriods));
        }
        rollupPeriod = timePeriodType.toTemporalAmount(timePeriods);
    }
    return rollupStream(from, to, limit, rollup, rollupPeriod, defaultMapper, aggregateMapper).apply(point);
}
Also used : DataPointVO(com.serotonin.m2m2.vo.DataPointVO) DefaultStreamMapper(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.DefaultStreamMapper) ExpandTimePeriodAdjuster(com.infiniteautomation.mango.util.datetime.ExpandTimePeriodAdjuster) AggregateValueMapper(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.AggregateValueMapper) TemporalAmount(java.time.temporal.TemporalAmount) TruncateTimePeriodAdjuster(com.infiniteautomation.mango.util.datetime.TruncateTimePeriodAdjuster) StreamMapperBuilder(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.StreamMapperBuilder) ApiOperation(io.swagger.annotations.ApiOperation) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 5 with StreamMapperBuilder

use of com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.StreamMapperBuilder in project ma-modules-public by infiniteautomation.

the class PointValueRestController method getPointValues.

@ApiOperation(value = "Query Time Range For 1 Data Point, return in time ascending order", notes = "From time inclusive, To time exclusive.  With a bookend value at from and to if possible/necessary.", response = PointValueTimeModel.class, responseContainer = "Array")
@RequestMapping(method = RequestMethod.GET, value = "/time-period/{xid}")
public Stream<StreamingPointValueTimeModel> getPointValues(@ApiParam(value = "Point xid", required = true) @PathVariable String xid, @ApiParam(value = "Date Time format pattern for timestamps as strings, if not included epoch milli number is used") @RequestParam(value = "dateTimeFormat", required = false) String dateTimeFormat, @ApiParam(value = "From time") @RequestParam(value = "from", required = false) @DateTimeFormat(iso = ISO.DATE_TIME) ZonedDateTime from, @ApiParam(value = "To time") @RequestParam(value = "to", required = false) @DateTimeFormat(iso = ISO.DATE_TIME) ZonedDateTime to, @ApiParam(value = "Time zone") @RequestParam(value = "timezone", required = false) String timezone, @ApiParam(value = "Limit (not including bookend values)") @RequestParam(value = "limit", required = false) Integer limit, @ApiParam(value = "Bookend") @RequestParam(value = "bookend", required = false, defaultValue = "false") boolean bookend, @ApiParam(value = "Tolerance for use in Simplify algorithm") @RequestParam(required = false) Double simplifyTolerance, @ApiParam(value = "Target number of values to return for use in Simplify algorithm") @RequestParam(required = false) Integer simplifyTarget, @ApiParam(value = "Fields to be included in the returned data, default is TIMESTAMP,VALUE") @RequestParam(required = false) PointValueField[] fields, Locale locale) {
    DataPointVO point = dataPointService.get(xid);
    var mapper = new StreamMapperBuilder().withDataPoint(point).withFields(fields).withDateTimeFormat(dateTimeFormat).withTimezone(timezone, from, to).withLocale(locale).build(DefaultStreamMapper::new);
    return timeRangeStream(from, to, limit, bookend, simplifyTolerance, simplifyTarget, mapper).apply(point);
}
Also used : DataPointVO(com.serotonin.m2m2.vo.DataPointVO) DefaultStreamMapper(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.DefaultStreamMapper) StreamMapperBuilder(com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.StreamMapperBuilder) ApiOperation(io.swagger.annotations.ApiOperation) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Aggregations

StreamMapperBuilder (com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.StreamMapperBuilder)7 DefaultStreamMapper (com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.DefaultStreamMapper)6 ApiOperation (io.swagger.annotations.ApiOperation)6 RequestMapping (org.springframework.web.bind.annotation.RequestMapping)6 AggregateValueMapper (com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.AggregateValueMapper)5 DataPointVO (com.serotonin.m2m2.vo.DataPointVO)5 ExpandTimePeriodAdjuster (com.infiniteautomation.mango.util.datetime.ExpandTimePeriodAdjuster)4 TruncateTimePeriodAdjuster (com.infiniteautomation.mango.util.datetime.TruncateTimePeriodAdjuster)4 TemporalAmount (java.time.temporal.TemporalAmount)4 PointValueField (com.infiniteautomation.mango.rest.latest.model.pointValue.PointValueField)2 RollupEnum (com.infiniteautomation.mango.rest.latest.model.pointValue.RollupEnum)2 TimestampSource (com.infiniteautomation.mango.rest.latest.streamingvalues.mapper.TimestampSource)2 StreamingPointValueTimeModel (com.infiniteautomation.mango.rest.latest.streamingvalues.model.StreamingPointValueTimeModel)2 Common (com.serotonin.m2m2.Common)2 DataType (com.serotonin.m2m2.DataType)2 PointValueDao (com.serotonin.m2m2.db.dao.PointValueDao)2 DataPointRT (com.serotonin.m2m2.rt.dataImage.DataPointRT)2 PointValueTime (com.serotonin.m2m2.rt.dataImage.PointValueTime)2 DataValue (com.serotonin.m2m2.rt.dataImage.types.DataValue)2 MultistateValue (com.serotonin.m2m2.rt.dataImage.types.MultistateValue)2