Hello,
I want to use DataView to present Search Results from Hibernate
Search, but I got stuck with implementation of DataProvider - maybe
first I show you classes:
private class SearchDataProvider implements IDataProvider {
                
                private String query;
                
                public SearchDataProvider(String query) {
                        this.query = query;
                }
                
                @Override
                public Iterator iterator(int first, int count) {
                        SearchDAO.SearchResults searchedAdverts =
searchDAO.getSearchedAdverts(this.query, first, count);
                        return searchedAdverts.getResults().iterator();
                }

                @Override
                public IModel model(Object object) {
                        return new Model((Advertisement) object);
                }

                @Override
                public int size() {
                        SearchDAO.SearchResults searchedAdverts =
searchDAO.getSearchedAdverts(this.query, 0, 0);
                        return searchedAdverts.getCount();
                }

                @Override
                public void detach() {
                        
                }
}

in SearchDAO I have:
public class SearchDAO extends HibernateDaoSupport {
        public SearchResults getSearchedAdverts(final String queryString, int
first, int count) {
                Session session = getSession(true);
                FullTextSession fullTextSession = 
Search.createFullTextSession(session);
                SearchResults results = null;
                Transaction tx = fullTextSession.beginTransaction();
                MultiFieldQueryParser parser = new MultiFieldQueryParser( new
String[]{"title", "rawBody"},
                  new StandardAnalyzer());
                Query query;
                try {
                        query = parser.parse(queryString);
                        FullTextQuery hibQuery = 
fullTextSession.createFullTextQuery(query,
Advertisement.class)
                                .setFirstResult(first)
                                .setMaxResults(count);
                        results = new SearchResults(hibQuery.list(), 
hibQuery.getResultSize());
                } catch (ParseException e) {
                        e.printStackTrace();
                } finally {
                        tx.commit();
                        session.close();
                }
}
SearchResults is a wrapper for sublist of results and number of all:
public class SearchResults {
                
                private List<Advertisement> results = null;
                
                private int count = 0;
                
                public SearchResults(List<Advertisement> results, int count) {
                        super();
                        this.results = results;
                        this.count = count;
                }
      //getters/setters
}

As you see I have to repeat searching in size() and iterator()
(SearchDAO.SearchResults searchedAdverts =
searchDAO.getSearchedAdverts(this.query, 0, 0); and
SearchDAO.SearchResults searchedAdverts =
searchDAO.getSearchedAdverts(this.query, first, count);) in size I do
not get collection, but searching happens because this method is
launched before iterator() which could answer with number of all
results as hibQuery.getResultSize();
It's very inefficient, and I don't know how can I repair that, without
writing my own DataView implementation. DataProvider is good for
databases which need to make additional select count(*), but Lucene
Hibernate Search make it in one pass.

Anybody has a suggestion on this topic?

Best regards,
Adr

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to