/**
* input query = field:abcAND(field<bcdOR(field:defANDfield>=efg))
* return field:abc,field<bcd,field:def,field>=efg,AND,OR,AND
* @param root
* @param query
* @param predicates
* @return
* @return
*/
private Predicate populatePredicates(Root<T> root, String query)
{
if(StringUtils.countOccurrencesOf(query, Conjunctions.SP.toString()) == StringUtils.countOccurrencesOf(query, Conjunctions.EP.toString())) {
LinkedList<String> postfix = createPostfixExpression(query);
boolean hasSingleSearchField = postfix.size() == 1;
Map<String, Predicate> predicateMap = new LinkedHashMap<>();
for (int i = 0; i < postfix.size(); i++)
{
String attr = postfix.get(i);
if(Conjunctions.isConjunction(attr)) {
String rightOperand = postfix.get(i-1);
String leftOperand = postfix.get(i-2);
String key = rightOperand + attr + leftOperand;
Predicate rightPredicate = (predicateMap.containsKey(rightOperand))? predicateMap.get(rightOperand) : buildPredicate(root, new SearchField(rightOperand));
Predicate leftPredicate = (predicateMap.containsKey(leftOperand))? predicateMap.get(leftOperand) : buildPredicate(root, new SearchField(leftOperand));
postfix.set(i-2, key);
postfix.remove(i);
postfix.remove(i-1);
//reset loop
i=0;
List<Predicate> combinedPredicates = new ArrayList<>();
combinedPredicates.add(leftPredicate);
combinedPredicates.add(rightPredicate);
Predicate combinedPredicate = buildPredicateWithOperator(root, Conjunctions.getEnum(attr), combinedPredicates);
predicateMap.put(key, combinedPredicate);
}
}
if(hasSingleSearchField) {
SearchField field = new SearchField(postfix.get(0));
predicateMap.put(postfix.get(0), buildPredicate(root, field));
}
return (Predicate) predicateMap.values().toArray()[predicateMap.size()-1];
} else {
throw new RuntimeException("MALFORMED.QUERY");
}
}
CriteriaServiceImpl.java 文件源码
java
阅读 33
收藏 0
点赞 0
评论 0
项目:CriteriaBuilder
作者:
评论列表
文章目录