Browse Source

Added output key support for Arguments only mode

pull/14107/head
dshvaika 12 months ago
parent
commit
f7714c2f68
  1. 6
      application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationCalculatedFieldState.java
  2. 26
      application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java
  3. 2
      application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationCalculatedFieldStateTest.java
  4. 22
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/cf/CalculatedFieldTest.java

6
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationCalculatedFieldState.java

@ -83,15 +83,15 @@ public class PropagationCalculatedFieldState extends ScriptCalculatedFieldState
.type(output.getType()) .type(output.getType())
.scope(output.getScope()); .scope(output.getScope());
ObjectNode valuesNode = JacksonUtil.newObjectNode(); ObjectNode valuesNode = JacksonUtil.newObjectNode();
arguments.forEach((argumentName, argumentEntry) -> { arguments.forEach((outputKey, argumentEntry) -> {
if (argumentEntry instanceof PropagationArgumentEntry) { if (argumentEntry instanceof PropagationArgumentEntry) {
return; return;
} }
if (argumentEntry instanceof SingleValueArgumentEntry singleArgumentEntry) { if (argumentEntry instanceof SingleValueArgumentEntry singleArgumentEntry) {
JacksonUtil.addKvEntry(valuesNode, singleArgumentEntry.getKvEntryValue()); JacksonUtil.addKvEntry(valuesNode, singleArgumentEntry.getKvEntryValue(), outputKey);
return; return;
} }
throw new IllegalArgumentException("Unsupported argument type: " + argumentEntry.getType() + " detected for argument: " + argumentName + ". " + throw new IllegalArgumentException("Unsupported argument type: " + argumentEntry.getType() + " detected for argument: " + outputKey + ". " +
"Only Latest telemetry or Attribute arguments supported for 'Arguments Only' propagation mode!"); "Only Latest telemetry or Attribute arguments supported for 'Arguments Only' propagation mode!");
}); });
ObjectNode result = toSimpleResult(output.getType() == OutputType.TIME_SERIES, valuesNode); ObjectNode result = toSimpleResult(output.getType() == OutputType.TIME_SERIES, valuesNode);

26
application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java

