Revision 61831
Added by Claudio Atzori over 2 years ago
TermNode.java | ||
---|---|---|
2 | 2 |
|
3 | 3 |
import java.text.ParseException; |
4 | 4 |
import java.text.SimpleDateFormat; |
5 |
import java.util.Arrays; |
|
5 | 6 |
import java.util.List; |
6 | 7 |
import java.util.Map; |
7 | 8 |
import java.util.Map.Entry; |
9 |
import java.util.Optional; |
|
10 |
import java.util.stream.Collectors; |
|
11 |
import java.util.stream.Stream; |
|
12 |
import java.util.stream.StreamSupport; |
|
8 | 13 |
|
9 | 14 |
import com.google.common.base.Function; |
10 | 15 |
import com.google.common.base.Joiner; |
... | ... | |
50 | 55 |
|
51 | 56 |
@Override |
52 | 57 |
public String toLucene() { |
53 |
//StringTokenizer termTokenizer = new StringTokenizer(value, " "); |
|
54 |
//StringTokenizer weightTokenizer = new StringTokenizer(value, " "); |
|
55 |
final Iterable<String> termTokenizer = Splitter.on(" ").omitEmptyStrings().split(value); |
|
56 |
final Iterable<String> weightTokenizer = Splitter.on(" ").omitEmptyStrings().split(value); |
|
58 |
return _toLucene().trim(); |
|
59 |
} |
|
60 |
|
|
61 |
private String _toLucene() { |
|
62 |
final Stream<String> termTokenizer = Splitter.on(" ").omitEmptyStrings().splitToList(value).stream(); |
|
63 |
final Stream<String> weightTokenizer = Splitter.on(" ").omitEmptyStrings().splitToList(value).stream(); |
|
57 | 64 |
switch (rel) { |
58 | 65 |
case EXACT: |
59 | 66 |
final String lucene = getFieldName() + ":" + "\"" + value + "\""; |
60 | 67 |
return StringUtils.isNotBlank(weight()) ? lucene + weight() + " " + expand(value) : lucene; |
61 | 68 |
case EQUAL: |
62 | 69 |
case ALL: |
63 |
return "(" + handleTokens(termTokenizer, "AND") + " " + expandTokens(weightTokenizer) + ")"; |
|
64 | 70 |
case ANY: |
65 |
return "(" + handleTokens(termTokenizer, "OR") + " " + expandTokens(weightTokenizer) + ")";
|
|
71 |
return handleTokens(termTokenizer) + " " + expandTokens(weightTokenizer);
|
|
66 | 72 |
case NOT: |
67 | 73 |
return "NOT " + field + ":" + "\"" + value + "\""; |
68 | 74 |
case LT: |
... | ... | |
108 | 114 |
return (weights != null) && (weights.get(field) != null) ? "^" + weights.get(field) : ""; |
109 | 115 |
} |
110 | 116 |
|
111 |
private String expandTokens(final Iterable<String> tokens) { |
|
112 |
return Joiner.on("").skipNulls().join(Iterables.transform(tokens, new Function<String, String>() { |
|
113 |
@Override |
|
114 |
public String apply(final String s) { |
|
115 |
if (field.equals(dnetDefaultField.toLowerCase()) || field.equals(dnetDefaultField.toLowerCase())) { |
|
116 |
return expand(s); |
|
117 |
} |
|
118 |
return null; |
|
119 |
} |
|
120 |
})).trim(); |
|
117 |
private String expandTokens(final Stream<String> tokens) { |
|
118 |
return tokens |
|
119 |
.filter(s -> field.equals(dnetDefaultField.toLowerCase())) |
|
120 |
.map(s -> expand(s)) |
|
121 |
.collect(Collectors.joining("")) |
|
122 |
.trim(); |
|
121 | 123 |
} |
122 | 124 |
|
123 | 125 |
private String expand(final String token) { |
... | ... | |
130 | 132 |
return ret.trim(); |
131 | 133 |
} |
132 | 134 |
|
133 |
private String handleTokens(final Iterable<String> tokens, final String op) { |
|
134 |
final String separator = " " + op + " "; |
|
135 |
return Joiner.on(separator).join(Iterables.transform(tokens, new Function<String, String>() { |
|
136 |
@Override |
|
137 |
public String apply(final String s) { |
|
138 |
return field + ":" + checkEscaping(s) + weight(); |
|
139 |
} |
|
140 |
})).trim(); |
|
135 |
private String handleTokens(final Stream<String> tokens) { |
|
136 |
//final String separator = " " + op + " "; |
|
137 |
final String separator = " "; |
|
138 |
return tokens |
|
139 |
.map(t -> field + ":" + checkEscaping(t) + weight()) |
|
140 |
.collect(Collectors.joining(separator)) |
|
141 |
.trim(); |
|
141 | 142 |
} |
142 | 143 |
|
143 | 144 |
private String checkEscaping(String token) { |
Also available in: Unified diff
updated term node serialization to meet the requirements discussed in https://support.openaire.eu/issues/7083