CriteriaServiceImpl.java 文件源码

java
阅读 33 收藏 0 点赞 0 评论 0

项目:CriteriaBuilder 作者:
/**
 * 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");
    }
}
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号