package org.compass.core.lucene; import java.io.Reader; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.document.Field; import org.compass.core.Property; import org.compass.core.Resource; import org.compass.core.ResourceFactory; import org.compass.core.converter.mapping.ResourcePropertyConverter; import org.compass.core.engine.RepeatableReader; import org.compass.core.engine.SearchEngineException; import org.compass.core.lucene.engine.LuceneSearchEngineFactory; import org.compass.core.lucene.support.FieldHelper; import org.compass.core.mapping.ResourcePropertyMapping; import org.compass.core.mapping.ReverseType; import org.compass.core.util.StringUtils; import org.compass.core.util.reader.ReverseStringReader; /** * @author kimchy */ public class LuceneResourceFactory implements ResourceFactory { private LuceneSearchEngineFactory searchEngineFactory; public LuceneResourceFactory(LuceneSearchEngineFactory searchEngineFactory) { this.searchEngineFactory = searchEngineFactory; } public String getNullValue() { return ""; } public boolean isNullValue(String value) { return value == null || value.length() == 0; } public Resource createResource(String alias) throws SearchEngineException { return new LuceneMultiResource(alias, searchEngineFactory); } public Property createProperty(String value, ResourcePropertyMapping mapping) throws SearchEngineException { return createProperty(mapping.getPath().getPath(), value, mapping); } public Property createProperty(String value, ResourcePropertyMapping mapping, Property.Store store, Property.Index index) throws SearchEngineException { return createProperty(mapping.getPath().getPath(), value, mapping, store, index); } public Property createProperty(String name, String value, ResourcePropertyMapping mapping) throws SearchEngineException { return createProperty(name, value, mapping, mapping.getStore(), mapping.getIndex()); } public Property createProperty(String name, String value, ResourcePropertyConverter converter) { Property.Store store = converter.suggestStore(); if (store == null) { store = Property.Store.YES; } Property.Index index = converter.suggestIndex(); if (index == null) { index = Property.Index.ANALYZED; } Property.TermVector termVector = converter.suggestTermVector(); if (termVector == null) { termVector = Property.TermVector.NO; } Property property = createProperty(name, value, store, index, termVector); if (converter.suggestOmitNorms() != null) { property.setOmitNorms(converter.suggestOmitNorms()); } if (converter.suggestOmitTf() != null) { property.setOmitTf(converter.suggestOmitTf()); } return property; } public Property createProperty(String name, String value, ResourcePropertyMapping mapping, Property.Store store, Property.Index index) throws SearchEngineException { Property property; if (mapping.getReverse() == ReverseType.NO) { property = createProperty(name, value, store, index, mapping.getTermVector()); } else if (mapping.getReverse() == ReverseType.READER) { property = createProperty(name, new ReverseStringReader(value), mapping.getTermVector()); } else if (mapping.getReverse() == ReverseType.STRING) { property = createProperty(name, StringUtils.reverse(value), store, index, mapping.getTermVector()); } else { throw new SearchEngineException("Unsupported Reverse type [" + mapping.getReverse() + "]"); } property.setBoost(mapping.getBoost()); if (mapping.isOmitNorms() != null) { property.setOmitNorms(mapping.isOmitNorms()); } if (mapping.isOmitTf() != null) { property.setOmitTf(mapping.isOmitTf()); } property.setBoost(mapping.getBoost()); ((LuceneProperty) property).setPropertyMapping(mapping); return property; } public Property createProperty(String name, String value, Property.Store store, Property.Index index) throws SearchEngineException { return createProperty(name, value, store, index, Property.TermVector.NO); } public Property createProperty(String name, String value, Property.Store store, Property.Index index, Property.TermVector termVector) throws SearchEngineException { Field.Store fieldStore = FieldHelper.getFieldStore(store); Field.Index fieldIndex = FieldHelper.getFieldIndex(index); Field.TermVector fieldTermVector = FieldHelper.getFieldTermVector(termVector); Field field = new Field(name, value, fieldStore, fieldIndex, fieldTermVector); return new LuceneProperty(field); } public Property createProperty(String name, TokenStream tokenStream, Property.TermVector termVector) { Field.TermVector fieldTermVector = FieldHelper.getFieldTermVector(termVector); Field field = new Field(name, tokenStream, fieldTermVector); return new LuceneProperty(field); } public Property createProperty(String name, Reader value) { return createProperty(name, value, Property.TermVector.NO); } public Property createProperty(String name, byte[] value, Property.Store store) throws SearchEngineException { Field.Store fieldStore = FieldHelper.getFieldStore(store); Field field = new Field(name, value, fieldStore); return new LuceneProperty(field); } public Property createProperty(String name, Reader value, Property.TermVector termVector) { Field.TermVector fieldTermVector = FieldHelper.getFieldTermVector(termVector); Field field = new Field(name, value, fieldTermVector); if (value instanceof RepeatableReader) { return new LuceneProperty(field, (RepeatableReader) value); } return new LuceneProperty(field); } }