Browse Source

added related entities argument entry implementation

pull/14141/head
IrynaMatveieva 11 months ago
parent
commit
c46d2f0415
  1. 4
      application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java
  2. 25
      application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesArgumentEntry.java
  3. 1
      application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/CountUniqueAggEntry.java
  4. 2
      application/src/main/java/org/thingsboard/server/utils/CalculatedFieldUtils.java
  5. 10
      application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesArgumentEntryTest.java
  6. 2
      common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfArg.java
  7. 17
      common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfRelatedEntitiesArgumentValue.java

4
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java

@ -118,7 +118,7 @@ public class RelatedEntitiesAggregationCalculatedFieldState extends BaseCalculat
public void cleanupEntityData(EntityId relatedEntityId) { public void cleanupEntityData(EntityId relatedEntityId) {
arguments.values().forEach(argEntry -> { arguments.values().forEach(argEntry -> {
RelatedEntitiesArgumentEntry aggEntry = (RelatedEntitiesArgumentEntry) argEntry; RelatedEntitiesArgumentEntry aggEntry = (RelatedEntitiesArgumentEntry) argEntry;
aggEntry.getAggInputs().remove(relatedEntityId); aggEntry.getEntityInputs().remove(relatedEntityId);
}); });
lastMetricsEvalTs = -1; lastMetricsEvalTs = -1;
lastArgsRefreshTs = System.currentTimeMillis(); lastArgsRefreshTs = System.currentTimeMillis();
@ -135,7 +135,7 @@ public class RelatedEntitiesAggregationCalculatedFieldState extends BaseCalculat
for (Map.Entry<String, ArgumentEntry> argEntry : arguments.entrySet()) { for (Map.Entry<String, ArgumentEntry> argEntry : arguments.entrySet()) {
String key = argEntry.getKey(); String key = argEntry.getKey();
RelatedEntitiesArgumentEntry relatedEntitiesArgumentEntry = (RelatedEntitiesArgumentEntry) argEntry.getValue(); RelatedEntitiesArgumentEntry relatedEntitiesArgumentEntry = (RelatedEntitiesArgumentEntry) argEntry.getValue();
relatedEntitiesArgumentEntry.getAggInputs().forEach((entityId, argumentEntry) -> { relatedEntitiesArgumentEntry.getEntityInputs().forEach((entityId, argumentEntry) -> {
inputs.computeIfAbsent(entityId, k -> new HashMap<>()).put(key, argumentEntry); inputs.computeIfAbsent(entityId, k -> new HashMap<>()).put(key, argumentEntry);
}); });
} }

25
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesArgumentEntry.java

@ -18,19 +18,21 @@ package org.thingsboard.server.service.cf.ctx.state.aggregation;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import org.thingsboard.script.api.tbel.TbelCfArg; import org.thingsboard.script.api.tbel.TbelCfArg;
import org.thingsboard.script.api.tbel.TbelCfRelatedEntitiesAggregation; import org.thingsboard.script.api.tbel.TbelCfRelatedEntitiesArgumentValue;
import org.thingsboard.script.api.tbel.TbelCfSingleValueArg;
import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.service.cf.ctx.state.ArgumentEntry; import org.thingsboard.server.service.cf.ctx.state.ArgumentEntry;
import org.thingsboard.server.service.cf.ctx.state.ArgumentEntryType; import org.thingsboard.server.service.cf.ctx.state.ArgumentEntryType;
import org.thingsboard.server.service.cf.ctx.state.SingleValueArgumentEntry; import org.thingsboard.server.service.cf.ctx.state.SingleValueArgumentEntry;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
@Data @Data
@AllArgsConstructor @AllArgsConstructor
public class RelatedEntitiesArgumentEntry implements ArgumentEntry { public class RelatedEntitiesArgumentEntry implements ArgumentEntry {
private final Map<EntityId, ArgumentEntry> aggInputs; private final Map<EntityId, ArgumentEntry> entityInputs;
private boolean forceResetPrevious; private boolean forceResetPrevious;
@ -41,24 +43,24 @@ public class RelatedEntitiesArgumentEntry implements ArgumentEntry {
@Override @Override
public Object getValue() { public Object getValue() {
return aggInputs; return entityInputs;
} }
@Override @Override
public boolean updateEntry(ArgumentEntry entry) { public boolean updateEntry(ArgumentEntry entry) {
if (entry instanceof RelatedEntitiesArgumentEntry relatedEntitiesArgumentEntry) { if (entry instanceof RelatedEntitiesArgumentEntry relatedEntitiesArgumentEntry) {
aggInputs.putAll(relatedEntitiesArgumentEntry.aggInputs); entityInputs.putAll(relatedEntitiesArgumentEntry.entityInputs);
return true; return true;
} else if (entry instanceof SingleValueArgumentEntry singleValueArgumentEntry) { } else if (entry instanceof SingleValueArgumentEntry singleValueArgumentEntry) {
if (entry.isForceResetPrevious()) { if (entry.isForceResetPrevious()) {
aggInputs.put(singleValueArgumentEntry.getEntityId(), singleValueArgumentEntry); entityInputs.put(singleValueArgumentEntry.getEntityId(), singleValueArgumentEntry);
return true; return true;
} }
ArgumentEntry argumentEntry = aggInputs.get(singleValueArgumentEntry.getEntityId()); ArgumentEntry argumentEntry = entityInputs.get(singleValueArgumentEntry.getEntityId());
if (argumentEntry != null) { if (argumentEntry != null) {
argumentEntry.updateEntry(singleValueArgumentEntry); argumentEntry.updateEntry(singleValueArgumentEntry);
} else { } else {
aggInputs.put(singleValueArgumentEntry.getEntityId(), singleValueArgumentEntry); entityInputs.put(singleValueArgumentEntry.getEntityId(), singleValueArgumentEntry);
} }
return true; return true;
} else { } else {
@ -68,12 +70,17 @@ public class RelatedEntitiesArgumentEntry implements ArgumentEntry {
@Override @Override
public boolean isEmpty() { public boolean isEmpty() {
return aggInputs.isEmpty(); return entityInputs.isEmpty();
} }
@Override @Override
public TbelCfArg toTbelCfArg() { public TbelCfArg toTbelCfArg() {
return new TbelCfRelatedEntitiesAggregation(aggInputs.values()); var inputs = entityInputs.entrySet().stream()
.collect(Collectors.toMap(
e -> e.getKey().getId(),
e -> (TbelCfSingleValueArg) e.getValue().toTbelCfArg()
));
return new TbelCfRelatedEntitiesArgumentValue(inputs);
} }
} }

1
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/CountUniqueAggEntry.java

@ -18,7 +18,6 @@ package org.thingsboard.server.service.cf.ctx.state.aggregation.function;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.cf.configuration.aggregation.AggFunction; import org.thingsboard.server.common.data.cf.configuration.aggregation.AggFunction;
import java.util.HashSet;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;

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

@ -105,7 +105,7 @@ public class CalculatedFieldUtils {
builder.addGeofencingArguments(toGeofencingArgumentProto(argName, (GeofencingArgumentEntry) argEntry)); builder.addGeofencingArguments(toGeofencingArgumentProto(argName, (GeofencingArgumentEntry) argEntry));
case RELATED_ENTITIES -> { case RELATED_ENTITIES -> {
RelatedEntitiesArgumentEntry relatedEntitiesArgumentEntry = (RelatedEntitiesArgumentEntry) argEntry; RelatedEntitiesArgumentEntry relatedEntitiesArgumentEntry = (RelatedEntitiesArgumentEntry) argEntry;
relatedEntitiesArgumentEntry.getAggInputs() relatedEntitiesArgumentEntry.getEntityInputs()
.forEach((entityId, entry) -> builder.addSingleValueArguments(toSingleValueArgumentProto(argName, (SingleValueArgumentEntry) entry))); .forEach((entityId, entry) -> builder.addSingleValueArguments(toSingleValueArgumentProto(argName, (SingleValueArgumentEntry) entry)));
} }
} }

10
application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesArgumentEntryTest.java

@ -67,10 +67,10 @@ public class RelatedEntitiesArgumentEntryTest {
assertThat(entry.updateEntry(relatedEntitiesArgumentEntry)).isTrue(); assertThat(entry.updateEntry(relatedEntitiesArgumentEntry)).isTrue();
Map<EntityId, ArgumentEntry> aggInputs = entry.getAggInputs(); Map<EntityId, ArgumentEntry> aggInputs = entry.getEntityInputs();
assertThat(aggInputs.size()).isEqualTo(4); assertThat(aggInputs.size()).isEqualTo(4);
assertThat(aggInputs.get(device3)).isEqualTo(relatedEntitiesArgumentEntry.getAggInputs().get(device3)); assertThat(aggInputs.get(device3)).isEqualTo(relatedEntitiesArgumentEntry.getEntityInputs().get(device3));
assertThat(aggInputs.get(device4)).isEqualTo(relatedEntitiesArgumentEntry.getAggInputs().get(device4)); assertThat(aggInputs.get(device4)).isEqualTo(relatedEntitiesArgumentEntry.getEntityInputs().get(device4));
} }
@Test @Test
@ -81,7 +81,7 @@ public class RelatedEntitiesArgumentEntryTest {
assertThat(entry.updateEntry(singleEntityArgumentEntry)).isTrue(); assertThat(entry.updateEntry(singleEntityArgumentEntry)).isTrue();
Map<EntityId, ArgumentEntry> aggInputs = entry.getAggInputs(); Map<EntityId, ArgumentEntry> aggInputs = entry.getEntityInputs();
assertThat(aggInputs.size()).isEqualTo(3); assertThat(aggInputs.size()).isEqualTo(3);
assertThat(aggInputs.get(device3)).isEqualTo(singleEntityArgumentEntry); assertThat(aggInputs.get(device3)).isEqualTo(singleEntityArgumentEntry);
} }
@ -92,7 +92,7 @@ public class RelatedEntitiesArgumentEntryTest {
assertThat(entry.updateEntry(singleEntityArgumentEntry)).isTrue(); assertThat(entry.updateEntry(singleEntityArgumentEntry)).isTrue();
Map<EntityId, ArgumentEntry> aggInputs = entry.getAggInputs(); Map<EntityId, ArgumentEntry> aggInputs = entry.getEntityInputs();
assertThat(aggInputs.size()).isEqualTo(2); assertThat(aggInputs.size()).isEqualTo(2);
assertThat(aggInputs.get(device2)).isEqualTo(singleEntityArgumentEntry); assertThat(aggInputs.get(device2)).isEqualTo(singleEntityArgumentEntry);
} }

2
common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfArg.java

@ -29,7 +29,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonSubTypes.Type(value = TbelCfTsRollingArg.class, name = "TS_ROLLING"), @JsonSubTypes.Type(value = TbelCfTsRollingArg.class, name = "TS_ROLLING"),
@JsonSubTypes.Type(value = TbelCfGeofencingArg.class, name = "GEOFENCING_CF_ARGUMENT_VALUE"), @JsonSubTypes.Type(value = TbelCfGeofencingArg.class, name = "GEOFENCING_CF_ARGUMENT_VALUE"),
@JsonSubTypes.Type(value = TbelCfPropagationArg.class, name = "PROPAGATION_CF_ARGUMENT_VALUE"), @JsonSubTypes.Type(value = TbelCfPropagationArg.class, name = "PROPAGATION_CF_ARGUMENT_VALUE"),
@JsonSubTypes.Type(value = TbelCfRelatedEntitiesAggregation.class, name = "RELATED_ENTITIES_AGGREGATION") @JsonSubTypes.Type(value = TbelCfRelatedEntitiesArgumentValue.class, name = "RELATED_ENTITIES_ARGUMENT_VALUE")
}) })
public interface TbelCfArg extends TbelCfObject { public interface TbelCfArg extends TbelCfObject {

17
common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfRelatedEntitiesAggregation.java → common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfRelatedEntitiesArgumentValue.java

@ -19,22 +19,23 @@ import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data; import lombok.Data;
import java.util.Collections;
import java.util.Map;
import java.util.UUID;
@Data @Data
public class TbelCfRelatedEntitiesAggregation implements TbelCfArg { public class TbelCfRelatedEntitiesArgumentValue implements TbelCfArg {
private final Object value; private final Map<UUID, TbelCfSingleValueArg> entityInputs;
@JsonCreator @JsonCreator
public TbelCfRelatedEntitiesAggregation( public TbelCfRelatedEntitiesArgumentValue(@JsonProperty("entityInputs") Map<UUID, TbelCfSingleValueArg> values) {
@JsonProperty("value") Object value this.entityInputs = Collections.unmodifiableMap(values);
) {
this.value = value;
} }
@Override @Override
public String getType() { public String getType() {
return "RELATED_ENTITIES_AGGREGATION"; return "RELATED_ENTITIES_ARGUMENT_VALUE";
} }
@Override @Override
Loading…
Cancel
Save