Browse Source

refactoring TbGetTelemetryCertainTimeRangeNode

pull/1052/head
Mitia Shvayka 8 years ago
parent
commit
ce77562a9e
  1. 56
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryCertainTimeRangeNode.java
  2. 16
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryCertainTimeRangeNodeConfiguration.java
  3. 6
      rule-engine/rule-engine-components/src/main/resources/public/static/rulenode/rulenode-core-config.js

56
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryCertainTimeRangeNode.java

@ -1,6 +1,20 @@
/**
* Copyright © 2016-2018 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.rule.engine.metadata; package org.thingsboard.rule.engine.metadata;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
@ -28,12 +42,14 @@ import static org.thingsboard.server.common.data.kv.Aggregation.NONE;
*/ */
@Slf4j @Slf4j
@RuleNode(type = ComponentType.ENRICHMENT, @RuleNode(type = ComponentType.ENRICHMENT,
name = "Get Telemtry from DataBase", name = "get telemetry from certain time range",
configClazz = TbGetTelemetryCertainTimeRangeNodeConfiguration.class, configClazz = TbGetTelemetryCertainTimeRangeNodeConfiguration.class,
nodeDescription = "", nodeDescription = "Fetch telemetry of certain time range based on the certain delay in the Message Metadata.\n",
nodeDetails = "", nodeDetails = "The node allows you to select fetch mode <b>FIRST/LAST/ALL</b> to fetch telemetry of certain time range that are added into Message metadata without any prefix. " +
uiResources = "", //{"static/rulenode/rulenode-core-config.js"}, "If selected fetch mode <b>ALL</b> Telemetry will be added like array into Message Metadata where <b>key</b> is Timestamp and <b>value</b> is value of Telemetry. " +
configDirective = "") "If selected fetch mode <b>FIRST</b> or <b>LAST</b> Telemetry will be added like string without Timestamp",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbEnrichmentNodeGetTelemetryFromDatabase")
public class TbGetTelemetryCertainTimeRangeNode implements TbNode { public class TbGetTelemetryCertainTimeRangeNode implements TbNode {
private TbGetTelemetryCertainTimeRangeNodeConfiguration config; private TbGetTelemetryCertainTimeRangeNodeConfiguration config;
@ -62,32 +78,34 @@ public class TbGetTelemetryCertainTimeRangeNode implements TbNode {
long startTs = ts - startTsOffset; long startTs = ts - startTsOffset;
long endTs = ts - endTsOffset; long endTs = ts - endTsOffset;
if (tsKeyNames.isEmpty()) { if (tsKeyNames.isEmpty()) {
ctx.tellFailure(msg, new Exception("Telemetry not found")); ctx.tellFailure(msg, new Exception("Telemetry are not selected!"));
} else { } else {
for (String key : tsKeyNames) { for (String key : tsKeyNames) {
//TODO: handle direction; //TODO: handle direction;
queries.add(new BaseTsKvQuery(key, startTs, endTs, 1, limit, NONE)); queries.add(new BaseTsKvQuery(key, startTs, endTs, 1, limit, NONE));
if (limit == TbGetTelemetryCertainTimeRangeNodeConfiguration.MAX_FETCH_SIZE) {
resultNode.set(key, mapper.createArrayNode());
} else {
resultNode.putObject(key);
}
} }
try { try {
ListenableFuture<List<TsKvEntry>> list = ctx.getTimeseriesService().findAll(msg.getOriginator(), queries); ListenableFuture<List<TsKvEntry>> list = ctx.getTimeseriesService().findAll(msg.getOriginator(), queries);
DonAsynchron.withCallback(list, data -> { DonAsynchron.withCallback(list, data -> {
for (TsKvEntry tsKvEntry : data) { for (TsKvEntry tsKvEntry : data) {
JsonNode node = resultNode.get(tsKvEntry.getKey()); if (limit == TbGetTelemetryCertainTimeRangeNodeConfiguration.MAX_FETCH_SIZE) {
if (node.isArray()) { ArrayNode arrayNode;
ArrayNode arrayNode = (ArrayNode) node; if(resultNode.has(tsKvEntry.getKey())){
arrayNode.add(mapper.createObjectNode().put(String.valueOf(tsKvEntry.getTs()), tsKvEntry.getValueAsString())); arrayNode = (ArrayNode) resultNode.get(tsKvEntry.getKey());
arrayNode.add(mapper.createObjectNode().put(String.valueOf(tsKvEntry.getTs()), tsKvEntry.getValueAsString()));
}else {
arrayNode = mapper.createArrayNode();
arrayNode.add((mapper.createObjectNode().put(String.valueOf(tsKvEntry.getTs()), tsKvEntry.getValueAsString())));
resultNode.set(tsKvEntry.getKey(), arrayNode);
}
} else { } else {
ObjectNode object = mapper.createObjectNode().put(String.valueOf(tsKvEntry.getTs()), tsKvEntry.getValueAsString()); resultNode.put(tsKvEntry.getKey(), tsKvEntry.getValueAsString());
resultNode.set(tsKvEntry.getKey(), object);
} }
} }
for (String key : tsKeyNames) { for (String key : tsKeyNames) {
msg.getMetaData().putValue(key, resultNode.get(key).toString()); if(resultNode.has(key)){
msg.getMetaData().putValue(key, resultNode.get(key).toString());
}
} }
TbMsg newMsg = ctx.newMsg(msg.getType(), msg.getOriginator(), msg.getMetaData(), msg.getData()); TbMsg newMsg = ctx.newMsg(msg.getType(), msg.getOriginator(), msg.getMetaData(), msg.getData());
ctx.tellNext(newMsg, SUCCESS); ctx.tellNext(newMsg, SUCCESS);

16
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryCertainTimeRangeNodeConfiguration.java

@ -1,3 +1,18 @@
/**
* Copyright © 2016-2018 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.rule.engine.metadata; package org.thingsboard.rule.engine.metadata;
import lombok.Data; import lombok.Data;
@ -32,6 +47,7 @@ public class TbGetTelemetryCertainTimeRangeNodeConfiguration implements NodeConf
public TbGetTelemetryCertainTimeRangeNodeConfiguration defaultConfiguration() { public TbGetTelemetryCertainTimeRangeNodeConfiguration defaultConfiguration() {
TbGetTelemetryCertainTimeRangeNodeConfiguration configuration = new TbGetTelemetryCertainTimeRangeNodeConfiguration(); TbGetTelemetryCertainTimeRangeNodeConfiguration configuration = new TbGetTelemetryCertainTimeRangeNodeConfiguration();
configuration.setLatestTsKeyNames(Collections.emptyList()); configuration.setLatestTsKeyNames(Collections.emptyList());
configuration.setFetchMode("FIRST");
configuration.setStartIntervalTimeUnit(TimeUnit.MINUTES.name()); configuration.setStartIntervalTimeUnit(TimeUnit.MINUTES.name());
configuration.setStartInterval(1); configuration.setStartInterval(1);
configuration.setEndIntervalTimeUnit(TimeUnit.MINUTES.name()); configuration.setEndIntervalTimeUnit(TimeUnit.MINUTES.name());

6
rule-engine/rule-engine-components/src/main/resources/public/static/rulenode/rulenode-core-config.js

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save