From 6d5116a2e0c8dade369f99d03a0fe9f8f98ab294 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Sun, 26 Feb 2012 09:10:09 +0200 Subject: [PATCH] #101 improved Lucene sorting options --- .../query/lucene/AbstractLuceneQuery.java | 13 ++++++++-- .../mysema/query/lucene/LuceneSerializer.java | 2 +- .../mysema/query/lucene/LuceneQueryTest.java | 24 +++++++++++++++++-- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/querydsl-lucene/src/main/java/com/mysema/query/lucene/AbstractLuceneQuery.java b/querydsl-lucene/src/main/java/com/mysema/query/lucene/AbstractLuceneQuery.java index a8317a90c..194fa026f 100644 --- a/querydsl-lucene/src/main/java/com/mysema/query/lucene/AbstractLuceneQuery.java +++ b/querydsl-lucene/src/main/java/com/mysema/query/lucene/AbstractLuceneQuery.java @@ -72,6 +72,9 @@ SimpleProjectable { @Nullable private Filter filter; + + @Nullable + private Sort querySort; @SuppressWarnings("unchecked") public AbstractLuceneQuery(LuceneSerializer serializer, Searcher searcher, @@ -163,7 +166,7 @@ SimpleProjectable { final List> orderBys = metadata.getOrderBy(); final Long queryLimit = metadata.getModifiers().getLimit(); final Long queryOffset = metadata.getModifiers().getOffset(); - Sort sort = null; + Sort sort = querySort; int limit; final int offset = queryOffset != null ? queryOffset.intValue() : 0; try { @@ -177,7 +180,7 @@ SimpleProjectable { if (queryLimit != null && queryLimit.intValue() < limit) { limit = queryLimit.intValue(); } - if (!orderBys.isEmpty()) { + if (sort == null && !orderBys.isEmpty()) { sort = serializer.toSort(orderBys); } @@ -282,6 +285,12 @@ SimpleProjectable { public

Q set(ParamExpression

param, P value) { return queryMixin.set(param, value); } + + @SuppressWarnings("unchecked") + public Q sort(Sort sort) { + this.querySort = sort; + return (Q)this; + } @Nullable private T oneResult(boolean unique) { diff --git a/querydsl-lucene/src/main/java/com/mysema/query/lucene/LuceneSerializer.java b/querydsl-lucene/src/main/java/com/mysema/query/lucene/LuceneSerializer.java index 27b912a85..ba7c0c412 100644 --- a/querydsl-lucene/src/main/java/com/mysema/query/lucene/LuceneSerializer.java +++ b/querydsl-lucene/src/main/java/com/mysema/query/lucene/LuceneSerializer.java @@ -530,7 +530,7 @@ public class LuceneSerializer { } } - public Sort toSort(List> orderBys) { + public Sort toSort(List> orderBys) { List sorts = new ArrayList(orderBys.size()); for (OrderSpecifier order : orderBys) { if (!(order.getTarget() instanceof Path)) { diff --git a/querydsl-lucene/src/test/java/com/mysema/query/lucene/LuceneQueryTest.java b/querydsl-lucene/src/test/java/com/mysema/query/lucene/LuceneQueryTest.java index 8dd2a3690..a19e55ac8 100644 --- a/querydsl-lucene/src/test/java/com/mysema/query/lucene/LuceneQueryTest.java +++ b/querydsl-lucene/src/test/java/com/mysema/query/lucene/LuceneQueryTest.java @@ -24,6 +24,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.IOException; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Locale; @@ -31,16 +32,17 @@ import java.util.Locale; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; -import org.apache.lucene.document.MapFieldSelector; -import org.apache.lucene.document.NumericField; import org.apache.lucene.document.Field.Index; import org.apache.lucene.document.Field.Store; +import org.apache.lucene.document.MapFieldSelector; +import org.apache.lucene.document.NumericField; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriter.MaxFieldLength; import org.apache.lucene.search.DuplicateFilter; import org.apache.lucene.search.Filter; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Searcher; +import org.apache.lucene.search.Sort; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.Version; import org.junit.After; @@ -288,6 +290,23 @@ public class LuceneQueryTest { assertEquals("1990", documents.get(2).get("year")); assertEquals("1990", documents.get(3).get("year")); } + + + @Test + public void List_Sort() { + Sort sort = LuceneSerializer.DEFAULT.toSort(Collections.singletonList(year.asc())); + + query.where(year.between(1800, 2000)); + //query.orderBy(year.asc()); + query.sort(sort); + final List documents = query.list(); + assertFalse(documents.isEmpty()); + assertEquals(4, documents.size()); + assertEquals("1864", documents.get(0).get("year")); + assertEquals("1954", documents.get(1).get("year")); + assertEquals("1990", documents.get(2).get("year")); + assertEquals("1990", documents.get(3).get("year")); + } @Test public void List_Distinct_Property(){ @@ -320,6 +339,7 @@ public class LuceneQueryTest { assertEquals("1954", documents.get(2).get("year")); assertEquals("1864", documents.get(3).get("year")); } + @Test public void List_Sorted_Descending_By_Gross() {