/* * 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.query.dsl; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.TimeZone; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; import org.apache.lucene.document.DateTools; import org.apache.lucene.search.Query; import org.fest.assertions.Assertions; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.search.Search; import org.hibernate.search.annotations.CalendarBridge; import org.hibernate.search.annotations.DateBridge; import org.hibernate.search.annotations.EncodingType; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.Resolution; import org.hibernate.search.query.dsl.QueryBuilder; import org.hibernate.search.test.SearchTestBase; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * @author Davide D'Alto */ public class NumericEncodingQueriesTest extends SearchTestBase { private static final Calendar ANNOUNCED = initCalendar( 1950, 1, 1 ); private static final Date UPDATED = initCalendar( 2000, 1, 1 ).getTime(); private static final Calendar FIRST_EDITION = initCalendar( 1966, 0, 1 ); private static final Calendar NEXT_EVENT = initCalendar( 2015, 9, 29 ); private static final Fair LUCCA_COMICS = new Fair( 1L, "Lucca comics and games", NEXT_EVENT.getTime(), FIRST_EDITION, UPDATED, ANNOUNCED ); private static Calendar initCalendar(int year, int month, int day) { Calendar instance = createCalendar(); instance.set( 1966, 0, 1 ); return instance; } private static Calendar createCalendar() { Calendar calendar = Calendar.getInstance( TimeZone.getTimeZone( "Europe/Rome" ), Locale.ITALY ); calendar.setTimeInMillis( 0 ); // Reset to epoch; clears hours/minutes/seconds in particular return calendar; } @Before public void createEvent() throws Exception { try (Session session = openSession()) { Transaction tx = session.beginTransaction(); session.persist( LUCCA_COMICS ); tx.commit(); } } @After public void cleanUp() throws Exception { try (Session session = openSession()) { Transaction tx = session.beginTransaction(); session.delete( LUCCA_COMICS ); tx.commit(); } } @Test public void testDslWithDate() throws Exception { try (Session session = openSession()) { Date nextEventDate = DateTools.round( NEXT_EVENT.getTime(), DateTools.Resolution.DAY ); Query query = queryBuilder().keyword().onField( "startDate" ).matching( nextEventDate ).createQuery(); Fair event = (Fair) Search.getFullTextSession( session ).createFullTextQuery( query, Fair.class ).uniqueResult(); Assertions.assertThat( event ).isEqualTo( LUCCA_COMICS ); } } @Test public void testDslWithCalendar() throws Exception { try (Session session = openSession()) { Calendar year = createCalendar(); year.setTime( DateTools.round( FIRST_EDITION.getTime(), DateTools.Resolution.YEAR ) ); Query query = queryBuilder().keyword().onField( "since" ).matching( year ).createQuery(); Fair event = (Fair) Search.getFullTextSession( session ).createFullTextQuery( query, Fair.class ).uniqueResult(); Assertions.assertThat( event ).isEqualTo( LUCCA_COMICS ); } } @Test public void testDslWithDefaultDateBridge() throws Exception { try (Session session = openSession()) { Query query = queryBuilder().keyword().onField( "updated" ).matching( UPDATED ).createQuery(); Fair event = (Fair) Search.getFullTextSession( session ).createFullTextQuery( query, Fair.class ).uniqueResult(); Assertions.assertThat( event ).isEqualTo( LUCCA_COMICS ); } } @Test public void testDslWithDefaultCalendarBridge() throws Exception { try (Session session = openSession()) { Query query = queryBuilder().keyword().onField( "announced" ).matching( ANNOUNCED ).createQuery(); Fair event = (Fair) Search.getFullTextSession( session ).createFullTextQuery( query, Fair.class ).uniqueResult(); Assertions.assertThat( event ).isEqualTo( LUCCA_COMICS ); } } private QueryBuilder queryBuilder() { QueryBuilder queryBuilder = getSearchFactory().buildQueryBuilder().forEntity( Fair.class ).get(); return queryBuilder; } @Override public Class<?>[] getAnnotatedClasses() { return new Class<?>[] { Fair.class }; } @Entity @Indexed static class Fair { @Id private Long id; @Field private String name; @Field @DateBridge(encoding = EncodingType.NUMERIC, resolution = Resolution.DAY) @Temporal(TemporalType.DATE) private Date startDate; @Field @CalendarBridge(encoding = EncodingType.NUMERIC, resolution = Resolution.YEAR) private Calendar since; @Field private Date updated; @Field private Calendar announced; public Fair() { } public Fair(Long id, String name, Date startDate, Calendar since, Date updated, Calendar announced) { super(); this.id = id; this.name = name; this.startDate = startDate; this.since = since; this.updated = updated; this.announced = announced; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getStartDate() { return startDate; } public void setStartDate(Date startDate) { this.startDate = startDate; } public Calendar getSince() { return since; } public void setSince(Calendar firstEvent) { this.since = firstEvent; } public Date getUpdated() { return updated; } public void setUpdated(Date updated) { this.updated = updated; } public Calendar getAnnounced() { return announced; } public void setAnnounced(Calendar announced) { this.announced = announced; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ( ( name == null ) ? 0 : name.hashCode() ); return result; } @Override public boolean equals(Object obj) { if ( this == obj ) { return true; } if ( obj == null ) { return false; } if ( getClass() != obj.getClass() ) { return false; } Fair other = (Fair) obj; if ( name == null ) { if ( other.name != null ) { return false; } } else if ( !name.equals( other.name ) ) { return false; } return true; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append( "Fair [id=" ); builder.append( id ); builder.append( ", name=" ); builder.append( name ); builder.append( ", startDate=" ); builder.append( startDate ); builder.append( ", since=" ); builder.append( since ); builder.append( "]" ); return builder.toString(); } } }