diff --git a/querydsl-lucene/src/main/java/com/mysema/query/lucene/LuceneQuery.java b/querydsl-lucene/src/main/java/com/mysema/query/lucene/LuceneQuery.java index cc1ab855a..12814ad22 100644 --- a/querydsl-lucene/src/main/java/com/mysema/query/lucene/LuceneQuery.java +++ b/querydsl-lucene/src/main/java/com/mysema/query/lucene/LuceneQuery.java @@ -52,9 +52,12 @@ public class LuceneQuery implements SimpleQuery, public LuceneQuery(final Searcher searcher) { this(LuceneSerializer.DEFAULT, searcher); } + + public void close(){ + // template method + } - @Override - public long count() { + private long innerCount(){ try { final int maxDoc = searcher.maxDoc(); if (maxDoc == 0) { @@ -63,12 +66,27 @@ public class LuceneQuery implements SimpleQuery, return searcher.search(createQuery(), maxDoc).totalHits; } catch (final IOException e) { throw new QueryException(e); + } + } + + @Override + public long count() { + try{ + return innerCount(); + }finally{ + close(); } + } @Override public long countDistinct() { - return count(); + try{ + return innerCount(); + }finally{ + close(); + } + } private Query createQuery() { @@ -128,9 +146,17 @@ public class LuceneQuery implements SimpleQuery, return iterate(); } + private List innerList(){ + return new IteratorAdapter(iterate()).asList(); + } + @Override public List list() { - return new IteratorAdapter(iterate()).asList(); + try{ + return innerList(); + }finally{ + close(); + } } @Override @@ -145,12 +171,17 @@ public class LuceneQuery implements SimpleQuery, @Override public SearchResults listResults() { - final List documents = list(); - /* - * TODO Get rid of count(). It could be implemented by iterating the - * list results in list* from n to m. - */ - return new SearchResults(documents, queryMixin.getMetadata().getModifiers(), count()); + try{ + List documents = innerList(); + /* + * TODO Get rid of count(). It could be implemented by iterating the + * list results in list* from n to m. + */ + return new SearchResults(documents, queryMixin.getMetadata().getModifiers(), innerCount()); + }finally{ + close(); + } + } @Override @@ -176,7 +207,7 @@ public class LuceneQuery implements SimpleQuery, @Override public Document uniqueResult() { try { - final int maxDoc = searcher.maxDoc(); + int maxDoc = searcher.maxDoc(); if (maxDoc == 0) { return null; } @@ -188,8 +219,10 @@ public class LuceneQuery implements SimpleQuery, } else { return null; } - } catch (final IOException e) { + } catch (IOException e) { throw new QueryException(e); + } finally { + close(); } } diff --git a/querydsl-lucene/src/main/java/com/mysema/query/lucene/session/LuceneSession.java b/querydsl-lucene/src/main/java/com/mysema/query/lucene/session/LuceneSession.java index 6406e854d..aa861a77c 100644 --- a/querydsl-lucene/src/main/java/com/mysema/query/lucene/session/LuceneSession.java +++ b/querydsl-lucene/src/main/java/com/mysema/query/lucene/session/LuceneSession.java @@ -1,5 +1,7 @@ package com.mysema.query.lucene.session; +import com.mysema.query.lucene.LuceneQuery; + /** @@ -9,19 +11,13 @@ package com.mysema.query.lucene.session; */ public interface LuceneSession { -// /** -// * @return -// */ -// LuceneQuery createQuery(); - /** - * Lucene query callback for querying + * Creates a new LuceneQuery * - * @param callback * @return */ - T query(QueryCallback callback); - + LuceneQuery createQuery(); + /** * Creates a new index, adds updates to it and publishes the new index to * all readers after the callback finishes. diff --git a/querydsl-lucene/src/main/java/com/mysema/query/lucene/session/LuceneSessionImpl.java b/querydsl-lucene/src/main/java/com/mysema/query/lucene/session/LuceneSessionImpl.java index 8092300b7..abb589625 100644 --- a/querydsl-lucene/src/main/java/com/mysema/query/lucene/session/LuceneSessionImpl.java +++ b/querydsl-lucene/src/main/java/com/mysema/query/lucene/session/LuceneSessionImpl.java @@ -88,42 +88,45 @@ public class LuceneSessionImpl implements LuceneSession { return searcher.get(); } - - -// @Override -// public LuceneQuery createQuery() { -// try { -// IndexSearcher searcher = getSearcher(); -// searcher.getIndexReader().incRef(); -// return new LuceneQuery(serializer, searcher); -// } catch (IOException e) { -// throw new QueryException(e); -// } -// } - @Override - public T query(QueryCallback callback) { + public LuceneQuery createQuery() { try { - IndexSearcher is = getSearcher(); - T results = null; - try { - // Incrementing the reference count - is.getIndexReader().incRef(); - results = callback.query(new LuceneQuery(serializer, is)); - - } finally { - // Releasing the reference count - // This can be the last to actually close the reader - is.getIndexReader().decRef(); - } - - return results; + final IndexSearcher searcher = getSearcher(); + searcher.getIndexReader().incRef(); + return new LuceneQuery(serializer, searcher){ + @Override + public void close(){ + try { + searcher.getIndexReader().decRef(); + } catch (IOException e) { + throw new QueryException(e); + } + } + }; } catch (IOException e) { throw new QueryException(e); } - } +// @Override +// public T query(QueryCallback callback) { +// try { +// IndexSearcher is = getSearcher(); +// try { +// // Incrementing the reference count +// is.getIndexReader().incRef(); +// return callback.query(new LuceneQuery(serializer, is)); +// } finally { +// // Releasing the reference count +// // This can be the last to actually close the reader +// is.getIndexReader().decRef(); +// } +// } catch (IOException e) { +// throw new QueryException(e); +// } +// +// } + @Override public void update(WriteCallback callback) { try { diff --git a/querydsl-lucene/src/test/java/com/mysema/query/lucene/session/LuceneSessionImplTest.java b/querydsl-lucene/src/test/java/com/mysema/query/lucene/session/LuceneSessionImplTest.java index 40782fcd8..636e66db3 100644 --- a/querydsl-lucene/src/test/java/com/mysema/query/lucene/session/LuceneSessionImplTest.java +++ b/querydsl-lucene/src/test/java/com/mysema/query/lucene/session/LuceneSessionImplTest.java @@ -17,7 +17,6 @@ import org.apache.lucene.store.RAMDirectory; import org.junit.Before; import org.junit.Test; -import com.mysema.query.lucene.LuceneQuery; import com.mysema.query.types.PathMetadataFactory; import com.mysema.query.types.path.EntityPathBase; import com.mysema.query.types.path.NumberPath; @@ -46,9 +45,9 @@ public class LuceneSessionImplTest { private StringPath title; - private NumberPath year; - - private NumberPath gross; +// private NumberPath year; +// +// private NumberPath gross; @Before public void before() throws IOException { @@ -56,8 +55,8 @@ public class LuceneSessionImplTest { session = new LuceneSessionImpl(directory); final QDocument entityPath = new QDocument("doc"); title = entityPath.title; - year = entityPath.year; - gross = entityPath.gross; +// year = entityPath.year; +// gross = entityPath.gross; } @Test @@ -89,25 +88,29 @@ public class LuceneSessionImplTest { } }); - List results = session.query(new QueryCallback>() { - public List query(LuceneQuery query) { - - return query.where(title.eq("Jurassic Park")).list(); - - } - }); +// List results = session.query(new QueryCallback>() { +// public List query(LuceneQuery query) { +// +// return query.where(title.eq("Jurassic Park")).list(); +// +// } +// }); + + List results = session.createQuery().where(title.eq("Jurassic Park")).list(); assertEquals(1, results.size()); assertEquals("Jurassic Park", results.get(0).getField("title").stringValue()); - Long count = session.query(new QueryCallback() { - public Long query(LuceneQuery query) { - //return query.where(title.ne("AA")).count(); - - return query.where(title.startsWith("Nummi")).count(); - - } - }); +// Long count = session.query(new QueryCallback() { +// public Long query(LuceneQuery query) { +// //return query.where(title.ne("AA")).count(); +// +// return query.where(title.startsWith("Nummi")).count(); +// +// } +// }); + + Long count = session.createQuery().where(title.startsWith("Nummi")).count(); assertEquals(1, (long) count); }