added util method
This commit is contained in:
parent
42ba543fb0
commit
9b870126f1
@ -153,7 +153,7 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void process(EntityCalculatedFieldTelemetryMsg msg) throws CalculatedFieldException {
|
public void process(EntityCalculatedFieldTelemetryMsg msg) throws CalculatedFieldException {
|
||||||
log.info("[{}] Processing CF telemetry msg.", msg.getEntityId());
|
log.debug("[{}] Processing CF telemetry msg.", msg.getEntityId());
|
||||||
var proto = msg.getProto();
|
var proto = msg.getProto();
|
||||||
var numberOfCallbacks = CALLBACKS_PER_CF * (msg.getEntityIdFields().size() + msg.getProfileIdFields().size());
|
var numberOfCallbacks = CALLBACKS_PER_CF * (msg.getEntityIdFields().size() + msg.getProfileIdFields().size());
|
||||||
MultipleTbCallback callback = new MultipleTbCallback(numberOfCallbacks, msg.getCallback());
|
MultipleTbCallback callback = new MultipleTbCallback(numberOfCallbacks, msg.getCallback());
|
||||||
@ -168,7 +168,7 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void process(EntityCalculatedFieldLinkedTelemetryMsg msg) throws CalculatedFieldException {
|
public void process(EntityCalculatedFieldLinkedTelemetryMsg msg) throws CalculatedFieldException {
|
||||||
log.info("[{}] Processing CF link telemetry msg.", msg.getEntityId());
|
log.debug("[{}] Processing CF link telemetry msg.", msg.getEntityId());
|
||||||
var proto = msg.getProto();
|
var proto = msg.getProto();
|
||||||
var ctx = msg.getCtx();
|
var ctx = msg.getCtx();
|
||||||
var callback = new MultipleTbCallback(CALLBACKS_PER_CF, msg.getCallback());
|
var callback = new MultipleTbCallback(CALLBACKS_PER_CF, msg.getCallback());
|
||||||
|
|||||||
@ -318,14 +318,14 @@ public class CalculatedFieldManagerMessageProcessor extends AbstractContextAware
|
|||||||
|
|
||||||
public void onTelemetryMsg(CalculatedFieldTelemetryMsg msg) {
|
public void onTelemetryMsg(CalculatedFieldTelemetryMsg msg) {
|
||||||
EntityId entityId = msg.getEntityId();
|
EntityId entityId = msg.getEntityId();
|
||||||
log.info("Received telemetry msg from entity [{}]", entityId);
|
log.debug("Received telemetry msg from entity [{}]", entityId);
|
||||||
// 2 = 1 for CF processing + 1 for links processing
|
// 2 = 1 for CF processing + 1 for links processing
|
||||||
MultipleTbCallback callback = new MultipleTbCallback(2, msg.getCallback());
|
MultipleTbCallback callback = new MultipleTbCallback(2, msg.getCallback());
|
||||||
// process all cfs related to entity, or it's profile;
|
// process all cfs related to entity, or it's profile;
|
||||||
var entityIdFields = getCalculatedFieldsByEntityId(entityId);
|
var entityIdFields = getCalculatedFieldsByEntityId(entityId);
|
||||||
var profileIdFields = getCalculatedFieldsByEntityId(getProfileId(tenantId, entityId));
|
var profileIdFields = getCalculatedFieldsByEntityId(getProfileId(tenantId, entityId));
|
||||||
if (!entityIdFields.isEmpty() || !profileIdFields.isEmpty()) {
|
if (!entityIdFields.isEmpty() || !profileIdFields.isEmpty()) {
|
||||||
log.info("Pushing telemetry msg to specific actor [{}]", entityId);
|
log.debug("Pushing telemetry msg to specific actor [{}]", entityId);
|
||||||
getOrCreateActor(entityId).tell(new EntityCalculatedFieldTelemetryMsg(msg, entityIdFields, profileIdFields, callback));
|
getOrCreateActor(entityId).tell(new EntityCalculatedFieldTelemetryMsg(msg, entityIdFields, profileIdFields, callback));
|
||||||
} else {
|
} else {
|
||||||
callback.onSuccess();
|
callback.onSuccess();
|
||||||
@ -342,7 +342,7 @@ public class CalculatedFieldManagerMessageProcessor extends AbstractContextAware
|
|||||||
|
|
||||||
public void onLinkedTelemetryMsg(CalculatedFieldLinkedTelemetryMsg msg) {
|
public void onLinkedTelemetryMsg(CalculatedFieldLinkedTelemetryMsg msg) {
|
||||||
EntityId sourceEntityId = msg.getEntityId();
|
EntityId sourceEntityId = msg.getEntityId();
|
||||||
log.info("Received linked telemetry msg from entity [{}]", sourceEntityId);
|
log.debug("Received linked telemetry msg from entity [{}]", sourceEntityId);
|
||||||
var proto = msg.getProto();
|
var proto = msg.getProto();
|
||||||
var linksList = proto.getLinksList();
|
var linksList = proto.getLinksList();
|
||||||
for (var linkProto : linksList) {
|
for (var linkProto : linksList) {
|
||||||
@ -357,14 +357,14 @@ public class CalculatedFieldManagerMessageProcessor extends AbstractContextAware
|
|||||||
MultipleTbCallback callback = new MultipleTbCallback(entityIds.size(), msg.getCallback());
|
MultipleTbCallback callback = new MultipleTbCallback(entityIds.size(), msg.getCallback());
|
||||||
var newMsg = new EntityCalculatedFieldLinkedTelemetryMsg(tenantId, sourceEntityId, proto.getMsg(), cf, callback);
|
var newMsg = new EntityCalculatedFieldLinkedTelemetryMsg(tenantId, sourceEntityId, proto.getMsg(), cf, callback);
|
||||||
entityIds.forEach(entityId -> {
|
entityIds.forEach(entityId -> {
|
||||||
log.info("Pushing linked telemetry msg to specific actor [{}]", entityId);
|
log.debug("Pushing linked telemetry msg to specific actor [{}]", entityId);
|
||||||
getOrCreateActor(entityId).tell(newMsg);
|
getOrCreateActor(entityId).tell(newMsg);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
msg.getCallback().onSuccess();
|
msg.getCallback().onSuccess();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.info("Pushing linked telemetry msg to specific actor [{}]", targetEntityId);
|
log.debug("Pushing linked telemetry msg to specific actor [{}]", targetEntityId);
|
||||||
var newMsg = new EntityCalculatedFieldLinkedTelemetryMsg(tenantId, sourceEntityId, proto.getMsg(), cf, msg.getCallback());
|
var newMsg = new EntityCalculatedFieldLinkedTelemetryMsg(tenantId, sourceEntityId, proto.getMsg(), cf, msg.getCallback());
|
||||||
getOrCreateActor(targetEntityId).tell(newMsg);
|
getOrCreateActor(targetEntityId).tell(newMsg);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,7 +34,6 @@ import org.thingsboard.server.common.data.id.TenantId;
|
|||||||
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
|
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
|
||||||
import org.thingsboard.server.common.data.kv.TsKvEntry;
|
import org.thingsboard.server.common.data.kv.TsKvEntry;
|
||||||
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
|
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
|
||||||
import org.thingsboard.server.common.data.util.TbPair;
|
|
||||||
import org.thingsboard.server.common.util.ProtoUtils;
|
import org.thingsboard.server.common.util.ProtoUtils;
|
||||||
import org.thingsboard.server.dao.usagerecord.ApiLimitService;
|
import org.thingsboard.server.dao.usagerecord.ApiLimitService;
|
||||||
import org.thingsboard.server.gen.transport.TransportProtos.CalculatedFieldTelemetryMsgProto;
|
import org.thingsboard.server.gen.transport.TransportProtos.CalculatedFieldTelemetryMsgProto;
|
||||||
@ -44,7 +43,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class CalculatedFieldCtx {
|
public class CalculatedFieldCtx {
|
||||||
@ -58,8 +56,6 @@ public class CalculatedFieldCtx {
|
|||||||
private final Map<String, Argument> arguments;
|
private final Map<String, Argument> arguments;
|
||||||
private final Map<ReferencedEntityKey, String> mainEntityArguments;
|
private final Map<ReferencedEntityKey, String> mainEntityArguments;
|
||||||
private final Map<EntityId, Map<ReferencedEntityKey, String>> linkedEntityArguments;
|
private final Map<EntityId, Map<ReferencedEntityKey, String>> linkedEntityArguments;
|
||||||
|
|
||||||
private final Map<TbPair<EntityId, ReferencedEntityKey>, String> referencedEntityKeys;
|
|
||||||
private final List<String> argNames;
|
private final List<String> argNames;
|
||||||
private Output output;
|
private Output output;
|
||||||
private String expression;
|
private String expression;
|
||||||
@ -93,11 +89,6 @@ public class CalculatedFieldCtx {
|
|||||||
linkedEntityArguments.computeIfAbsent(refId, key -> new HashMap<>()).put(refKey, entry.getKey());
|
linkedEntityArguments.computeIfAbsent(refId, key -> new HashMap<>()).put(refKey, entry.getKey());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.referencedEntityKeys = arguments.entrySet().stream()
|
|
||||||
.collect(Collectors.toMap(
|
|
||||||
entry -> new TbPair<>(entry.getValue().getRefEntityId() == null ? entityId : entry.getValue().getRefEntityId(), entry.getValue().getRefEntityKey()),
|
|
||||||
Map.Entry::getKey
|
|
||||||
));
|
|
||||||
this.argNames = new ArrayList<>(arguments.keySet());
|
this.argNames = new ArrayList<>(arguments.keySet());
|
||||||
this.output = configuration.getOutput();
|
this.output = configuration.getOutput();
|
||||||
this.expression = configuration.getExpression();
|
this.expression = configuration.getExpression();
|
||||||
|
|||||||
@ -18,8 +18,6 @@ package org.thingsboard.script.api.tbel;
|
|||||||
import com.google.common.primitives.Bytes;
|
import com.google.common.primitives.Bytes;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.ArrayUtils;
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
import org.mvel2.ConversionHandler;
|
|
||||||
import org.mvel2.DataConversion;
|
|
||||||
import org.mvel2.ExecutionContext;
|
import org.mvel2.ExecutionContext;
|
||||||
import org.mvel2.ParserConfiguration;
|
import org.mvel2.ParserConfiguration;
|
||||||
import org.mvel2.execution.ExecutionArrayList;
|
import org.mvel2.execution.ExecutionArrayList;
|
||||||
@ -259,6 +257,8 @@ public class TbUtils {
|
|||||||
float.class, int.class)));
|
float.class, int.class)));
|
||||||
parserConfig.addImport("toInt", new MethodStub(TbUtils.class.getMethod("toInt",
|
parserConfig.addImport("toInt", new MethodStub(TbUtils.class.getMethod("toInt",
|
||||||
double.class)));
|
double.class)));
|
||||||
|
parserConfig.addImport("isNaN", new MethodStub(TbUtils.class.getMethod("isNaN",
|
||||||
|
double.class)));
|
||||||
parserConfig.addImport("hexToBytes", new MethodStub(TbUtils.class.getMethod("hexToBytes",
|
parserConfig.addImport("hexToBytes", new MethodStub(TbUtils.class.getMethod("hexToBytes",
|
||||||
ExecutionContext.class, String.class)));
|
ExecutionContext.class, String.class)));
|
||||||
parserConfig.addImport("hexToBytesArray", new MethodStub(TbUtils.class.getMethod("hexToBytesArray",
|
parserConfig.addImport("hexToBytesArray", new MethodStub(TbUtils.class.getMethod("hexToBytesArray",
|
||||||
@ -1163,6 +1163,10 @@ public class TbUtils {
|
|||||||
return BigDecimal.valueOf(value).setScale(0, RoundingMode.HALF_UP).intValue();
|
return BigDecimal.valueOf(value).setScale(0, RoundingMode.HALF_UP).intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isNaN(double value) {
|
||||||
|
return Double.isNaN(value);
|
||||||
|
}
|
||||||
|
|
||||||
public static ExecutionHashMap<String, Object> toFlatMap(ExecutionContext ctx, Map<String, Object> json) {
|
public static ExecutionHashMap<String, Object> toFlatMap(ExecutionContext ctx, Map<String, Object> json) {
|
||||||
return toFlatMap(ctx, json, new ArrayList<>(), true);
|
return toFlatMap(ctx, json, new ArrayList<>(), true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1138,12 +1138,18 @@ public class TbUtilsTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void toInt() {
|
public void toInt() {
|
||||||
Assertions.assertEquals(1729, TbUtils.toInt(doubleVal));
|
Assertions.assertEquals(1729, TbUtils.toInt(doubleVal));
|
||||||
Assertions.assertEquals(13, TbUtils.toInt(12.8));
|
Assertions.assertEquals(13, TbUtils.toInt(12.8));
|
||||||
Assertions.assertEquals(28, TbUtils.toInt(28.0));
|
Assertions.assertEquals(28, TbUtils.toInt(28.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isNaN() {
|
||||||
|
Assertions.assertFalse(TbUtils.isNaN(doubleVal));
|
||||||
|
Assertions.assertTrue(TbUtils.isNaN(Double.NaN));
|
||||||
|
}
|
||||||
|
|
||||||
private static List<Byte> toList(byte[] data) {
|
private static List<Byte> toList(byte[] data) {
|
||||||
List<Byte> result = new ArrayList<>(data.length);
|
List<Byte> result = new ArrayList<>(data.length);
|
||||||
for (Byte b : data) {
|
for (Byte b : data) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user