Browse Source

fixes

pull/14253/head
IrynaMatveieva 11 months ago
parent
commit
85d83eaa87
  1. 6
      application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldManagerMessageProcessor.java
  2. 9
      application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java
  3. 6
      application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldProcessingService.java
  4. 15
      application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java
  5. 13
      application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java
  6. 9
      application/src/main/java/org/thingsboard/server/utils/CalculatedFieldUtils.java
  7. 11
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggInterval.java
  8. 5
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggIntervalType.java
  9. 10
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/BaseAggInterval.java
  10. 11
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/CustomInterval.java
  11. 2
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/DayInterval.java
  12. 2
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/HourInterval.java
  13. 4
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/MinInterval.java
  14. 2
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/MonthInterval.java
  15. 4
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/Watermark.java
  16. 2
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/WeekInterval.java
  17. 2
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/WeekSunSatInterval.java
  18. 2
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/YearInterval.java

6
application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldManagerMessageProcessor.java

@ -305,10 +305,8 @@ public class CalculatedFieldManagerMessageProcessor extends AbstractContextAware
private void onRelationChangedEvent(ComponentLifecycleMsg msg, TbCallback callback) { private void onRelationChangedEvent(ComponentLifecycleMsg msg, TbCallback callback) {
Function<EntityId, TriConsumer<EntityId, CalculatedFieldCtx, TbCallback>> relationAction = switch (msg.getEvent()) { Function<EntityId, TriConsumer<EntityId, CalculatedFieldCtx, TbCallback>> relationAction = switch (msg.getEvent()) {
case RELATION_UPDATED -> case RELATION_UPDATED -> relatedId -> (entityId, ctx, cb) -> initRelatedEntity(entityId, relatedId, ctx, cb);
relatedId -> (entityId, ctx, cb) -> initRelatedEntity(entityId, relatedId, ctx, cb); case RELATION_DELETED -> relatedId -> (entityId, ctx, cb) -> deleteRelatedEntity(entityId, relatedId, ctx, cb);
case RELATION_DELETED ->
relatedId -> (entityId, ctx, cb) -> deleteRelatedEntity(entityId, relatedId, ctx, cb);
default -> null; default -> null;
}; };

9
application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java

@ -127,15 +127,6 @@ public abstract class AbstractCalculatedFieldProcessingService {
return futures; return futures;
} }
private Map<String, ListenableFuture<ArgumentEntry>> getEntityArgumentsDuringInterval(CalculatedFieldCtx ctx, EntityId entityId, long ts) {
Map<String, ListenableFuture<ArgumentEntry>> futures = new HashMap<>();
for (var entry : ctx.getArguments().entrySet()) {
var argValueFuture = fetchArgumentValue(ctx.getTenantId(), entityId, entry.getValue(), ts);
futures.put(entry.getKey(), argValueFuture);
}
return futures;
}
protected EntityId resolveEntityId(TenantId tenantId, EntityId entityId, Argument argument) { protected EntityId resolveEntityId(TenantId tenantId, EntityId entityId, Argument argument) {
if (argument.getRefEntityId() != null) { if (argument.getRefEntityId() != null) {
return argument.getRefEntityId(); return argument.getRefEntityId();

6
application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldProcessingService.java

@ -92,10 +92,8 @@ public class DefaultCalculatedFieldProcessingService extends AbstractCalculatedF
@Override @Override
public Map<String, ArgumentEntry> fetchDynamicArgsFromDb(CalculatedFieldCtx ctx, EntityId entityId) { public Map<String, ArgumentEntry> fetchDynamicArgsFromDb(CalculatedFieldCtx ctx, EntityId entityId) {
return switch (ctx.getCfType()) { return switch (ctx.getCfType()) {
case GEOFENCING -> case GEOFENCING -> resolveArgumentFutures(fetchGeofencingCalculatedFieldArguments(ctx, entityId, true, System.currentTimeMillis()));
resolveArgumentFutures(fetchGeofencingCalculatedFieldArguments(ctx, entityId, true, System.currentTimeMillis())); case PROPAGATION -> resolveArgumentFutures(Map.of(PROPAGATION_CONFIG_ARGUMENT, fetchPropagationCalculatedFieldArgument(ctx, entityId)));
case PROPAGATION ->
resolveArgumentFutures(Map.of(PROPAGATION_CONFIG_ARGUMENT, fetchPropagationCalculatedFieldArgument(ctx, entityId)));
default -> Collections.emptyMap(); default -> Collections.emptyMap();
}; };
} }

15
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java

@ -206,21 +206,6 @@ public class CalculatedFieldCtx implements Closeable {
this.maxStateSize = systemContext.getApiLimitService().getLimit(tenantId, DefaultTenantProfileConfiguration::getMaxStateSizeInKBytes) * 1024; this.maxStateSize = systemContext.getApiLimitService().getLimit(tenantId, DefaultTenantProfileConfiguration::getMaxStateSizeInKBytes) * 1024;
this.maxSingleValueArgumentSize = systemContext.getApiLimitService().getLimit(tenantId, DefaultTenantProfileConfiguration::getMaxSingleValueArgumentSizeInKBytes) * 1024; this.maxSingleValueArgumentSize = systemContext.getApiLimitService().getLimit(tenantId, DefaultTenantProfileConfiguration::getMaxSingleValueArgumentSizeInKBytes) * 1024;
} }
//
// public boolean isRequiresScheduledReevaluation() {
// if (CalculatedFieldType.ENTITY_AGGREGATION.equals(calculatedField.getType())) {
// var configuration = (EntityAggregationCalculatedFieldConfiguration) calculatedField.getConfiguration();
// AggInterval interval = configuration.getInterval();
// long delayUntilIntervalEnd = interval.getDelayUntilIntervalEnd();
// if (lastReevaluationTs < System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(systemContext.getCfCheckInterval())) {
//
// }
// if (TimeUnit.SECONDS.toMillis(systemContext.getCfCheckInterval()) >= delayUntilIntervalEnd) {
// return true;
// }
// }
// return requiresScheduledReevaluation;
// }
public void init() { public void init() {
switch (cfType) { switch (cfType) {

13
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java

@ -35,8 +35,10 @@ import org.thingsboard.server.service.cf.ctx.state.ArgumentEntry;
import org.thingsboard.server.service.cf.ctx.state.BaseCalculatedFieldState; import org.thingsboard.server.service.cf.ctx.state.BaseCalculatedFieldState;
import org.thingsboard.server.service.cf.ctx.state.CalculatedFieldCtx; import org.thingsboard.server.service.cf.ctx.state.CalculatedFieldCtx;
import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldState { public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldState {
@ -117,11 +119,13 @@ public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldSt
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
Map<AggIntervalEntry, Map<String, ArgumentEntry>> results = new HashMap<>(); Map<AggIntervalEntry, Map<String, ArgumentEntry>> results = new HashMap<>();
List<AggIntervalEntry> expiredIntervals = new ArrayList<>();
for (Map.Entry<AggIntervalEntry, Map<String, AggIntervalEntryStatus>> entry : intervals.entrySet()) { for (Map.Entry<AggIntervalEntry, Map<String, AggIntervalEntryStatus>> entry : intervals.entrySet()) {
AggIntervalEntry intervalEntry = entry.getKey(); AggIntervalEntry intervalEntry = entry.getKey();
Map<String, AggIntervalEntryStatus> args = entry.getValue(); Map<String, AggIntervalEntryStatus> args = entry.getValue();
processInterval(now, intervalEntry, args, results); processInterval(now, intervalEntry, args, expiredIntervals, results);
} }
expiredIntervals.forEach(intervals::remove);
ArrayNode result = toResult(results); ArrayNode result = toResult(results);
if (result.isEmpty()) { if (result.isEmpty()) {
@ -157,14 +161,17 @@ public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldSt
ctx.scheduleReevaluation(interval.getDelayUntilIntervalEnd(), actorCtx); ctx.scheduleReevaluation(interval.getDelayUntilIntervalEnd(), actorCtx);
} }
private void processInterval(long now, AggIntervalEntry intervalEntry, Map<String, AggIntervalEntryStatus> args, private void processInterval(long now,
AggIntervalEntry intervalEntry,
Map<String, AggIntervalEntryStatus> args,
List<AggIntervalEntry> expiredIntervals,
Map<AggIntervalEntry, Map<String, ArgumentEntry>> results) throws Exception { Map<AggIntervalEntry, Map<String, ArgumentEntry>> results) throws Exception {
long startTs = intervalEntry.getStartTs(); long startTs = intervalEntry.getStartTs();
long endTs = intervalEntry.getEndTs(); long endTs = intervalEntry.getEndTs();
if (now - endTs > watermarkDuration) { if (now - endTs > watermarkDuration) {
handleExpiredInterval(intervalEntry, args, results); handleExpiredInterval(intervalEntry, args, results);
intervals.remove(intervalEntry); expiredIntervals.add(intervalEntry);
} else if (now - startTs >= intervalDuration) { } else if (now - startTs >= intervalDuration) {
handleActiveInterval(intervalEntry, args, results); handleActiveInterval(intervalEntry, args, results);
} }

9
application/src/main/java/org/thingsboard/server/utils/CalculatedFieldUtils.java

@ -102,12 +102,9 @@ public class CalculatedFieldUtils {
state.getArguments().forEach((argName, argEntry) -> { state.getArguments().forEach((argName, argEntry) -> {
switch (argEntry.getType()) { switch (argEntry.getType()) {
case SINGLE_VALUE -> case SINGLE_VALUE -> builder.addSingleValueArguments(toSingleValueArgumentProto(argName, (SingleValueArgumentEntry) argEntry));
builder.addSingleValueArguments(toSingleValueArgumentProto(argName, (SingleValueArgumentEntry) argEntry)); case TS_ROLLING -> builder.addRollingValueArguments(toRollingArgumentProto(argName, (TsRollingArgumentEntry) argEntry));
case TS_ROLLING -> case GEOFENCING -> builder.addGeofencingArguments(toGeofencingArgumentProto(argName, (GeofencingArgumentEntry) argEntry));
builder.addRollingValueArguments(toRollingArgumentProto(argName, (TsRollingArgumentEntry) argEntry));
case GEOFENCING ->
builder.addGeofencingArguments(toGeofencingArgumentProto(argName, (GeofencingArgumentEntry) argEntry));
case RELATED_ENTITIES -> { case RELATED_ENTITIES -> {
RelatedEntitiesArgumentEntry relatedEntitiesArgumentEntry = (RelatedEntitiesArgumentEntry) argEntry; RelatedEntitiesArgumentEntry relatedEntitiesArgumentEntry = (RelatedEntitiesArgumentEntry) argEntry;
relatedEntitiesArgumentEntry.getEntityInputs() relatedEntitiesArgumentEntry.getEntityInputs()

11
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggInterval.java

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval; package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo;
@ -25,27 +26,31 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
property = "type" property = "type"
) )
@JsonSubTypes({ @JsonSubTypes({
@JsonSubTypes.Type(value = MinInterval.class, name = "MIN"),
@JsonSubTypes.Type(value = HourInterval.class, name = "HOUR"), @JsonSubTypes.Type(value = HourInterval.class, name = "HOUR"),
@JsonSubTypes.Type(value = DayInterval.class, name = "DAY"), @JsonSubTypes.Type(value = DayInterval.class, name = "DAY"),
@JsonSubTypes.Type(value = WeekInterval.class, name = "WEEK"), @JsonSubTypes.Type(value = WeekInterval.class, name = "WEEK"),
@JsonSubTypes.Type(value = WeekSunSatInterval.class, name = "WEEK_SUN_SAT"), @JsonSubTypes.Type(value = WeekSunSatInterval.class, name = "WEEK_SUN_SAT"),
@JsonSubTypes.Type(value = MonthInterval.class, name = "MONTH"), @JsonSubTypes.Type(value = MonthInterval.class, name = "MONTH"),
@JsonSubTypes.Type(value = YearInterval.class, name = "YEAR"), @JsonSubTypes.Type(value = YearInterval.class, name = "YEAR"),
@JsonSubTypes.Type(value = CustomInterval.class, name = "CUSTOM"), @JsonSubTypes.Type(value = CustomInterval.class, name = "CUSTOM")
@JsonSubTypes.Type(value = MinInterval.class, name = "MIN")// todo: delete. used only for tests
}) })
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public interface AggInterval { public interface AggInterval {
@JsonIgnore
AggIntervalType getType(); AggIntervalType getType();
@JsonIgnore
long getIntervalDurationMillis(); long getIntervalDurationMillis();
@JsonIgnore
long getCurrentIntervalStartTs(); long getCurrentIntervalStartTs();
@JsonIgnore
long getCurrentIntervalEndTs(); long getCurrentIntervalEndTs();
@JsonIgnore
long getDelayUntilIntervalEnd(); long getDelayUntilIntervalEnd();
} }

5
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggIntervalType.java

@ -17,14 +17,13 @@ package org.thingsboard.server.common.data.cf.configuration.aggregation.single.i
public enum AggIntervalType { public enum AggIntervalType {
MIN,
HOUR, HOUR,
DAY, DAY,
WEEK, WEEK,
WEEK_SUN_SAT, WEEK_SUN_SAT,
MONTH, MONTH,
YEAR, YEAR,
CUSTOM, CUSTOM
MIN// todo: delete
} }

10
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/BaseAggInterval.java

@ -22,6 +22,7 @@ import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters; import java.time.temporal.TemporalAdjusters;
@ -29,6 +30,7 @@ import java.time.temporal.TemporalAdjusters;
@Data @Data
public abstract class BaseAggInterval implements AggInterval { public abstract class BaseAggInterval implements AggInterval {
protected String tz;
protected long offsetMillis; // delay millis since start of interval protected long offsetMillis; // delay millis since start of interval
@Override @Override
@ -54,7 +56,8 @@ public abstract class BaseAggInterval implements AggInterval {
} }
protected long getCurrentIntervalStartTs(AggIntervalType type, int multiplier) { protected long getCurrentIntervalStartTs(AggIntervalType type, int multiplier) {
ZonedDateTime now = ZonedDateTime.now(); ZoneId zoneId = ZoneId.of(tz);
ZonedDateTime now = ZonedDateTime.now(zoneId);
ZonedDateTime shiftedNow = now.minus(Duration.ofMillis(offsetMillis)); ZonedDateTime shiftedNow = now.minus(Duration.ofMillis(offsetMillis));
ZonedDateTime alignedStart = getAlignedBoundary(type, multiplier, false, shiftedNow); ZonedDateTime alignedStart = getAlignedBoundary(type, multiplier, false, shiftedNow);
ZonedDateTime actualStart = alignedStart.plus(Duration.ofMillis(offsetMillis)); ZonedDateTime actualStart = alignedStart.plus(Duration.ofMillis(offsetMillis));
@ -67,7 +70,8 @@ public abstract class BaseAggInterval implements AggInterval {
} }
protected long getCurrentIntervalEndTs(AggIntervalType type, int multiplier) { protected long getCurrentIntervalEndTs(AggIntervalType type, int multiplier) {
ZonedDateTime now = ZonedDateTime.now(); ZoneId zoneId = ZoneId.of(tz);
ZonedDateTime now = ZonedDateTime.now(zoneId);
ZonedDateTime shiftedNow = now.minus(Duration.ofMillis(offsetMillis)); ZonedDateTime shiftedNow = now.minus(Duration.ofMillis(offsetMillis));
ZonedDateTime alignedEnd = getAlignedBoundary(type, multiplier, true, shiftedNow); ZonedDateTime alignedEnd = getAlignedBoundary(type, multiplier, true, shiftedNow);
ZonedDateTime actualEnd = alignedEnd.plus(Duration.ofMillis(offsetMillis)); ZonedDateTime actualEnd = alignedEnd.plus(Duration.ofMillis(offsetMillis));
@ -100,7 +104,7 @@ public abstract class BaseAggInterval implements AggInterval {
private ZonedDateTime alignByMin(ZonedDateTime now, int multiplier, boolean next) { private ZonedDateTime alignByMin(ZonedDateTime now, int multiplier, boolean next) {
ZonedDateTime startOfHour = now.truncatedTo(ChronoUnit.HOURS); ZonedDateTime startOfHour = now.truncatedTo(ChronoUnit.HOURS);
long minsSinceHour = Duration.between(startOfHour, now).toHours(); long minsSinceHour = Duration.between(startOfHour, now).toMinutes();
long aligned = (minsSinceHour / multiplier) * multiplier; long aligned = (minsSinceHour / multiplier) * multiplier;
if (next) aligned += multiplier; if (next) aligned += multiplier;
return startOfHour.plusMinutes(aligned); return startOfHour.plusMinutes(aligned);

11
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/CustomInterval.java

@ -16,13 +16,24 @@
package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval; package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@EqualsAndHashCode(callSuper = true)
@Data @Data
@NoArgsConstructor
public class CustomInterval extends BaseAggInterval { public class CustomInterval extends BaseAggInterval {
private int multiplier; // number of base units (e.g. 2 hours, 5 days) private int multiplier; // number of base units (e.g. 2 hours, 5 days)
private AggIntervalType internalIntervalType; private AggIntervalType internalIntervalType;
public CustomInterval(int multiplier, AggIntervalType internalIntervalType, long offsetMillis, String tz) {
this.tz = tz;
this.offsetMillis = offsetMillis;
this.multiplier = multiplier;
this.internalIntervalType = internalIntervalType;
}
@Override @Override
public AggIntervalType getType() { public AggIntervalType getType() {
return AggIntervalType.CUSTOM; return AggIntervalType.CUSTOM;

2
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/DayInterval.java

@ -16,8 +16,10 @@
package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval; package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor
public class DayInterval extends BaseAggInterval { public class DayInterval extends BaseAggInterval {
@Override @Override

2
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/HourInterval.java

@ -16,8 +16,10 @@
package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval; package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor
public class HourInterval extends BaseAggInterval { public class HourInterval extends BaseAggInterval {
@Override @Override

4
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/MinInterval.java

@ -16,13 +16,15 @@
package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval; package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor
public class MinInterval extends BaseAggInterval { public class MinInterval extends BaseAggInterval {
@Override @Override
public AggIntervalType getType() { public AggIntervalType getType() {
return AggIntervalType.HOUR; return AggIntervalType.MIN;
} }
} }

2
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/MonthInterval.java

@ -16,8 +16,10 @@
package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval; package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor
public class MonthInterval extends BaseAggInterval { public class MonthInterval extends BaseAggInterval {
@Override @Override

4
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/Watermark.java

@ -15,9 +15,13 @@
*/ */
package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval; package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
@Data @Data
@AllArgsConstructor
@NoArgsConstructor
public class Watermark { public class Watermark {
private long duration; private long duration;

2
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/WeekInterval.java

@ -16,8 +16,10 @@
package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval; package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor
public class WeekInterval extends BaseAggInterval { public class WeekInterval extends BaseAggInterval {
@Override @Override

2
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/WeekSunSatInterval.java

@ -16,8 +16,10 @@
package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval; package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor
public class WeekSunSatInterval extends BaseAggInterval { public class WeekSunSatInterval extends BaseAggInterval {
@Override @Override

2
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/YearInterval.java

@ -16,8 +16,10 @@
package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval; package org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor
public class YearInterval extends BaseAggInterval { public class YearInterval extends BaseAggInterval {
@Override @Override

Loading…
Cancel
Save