/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.engineperformance.setuputilities;
import java.nio.file.Path;
import org.hibernate.search.backend.spi.Work;
import org.hibernate.search.backend.spi.WorkType;
import org.hibernate.search.backend.spi.Worker;
import org.hibernate.search.engineperformance.model.BookEntity;
import org.hibernate.search.spi.SearchIntegrator;
import org.hibernate.search.spi.SearchIntegratorBuilder;
import org.hibernate.search.testsupport.setup.SearchConfigurationForTest;
import org.hibernate.search.testsupport.setup.TransactionContextForTest;
public class SearchIntegratorCreation {
private SearchIntegratorCreation() {
//do not construct
}
public static SearchIntegrator createIntegrator(String directorytype, String readerStrategy, Path storagePath) {
SearchConfigurationForTest cfg = new SearchConfigurationForTest();
switch ( directorytype ) {
case "ram" :
cfg.addProperty( "hibernate.search.default.directory_provider", "ram" );
break;
case "fs" :
cfg.addProperty( "hibernate.search.default.directory_provider", "filesystem" );
break;
case "fs-nrt" :
cfg.addProperty( "hibernate.search.default.directory_provider", "filesystem" );
cfg.addProperty( "hibernate.search.default.indexmanager", "near-real-time" );
break;
case "blackhole" :
cfg.addProperty( "hibernate.search.default.worker.backend", "blackhole" );
break;
default :
throw new RuntimeException( "Parameter 'directorytype'='" + directorytype + "' not recognized!" );
}
switch ( readerStrategy ) {
case "async" :
cfg.addProperty( "hibernate.search.default.reader.strategy", "async" );
break;
case "shared" :
cfg.addProperty( "hibernate.search.default.reader.strategy", "shared" );
break;
default :
throw new RuntimeException( "Parameter 'readerStrategy'='" + readerStrategy + "' not recognized!" );
}
cfg.addProperty( "hibernate.search.default.indexBase", storagePath.toString() );
cfg.addClass( BookEntity.class );
return new SearchIntegratorBuilder().configuration( cfg ).buildSearchIntegrator();
}
public static void preindexEntities(SearchIntegrator si, int numEntities) {
println( "Starting index creation..." );
Worker worker = si.getWorker();
TransactionContextForTest tc = new TransactionContextForTest();
boolean needsFlush = false;
int i = 1;
for ( ; i <= numEntities; i++ ) {
BookEntity book = new BookEntity();
book.setId( Long.valueOf( i ) );
book.setText( "Some very long text should be stored here. No, I mean long as in a book." );
book.setTitle( "Naaa" );
book.setRating( Float.intBitsToFloat( i ) );
Work work = new Work( book, book.getId(), WorkType.ADD, false );
worker.performWork( work, tc );
needsFlush = true;
if ( i % 1000 == 0 ) {
//commit in batches of 1000:
tc.end();
needsFlush = false;
tc = new TransactionContextForTest();
}
}
if ( needsFlush ) {
//commit remaining work
tc.end();
}
println( " ... created an index of " + numEntities + " entities." );
}
private static void println(String string) {
//We strictly disallow System.out usage in the whole project,
//however this is a CLI tool so allow it here:
//CHECKSTYLE:OFF
System.out.println( string );
//CHECKSTYLE:ON
}
}