package org.apache.solr.analysis;
import java.io.*;
import java.util.HashSet;
import java.util.LinkedHashSet;
import org.apache.commons.io.FileUtils;
import org.apache.lucene.util.LuceneTestCase;
public class TestWriteableSynonymMap extends LuceneTestCase {
public void testExplicitMap() throws IOException, InterruptedException {
String expected = "Foo\\,\\ Bär=>Foo\\,\\ Bar,Foo\\,\\ Baer\n" +
"Boo\\,\\ Bär=>Boo\\,\\ Bar,Boo\\,\\ Baer";
File tmpFile = createTempFile(expected);
// create a synonym map
WriteableSynonymMap synMap = new WriteableExplicitSynonymMap();
synMap.setOutput(tmpFile.getAbsolutePath());
synMap.populateMap(synMap.getLines(tmpFile.getAbsolutePath()));
assertTrue(synMap.containsKey("Foo, Bär"));
assertTrue(!synMap.containsKey("Foo, Bar"));
assertTrue(!synMap.containsKey("Foo, Baer"));
assertTrue(synMap.get("Foo, Bär").contains("Foo, Bar"));
assertTrue(synMap.get("Foo, Bär").contains("Foo, Baer"));
assertTrue(synMap.containsKey("Boo, Bär"));
assertTrue(!synMap.containsKey("Boo, Bar"));
assertTrue(!synMap.containsKey("Boo, Baer"));
assertTrue(synMap.get("Boo, Bär").contains("Boo, Bar"));
assertTrue(synMap.get("Boo, Bär").contains("Boo, Baer"));
synMap.persist();
String fc = readFile(tmpFile);
assertTrue(fc.contains("Foo\\,\\ Bär=>Foo\\,\\ Bar,Foo\\,\\ Baer\n"));
assertTrue(fc.contains("Boo\\,\\ Bär=>Boo\\,\\ Bar,Boo\\,\\ Baer"));
// add some synonyms
synMap.add("Foo, Bär", new LinkedHashSet<String>() {{ add("Fuu, Bar"); add("Foo, Baer"); }});
synMap.add("Fuu, Bar", new LinkedHashSet<String>() {{ add("Fuj, Taj");}});
assertTrue(synMap.containsKey("Fuu, Bar"));
assertTrue(synMap.get("Fuu, Bar").contains("Fuj, Taj"));
assertTrue(!synMap.get("Foo, Bär").contains("Fuj, Taj"));
assertTrue(synMap.get("Foo, Bär").contains("Fuu, Bar"));
synMap.persist();
fc = readFile(tmpFile);
assertTrue(fc.contains("Foo\\,\\ Bär=>Foo\\,\\ Bar,Foo\\,\\ Baer,Fuu\\,\\ Bar\n"));
assertTrue(fc.contains("Boo\\,\\ Bär=>Boo\\,\\ Bar,Boo\\,\\ Baer"));
FileUtils.deleteQuietly(tmpFile);
}
public void testEquivalentMap() throws IOException, InterruptedException {
String expected = "Foo\\,\\ Bär,Foo\\,\\ Bar,Foo\\,\\ Baer\n" +
"Boo\\,\\ Bär,Boo\\,\\ Bar,Boo\\,\\ Baer";
File tmpFile = createTempFile(expected);
// create a synonym map
WriteableSynonymMap synMap = new WriteableEquivalentSynonymMap();
synMap.setOutput(tmpFile.getAbsolutePath());
synMap.populateMap(synMap.getLines(tmpFile.getAbsolutePath()));
// values are stored inside the same set
assertTrue(synMap.containsKey("Foo, Bär"));
assertEquals(synMap.get("Foo, Bär"), synMap.get("Foo, Bar"));
assertEquals(synMap.get("Foo, Bär"), synMap.get("Foo, Baer"));
assertSame(synMap.get("Foo, Bär"), synMap.get("Foo, Bar"));
assertSame(synMap.get("Foo, Bär"), synMap.get("Foo, Baer"));
assertSame(synMap.get("Foo, Bar"), synMap.get("Foo, Baer"));
assertTrue(synMap.containsKey("Boo, Bär"));
assertEquals(synMap.get("Boo, Bär"), synMap.get("Boo, Bar"));
assertEquals(synMap.get("Boo, Bär"), synMap.get("Boo, Baer"));
assertSame(synMap.get("Boo, Bär"), synMap.get("Boo, Bar"));
assertSame(synMap.get("Boo, Bar"), synMap.get("Boo, Baer"));
synMap.persist();
String fc = readFile(tmpFile);
assertTrue(fc.contains("Foo\\,\\ Bär,Foo\\,\\ Bar,Foo\\,\\ Baer\n"));
assertTrue(fc.contains("Boo\\,\\ Bär,Boo\\,\\ Bar,Boo\\,\\ Baer"));
// add some synonyms
synMap.add("Foo, Bär", new HashSet<String>() {{ add("Fuu, Bar"); add("Foo, Baer"); }});
assertTrue(synMap.containsKey("Fuu, Bar"));
assertEquals(synMap.get("Fuu, Bar"), synMap.get("Foo, Bär"));
assertEquals(synMap.get("Fuu, Bar"), synMap.get("Foo, Bar"));
assertEquals(synMap.get("Fuu, Bar"), synMap.get("Foo, Baer"));
assertSame(synMap.get("Fuu, Bar"), synMap.get("Foo, Bär"));
assertSame(synMap.get("Fuu, Bar"), synMap.get("Foo, Bar"));
assertSame(synMap.get("Fuu, Bar"), synMap.get("Foo, Baer"));
synMap.persist();
fc = readFile(tmpFile);
assertTrue(fc.contains("Foo\\,\\ Bär,Foo\\,\\ Bar,Foo\\,\\ Baer,Fuu\\,\\ Bar\n"));
assertTrue(fc.contains("Boo\\,\\ Bär,Boo\\,\\ Bar,Boo\\,\\ Baer"));
FileUtils.deleteQuietly(tmpFile);
}
private String readFile(File tmpFile) throws IOException {
FileInputStream in = new FileInputStream(tmpFile);
BufferedReader fi = new BufferedReader(new InputStreamReader(new DataInputStream(in), "UTF-8"));
StringBuffer out = new StringBuffer();
String strLine;
while ((strLine = fi.readLine()) != null) {
out.append(strLine);
out.append("\n");
}
return out.toString();
}
private void checkOutput(File tmpFile, String expected) throws IOException {
assertEquals(expected, readFile(tmpFile));
}
private File createTempFile(String...lines) throws IOException {
File tmpFile = File.createTempFile("montySolr-unittest", null);
if (lines.length > 0) {
FileOutputStream fi = FileUtils.openOutputStream(tmpFile);
StringBuffer out = new StringBuffer();
for (String l: lines) {
out.append(l + "\n");
}
FileUtils.writeStringToFile(tmpFile, out.toString(), "UTF-8");
}
return tmpFile;
}
}