public static List<Term> parse(Map<String, Object> map) {
        if (MapUtils.isEmpty(map)) {
            return Collections.emptyList();
        }

        List<Term> terms = new ArrayList<>(map.size());
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            boolean isOr = false;
            Term term = new Term();

            //嵌套
            if (key.startsWith("$nest") ||
                    (isOr = key.startsWith("$orNest"))) {
                @SuppressWarnings("all")
                List<Term> nest = value instanceof Map ? parse(((Map<String, Object>) value)) : parse(String.valueOf(value));
                term.setTerms(nest);
            }
            //普通
            else {
                if (key.startsWith("$or$")) {
                    isOr = true;
                    key = key.substring(4);
                }
                term.setColumn(key);
                term.setValue(value);
            }

            if (isOr) {
                term.setType(Term.Type.or);
            }
            terms.add(term);
        }

        return terms;

    }
@Test
    public void testUrl(){
        List<Term> terms = TermExpressionParser.parse("type=email%20and%20provider=test");

        assertEquals(terms.get(0).getTermType(), TermType.eq);
        assertEquals(terms.get(0).getColumn(), "type");
        assertEquals(terms.get(0).getValue(), "email");

        assertEquals(terms.get(1).getTermType(), TermType.eq);
        assertEquals(terms.get(1).getColumn(), "provider");
        assertEquals(terms.get(1).getValue(), "test");

    }