/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.test.bridge;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
import org.apache.lucene.document.Document;
import org.hibernate.search.bridge.FieldBridge;
import org.hibernate.search.bridge.LuceneOptions;
import org.hibernate.search.bridge.MetadataProvidingFieldBridge;
import org.hibernate.search.bridge.spi.FieldMetadataBuilder;
import org.hibernate.search.bridge.spi.FieldType;
/**
* Store the date in 3 different fields - year, month, day - to ease Range Query per
* year, month or day (eg get all the elements of December for the last 5 years).
*
* @author Emmanuel Bernard
*/
public class DateSplitBridge implements FieldBridge, MetadataProvidingFieldBridge {
private static final TimeZone GMT = TimeZone.getTimeZone( "GMT" );
private static final String YEAR_SUFFIX = "_year";
private static final String MONTH_SUFFIX = "_month";
private static final String DAY_SUFFIX = "_day";
@Override
public void configureFieldMetadata(String name, FieldMetadataBuilder builder) {
builder.field( name + YEAR_SUFFIX, FieldType.STRING )
.field( name + MONTH_SUFFIX, FieldType.STRING )
.field( name + DAY_SUFFIX, FieldType.STRING );
}
@Override
public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
Date date = (Date) value;
Calendar cal = GregorianCalendar.getInstance( GMT, Locale.ROOT );
cal.setTime( date );
int year = cal.get( Calendar.YEAR );
int month = cal.get( Calendar.MONTH ) + 1;
int day = cal.get( Calendar.DAY_OF_MONTH );
// set year
luceneOptions.addFieldToDocument( name + YEAR_SUFFIX, String.valueOf( year ), document );
// set month and pad it if needed
luceneOptions.addFieldToDocument( name + MONTH_SUFFIX,
month < 10 ? "0" : "" + String.valueOf( month ), document );
// set day and pad it if needed
luceneOptions.addFieldToDocument( name + DAY_SUFFIX,
day < 10 ? "0" : "" + String.valueOf( day ), document );
}
}