package com.mysema.luja.serializer; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; import org.apache.lucene.document.Document; import org.apache.lucene.store.RAMDirectory; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Test; import com.mysema.luja.LuceneSession; import com.mysema.luja.impl.LuceneSessionFactoryImpl; import com.mysema.luja.mapping.domain.FieldAnnotated; import com.mysema.luja.mapping.domain.QFieldAnnotated; import com.mysema.query.lucene.LuceneQuery; import com.mysema.query.types.Predicate; public class AnnotationSerializerTest { private QFieldAnnotated d = new QFieldAnnotated("d"); private List<FieldAnnotated> data = new ArrayList<FieldAnnotated>(); private LuceneSessionFactoryImpl sessionFactory; LocalDate d1 = new LocalDate(2009, 12, 30); LocalDate d2 = new LocalDate(2009, 12, 31); LocalDate d3 = new LocalDate(2010, 1, 1); DateTime t1 = new DateTime(2010, 1, 1, 12, 1, 1, 1); DateTime t2 = new DateTime(2010, 1, 1, 12, 1, 1, 2); DateTime t3 = new DateTime(2010, 1, 1, 12, 1, 1, 3); LocalDateTime lt1 = new LocalDateTime(t1); LocalDateTime lt2 = new LocalDateTime(t2); LocalDateTime lt3 = new LocalDateTime(t3); Date jd1 = new Date(d1.toDateTimeAtStartOfDay(DateTimeZone.UTC).getMillis()); Date jd2 = new Date(d2.toDateTimeAtStartOfDay(DateTimeZone.UTC).getMillis()); Date jd3 = new Date(d3.toDateTimeAtStartOfDay(DateTimeZone.UTC).getMillis()); @Before public void before() { sessionFactory = new LuceneSessionFactoryImpl(new RAMDirectory()); createTestData(); } @Test public void NotAnalyzedAnnotation() { assertQuery(d.intNumber.eq(1), data.get(0)); assertQuery(d.code.eq("ABC-123"), data.get(0)); assertQuery(d.code.eq("ABC-123 B"), data.get(1)); assertQuery(d.code.contains("ABC"), data.get(0), data.get(1), data.get(2)); assertQuery(d.code.contains("abc")); assertQuery(d.name.in("Aapeli", "Aakkonen")); assertQuery(d.name.in("Aapeli Aakkonen", "Esko Aakkonen"), data.get(0), data.get(2)); assertQuery(d.locale.eq(new Locale("fi", "FI")), data.get(0)); assertQuery(d.locale.eq(new Locale("fi", "SV"))); assertQuery(d.locale.eq(new Locale("en", "US")), data.get(1)); } @Test public void AnalyzedAnnotation() { assertQuery(d.tokenized.contains("java"), data.get(0), data.get(1)); } @Test public void LocalDateSort() { LuceneSession session = sessionFactory.openReadOnlySession(); List<FieldAnnotated> results = convertList(session.createQuery().orderBy(d.date.desc()).list()); assertEquals(data.get(2).getIntNumber(), results.get(0).getIntNumber()); assertEquals(data.get(1).getIntNumber(), results.get(1).getIntNumber()); assertEquals(data.get(0).getIntNumber(), results.get(2).getIntNumber()); results = convertList(session.createQuery().orderBy(d.date.asc()).list()); assertEquals(data.get(0).getIntNumber(), results.get(0).getIntNumber()); assertEquals(data.get(1).getIntNumber(), results.get(1).getIntNumber()); assertEquals(data.get(2).getIntNumber(), results.get(2).getIntNumber()); } @Test public void LocalDateSearch() { LocalDate date = new LocalDate(2010, 1, 1); assertQuery(d.date.eq(date), data.get(2)); assertQuery(d.date.after(date.minusYears(1)), data.get(0), data.get(1), data.get(2)); assertQuery(d.date.between(date.minusDays(1), date), data.get(1), data.get(2)); } @Test public void DateSort() { LuceneSession session = sessionFactory.openReadOnlySession(); List<FieldAnnotated> results = convertList(session.createQuery().orderBy(d.javaDate.desc()).list()); assertEquals(data.get(2).getIntNumber(), results.get(0).getIntNumber()); assertEquals(data.get(1).getIntNumber(), results.get(1).getIntNumber()); assertEquals(data.get(0).getIntNumber(), results.get(2).getIntNumber()); results = convertList(session.createQuery().orderBy(d.javaDate.asc()).list()); assertEquals(data.get(0).getIntNumber(), results.get(0).getIntNumber()); assertEquals(data.get(1).getIntNumber(), results.get(1).getIntNumber()); assertEquals(data.get(2).getIntNumber(), results.get(2).getIntNumber()); } @Test public void DateSearch() { assertQuery(d.javaDate.eq(jd1), data.get(0)); assertQuery( d.javaDate.after(new Date(d1.minusYears(1).toDateTimeAtStartOfDay().getMillis())), data.get(0), data.get(1), data.get(2)); assertQuery(d.javaDate.between(jd1, jd2), data.get(0), data.get(1)); } @Test public void DateTimeSort() { LuceneSession session = sessionFactory.openReadOnlySession(); List<FieldAnnotated> results = convertList(session.createQuery().orderBy(d.time.desc()).list()); assertEquals(data.get(2).getIntNumber(), results.get(0).getIntNumber()); assertEquals(data.get(1).getIntNumber(), results.get(1).getIntNumber()); assertEquals(data.get(0).getIntNumber(), results.get(2).getIntNumber()); results = convertList(session.createQuery().orderBy(d.time.asc()).list()); assertEquals(data.get(0).getIntNumber(), results.get(0).getIntNumber()); assertEquals(data.get(1).getIntNumber(), results.get(1).getIntNumber()); assertEquals(data.get(2).getIntNumber(), results.get(2).getIntNumber()); } @Test public void DateTimeSearch() { DateTime t1 = new DateTime(2010, 1, 1, 12, 1, 1, 1); assertQuery(d.time.eq(t1), data.get(0)); assertQuery(d.time.after(t1), data.get(1), data.get(2)); assertQuery(d.time.between(t1, t1.plusMillis(1)), data.get(0), data.get(1)); } @Test public void LocalDateTimeSort() { LuceneSession session = sessionFactory.openReadOnlySession(); List<FieldAnnotated> results = convertList(session.createQuery().orderBy(d.localTime.desc()).list()); assertEquals(data.get(2).getIntNumber(), results.get(0).getIntNumber()); assertEquals(data.get(1).getIntNumber(), results.get(1).getIntNumber()); assertEquals(data.get(0).getIntNumber(), results.get(2).getIntNumber()); results = convertList(session.createQuery().orderBy(d.localTime.asc()).list()); assertEquals(data.get(0).getIntNumber(), results.get(0).getIntNumber()); assertEquals(data.get(1).getIntNumber(), results.get(1).getIntNumber()); assertEquals(data.get(2).getIntNumber(), results.get(2).getIntNumber()); } @Test public void LocaleBasedSort() { LuceneSession session = sessionFactory.openSession(); session.beginReset() .addDocument(new FieldAnnotated(3, "\u00c4").toDocument()) .addDocument(new FieldAnnotated(2, "b").toDocument()) .addDocument(new FieldAnnotated(1,"a").toDocument()); session.close(); sessionFactory.setSortLocale(Locale.ENGLISH); session = sessionFactory.openReadOnlySession(); List<FieldAnnotated> results = convertList(session.createQuery().orderBy(d.name.asc()).list()); assertEquals(1, results.get(0).getIntNumber()); assertEquals(3, results.get(1).getIntNumber()); assertEquals(2, results.get(2).getIntNumber()); session.close(); sessionFactory.setSortLocale(new Locale("fi", "FI")); session = sessionFactory.openReadOnlySession(); results = convertList(session.createQuery().orderBy(d.name.asc()).list()); assertEquals(1, results.get(0).getIntNumber()); assertEquals(2, results.get(1).getIntNumber()); assertEquals(3, results.get(2).getIntNumber()); session.close(); } @Test public void LocalDateTimeSearch() { assertQuery(d.localTime.eq(lt1), data.get(0)); assertQuery(d.localTime.after(lt1), data.get(1), data.get(2)); assertQuery(d.localTime.between(lt1, lt1.plusMillis(1)), data.get(0), data.get(1)); } @Test public void DatesAndTimesRoundtripWorks() { LuceneSession session = sessionFactory.openReadOnlySession(); List<FieldAnnotated> results = convertList(session.createQuery().list()); assertEquals(3, results.size()); assertEquals(d1, results.get(0).getDate()); assertEquals(d2, results.get(1).getDate()); assertEquals(d3, results.get(2).getDate()); assertEquals(t1, results.get(0).getTime()); assertEquals(t2, results.get(1).getTime()); assertEquals(t3, results.get(2).getTime()); assertEquals(lt1, results.get(0).getLocalTime()); assertEquals(lt2, results.get(1).getLocalTime()); assertEquals(lt3, results.get(2).getLocalTime()); assertEquals(jd1, results.get(0).getJavaDate()); assertEquals(jd2, results.get(1).getJavaDate()); assertEquals(jd3, results.get(2).getJavaDate()); session.close(); } private List<FieldAnnotated> convertList(List<Document> list) { List<FieldAnnotated> results = new ArrayList<FieldAnnotated>(); for (Document document : list) { results.add(new FieldAnnotated(document)); } return results; } private void assertQuery(Predicate where, FieldAnnotated... expects) { LuceneSession session = sessionFactory.openReadOnlySession(); LuceneQuery query = session.createQuery().where(where).orderBy(d.intNumber.asc()); System.out.println(query); List<Document> results = query.list(); if (expects == null && results.size() > 0) { assertEquals("Invalid results size", 0, results.size()); } assertEquals("Invalid results size", expects.length, results.size()); int i = 0; for (FieldAnnotated expect : expects) { assertEquals( "Expected id does not match", expect.getIntNumber(), new FieldAnnotated(results.get(i++)).getIntNumber()); } session.close(); } private void createTestData() { Locale fi = new Locale("fi", "FI"); Locale enUs = new Locale("en", "US"); Locale enUk = new Locale("en", "UK"); data.add(new FieldAnnotated(1, d1, t1, lt1, jd1, "ABC-123", "Aapeli Aakkonen", "Java C++ Scala Ruby", fi)); data.add(new FieldAnnotated(2, d2, t2, lt2, jd2, "ABC-123 B", "Aapeli Ukkonen", "Java C++ Groove Ruby", enUs)); data.add(new FieldAnnotated(3, d3, t3, lt3, jd3, "ABC-123 D", "Esko Aakkonen", "PHP C Scala Ruby", enUk)); LuceneSession session = sessionFactory.openSession(); session.beginReset().addDocument(data.get(0).toDocument()) .addDocument(data.get(1).toDocument()).addDocument(data.get(2).toDocument()); session.close(); } }