/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2010, Red Hat, Inc. and/or its affiliates or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat, Inc. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.hibernate.search.engine.impl; import org.apache.lucene.document.CompressionTools; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.Field.Index; import org.apache.lucene.document.Field.TermVector; import org.apache.lucene.document.NumericField; import org.hibernate.annotations.common.util.StringHelper; import org.hibernate.search.SearchException; import org.hibernate.search.annotations.Store; import org.hibernate.search.bridge.LuceneOptions; import org.hibernate.search.bridge.util.impl.NumericFieldUtils; import static org.hibernate.search.annotations.NumericField.PRECISION_STEP_DEFAULT; /** * A wrapper class for Lucene parameters needed for indexing. * * @author Hardy Ferentschik * @author Sanne Grinovero * @author Gustavo Fernandes */ public class LuceneOptionsImpl implements LuceneOptions { private final boolean storeCompressed; private final boolean storeUncompressed; private final Index indexMode; private final TermVector termVector; private final float boost; private final Store storeType; private final int precisionStep; private final String indexNullAs; public LuceneOptionsImpl(Store store, Index indexMode, TermVector termVector, float boost) { this( store, indexMode, termVector, boost, null, PRECISION_STEP_DEFAULT ); } public LuceneOptionsImpl(Store store, Index indexMode, TermVector termVector, float boost, String indexNullAs, int precisionStep) { this.indexMode = indexMode; this.termVector = termVector; this.boost = boost; this.storeType = store; this.storeCompressed = store.equals( Store.COMPRESS ); this.storeUncompressed = store.equals( Store.YES ); this.indexNullAs = indexNullAs; this.precisionStep = precisionStep; } public void addFieldToDocument(String name, String indexedString, Document document) { //Do not add fields on empty strings, seems a sensible default in most situations if ( StringHelper.isNotEmpty( indexedString ) ) { if ( !( indexMode.equals( Index.NO ) && storeCompressed ) ) { standardFieldAdd( name, indexedString, document ); } if ( storeCompressed ) { compressedFieldAdd( name, indexedString, document ); } } } public void addNumericFieldToDocument(String fieldName, Object value, Document document) { if ( storeType == Store.COMPRESS ) { throw new SearchException( "Error indexing field " + fieldName + ", @NumericField cannot be compressed" ); } if ( value != null ) { NumericField numericField = new NumericField( fieldName, precisionStep, storeType != Store.NO ? Field.Store.YES : Field.Store.NO, true ); NumericFieldUtils.setNumericValue( value, numericField ); numericField.setBoost( boost ); if ( numericField.getNumericValue() != null ) { document.add( numericField ); } } } private void standardFieldAdd(String name, String indexedString, Document document) { Field field = new Field( name, true, indexedString, storeUncompressed ? Field.Store.YES : Field.Store.NO, indexMode, termVector ); field.setBoost( boost ); document.add( field ); } private void compressedFieldAdd(String name, String indexedString, Document document) { byte[] compressedString = CompressionTools.compressString( indexedString ); // indexed is implicitly set to false when using byte[] Field field = new Field( name, compressedString ); document.add( field ); } public float getBoost() { return boost; } public String indexNullAs() { return indexNullAs; } public boolean isCompressed() { return storeCompressed; } public Index getIndex() { return this.indexMode; } public org.apache.lucene.document.Field.Store getStore() { if ( storeUncompressed || storeCompressed ) { return org.apache.lucene.document.Field.Store.YES; } else { return org.apache.lucene.document.Field.Store.NO; } } public TermVector getTermVector() { return this.termVector; } /** * Might be useful for a bridge implementation, but not currently part * of LuceneOptions API as we are considering to remove the getters. */ public Store getStoreStrategy() { return storeType; } }