package org.xbib.elasticsearch.index.analysis.langdetect;
import org.elasticsearch.Version;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.common.inject.ModulesBuilder;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.settings.SettingsModule;
import org.elasticsearch.env.Environment;
import org.elasticsearch.env.EnvironmentModule;
import org.elasticsearch.index.Index;
import org.elasticsearch.index.IndexNameModule;
import org.elasticsearch.index.analysis.AnalysisModule;
import org.elasticsearch.index.analysis.AnalysisService;
import org.elasticsearch.index.codec.docvaluesformat.DocValuesFormatService;
import org.elasticsearch.index.codec.postingsformat.PostingsFormatService;
import org.elasticsearch.index.mapper.DocumentMapper;
import org.elasticsearch.index.mapper.DocumentMapperParser;
import org.elasticsearch.index.mapper.ParseContext;
import org.elasticsearch.index.settings.IndexSettingsModule;
import org.elasticsearch.index.similarity.SimilarityLookupService;
import org.elasticsearch.indices.analysis.IndicesAnalysisModule;
import org.elasticsearch.indices.analysis.IndicesAnalysisService;
import org.junit.Assert;
import org.junit.Test;
import org.xbib.elasticsearch.plugin.analysis.german.AnalysisGermanPlugin;
import java.io.IOException;
import static org.elasticsearch.common.io.Streams.copyToStringFromClasspath;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
public class LangdetectMappingTests extends Assert {
@Test
public void testSimpleMappings() throws Exception {
String mapping = copyToStringFromClasspath("/org/xbib/elasticsearch/index/analysis/langdetect/simple-mapping.json");
DocumentMapper docMapper = createMapperParser().parse(mapping);
String sampleText = copyToStringFromClasspath("/org/xbib/elasticsearch/index/analysis/langdetect/english.txt");
BytesReference json = jsonBuilder().startObject().field("_id", 1).field("someField", sampleText).endObject().bytes();
ParseContext.Document doc = docMapper.parse(json).rootDoc();
assertEquals(doc.get(docMapper.mappers().smartName("someField").mapper().names().indexName()), sampleText);
assertEquals(doc.getFields("someField.lang").length, 1);
assertEquals(doc.getFields("someField.lang")[0].stringValue(), "eng");
// re-parse it
String builtMapping = docMapper.mappingSource().string();
docMapper = createMapperParser().parse(builtMapping);
json = jsonBuilder().startObject().field("_id", 1).field("someField", sampleText).endObject().bytes();
doc = docMapper.parse(json).rootDoc();
assertEquals(doc.get(docMapper.mappers().smartName("someField").mapper().names().indexName()), sampleText);
assertEquals(doc.getFields("someField.lang").length, 1);
assertEquals(doc.getFields("someField.lang")[0].stringValue(), "eng");
}
@Test
public void testBinary() throws Exception {
Settings settings = ImmutableSettings.EMPTY;
String mapping = copyToStringFromClasspath("/org/xbib/elasticsearch/index/analysis/langdetect/base64-mapping.json");
DocumentMapper docMapper = createMapperParser(settings).parse(mapping);
String sampleBinary = copyToStringFromClasspath("/org/xbib/elasticsearch/index/analysis/langdetect/base64.txt");
String sampleText = copyToStringFromClasspath("/org/xbib/elasticsearch/index/analysis/langdetect/base64-decoded.txt");
BytesReference json = jsonBuilder().startObject().field("_id", 1).field("someField", sampleBinary).endObject().bytes();
ParseContext.Document doc = docMapper.parse(json).rootDoc();
assertEquals(doc.get(docMapper.mappers().smartName("someField").mapper().names().indexName()), sampleText);
assertEquals(doc.getFields("someField.lang").length, 1);
assertEquals(doc.getFields("someField.lang")[0].stringValue(), "eng");
// re-parse it
String builtMapping = docMapper.mappingSource().string();
docMapper = createMapperParser(settings).parse(builtMapping);
json = jsonBuilder().startObject().field("_id", 1).field("someField", sampleText).endObject().bytes();
doc = docMapper.parse(json).rootDoc();
assertEquals(doc.get(docMapper.mappers().smartName("someField").mapper().names().indexName()), sampleText);
assertEquals(doc.getFields("someField.lang").length, 1);
assertEquals(doc.getFields("someField.lang")[0].stringValue(), "eng");
}
@Test
public void testMappings() throws Exception {
Settings settings = ImmutableSettings.settingsBuilder()
.loadFromClasspath("org/xbib/elasticsearch/index/analysis/langdetect/settings.json").build();
String mapping = copyToStringFromClasspath("/org/xbib/elasticsearch/index/analysis/langdetect/mapping.json");
DocumentMapper docMapper = createMapperParser(settings).parse(mapping);
String sampleText = copyToStringFromClasspath("/org/xbib/elasticsearch/index/analysis/langdetect/german.txt");
BytesReference json = jsonBuilder().startObject().field("_id", 1).field("someField", sampleText).endObject().bytes();
ParseContext.Document doc = docMapper.parse(json).rootDoc();
assertEquals(doc.get(docMapper.mappers().smartName("someField").mapper().names().indexName()), sampleText);
assertEquals(doc.getFields("someField.lang").length, 1);
assertEquals(doc.getFields("someField.lang")[0].stringValue(), "Deutsch");
}
private DocumentMapperParser createMapperParser() throws IOException {
return createMapperParser(ImmutableSettings.EMPTY);
}
private DocumentMapperParser createMapperParser(Settings fromSettings) throws IOException {
Index index = new Index("test");
Settings settings = ImmutableSettings.settingsBuilder()
.put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
.put(fromSettings)
.build();
Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings),
new EnvironmentModule(new Environment(settings)),
new IndicesAnalysisModule())
.createInjector();
AnalysisModule analysisModule = new AnalysisModule(settings, parentInjector.getInstance(IndicesAnalysisService.class));
new AnalysisGermanPlugin().onModule(analysisModule);
Injector injector = new ModulesBuilder().add(
new IndexSettingsModule(index, settings),
new IndexNameModule(index),
analysisModule)
.createChildInjector(parentInjector);
AnalysisService service =injector.getInstance(AnalysisService.class);
DocumentMapperParser mapperParser = new DocumentMapperParser(index,
settings,
service,
new PostingsFormatService(index),
new DocValuesFormatService(index),
new SimilarityLookupService(index, settings),
null
);
mapperParser.putTypeParser(LangdetectMapper.CONTENT_TYPE, new LangdetectMapper.TypeParser());
return mapperParser;
}
}