fix: 修复标签条件获取错误问题
This commit is contained in:
parent
49345c9062
commit
05abda43c7
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue