Project

General

Profile

1
package eu.dnetlib.functionality.cql;
2

    
3
import java.util.HashMap;
4
import java.util.List;
5
import java.util.Map;
6

    
7
import org.z3950.zing.cql.CQLAndNode;
8
import org.z3950.zing.cql.CQLBooleanNode;
9
import org.z3950.zing.cql.CQLNode;
10
import org.z3950.zing.cql.CQLPrefixNode;
11
import org.z3950.zing.cql.CQLTermNode;
12
import org.z3950.zing.cql.ModifierSet;
13

    
14
public class CqlGroup {
15

    
16
	public static final String defaultTerm = "cql.filtered";
17

    
18
	public Map<String, CQLNode> group(final CQLNode node, final List<String> fields) {
19
		return node != null ? doGroup(node, fields, new HashMap<String, CQLNode>()) : new HashMap<String, CQLNode>();
20
	}
21

    
22
	private Map<String, CQLNode> doGroup(CQLNode node, List<String> fields, Map<String, CQLNode> groups) {
23

    
24
		if (node instanceof CQLBooleanNode) {
25
			return doGroup((CQLBooleanNode) node, fields, groups);
26
		}
27

    
28
		if (node instanceof CQLTermNode) {
29
			return doGroup((CQLTermNode) node, fields, groups);
30
		}
31
		
32
		if (node instanceof CQLPrefixNode) {
33
			return groups;
34
		}
35

    
36
		throw new RuntimeException("error choice");
37
	}
38

    
39
	private Map<String, CQLNode> doGroup(CQLBooleanNode node, List<String> fields, Map<String, CQLNode> groups) {
40

    
41
		doGroup(node.left, fields, groups);
42
		doGroup(node.right, fields, groups);
43

    
44
		return groups;
45
	}
46

    
47
	private static Map<String, CQLNode> doGroup(CQLTermNode node, List<String> fields, Map<String, CQLNode> groups) {
48

    
49
		if (isTermNodeToGroup(node, fields)) {
50
			String term = node.getIndex().toLowerCase();
51

    
52
			if (groups.get(term) == null) {
53
				groups.put(term, node);
54
			}
55

    
56
			CQLNode group = groups.get(term);
57
			CQLAndNode andNode = new CQLAndNode(group, node, new ModifierSet("and"));
58

    
59
			if (!groups.containsValue(node)) {
60
				groups.put(term, andNode);
61
			}
62
		}
63

    
64
		return groups;
65
	}
66

    
67
	private static boolean isTermNodeToGroup(CQLTermNode node, List<String> fields) {
68
		return fields.contains(node.getIndex().toLowerCase());
69
	}
70

    
71
}
(4-4/9)