feat(基础模块): 优化es查询条件值类型转换

This commit is contained in:
zhouhao 2023-06-01 15:15:51 +08:00
parent ec66ae9ae7
commit ad66985fb1
1 changed files with 47 additions and 11 deletions

View File

@ -9,6 +9,7 @@ import org.elasticsearch.search.sort.SortOrder;
import org.hswebframework.ezorm.core.param.QueryParam;
import org.hswebframework.ezorm.core.param.Sort;
import org.hswebframework.ezorm.core.param.Term;
import org.hswebframework.ezorm.core.param.TermType;
import org.jetlinks.community.elastic.search.index.ElasticSearchIndexMetadata;
import org.jetlinks.community.elastic.search.parser.DefaultLinkTypeParser;
import org.jetlinks.community.utils.ConverterUtils;
@ -43,26 +44,61 @@ public class QueryParamTranslator {
};
private static boolean maybeList(Term term) {
switch (term.getTermType().toLowerCase()) {
case TermType.in:
case TermType.nin:
case TermType.btw:
case TermType.nbtw:
return true;
}
return false;
}
private static boolean isDoNotConvertValue(Term term) {
switch (term.getTermType().toLowerCase()) {
case TermType.isnull:
case TermType.notnull:
case TermType.empty:
case TermType.nempty:
return true;
}
return false;
}
private static Object convertValue(DataType type, Object val) {
if (type instanceof DateTimeType) {
return TimeUtils.convertToDate(val).getTime();
} else if (type instanceof Converter) {
return ((Converter<?>) type).convert(val);
}
return val;
}
public static QueryBuilder createQueryBuilder(QueryParam queryParam, ElasticSearchIndexMetadata metadata) {
BoolQueryBuilder queryBuilders = QueryBuilders.boolQuery();
Consumer<Term> paramConverter = doNotingParamConverter;
if (metadata != null) {
paramConverter = t -> {
if (ObjectUtils.isEmpty(t.getColumn())) {
if (ObjectUtils.isEmpty(t.getColumn()) || isDoNotConvertValue(t)) {
return;
}
PropertyMetadata property = metadata.getProperty(t.getColumn());
if (null != property) {
DataType type = property.getValueType();
t.setValue(
ConverterUtils.tryConvertToList(t.getValue(), val -> {
if (type instanceof DateTimeType) {
return TimeUtils.convertToDate(val).getTime();
} else if (type instanceof Converter) {
return ((Converter<?>) type).convert(val);
}
return val;
}));
Object value;
if (maybeList(t)) {
value = ConverterUtils.tryConvertToList(t.getValue(), v -> convertValue(type, v));
} else {
value = convertValue(type, t.getValue());
}
if (null != value) {
t.setValue(value);
} else {
log.warn("Can not convert {} to {}", t.getValue(), type.getId());
}
converter.getOrDefault(type.getId(), defaultDataTypeConverter).accept(type, t);
}
};
@ -85,7 +121,7 @@ public class QueryParamTranslator {
}
}
return sourceBuilder.query(createQueryBuilder(queryParam,metadata));
return sourceBuilder.query(createQueryBuilder(queryParam, metadata));
}
}