fix: 修复标签条件获取错误问题

This commit is contained in:
zhouhao 2024-04-18 14:07:10 +08:00
parent 49345c9062
commit 05abda43c7
1 changed files with 40 additions and 16 deletions

View File

@ -11,6 +11,7 @@ import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTerm
import org.hswebframework.web.api.crud.entity.TermExpressionParser; import org.hswebframework.web.api.crud.entity.TermExpressionParser;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -32,13 +33,13 @@ public class DeviceTagTerm extends AbstractTermFragmentBuilder {
private void acceptTerm(boolean and, RDBColumnMetadata column, PrepareSqlFragments fragments, String terms) { private void acceptTerm(boolean and, RDBColumnMetadata column, PrepareSqlFragments fragments, String terms) {
//json //json
if (terms.startsWith("[")) { if (terms.startsWith("[")) {
acceptTerm(and, fragments, (List) JSON.parseArray(terms, Map.class)); acceptTerm(and, fragments, JSON.parseArray(terms, Map.class));
} else if (terms.startsWith("{")) { } else if (terms.startsWith("{")) {
acceptTerm(and, fragments, JSON.parseObject(terms)); acceptTerm(and, fragments, JSON.parseObject(terms));
} else if (terms.contains(":") && !terms.contains(" ")) { } else if (terms.contains(":") && !terms.contains(" ")) {
List<Map<String, String>> tags = Stream List<Map<String, String>> tags = Stream
.of(terms.split("[,]")) .of(terms.split(","))
.map(str -> str.split("[:]")) .map(str -> str.split(":"))
.map(str -> { .map(str -> {
Map<String, String> tag = new HashMap<>(); Map<String, String> tag = new HashMap<>();
tag.put("key", str[0]); tag.put("key", str[0]);
@ -50,7 +51,10 @@ public class DeviceTagTerm extends AbstractTermFragmentBuilder {
} else { } else {
//SQL表达式 //SQL表达式
List<Term> tagKeys = TermExpressionParser.parse(terms); List<Term> tagKeys = TermExpressionParser.parse(terms);
fragments.addSql("and (").addFragments(builder.createTermFragments(column, tagKeys)).addSql(")"); SqlFragments expr = builder.createTermFragments(column, tagKeys);
if (expr.isNotEmpty()) {
fragments.addSql("and (").addFragments(expr).addSql(")");
}
} }
} }
@ -64,15 +68,30 @@ public class DeviceTagTerm extends AbstractTermFragmentBuilder {
}).collect(Collectors.toList())); }).collect(Collectors.toList()));
} }
private void acceptTerm(boolean and, PrepareSqlFragments fragments, List<Map<String, String>> tags) { private void acceptTerm(boolean and, PrepareSqlFragments fragments, Collection<?> tags) {
int len = 0; int len = 0;
fragments.addSql("and ("); fragments.addSql("and (");
for (Map<String, String> tag : tags) { for (Object tag : tags) {
if (len++ > 0) { if (len++ > 0) {
fragments.addSql(and ? "and" : "or"); fragments.addSql(and ? "and" : "or");
} }
fragments.addSql("(d.key = ? and d.value like ?)").addParameter(tag.get("key"), tag.get("value")); String key;
String value;
if (tag instanceof Map) {
@SuppressWarnings("all")
Map<Object, Object> map = ((Map) tag);
//key or column
key = String.valueOf(map.getOrDefault("key", map.get("column")));
value = String.valueOf(map.get("value"));
} else if (tag instanceof Term) {
key = ((Term) tag).getColumn();
value = String.valueOf(((Term) tag).getValue());
} else {
throw new IllegalArgumentException("illegal tag value format");
}
fragments.addSql("(d.key = ? and d.value like ?)")
.addParameter(key, value);
} }
if (tags.isEmpty()) { if (tags.isEmpty()) {
fragments.addSql("1=2"); fragments.addSql("1=2");
@ -85,14 +104,13 @@ public class DeviceTagTerm extends AbstractTermFragmentBuilder {
PrepareSqlFragments fragments = PrepareSqlFragments.of(); PrepareSqlFragments fragments = PrepareSqlFragments.of();
fragments.addSql("exists(select 1 from ",getTableName("dev_device_tags",column)," d where d.device_id =", columnFullName); fragments.addSql("exists(select 1 from ",getTableName("dev_device_tags",column)," d where d.device_id =", columnFullName);
Object value = term.getValue(); Object value = term.getValue();
boolean and = term.getOptions().contains("and"); boolean and = term.getOptions().contains("and");
if (value instanceof Map) { if (value instanceof Map) {
acceptTerm(and, fragments, (Map<?, ?>) value); acceptTerm(and, fragments, (Map<?, ?>) value);
} else if (value instanceof List) { } else if (value instanceof Collection) {
acceptTerm(and, fragments, (List<Map<String, String>>) value); acceptTerm(and, fragments, (Collection<?>) value);
} else { } else {
acceptTerm(and, column, fragments, String.valueOf(value)); acceptTerm(and, column, fragments, String.valueOf(value));
} }
@ -113,11 +131,17 @@ public class DeviceTagTerm extends AbstractTermFragmentBuilder {
PrepareSqlFragments sqlFragments = PrepareSqlFragments.of(); PrepareSqlFragments sqlFragments = PrepareSqlFragments.of();
sqlFragments.addSql("(d.key = ?") sqlFragments.addSql("(d.key = ?")
.addParameter(term.getColumn()) .addParameter(term.getColumn())
.addSql("and") .addSql("and");
.addFragments(parameter if (parameter == null) {
.findFeatureNow(TermFragmentBuilder.createFeatureId(term.getTermType())) sqlFragments.addSql("d.value = ?").addParameter(term.getValue());
.createFragments("d.value", parameter, term) } else {
).addSql(")"); sqlFragments.addFragments(parameter
.findFeatureNow(TermFragmentBuilder.createFeatureId(term.getTermType()))
.createFragments("d.value", parameter, term)
);
}
sqlFragments
.addSql(")");
return sqlFragments; return sqlFragments;
} }
@ -126,4 +150,4 @@ public class DeviceTagTerm extends AbstractTermFragmentBuilder {
return super.createTermFragments(parameter, terms); return super.createTermFragments(parameter, terms);
} }
} }
} }