From bceeac55f05979fc0e9ac2d42a1a4ffcd453ad12 Mon Sep 17 00:00:00 2001 From: zhou-hao Date: Thu, 16 Jul 2020 18:58:43 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=A7=84=E5=88=99?= =?UTF-8?q?=E5=BC=95=E6=93=8E=E8=AE=A2=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rule/engine/messaging/RuleEngineSubscriptionProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetlinks-components/rule-engine-component/src/main/java/org/jetlinks/community/rule/engine/messaging/RuleEngineSubscriptionProvider.java b/jetlinks-components/rule-engine-component/src/main/java/org/jetlinks/community/rule/engine/messaging/RuleEngineSubscriptionProvider.java index 9aa7fa2d..c6fe296c 100644 --- a/jetlinks-components/rule-engine-component/src/main/java/org/jetlinks/community/rule/engine/messaging/RuleEngineSubscriptionProvider.java +++ b/jetlinks-components/rule-engine-component/src/main/java/org/jetlinks/community/rule/engine/messaging/RuleEngineSubscriptionProvider.java @@ -36,7 +36,7 @@ public class RuleEngineSubscriptionProvider implements SubscriptionProvider { @Override public Flux subscribe(SubscribeRequest request) { - return messageGateway.subscribe(Subscription.asList(request.getTopic()), "rule:sub:" + request.getId(), true) + return messageGateway.subscribe(Subscription.asList(request.getTopic()),messageGateway.nextSubscriberId( "rule:sub:" + request.getId()), true) .map(msg -> Message.success(request.getId(), msg.getTopic(), msg.convertMessage())); } } From 64df73abdbd0939f86dadc184a358260dfab8bd2 Mon Sep 17 00:00:00 2001 From: zhou-hao Date: Mon, 20 Jul 2020 10:37:30 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/service/term/DeviceTagTerm.java | 64 +++++++++++++++---- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/term/DeviceTagTerm.java b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/term/DeviceTagTerm.java index bd0f474c..8a956079 100644 --- a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/term/DeviceTagTerm.java +++ b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/term/DeviceTagTerm.java @@ -1,5 +1,6 @@ package org.jetlinks.community.device.service.term; +import com.alibaba.fastjson.JSON; import org.hswebframework.ezorm.core.param.Term; import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata; import org.hswebframework.ezorm.rdb.operator.builder.fragments.PrepareSqlFragments; @@ -7,6 +8,12 @@ import org.hswebframework.ezorm.rdb.operator.builder.fragments.SqlFragments; import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTermFragmentBuilder; import org.springframework.stereotype.Component; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + /** * where("id$dev-tag$location","重庆") */ @@ -16,39 +23,70 @@ public class DeviceTagTerm extends AbstractTermFragmentBuilder { super("dev-tag", "根据设备标签查询设备"); } - private void acceptTerm(PrepareSqlFragments fragments, String terms) { + List> tags; + //json if (terms.startsWith("[")) { - // + tags = (List) JSON.parseArray(terms, Map.class); + } else if (terms.startsWith("{")) { + acceptTerm(fragments, JSON.parseObject(terms)); + return; + } else { + tags = Stream.of(terms.split("[,]")) + .map(str -> str.split("[:]")) + .map(str -> { + Map tag = new HashMap<>(); + tag.put("key", str[0]); + tag.put("value", str.length > 1 ? str[1] : null); + return tag; + }) + .collect(Collectors.toList()); } - String[] tags = terms.split("[,]"); + acceptTerm(fragments, tags); + } + + private void acceptTerm(PrepareSqlFragments fragments, Map terms) { + acceptTerm(fragments, terms.entrySet().stream().map(e -> { + Map tag = new HashMap<>(); + tag.put("key", String.valueOf(e.getKey())); + tag.put("value", String.valueOf(e.getValue())); + return tag; + }).collect(Collectors.toList())); + } + + private void acceptTerm(PrepareSqlFragments fragments, List> tags) { + int len = 0; fragments.addSql("and ("); - - for (String tag : tags) { - String[] kv = tag.split("[:]"); - if (kv.length != 2) { - continue; - } + for (Map tag : tags) { if (len++ > 0) { fragments.addSql("or"); } - fragments.addSql("(d.key = ? and d.value like ?)").addParameter(kv[0], kv[1]); + fragments.addSql("(d.key = ? and d.value like ?)").addParameter(tag.get("key"), tag.get("value")); + } + if (tags.isEmpty()) { + fragments.addSql("1=2"); } fragments.addSql(")"); - } @Override public SqlFragments createFragments(String columnFullName, RDBColumnMetadata column, Term term) { - String val = String.valueOf(term.getValue()); + PrepareSqlFragments fragments = PrepareSqlFragments.of(); fragments.addSql("exists(select 1 from dev_device_tags d where d.device_id =", columnFullName); + Object value = term.getValue(); - acceptTerm(fragments,val); + if (value instanceof Map) { + acceptTerm(fragments, (Map) value); + } else if (value instanceof List) { + acceptTerm(fragments, (List>) value); + } else { + acceptTerm(fragments, String.valueOf(value)); + } fragments.addSql(")");