package com.manning.hsia.dvdstore.action; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.queryParser.QueryParser; import org.hibernate.ScrollableResults; import org.hibernate.search.FullTextQuery; import org.hibernate.search.FullTextSession; import com.manning.hsia.dvdstore.model.Item; import com.manning.hsia.dvdstore.util.SessionHolder; public class BatchChangeActionImpl implements BatchChangeAction { private static final int WINDOW_SIZE = 50; /** * Example 6.12 */ public void applyBatchChange(String words) { FullTextSession ftSession = SessionHolder.getFullTextSession(); org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(words, Item.class); FullTextQuery query = ftSession.createFullTextQuery(luceneQuery, Item.class); query.setFetchSize(WINDOW_SIZE); //define fetch size as window size ScrollableResults items = query.scroll(); log( "Results changed: " + query.getResultSize() ); try { items.beforeFirst(); int index = 0; while( items.next() ) { Item item = (Item) items.get()[0]; index++; if ( item != null ) { applyChange(item); //update item } //TODO proof read algo wrt sync between fetch size and window_size if ( index % WINDOW_SIZE == 0 ) { //clear memory every window size ftSession.flush(); //flush changes to the database ftSession.flushToIndexes(); //flush changes to the index ftSession.clear(); //clear memory } } } finally { items.close(); } } public String getUrl(String words) { FullTextSession ftSession = SessionHolder.getFullTextSession(); org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(words, Item.class); FullTextQuery query = ftSession.createFullTextQuery(luceneQuery, Item.class); Item item = (Item) query.setFirstResult(0).setMaxResults(1).uniqueResult(); return item.getImageURL(); } private org.apache.lucene.search.Query buildLuceneQuery(String words, Class<?> searchedEntity) { Analyzer analyzer; if (searchedEntity == null) { //get most appropriate analyzer analyzer = new StandardAnalyzer(); } else { analyzer = SessionHolder.getFullTextSession().getSearchFactory().getAnalyzer(searchedEntity); } QueryParser parser = new QueryParser( "description", analyzer ); org.apache.lucene.search.Query luceneQuery = null; try { luceneQuery = parser.parse(words); } catch (org.apache.lucene.queryParser.ParseException e) { throw new IllegalArgumentException("Unable to parse search entry into a Lucene query", e); } return luceneQuery; } private void log(String string) { System.out.println(string); } private void applyChange(Item item) { item.setImageURL("http://blog.emmanuelbernard.com"); } }