Browse Source

Added output key support for Arguments only mode

pull/14107/head
dshvaika 8 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())
.scope(output.getScope());
ObjectNode valuesNode = JacksonUtil.newObjectNode();
arguments.forEach((argumentName, argumentEntry) -> {
arguments.forEach((outputKey, argumentEntry) -> {
if (argumentEntry instanceof PropagationArgumentEntry) {
return;
}
if (argumentEntry instanceof SingleValueArgumentEntry singleArgumentEntry) {
JacksonUtil.addKvEntry(valuesNode, singleArgumentEntry.getKvEntryValue());
JacksonUtil.addKvEntry(valuesNode, singleArgumentEntry.getKvEntryValue(), outputKey);
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!");
});
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();
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.setType(OutputType.TIME_SERIES);
@ -1073,14 +1073,14 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes
.atMost(TIMEOUT, TimeUnit.SECONDS)
.pollInterval(POLL_INTERVAL, TimeUnit.SECONDS)
.untilAsserted(() -> {
ObjectNode telemetry1 = getLatestTelemetry(asset1.getId(), "temperature");
ObjectNode telemetry2 = getLatestTelemetry(asset2.getId(), "temperature");
ObjectNode telemetry1 = getLatestTelemetry(asset1.getId(), "temperatureComputed");
ObjectNode telemetry2 = getLatestTelemetry(asset2.getId(), "temperatureComputed");
assertThat(telemetry1).isNotNull();
assertThat(telemetry2).isNotNull();
assertThat(telemetry1.get("temperature").get(0).get("ts").asText()).isEqualTo(Long.toString(ts));
assertThat(telemetry1.get("temperature").get(0).get("value").asDouble()).isEqualTo(12.5);
assertThat(telemetry2.get("temperature").get(0).get("ts").asText()).isEqualTo(Long.toString(ts));
assertThat(telemetry2.get("temperature").get(0).get("value").asDouble()).isEqualTo(12.5);
assertThat(telemetry1.get("temperatureComputed").get(0).get("ts").asText()).isEqualTo(Long.toString(ts));
assertThat(telemetry1.get("temperatureComputed").get(0).get("value").asDouble()).isEqualTo(12.5);
assertThat(telemetry2.get("temperatureComputed").get(0).get("ts").asText()).isEqualTo(Long.toString(ts));
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",
@ -1088,7 +1088,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes
EntityRelation.CONTAINS_TYPE, device.getId().getId(), EntityType.DEVICE
);
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
long newTs = System.currentTimeMillis() - 300000L;
@ -1099,13 +1099,13 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes
.atMost(TIMEOUT, TimeUnit.SECONDS)
.pollInterval(POLL_INTERVAL, TimeUnit.SECONDS)
.untilAsserted(() -> {
ObjectNode telemetry1 = getLatestTelemetry(asset1.getId(), "temperature");
ObjectNode telemetry2 = getLatestTelemetry(asset2.getId(), "temperature");
ObjectNode telemetry1 = getLatestTelemetry(asset1.getId(), "temperatureComputed");
ObjectNode telemetry2 = getLatestTelemetry(asset2.getId(), "temperatureComputed");
assertThat(telemetry1).isNotNull();
assertThat(telemetry2).isNotNull();
assertThat(telemetry1.get("temperature").get(0).get("value")).isEqualTo(NullNode.instance);
assertThat(telemetry2.get("temperature").get(0).get("ts").asText()).isEqualTo(Long.toString(newTs));
assertThat(telemetry2.get("temperature").get(0).get("value").asDouble()).isEqualTo(25);
assertThat(telemetry1.get("temperatureComputed").get(0).get("value")).isEqualTo(NullNode.instance);
assertThat(telemetry2.get("temperatureComputed").get(0).get("ts").asText()).isEqualTo(Long.toString(newTs));
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);
ObjectNode expectedNode = JacksonUtil.newObjectNode();
JacksonUtil.addKvEntry(expectedNode, singleValueArgEntry.getKvEntryValue());
JacksonUtil.addKvEntry(expectedNode, singleValueArgEntry.getKvEntryValue(), TEMPERATURE_ARGUMENT_NAME);
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();
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.setType(OutputType.TIME_SERIES);
@ -558,19 +558,19 @@ public class CalculatedFieldTest extends AbstractContainerTest {
.untilAsserted(() -> {
JsonNode temperature1 = testRestClient.getLatestTelemetry(asset1.getId());
assertThat(temperature1).isNotNull();
assertThat(temperature1.get("temperature")).isNotNull();
assertThat(temperature1.get("temperature").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")).isNotNull();
assertThat(temperature1.get("temperatureComputed").get(0).get("ts").asText()).isEqualTo(Long.toString(ts));
assertThat(temperature1.get("temperatureComputed").get(0).get("value").asText()).isEqualTo("12.5");
JsonNode temperature2 = testRestClient.getLatestTelemetry(asset2.getId());
assertThat(temperature2).isNotNull();
assertThat(temperature2.get("temperature")).isNotNull();
assertThat(temperature2.get("temperature").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")).isNotNull();
assertThat(temperature2.get("temperatureComputed").get(0).get("ts").asText()).isEqualTo(Long.toString(ts));
assertThat(temperature2.get("temperatureComputed").get(0).get("value").asText()).isEqualTo("12.5");
});
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
long newTs = System.currentTimeMillis() - 300000L;
@ -586,9 +586,9 @@ public class CalculatedFieldTest extends AbstractContainerTest {
JsonNode temperature2 = testRestClient.getLatestTelemetry(asset2.getId());
assertThat(temperature2).isNotNull();
assertThat(temperature2.get("temperature")).isNotNull();
assertThat(temperature2.get("temperature").get(0).get("ts").asText()).isEqualTo(Long.toString(newTs));
assertThat(temperature2.get("temperature").get(0).get("value").asInt()).isEqualTo(25);
assertThat(temperature2.get("temperatureComputed")).isNotNull();
assertThat(temperature2.get("temperatureComputed").get(0).get("ts").asText()).isEqualTo(Long.toString(newTs));
assertThat(temperature2.get("temperatureComputed").get(0).get("value").asInt()).isEqualTo(25);
});
testRestClient.deleteCalculatedFieldIfExists(saved.getId());

Loading…
Cancel
Save