@ -1058,7 +1058,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes
Argument arg = new Argument(); Argument arg = new Argument();
arg.setRefEntityKey(new ReferencedEntityKey("temperature", ArgumentType.TS_LATEST, null)); arg.setRefEntityKey(new ReferencedEntityKey("temperature", ArgumentType.TS_LATEST, null));
cfg.setArguments(Map.of("t", arg)); cfg.setArguments(Map.of("temperatureComputed", arg));
Output output = new Output(); Output output = new Output();
output.setType(OutputType.TIME_SERIES); output.setType(OutputType.TIME_SERIES);
@ -1073,14 +1073,14 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes
.atMost(TIMEOUT, TimeUnit.SECONDS) .atMost(TIMEOUT, TimeUnit.SECONDS)
.pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS)
.untilAsserted(() -> { .untilAsserted(() -> {
ObjectNode telemetry1 = getLatestTelemetry(asset1.getId(), "temperature"); ObjectNode telemetry1 = getLatestTelemetry(asset1.getId(), "temperatureComputed");
ObjectNode telemetry2 = getLatestTelemetry(asset2.getId(), "temperature"); ObjectNode telemetry2 = getLatestTelemetry(asset2.getId(), "temperatureComputed");
assertThat(telemetry1).isNotNull(); assertThat(telemetry1).isNotNull();
assertThat(telemetry2).isNotNull(); assertThat(telemetry2).isNotNull();
assertThat(telemetry1.get("temperature").get(0).get("ts").asText()).isEqualTo(Long.toString(ts)); assertThat(telemetry1.get("temperatureComputed").get(0).get("ts").asText()).isEqualTo(Long.toString(ts));
assertThat(telemetry1.get("temperature").get(0).get("value").asDouble()).isEqualTo(12.5); assertThat(telemetry1.get("temperatureComputed").get(0).get("value").asDouble()).isEqualTo(12.5);
assertThat(telemetry2.get("temperature").get(0).get("ts").asText()).isEqualTo(Long.toString(ts)); assertThat(telemetry2.get("temperatureComputed").get(0).get("ts").asText()).isEqualTo(Long.toString(ts));
assertThat(telemetry2.get("temperature").get(0).get("value").asDouble()).isEqualTo(12.5); assertThat(telemetry2.get("temperatureComputed").get(0).get("value").asDouble()).isEqualTo(12.5);
}); });
String deleteUrl = String.format("/api/v2/relation?fromId=%s&fromType=%s&relationType=%s&toId=%s&toType=%s", String deleteUrl = String.format("/api/v2/relation?fromId=%s&fromType=%s&relationType=%s&toId=%s&toType=%s",
@ -1088,7 +1088,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes
EntityRelation.CONTAINS_TYPE, device.getId().getId(), EntityType.DEVICE EntityRelation.CONTAINS_TYPE, device.getId().getId(), EntityType.DEVICE
); );
doDelete(deleteUrl).andExpect(status().isOk()); doDelete(deleteUrl).andExpect(status().isOk());
doDelete("/api/plugins/telemetry/ASSET/" + asset1.getId() + "/timeseries/delete?keys=temperature&deleteAllDataForKeys=true").andExpect(status().isOk()); doDelete("/api/plugins/telemetry/ASSET/" + asset1.getId() + "/timeseries/delete?keys=temperatureComputed&deleteAllDataForKeys=true").andExpect(status().isOk());
// Update telemetry on device // Update telemetry on device
long newTs = System.currentTimeMillis() - 300000L; long newTs = System.currentTimeMillis() - 300000L;
@ -1099,13 +1099,13 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes
.atMost(TIMEOUT, TimeUnit.SECONDS) .atMost(TIMEOUT, TimeUnit.SECONDS)
.pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS)
.untilAsserted(() -> { .untilAsserted(() -> {
ObjectNode telemetry1 = getLatestTelemetry(asset1.getId(), "temperature"); ObjectNode telemetry1 = getLatestTelemetry(asset1.getId(), "temperatureComputed");
ObjectNode telemetry2 = getLatestTelemetry(asset2.getId(), "temperature"); ObjectNode telemetry2 = getLatestTelemetry(asset2.getId(), "temperatureComputed");
assertThat(telemetry1).isNotNull(); assertThat(telemetry1).isNotNull();
assertThat(telemetry2).isNotNull(); assertThat(telemetry2).isNotNull();
assertThat(telemetry1.get("temperature").get(0).get("value")).isEqualTo(NullNode.instance); assertThat(telemetry1.get("temperatureComputed").get(0).get("value")).isEqualTo(NullNode.instance);
assertThat(telemetry2.get("temperature").get(0).get("ts").asText()).isEqualTo(Long.toString(newTs)); assertThat(telemetry2.get("temperatureComputed").get(0).get("ts").asText()).isEqualTo(Long.toString(newTs));
assertThat(telemetry2.get("temperature").get(0).get("value").asDouble()).isEqualTo(25); assertThat(telemetry2.get("temperatureComputed").get(0).get("value").asDouble()).isEqualTo(25);
}); });
} }

2
application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationCalculatedFieldStateTest.java

@ -179,7 +179,7 @@ public class PropagationCalculatedFieldStateTest {
assertThat(result.getScope()).isEqualTo(AttributeScope.SERVER_SCOPE); assertThat(result.getScope()).isEqualTo(AttributeScope.SERVER_SCOPE);
ObjectNode expectedNode = JacksonUtil.newObjectNode(); ObjectNode expectedNode = JacksonUtil.newObjectNode();
JacksonUtil.addKvEntry(expectedNode, singleValueArgEntry.getKvEntryValue()); JacksonUtil.addKvEntry(expectedNode, singleValueArgEntry.getKvEntryValue(), TEMPERATURE_ARGUMENT_NAME);
assertThat(result.getResult()).isEqualTo(expectedNode); assertThat(result.getResult()).isEqualTo(expectedNode);
} }

22
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/cf/CalculatedFieldTest.java

