/* * 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; import java.util.Arrays; import java.util.List; import org.apache.lucene.search.Query; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; 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.query.engine.spi.EntityInfo; import org.hibernate.search.query.engine.spi.HSQuery; import org.hibernate.search.spi.SearchIntegrator; import org.hibernate.search.testsupport.setup.TransactionContextForTest; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Group; import org.openjdk.jmh.annotations.GroupThreads; import org.openjdk.jmh.annotations.Threads; import org.openjdk.jmh.infra.Blackhole; @Fork(1) public class JMHBenchmarks { @Benchmark @Threads(20) public void simpleIndexing(QueryEngineHolder eh) { Worker worker = eh.si.getWorker(); BookEntity book = new BookEntity(); book.setId( 1l ); book.setText( "Some very long text should be stored here. No, I mean long as in a book." ); book.setTitle( "Naaa" ); Work work = new Work( book, book.getId(), WorkType.ADD, false ); TransactionContextForTest tc = new TransactionContextForTest(); worker.performWork( work, tc ); tc.end(); } @Benchmark @Threads(20) public void queryBooksByBestRating(QueryEngineHolder eh, Blackhole bh) { SearchIntegrator searchIntegrator = eh.si; Query luceneQuery = searchIntegrator.buildQueryBuilder() .forEntity( BookEntity.class ) .get() .all() .createQuery(); long expectedIndexSize = eh.getExpectedIndexSize(); int maxResults = eh.getMaxResults(); HSQuery hsQuery = searchIntegrator.createHSQuery( luceneQuery, BookEntity.class ); hsQuery.targetedEntities( Arrays.<Class<?>>asList( BookEntity.class ) ); hsQuery.sort( new Sort( new SortField( "rating", SortField.Type.FLOAT, true ) ) ); hsQuery.maxResults( maxResults ); int queryResultSize = hsQuery.queryResultSize(); List<EntityInfo> queryEntityInfos = hsQuery.queryEntityInfos(); if ( eh.isQuerySync() && queryResultSize != expectedIndexSize ) { throw new RuntimeException( "Unexpected index size" ); } if ( maxResults != queryEntityInfos.size() ) { throw new RuntimeException( "Unexpected resultset size" ); } bh.consume( queryEntityInfos ); } @Benchmark @GroupThreads(5) @Group("concurrentReadWriteTest") public void readWriteTestWriter(QueryEngineHolder eh) { simpleIndexing( eh ); } @Benchmark @GroupThreads(5) @Group("concurrentReadWriteTest") public void readWriteTestReader(QueryEngineHolder eh, Blackhole bh) { SearchIntegrator searchIntegrator = eh.si; Query luceneQuery = searchIntegrator.buildQueryBuilder() .forEntity( BookEntity.class ) .get() .all() .createQuery(); int maxResults = eh.getMaxResults(); HSQuery hsQuery = searchIntegrator.createHSQuery( luceneQuery, BookEntity.class ); hsQuery.targetedEntities( Arrays.<Class<?>>asList( BookEntity.class ) ); hsQuery.maxResults( maxResults ); int queryResultSize = hsQuery.queryResultSize(); List<EntityInfo> queryEntityInfos = hsQuery.queryEntityInfos(); bh.consume( queryEntityInfos ); bh.consume( queryResultSize ); } }