package org.apache.solr.analysis;
import java.io.IOException;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class WriteableEquivalentSynonymMap extends WriteableSynonymMap {
private HashSet<Integer> alreadySeen;
public WriteableEquivalentSynonymMap() {
super();
alreadySeen = new HashSet<Integer>();
}
@Override
public void add(String key, Set<String> values) {
Set<String> masterSet = null;
if (containsKey(key)) {
masterSet = get(key);
}
else {
for (String k: values) {
if (containsKey(k)) {
masterSet = get(k);
break;
}
}
if (masterSet==null) {
masterSet = new LinkedHashSet<String>();
}
}
masterSet.add(key);
masterSet.addAll(values);
for (String redo: masterSet) {
put(redo, masterSet);
}
}
/*
* this parses the non-explicit mapping syntax:
*
* tokena, tokenb, tokenc
*/
@Override
public void populateMap(List<String> rules) {
for (String rule : rules) {
Set<String> tokens = splitValues(rule);
for (String t: tokens) {
add(t, tokens);
break; // we can skip the rest
}
}
}
@Override
public String formatEntry(String key, Set<String> values) {
if (alreadySeen.contains(values.hashCode())) {
return "";
}
alreadySeen.add(values.hashCode());
StringBuffer out = new StringBuffer();
boolean notFirst = false;
for (String s : values) {
if (notFirst) out.append(",");
out.append(s.replace(",", "\\,").replace(" ", "\\ "));
notFirst=true;
}
out.append("\n");
return out.toString();
}
@Override
public void clear() {
alreadySeen.clear();
super.clear();
}
@Override
public boolean persist(boolean append) throws IOException {
if (append == false) alreadySeen.clear();
return super.persist(append);
}
}