@ -541,7 +541,7 @@ public class CalculatedFieldTest extends AbstractContainerTest {
Argument arg = new Argument(); Argument arg = new Argument();
arg.setRefEntityKey(new ReferencedEntityKey("temperature", ArgumentType.TS_LATEST, null)); arg.setRefEntityKey(new ReferencedEntityKey("temperature", ArgumentType.TS_LATEST, null));
cfg.setArguments(Map.of("t", arg)); cfg.setArguments(Map.of("temperatureComputed", arg));
Output output = new Output(); Output output = new Output();
output.setType(OutputType.TIME_SERIES); output.setType(OutputType.TIME_SERIES);
@ -558,19 +558,19 @@ public class CalculatedFieldTest extends AbstractContainerTest {
.untilAsserted(() -> { .untilAsserted(() -> {
JsonNode temperature1 = testRestClient.getLatestTelemetry(asset1.getId()); JsonNode temperature1 = testRestClient.getLatestTelemetry(asset1.getId());
assertThat(temperature1).isNotNull(); assertThat(temperature1).isNotNull();
assertThat(temperature1.get("temperature")).isNotNull(); assertThat(temperature1.get("temperatureComputed")).isNotNull();
assertThat(temperature1.get("temperature").get(0).get("ts").asText()).isEqualTo(Long.toString(ts)); assertThat(temperature1.get("temperatureComputed").get(0).get("ts").asText()).isEqualTo(Long.toString(ts));
assertThat(temperature1.get("temperature").get(0).get("value").asText()).isEqualTo("12.5"); assertThat(temperature1.get("temperatureComputed").get(0).get("value").asText()).isEqualTo("12.5");
JsonNode temperature2 = testRestClient.getLatestTelemetry(asset2.getId()); JsonNode temperature2 = testRestClient.getLatestTelemetry(asset2.getId());
assertThat(temperature2).isNotNull(); assertThat(temperature2).isNotNull();
assertThat(temperature2.get("temperature")).isNotNull(); assertThat(temperature2.get("temperatureComputed")).isNotNull();
assertThat(temperature2.get("temperature").get(0).get("ts").asText()).isEqualTo(Long.toString(ts)); assertThat(temperature2.get("temperatureComputed").get(0).get("ts").asText()).isEqualTo(Long.toString(ts));
assertThat(temperature2.get("temperature").get(0).get("value").asText()).isEqualTo("12.5"); assertThat(temperature2.get("temperatureComputed").get(0).get("value").asText()).isEqualTo("12.5");
}); });
testRestClient.deleteEntityRelation(asset1.getId(), EntityRelation.CONTAINS_TYPE, device.getId()); testRestClient.deleteEntityRelation(asset1.getId(), EntityRelation.CONTAINS_TYPE, device.getId());
testRestClient.deleteEntityTimeseries(asset1.getId(), "temperature", true); testRestClient.deleteEntityTimeseries(asset1.getId(), "temperatureComputed", true);
// Update telemetry on device // Update telemetry on device
long newTs = System.currentTimeMillis() - 300000L; long newTs = System.currentTimeMillis() - 300000L;
@ -586,9 +586,9 @@ public class CalculatedFieldTest extends AbstractContainerTest {
JsonNode temperature2 = testRestClient.getLatestTelemetry(asset2.getId()); JsonNode temperature2 = testRestClient.getLatestTelemetry(asset2.getId());
assertThat(temperature2).isNotNull(); assertThat(temperature2).isNotNull();
assertThat(temperature2.get("temperature")).isNotNull(); assertThat(temperature2.get("temperatureComputed")).isNotNull();
assertThat(temperature2.get("temperature").get(0).get("ts").asText()).isEqualTo(Long.toString(newTs)); assertThat(temperature2.get("temperatureComputed").get(0).get("ts").asText()).isEqualTo(Long.toString(newTs));
assertThat(temperature2.get("temperature").get(0).get("value").asInt()).isEqualTo(25); assertThat(temperature2.get("temperatureComputed").get(0).get("value").asInt()).isEqualTo(25);
}); });
testRestClient.deleteCalculatedFieldIfExists(saved.getId()); testRestClient.deleteCalculatedFieldIfExists(saved.getId());

Loading…
Cancel
Save