package org.apache.solr.analysis;
import java.util.*;
import org.apache.solr.common.util.StrUtils;
public class WriteableExplicitSynonymMap extends WriteableSynonymMap {
@Override
public void add(String key, Set<String> values) {
Set<String> masterSet;
if (containsKey(key)) {
masterSet = get(key);
}
else {
masterSet = new LinkedHashSet<String>();
put(key, masterSet);
}
masterSet.addAll(values);
}
/*
* this is much simplified version of synonym rules that
* supports:
*
* token=>token,token\\ tokenb,token
*/
@Override
public void populateMap(List<String> rules) {
for (String rule : rules) {
List<String> mapping = StrUtils.splitSmart(rule, "=>", false);
if (mapping.size() != 2) {
log.error("Invalid Synonym Rule:" + rule);
continue;
}
String key = mapping.get(0).trim().replace("\\,", ",").replace("\\ ", " ");
Set<String> values = splitValues(mapping.get(1));
add(key, values);
}
}
@Override
public String formatEntry(String key, Set<String> values) {
StringBuffer out = new StringBuffer();
out.append(key.replace(",", "\\,").replace(" ", "\\ "));
out.append("=>");
boolean notFirst = false;
for (String s : values) {
if (notFirst) out.append(",");
out.append(s.replace(",", "\\,").replace(" ", "\\ "));
notFirst=true;
}
out.append("\n");
return out.toString();
}
}