Hibernate SVN: r15557 - in search/branches/Branch_3_0_1_GA_CP: doc/reference/en and 1 other directories.
by hibernate-commits@lists.jboss.org
Author: gbadner
Date: 2008-11-12 17:19:53 -0500 (Wed, 12 Nov 2008)
New Revision: 15557
Modified:
search/branches/Branch_3_0_1_GA_CP/build.xml
search/branches/Branch_3_0_1_GA_CP/changelog.txt
search/branches/Branch_3_0_1_GA_CP/doc/reference/en/master.xml
search/branches/Branch_3_0_1_GA_CP/readme.txt
search/branches/Branch_3_0_1_GA_CP/src/java/org/hibernate/search/Version.java
Log:
JBPAPP-1389 : change version to 3.0.1.GA.CP01
Modified: search/branches/Branch_3_0_1_GA_CP/build.xml
===================================================================
--- search/branches/Branch_3_0_1_GA_CP/build.xml 2008-11-12 18:49:48 UTC (rev 15556)
+++ search/branches/Branch_3_0_1_GA_CP/build.xml 2008-11-12 22:19:53 UTC (rev 15557)
@@ -1,8 +1,8 @@
<!--
- Hibernate Annotations ANT build script.
+ Hibernate Search ANT build script.
- You need JDK 5.0 installed to build Hibernate Annotations.
+ You need JDK 5.0 installed to build Hibernate Search.
-->
@@ -17,7 +17,7 @@
<!-- Name of project and version, used to create filenames -->
<property name="Name" value="Hibernate Search"/>
<property name="name" value="hibernate-search"/>
- <property name="version" value="3.0.1.GA"/>
+ <property name="version" value="3.0.1.GA.CP01"/>
<property name="javadoc.packagenames" value="org.hibernate.search.*"/>
<property name="copy.test" value="true"/>
<property name="javac.source" value="1.5"/>
Modified: search/branches/Branch_3_0_1_GA_CP/changelog.txt
===================================================================
--- search/branches/Branch_3_0_1_GA_CP/changelog.txt 2008-11-12 18:49:48 UTC (rev 15556)
+++ search/branches/Branch_3_0_1_GA_CP/changelog.txt 2008-11-12 22:19:53 UTC (rev 15557)
@@ -1,6 +1,11 @@
Hibernate Search Changelog
==========================
+3.0.1.GA.CP01 (11-11-2008)
+---------------------
+** Bug
+ * [JBPAPP-1361 / HSEARCH-257] - Ignore delete operation when Core does update then delete on the same entity
+
3.0.1.GA (20-02-2008)
---------------------
Modified: search/branches/Branch_3_0_1_GA_CP/doc/reference/en/master.xml
===================================================================
--- search/branches/Branch_3_0_1_GA_CP/doc/reference/en/master.xml 2008-11-12 18:49:48 UTC (rev 15556)
+++ search/branches/Branch_3_0_1_GA_CP/doc/reference/en/master.xml 2008-11-12 22:19:53 UTC (rev 15557)
@@ -19,7 +19,7 @@
<subtitle>Reference Guide</subtitle>
- <releaseinfo>3.0.1.GA</releaseinfo>
+ <releaseinfo>3.0.1.GA.CP01</releaseinfo>
<mediaobject>
<imageobject>
@@ -65,4 +65,4 @@
&optimize;
&lucene-native;
-</book>
\ No newline at end of file
+</book>
Modified: search/branches/Branch_3_0_1_GA_CP/readme.txt
===================================================================
--- search/branches/Branch_3_0_1_GA_CP/readme.txt 2008-11-12 18:49:48 UTC (rev 15556)
+++ search/branches/Branch_3_0_1_GA_CP/readme.txt 2008-11-12 22:19:53 UTC (rev 15557)
@@ -1,6 +1,6 @@
Hibernate Search
==================================================
-Version: 3.0.1.GA, 20.02.2008
+Version: 3.0.1.GA.CP01, 11.11.2008
Description
-----------
@@ -48,4 +48,5 @@
If you want to contribute, go to http://www.hibernate.org/
This software and its documentation are distributed under the terms of the
-FSF Lesser Gnu Public License (see lgpl.txt).
\ No newline at end of file
+FSF Lesser Gnu Public License (see lgpl.txt).
+
Modified: search/branches/Branch_3_0_1_GA_CP/src/java/org/hibernate/search/Version.java
===================================================================
--- search/branches/Branch_3_0_1_GA_CP/src/java/org/hibernate/search/Version.java 2008-11-12 18:49:48 UTC (rev 15556)
+++ search/branches/Branch_3_0_1_GA_CP/src/java/org/hibernate/search/Version.java 2008-11-12 22:19:53 UTC (rev 15557)
@@ -10,7 +10,7 @@
* @author Emmanuel Bernard
*/
public class Version {
- public static final String VERSION = "3.0.1.GA"; // + new Date();
+ public static final String VERSION = "3.0.1.GA.CP01"; // + new Date();
private static Log log = LogFactory.getLog( Version.class );
static {
15 years, 10 months
Hibernate SVN: r15556 - search/trunk/src/java/org/hibernate/search/filter.
by hibernate-commits@lists.jboss.org
Author: sannegrinovero
Date: 2008-11-12 13:49:48 -0500 (Wed, 12 Nov 2008)
New Revision: 15556
Modified:
search/trunk/src/java/org/hibernate/search/filter/AndDocIdSet.java
search/trunk/src/java/org/hibernate/search/filter/EmptyDocIdBitSet.java
Log:
HSEARCH-289 some more cleanup and minor optimizations
Modified: search/trunk/src/java/org/hibernate/search/filter/AndDocIdSet.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/filter/AndDocIdSet.java 2008-11-12 18:27:38 UTC (rev 15555)
+++ search/trunk/src/java/org/hibernate/search/filter/AndDocIdSet.java 2008-11-12 18:49:48 UTC (rev 15556)
@@ -1,6 +1,7 @@
package org.hibernate.search.filter;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.List;
import static java.lang.Math.max;
@@ -17,7 +18,7 @@
*/
public class AndDocIdSet extends DocIdSet {
- private OpenBitSet docIdBitSet;
+ private DocIdSet docIdBitSet;
private final List<DocIdSet> andedDocIdSets;
private final int maxDocNumber;
@@ -25,34 +26,26 @@
public AndDocIdSet(List<DocIdSet> andedDocIdSets, int maxDocs) {
if ( andedDocIdSets == null || andedDocIdSets.size() < 2 )
throw new IllegalArgumentException( "To \"and\" some DocIdSet(s) they should be at least 2" );
- this.andedDocIdSets = andedDocIdSets;
+ this.andedDocIdSets = new ArrayList<DocIdSet>( andedDocIdSets ); // make a defensive mutable copy
this.maxDocNumber = maxDocs;
}
- private synchronized OpenBitSet buildBitset() throws IOException {
- if ( docIdBitSet != null ) return docIdBitSet; // double check for concurrent initialization
+ private synchronized DocIdSet buildBitset() throws IOException {
+ if ( docIdBitSet != null ) return docIdBitSet; // check for concurrent initialization
//TODO if all andedDocIdSets are actually DocIdBitSet, use their internal BitSet instead of next algo.
//TODO if some andedDocIdSets are DocIdBitSet, merge them first.
int size = andedDocIdSets.size();
DocIdSetIterator[] iterators = new DocIdSetIterator[size];
- boolean valuesExist = true;
for (int i=0; i<size; i++) {
// build all iterators
iterators[i] = andedDocIdSets.get(i).iterator();
}
- OpenBitSet bitSet;
- if ( valuesExist ) { // skip further processing if some idSet is empty
- bitSet = new OpenBitSet( maxDocNumber );
- markBitSetOnAgree( iterators, bitSet );
- }
- else {
- bitSet = new OpenBitSet(); //TODO a less expensive "empty"
- }
- docIdBitSet = bitSet;
- return bitSet;
+ andedDocIdSets.clear(); // contained DocIdSets are not needed any more, release them.
+ docIdBitSet = makeDocIdSetOnAgreedBits( iterators ); // before returning hold a copy as cache
+ return docIdBitSet;
}
- private final void markBitSetOnAgree(final DocIdSetIterator[] iterators, final OpenBitSet result) throws IOException {
+ private final DocIdSet makeDocIdSetOnAgreedBits(final DocIdSetIterator[] iterators) throws IOException {
final int iteratorSize = iterators.length;
int targetPosition = Integer.MIN_VALUE;
int votes = 0;
@@ -62,9 +55,12 @@
// for the others and he is considered "first" in the voting round (every iterator votes for himself ;-)
int i = 0;
//iterator initialize, just one "next" for each DocIdSetIterator
- for ( ;i<iteratorSize; i++ ) {
+ for ( ; i<iteratorSize; i++ ) {
final DocIdSetIterator iterator = iterators[i];
- if ( ! iterator.next() ) return; //current iterator has no values, so skip all
+ if ( ! iterator.next() ) {
+ //current iterator has no values, so skip all
+ return EmptyDocIdBitSet.instance;
+ }
final int position = iterator.doc();
if ( targetPosition==position ) {
votes++; //stopped as same position of others
@@ -75,6 +71,7 @@
votes=1;
}
}
+ final OpenBitSet result = new OpenBitSet( maxDocNumber );
// end iterator initialize
if (votes==iteratorSize) {
result.fastSet( targetPosition );
@@ -87,7 +84,7 @@
final DocIdSetIterator iterator = iterators[i];
final boolean validPosition = iterator.skipTo( targetPosition );
if ( ! validPosition )
- return; //exit condition
+ return result; //exit condition
final int position = iterator.doc();
if ( position == targetPosition ) {
if ( ++votes == iteratorSize ) {
Modified: search/trunk/src/java/org/hibernate/search/filter/EmptyDocIdBitSet.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/filter/EmptyDocIdBitSet.java 2008-11-12 18:27:38 UTC (rev 15555)
+++ search/trunk/src/java/org/hibernate/search/filter/EmptyDocIdBitSet.java 2008-11-12 18:49:48 UTC (rev 15556)
@@ -1,12 +1,20 @@
package org.hibernate.search.filter;
import java.io.IOException;
+import java.io.Serializable;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
-public class EmptyDocIdBitSet extends DocIdSet {
+/**
+ * A DocIdSet which is always empty.
+ * Stateless and ThreadSafe.
+ * @author Sanne Grinovero
+ */
+public final class EmptyDocIdBitSet extends DocIdSet implements Serializable {
+ private static final long serialVersionUID = 6429929383767238322L;
+
public static final DocIdSet instance = new EmptyDocIdBitSet();
private final DocIdSetIterator iterator = new EmptyDocIdSetIterator();
@@ -16,7 +24,7 @@
}
@Override
- public DocIdSetIterator iterator() {
+ public final DocIdSetIterator iterator() {
return iterator;
}
@@ -24,20 +32,20 @@
* implements a DocIdSetIterator for an empty DocIdSet
* As it is empty it also is stateless and so it can be reused.
*/
- private static class EmptyDocIdSetIterator extends DocIdSetIterator {
+ private static final class EmptyDocIdSetIterator extends DocIdSetIterator {
@Override
- public int doc() {
- throw new IllegalStateException("Should never be called");
+ public final int doc() {
+ throw new IllegalStateException( "Should never be called" );
}
@Override
- public boolean next() throws IOException {
+ public final boolean next() throws IOException {
return false;
}
@Override
- public boolean skipTo(int target) throws IOException {
+ public final boolean skipTo(int target) throws IOException {
return false;
}
15 years, 10 months
Hibernate SVN: r15555 - in search/trunk/src: test/org/hibernate/search/test/configuration and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: sannegrinovero
Date: 2008-11-12 13:27:38 -0500 (Wed, 12 Nov 2008)
New Revision: 15555
Modified:
search/trunk/src/java/org/hibernate/search/backend/LuceneIndexingParameters.java
search/trunk/src/test/org/hibernate/search/test/configuration/ConfigurationReadTestCase.java
search/trunk/src/test/org/hibernate/search/test/configuration/LuceneIndexingParametersTest.java
Log:
HSEARCH-298 Warn for dangerous IndexWriter settings
Modified: search/trunk/src/java/org/hibernate/search/backend/LuceneIndexingParameters.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/backend/LuceneIndexingParameters.java 2008-11-12 16:37:50 UTC (rev 15554)
+++ search/trunk/src/java/org/hibernate/search/backend/LuceneIndexingParameters.java 2008-11-12 18:27:38 UTC (rev 15555)
@@ -12,6 +12,7 @@
import org.hibernate.search.SearchException;
import org.hibernate.search.backend.configuration.IndexWriterSetting;
import static org.hibernate.search.backend.configuration.IndexWriterSetting.MAX_FIELD_LENGTH;
+import static org.hibernate.search.backend.configuration.IndexWriterSetting.USE_COMPOUND_FILE;
import org.hibernate.search.backend.configuration.MaskedProperty;
import org.hibernate.search.util.LoggerFactory;
@@ -46,19 +47,26 @@
Properties transactionProps = new MaskedProperty( indexingParameters, TRANSACTION );
//get keys for "batch" (defaulting to transaction)
Properties batchProps = new MaskedProperty( indexingParameters, BATCH, transactionProps ); //TODO to close HSEARCH-201 just remove 3° parameter
- transactionIndexParameters = new ParameterSet( transactionProps, TRANSACTION);
- batchIndexParameters = new ParameterSet( batchProps, BATCH);
- doSanityChecks( transactionIndexParameters, batchIndexParameters);
+ transactionIndexParameters = new ParameterSet( transactionProps, TRANSACTION );
+ batchIndexParameters = new ParameterSet( batchProps, BATCH );
+ doSanityChecks( transactionIndexParameters, batchIndexParameters );
}
private void doSanityChecks(ParameterSet transParams, ParameterSet batchParams) {
if ( log.isWarnEnabled() ) {
Integer maxFieldLengthTransaction = transParams.parameters.get( MAX_FIELD_LENGTH );
- Integer maxFieldLengthBatch = transParams.parameters.get( MAX_FIELD_LENGTH );
+ Integer maxFieldLengthBatch = batchParams.parameters.get( MAX_FIELD_LENGTH );
if ( notEquals( maxFieldLengthTransaction, maxFieldLengthBatch ) ) {
- log.warn( "The max_field_length value configured for transaction is different than the value configured for batch." );
+ log.warn( "The max_field_length value configured for transaction is "
+ + "different than the value configured for batch." );
}
}
+ Integer useCompoundTransaction = transParams.parameters.get( USE_COMPOUND_FILE );
+ Integer useCompoundBatch = batchParams.parameters.get( USE_COMPOUND_FILE );
+ if ( notEquals( useCompoundTransaction, useCompoundBatch ) ) {
+ throw new SearchException( "The IndexWriter setting \"use_compound_file\" for batch "+
+ "mode can't be different from the transaction setting." );
+ }
}
private boolean notEquals(Integer a, Integer b) {
Modified: search/trunk/src/test/org/hibernate/search/test/configuration/ConfigurationReadTestCase.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/configuration/ConfigurationReadTestCase.java 2008-11-12 16:37:50 UTC (rev 15554)
+++ search/trunk/src/test/org/hibernate/search/test/configuration/ConfigurationReadTestCase.java 2008-11-12 18:27:38 UTC (rev 15555)
@@ -1,11 +1,15 @@
// $Id$
package org.hibernate.search.test.configuration;
+import org.hibernate.HibernateException;
+import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
+import org.hibernate.search.SearchException;
import org.hibernate.search.backend.configuration.IndexWriterSetting;
import org.hibernate.search.engine.SearchFactoryImplementor;
import org.hibernate.search.impl.SearchFactoryImpl;
+import org.hibernate.search.store.RAMDirectoryProvider;
import org.hibernate.search.test.SearchTestCase;
import org.hibernate.search.util.FileHelper;
@@ -87,5 +91,20 @@
super.tearDown();
FileHelper.delete( getBaseIndexDir() );
}
+
+ public static void assertCfgIsInvalid(AnnotationConfiguration configuration, Class[] mapping) {
+ try {
+ for ( Class annotated : mapping ) {
+ ( configuration ).addAnnotatedClass( annotated );
+ }
+ configuration.setProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() );
+ configuration.buildSessionFactory();
+ fail();
+ } catch (HibernateException e) {
+ //thrown exceptions means the test is ok when cause by a SearchException
+ Throwable cause = e.getCause();
+ assertTrue( cause instanceof SearchException );
+ }
+ }
}
Modified: search/trunk/src/test/org/hibernate/search/test/configuration/LuceneIndexingParametersTest.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/configuration/LuceneIndexingParametersTest.java 2008-11-12 16:37:50 UTC (rev 15554)
+++ search/trunk/src/test/org/hibernate/search/test/configuration/LuceneIndexingParametersTest.java 2008-11-12 18:27:38 UTC (rev 15555)
@@ -4,6 +4,7 @@
import java.io.IOException;
import java.util.Properties;
+import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.search.backend.LuceneIndexingParameters;
import org.hibernate.search.test.Document;
import org.hibernate.search.test.SerializationTestHelper;
@@ -15,6 +16,7 @@
import static org.hibernate.search.backend.configuration.IndexWriterSetting.MERGE_FACTOR;
import static org.hibernate.search.backend.configuration.IndexWriterSetting.RAM_BUFFER_SIZE;
import static org.hibernate.search.backend.configuration.IndexWriterSetting.USE_COMPOUND_FILE;
+import static org.hibernate.search.backend.configuration.IndexWriterSetting.MAX_FIELD_LENGTH;
import static org.hibernate.search.test.configuration.ConfigurationReadTestCase.TransactionType.TRANSACTION;
import static org.hibernate.search.test.configuration.ConfigurationReadTestCase.TransactionType.BATCH;
@@ -27,7 +29,7 @@
super.configure( cfg );
cfg.setProperty( "hibernate.search.default.batch.ram_buffer_size", "1" );
- cfg.setProperty( "hibernate.search.default.batch.use_compound_file", "true" );
+ cfg.setProperty( "hibernate.search.default.transaction.use_compound_file", "true" );
//set by super : cfg.setProperty( "hibernate.search.default.batch.max_buffered_docs", "1000" );
cfg.setProperty( "hibernate.search.default.transaction.ram_buffer_size", "2" );
@@ -51,12 +53,12 @@
cfg.setProperty( "hibernate.search.Documents.transaction.merge_factor", "6" );
cfg.setProperty( "hibernate.search.Documents.transaction.max_buffered_docs", "7" );
cfg.setProperty( "hibernate.search.Documents.batch.max_merge_docs", "9" );
-
+ cfg.setProperty( "hibernate.search.Documents.transaction.max_field_length", "7" );
+ cfg.setProperty( "hibernate.search.Documents.batch.max_field_length", "9" );
}
public void testDefaultIndexProviderParameters() throws Exception {
assertValueIsSet( Author.class, BATCH, USE_COMPOUND_FILE, 1 );
- assertValueIsDefault( Author.class, TRANSACTION, USE_COMPOUND_FILE );
assertValueIsSet( Author.class, TRANSACTION, RAM_BUFFER_SIZE, 2 );
assertValueIsSet( Author.class, TRANSACTION, MAX_MERGE_DOCS, 9 );
assertValueIsSet( Author.class, TRANSACTION, MAX_BUFFERED_DOCS, 11 );
@@ -75,6 +77,12 @@
assertValueIsSet( Document.class, BATCH, MAX_BUFFERED_DOCS, 1000 );
}
+ public void testMaxFieldLength() throws Exception {
+ // there should also be logged a warning being logged about these:
+ assertValueIsSet( Document.class, TRANSACTION, MAX_FIELD_LENGTH, 7 );
+ assertValueIsSet( Document.class, BATCH, MAX_FIELD_LENGTH, 9 );
+ }
+
public void testExplicitBatchParameters() throws Exception {
assertValueIsSet( Book.class, BATCH, MAX_MERGE_DOCS, 12 );
assertValueIsSet( Book.class, BATCH, MAX_BUFFERED_DOCS, 14 );
@@ -106,6 +114,13 @@
assertEquals( param.getTransactionIndexParameters(), paramCopy.getTransactionIndexParameters() );
}
+ public void testInvalidConfiguration() {
+ AnnotationConfiguration configuration = new AnnotationConfiguration();
+ configuration.setProperty( "hibernate.search.default.transaction.use_compound_file", "true" );
+ configuration.setProperty( "hibernate.search.default.batch.use_compound_file", "false" );
+ assertCfgIsInvalid( configuration, getMappings() );
+ }
+
protected Class[] getMappings() {
return new Class[] {
Book.class,
15 years, 10 months
Hibernate SVN: r15554 - in search/trunk/src/java/org/hibernate/search: query and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2008-11-12 11:37:50 -0500 (Wed, 12 Nov 2008)
New Revision: 15554
Modified:
search/trunk/src/java/org/hibernate/search/engine/ProjectionLoader.java
search/trunk/src/java/org/hibernate/search/query/FullTextQueryImpl.java
Log:
HSEARCH-224
Pass along the filter classes to MultiClassesQueryLoader
Modified: search/trunk/src/java/org/hibernate/search/engine/ProjectionLoader.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/engine/ProjectionLoader.java 2008-11-12 15:01:44 UTC (rev 15553)
+++ search/trunk/src/java/org/hibernate/search/engine/ProjectionLoader.java 2008-11-12 16:37:50 UTC (rev 15554)
@@ -21,6 +21,7 @@
private Boolean projectThis;
private ResultTransformer transformer;
private String[] aliases;
+ private Class[] entityTypes;
public void init(Session session, SearchFactoryImplementor searchFactoryImplementor) {
this.session = session;
@@ -33,6 +34,10 @@
this.aliases = aliases;
}
+ public void setEntityTypes(Class[] entityTypes) {
+ this.entityTypes = entityTypes;
+ }
+
public Object load(EntityInfo entityInfo) {
initThisProjectionFlag( entityInfo );
if ( projectThis ) {
@@ -54,7 +59,7 @@
if ( projectThis ) {
MultiClassesQueryLoader loader = new MultiClassesQueryLoader();
loader.init( session, searchFactoryImplementor );
- loader.setEntityTypes( new Class[]{} );
+ loader.setEntityTypes( entityTypes );
objectLoader = loader;
}
}
Modified: search/trunk/src/java/org/hibernate/search/query/FullTextQueryImpl.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/query/FullTextQueryImpl.java 2008-11-12 15:01:44 UTC (rev 15553)
+++ search/trunk/src/java/org/hibernate/search/query/FullTextQueryImpl.java 2008-11-12 16:37:50 UTC (rev 15554)
@@ -164,6 +164,7 @@
if ( indexProjection != null ) {
ProjectionLoader loader = new ProjectionLoader();
loader.init( session, searchFactoryImplementor, resultTransformer, indexProjection );
+ loader.setEntityTypes( classes );
return loader;
}
if ( criteria != null ) {
15 years, 10 months
Hibernate SVN: r15553 - search/trunk/src/java/org/hibernate/search/engine.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2008-11-12 10:01:44 -0500 (Wed, 12 Nov 2008)
New Revision: 15553
Modified:
search/trunk/src/java/org/hibernate/search/engine/Loader.java
search/trunk/src/java/org/hibernate/search/engine/ProjectionLoader.java
Log:
HSEARCH-224
Use MultiClassesQueryLoader in ProjectionLoader
Modified: search/trunk/src/java/org/hibernate/search/engine/Loader.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/engine/Loader.java 2008-11-12 13:05:39 UTC (rev 15552)
+++ search/trunk/src/java/org/hibernate/search/engine/Loader.java 2008-11-12 15:01:44 UTC (rev 15553)
@@ -7,10 +7,16 @@
import org.hibernate.search.engine.EntityInfo;
/**
+ * Interface defining a set of operations in order to load entities which matched a query. Depending on the type of
+ * indexed entities and the type of query different strategies can be used.
+ *
+ *
* @author Emmanuel Bernard
*/
public interface Loader {
void init(Session session, SearchFactoryImplementor searchFactoryImplementor);
+
Object load(EntityInfo entityInfo);
+
List load(EntityInfo... entityInfos);
}
Modified: search/trunk/src/java/org/hibernate/search/engine/ProjectionLoader.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/engine/ProjectionLoader.java 2008-11-12 13:05:39 UTC (rev 15552)
+++ search/trunk/src/java/org/hibernate/search/engine/ProjectionLoader.java 2008-11-12 15:01:44 UTC (rev 15553)
@@ -8,13 +8,16 @@
import org.hibernate.transform.ResultTransformer;
/**
+ * Implementation of the <code>Loader</code> interface used for loading entities which are projected via
+ * {@link org.hibernate.search.ProjectionConstants#THIS}.
+ *
* @author Emmanuel Bernard
+ * @author Hardy Ferentschik
*/
-//TODO change the underlying ObjectLoader to a MutliClassesQueryLoader
public class ProjectionLoader implements Loader {
private SearchFactoryImplementor searchFactoryImplementor;
private Session session;
- private ObjectLoader objectLoader;
+ private Loader objectLoader;
private Boolean projectThis;
private ResultTransformer transformer;
private String[] aliases;
@@ -27,13 +30,13 @@
public void init(Session session, SearchFactoryImplementor searchFactoryImplementor, ResultTransformer transformer, String[] aliases) {
init( session, searchFactoryImplementor );
this.transformer = transformer;
- this.aliases = aliases;
+ this.aliases = aliases;
}
public Object load(EntityInfo entityInfo) {
initThisProjectionFlag( entityInfo );
if ( projectThis ) {
- for (int index : entityInfo.indexesOfThis) {
+ for ( int index : entityInfo.indexesOfThis ) {
entityInfo.projection[index] = objectLoader.load( entityInfo );
}
}
@@ -49,29 +52,32 @@
if ( projectThis == null ) {
projectThis = entityInfo.indexesOfThis.size() != 0;
if ( projectThis ) {
- //TODO use QueryLoader when possible
- objectLoader = new ObjectLoader();
- objectLoader.init( session, searchFactoryImplementor );
+ MultiClassesQueryLoader loader = new MultiClassesQueryLoader();
+ loader.init( session, searchFactoryImplementor );
+ loader.setEntityTypes( new Class[]{} );
+ objectLoader = loader;
}
}
}
public List load(EntityInfo... entityInfos) {
List results = new ArrayList( entityInfos.length );
- if ( entityInfos.length == 0 ) return results;
+ if ( entityInfos.length == 0 ) {
+ return results;
+ }
initThisProjectionFlag( entityInfos[0] );
if ( projectThis ) {
- objectLoader.load( entityInfos ); //load by batch
- for (EntityInfo entityInfo : entityInfos) {
- for (int index : entityInfo.indexesOfThis) {
- //set one by one to avoid loosing null objects (skipped in the objectLoader.load( EntityInfo[] ))
+ objectLoader.load( entityInfos ); // load by batch
+ for ( EntityInfo entityInfo : entityInfos ) {
+ for ( int index : entityInfo.indexesOfThis ) {
+ // set one by one to avoid loosing null objects (skipped in the objectLoader.load( EntityInfo[] ))
entityInfo.projection[index] = objectLoader.load( entityInfo );
}
}
}
- for (EntityInfo entityInfo : entityInfos) {
- if ( transformer != null) {
+ for ( EntityInfo entityInfo : entityInfos ) {
+ if ( transformer != null ) {
results.add( transformer.transformTuple( entityInfo.projection, aliases ) );
}
else {
15 years, 10 months
Hibernate SVN: r15552 - in search/trunk: doc/reference/en and 1 other directories.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2008-11-12 08:05:39 -0500 (Wed, 12 Nov 2008)
New Revision: 15552
Modified:
search/trunk/doc/reference/en/master.xml
search/trunk/doc/reference/en/modules/getting-started.xml
search/trunk/doc/reference/en/modules/mapping.xml
search/trunk/ivy.xml
Log:
some doc updates regarding Solr analyzers, moved the solr analyzer dependencies into the test scope of ivy.xml
Modified: search/trunk/doc/reference/en/master.xml
===================================================================
--- search/trunk/doc/reference/en/master.xml 2008-11-12 12:28:54 UTC (rev 15551)
+++ search/trunk/doc/reference/en/master.xml 2008-11-12 13:05:39 UTC (rev 15552)
@@ -24,7 +24,7 @@
~ Boston, MA 02110-1301 USA
-->
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
- <!ENTITY versionNumber "3.1.0.Beta2">
+ <!ENTITY versionNumber "3.1.0.CR1">
<!ENTITY copyrightYear "2004">
<!ENTITY copyrightHolder "Red Hat Middleware, LLC.">
]>
@@ -77,4 +77,4 @@
<xi:include href="modules/optimize.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="modules/lucene-native.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-</book>
\ No newline at end of file
+</book>
Modified: search/trunk/doc/reference/en/modules/getting-started.xml
===================================================================
--- search/trunk/doc/reference/en/modules/getting-started.xml 2008-11-12 12:28:54 UTC (rev 15551)
+++ search/trunk/doc/reference/en/modules/getting-started.xml 2008-11-12 13:05:39 UTC (rev 15552)
@@ -481,11 +481,16 @@
either specify the fully qualified classname of the analyzer to use or one
can refer to an analyzer definition defined by the
<literal>@AnalyzerDef</literal> annotation. In the latter case the Solr
- analyzer framework with its factories approach can be used. To find out
+ analyzer framework with its factories approach is utilized. To find out
more about the factory classes available you can either browse the Solr
JavaDoc or read the corresponding section on the <ulink
url="http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters">Solr
- Wiki.</ulink> In the example a
+ Wiki.</ulink> Note that depending on the chosen factory class additional
+ libraries on top of the Solr dependencies might be required. For example,
+ the <classname>PhoneticFilterFactory</classname> depends on <ulink
+ url="http://commons.apache.org/codec">commons-codec</ulink>. </para>
+
+ <para>In the example below a
<classname>StandardTokenizerFactory</classname> is used followed by two
filter factories, <classname>LowerCaseFilterFactory</classname> and
<classname>SnowballPorterFilterFactory</classname>. The standard tokenizer
Modified: search/trunk/doc/reference/en/modules/mapping.xml
===================================================================
--- search/trunk/doc/reference/en/modules/mapping.xml 2008-11-12 12:28:54 UTC (rev 15551)
+++ search/trunk/doc/reference/en/modules/mapping.xml 2008-11-12 13:05:39 UTC (rev 15552)
@@ -623,8 +623,11 @@
</filename><filename>solr-common.jar</filename> to your classpath to
use analyzer definitions. In case you also want to utilizing a
snowball stemmer also include the
- <filename>lucene-snowball.jar.</filename> Your distribution of
- Hibernate Search provides these dependecies in its
+ <filename>lucene-snowball.jar.</filename> Other Solr analyzers might
+ depend on more libraries. For example, the
+ <classname>PhoneticFilterFactory</classname> depends on <ulink
+ url="http://commons.apache.org/codec">commons-codec</ulink>. Your
+ distribution of Hibernate Search provides these dependecies in its
<filename>lib</filename> directory.</para>
<programlisting>@AnalyzerDef(name="customanalyzer",
@@ -993,9 +996,10 @@
bridge. To do so you need to implements the
<literal>org.hibernate.search.bridge.StringBridge</literal>
interface.</para>
- <para>All implementations have to be thread-safe as they
- are used concurrently.</para>
+ <para>All implementations have to be thread-safe as they are used
+ concurrently.</para>
+
<programlisting>/**
* Padding Integer bridge.
* All numbers will be padded with 0 to match 5 digits
@@ -1065,9 +1069,10 @@
<classname>TwoWayStringBridge</classname> ,
<classname>FieldBridge</classname> implementations (see
bellow).</para>
+
<para>All implementations have to be thread-safe, but the parameters
- are set during initialization and no special care is required at
- this stage.</para>
+ are set during initialization and no special care is required at this
+ stage.</para>
<para>If you expect to use your bridge implementation on for an id
property (ie annotated with <literal>@DocumentId</literal> ), you need
Modified: search/trunk/ivy.xml
===================================================================
--- search/trunk/ivy.xml 2008-11-12 12:28:54 UTC (rev 15551)
+++ search/trunk/ivy.xml 2008-11-12 13:05:39 UTC (rev 15552)
@@ -20,9 +20,6 @@
<dependency org="org.hibernate" name="hibernate-core" rev="3.3.1.GA" conf="default->default"/>
<dependency org="javax.transaction" name="jta" rev="1.1" conf="default->default"/>
<dependency org="org.apache.lucene" name="lucene-core" rev="2.4.0" conf="default->default"/>
- <dependency org="org.apache.lucene" name="lucene-snowball" rev="2.4.0" conf="default->default"/>
- <dependency org="org.apache.lucene" name="lucene-analyzers" rev="2.4.0" conf="default->default"/> <!-- optional -->
- <dependency org="org.apache.commons" name="commons-codec" rev="1.3" conf="default->default"/> <!-- optional -->
<dependency org="javax.jms" name="jms" rev="1.1" conf="default->default"/> <!-- optional -->
<dependency org="javax.annotation" name="jsr250-api" rev="1.0" conf="default->default"/> <!-- optional -->
<dependency org="org.apache.solr" name="solr-core" rev="1.3.0" conf="default->default"/> <!-- optional -->
@@ -36,6 +33,9 @@
<!-- test deps -->
<dependency name="annotations" rev="3.4.0.GA" conf="test->default"/>
<dependency name="entitymanager" rev="3.4.0.GA" conf="test->default"/>
+ <dependency org="org.apache.lucene" name="lucene-snowball" rev="2.4.0" conf="test->default"/>
+ <dependency org="org.apache.lucene" name="lucene-analyzers" rev="2.4.0" conf="test->default"/>
+ <dependency org="org.apache.commons" name="commons-codec" rev="1.3" conf="test->default"/>
<dependency org="cglib" name="cglib" rev="2.1_3" conf="test->default"/>
<dependency org="asm" name="asm" rev="1.5.3" conf="test->default"/>
<dependency org="asm" name="asm-attrs" rev="1.5.3" conf="test->default"/>
15 years, 10 months
Hibernate SVN: r15551 - in core/trunk/envers/src: test/java/org/hibernate/envers/test and 1 other directories.
by hibernate-commits@lists.jboss.org
Author: adamw
Date: 2008-11-12 07:28:54 -0500 (Wed, 12 Nov 2008)
New Revision: 15551
Added:
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/onetomany/InverseSideChanges.java
Modified:
core/trunk/envers/src/main/java/org/hibernate/envers/event/AuditEventListener.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/
Log:
HHH-3594: bug fix with test
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/event/AuditEventListener.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/event/AuditEventListener.java 2008-11-12 11:03:15 UTC (rev 15550)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/event/AuditEventListener.java 2008-11-12 12:28:54 UTC (rev 15551)
@@ -195,16 +195,23 @@
public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
CollectionEntry collectionEntry = getCollectionEntry(event);
- onCollectionAction(event, event.getCollection(), collectionEntry.getSnapshot(), collectionEntry);
+ if (!collectionEntry.getLoadedPersister().isInverse()) {
+ onCollectionAction(event, event.getCollection(), collectionEntry.getSnapshot(), collectionEntry);
+ }
}
public void onPreRemoveCollection(PreCollectionRemoveEvent event) {
CollectionEntry collectionEntry = getCollectionEntry(event);
- onCollectionAction(event, null, collectionEntry.getSnapshot(), collectionEntry);
+ if (!collectionEntry.getLoadedPersister().isInverse()) {
+ onCollectionAction(event, null, collectionEntry.getSnapshot(), collectionEntry);
+ }
}
public void onPostRecreateCollection(PostCollectionRecreateEvent event) {
- onCollectionAction(event, event.getCollection(), null, getCollectionEntry(event));
+ CollectionEntry collectionEntry = getCollectionEntry(event);
+ if (!collectionEntry.getLoadedPersister().isInverse()) {
+ onCollectionAction(event, event.getCollection(), null, collectionEntry);
+ }
}
@SuppressWarnings({"unchecked"})
Property changes on: core/trunk/envers/src/test/java/org/hibernate/envers/test
___________________________________________________________________
Name: svn:ignore
+ working
Copied: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/onetomany/InverseSideChanges.java (from rev 15549, core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/onetomany/BasicSet.java)
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/onetomany/InverseSideChanges.java (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/onetomany/InverseSideChanges.java 2008-11-12 12:28:54 UTC (rev 15551)
@@ -0,0 +1,109 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+
+package org.hibernate.envers.test.integration.onetomany;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.entities.onetomany.SetRefEdEntity;
+import org.hibernate.envers.test.entities.onetomany.SetRefIngEntity;
+import org.hibernate.envers.test.tools.TestTools;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class InverseSideChanges extends AbstractEntityTest {
+ private Integer ed1_id;
+
+ private Integer ing1_id;
+
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(SetRefEdEntity.class);
+ cfg.addAnnotatedClass(SetRefIngEntity.class);
+ }
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+ EntityManager em = getEntityManager();
+
+ SetRefEdEntity ed1 = new SetRefEdEntity(1, "data_ed_1");
+
+ SetRefIngEntity ing1 = new SetRefIngEntity(3, "data_ing_1");
+
+ // Revision 1
+ em.getTransaction().begin();
+
+ em.persist(ed1);
+
+ em.getTransaction().commit();
+
+ // Revision 2
+
+ em.getTransaction().begin();
+
+ ed1 = em.find(SetRefEdEntity.class, ed1.getId());
+
+ em.persist(ing1);
+
+ ed1.setReffering(new HashSet<SetRefIngEntity>());
+ ed1.getReffering().add(ing1);
+
+ em.getTransaction().commit();
+
+ //
+
+ ed1_id = ed1.getId();
+
+ ing1_id = ing1.getId();
+ }
+
+ @Test
+ public void testRevisionsCounts() {
+ assert Arrays.asList(1).equals(getAuditReader().getRevisions(SetRefEdEntity.class, ed1_id));
+
+ assert Arrays.asList(2).equals(getAuditReader().getRevisions(SetRefIngEntity.class, ing1_id));
+ }
+
+ @Test
+ public void testHistoryOfEdId1() {
+ SetRefEdEntity rev1 = getAuditReader().find(SetRefEdEntity.class, ed1_id, 1);
+
+ assert rev1.getReffering().equals(Collections.EMPTY_SET);
+ }
+
+ @Test
+ public void testHistoryOfEdIng1() {
+ SetRefIngEntity rev2 = getAuditReader().find(SetRefIngEntity.class, ing1_id, 2);
+
+ assert rev2.getReference() == null;
+ }
+}
\ No newline at end of file
Property changes on: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/onetomany/InverseSideChanges.java
___________________________________________________________________
Name: svn:mergeinfo
+
15 years, 10 months
Hibernate SVN: r15550 - in core/trunk/envers/src: main/java/org/hibernate/envers/query/criteria and 2 other directories.
by hibernate-commits@lists.jboss.org
Author: adamw
Date: 2008-11-12 06:03:15 -0500 (Wed, 12 Nov 2008)
New Revision: 15550
Added:
core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/RevisionTypeAuditExpression.java
Modified:
core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionProperty.java
core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionTypeProperty.java
core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/AuditSyncManager.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/query/RevisionConstraintQuery.java
Log:
HHH-3598: revision type property can be used as query restriction
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionProperty.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionProperty.java 2008-11-11 20:16:10 UTC (rev 15549)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionProperty.java 2008-11-12 11:03:15 UTC (rev 15550)
@@ -40,6 +40,20 @@
private RevisionProperty() { }
/**
+ * Apply a "equal" constraint on the revision number
+ */
+ public static AuditCriterion eq(Integer revision) {
+ return new RevisionAuditExpression(revision, "=");
+ }
+
+ /**
+ * Apply a "not equal" constraint on the revision number
+ */
+ public static AuditCriterion ne(Integer revision) {
+ return new RevisionAuditExpression(revision, "<>");
+ }
+
+ /**
* Apply a "greater than" constraint on the revision number
*/
public static AuditCriterion gt(Integer revision) {
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionTypeProperty.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionTypeProperty.java 2008-11-11 20:16:10 UTC (rev 15549)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionTypeProperty.java 2008-11-12 11:03:15 UTC (rev 15550)
@@ -25,7 +25,10 @@
import org.hibernate.envers.configuration.AuditConfiguration;
import org.hibernate.envers.query.projection.AuditProjection;
+import org.hibernate.envers.query.criteria.AuditCriterion;
+import org.hibernate.envers.query.criteria.RevisionTypeAuditExpression;
import org.hibernate.envers.tools.Triple;
+import org.hibernate.envers.RevisionType;
/**
* @author Adam Warski (adam at warski dot org)
@@ -35,6 +38,20 @@
private RevisionTypeProperty() { }
/**
+ * Apply a "equal" constraint on the revision type
+ */
+ public static AuditCriterion eq(RevisionType type) {
+ return new RevisionTypeAuditExpression(type, "=");
+ }
+
+ /**
+ * Apply a "not equal" constraint on the revision type
+ */
+ public static AuditCriterion ne(RevisionType type) {
+ return new RevisionTypeAuditExpression(type, "<>");
+ }
+
+ /**
* Projection on the revision type
*/
public static AuditProjection revisionType() {
Copied: core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/RevisionTypeAuditExpression.java (from rev 15549, core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/RevisionAuditExpression.java)
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/RevisionTypeAuditExpression.java (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/RevisionTypeAuditExpression.java 2008-11-12 11:03:15 UTC (rev 15550)
@@ -0,0 +1,46 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+
+package org.hibernate.envers.query.criteria;
+
+import org.hibernate.envers.configuration.AuditConfiguration;
+import org.hibernate.envers.tools.query.Parameters;
+import org.hibernate.envers.tools.query.QueryBuilder;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class RevisionTypeAuditExpression implements AuditCriterion {
+ private Object value;
+ private String op;
+
+ public RevisionTypeAuditExpression(Object value, String op) {
+ this.value = value;
+ this.op = op;
+ }
+
+ public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) {
+ parameters.addWhereWithParam(verCfg.getAuditEntCfg().getRevisionTypePropName(), op, value);
+ }
+}
\ No newline at end of file
Property changes on: core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/RevisionTypeAuditExpression.java
___________________________________________________________________
Name: svn:mergeinfo
+
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/AuditSyncManager.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/AuditSyncManager.java 2008-11-11 20:16:10 UTC (rev 15549)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/AuditSyncManager.java 2008-11-12 11:03:15 UTC (rev 15550)
@@ -24,9 +24,9 @@
package org.hibernate.envers.synchronization;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import org.hibernate.envers.revisioninfo.RevisionInfoGenerator;
-import org.hibernate.envers.tools.ConcurrentReferenceHashMap;
import org.hibernate.Transaction;
import org.hibernate.event.EventSource;
@@ -35,13 +35,11 @@
* @author Adam Warski (adam at warski dot org)
*/
public class AuditSyncManager {
- private final Map<Transaction, AuditSync> versionsSyncs;
+ private final Map<Transaction, AuditSync> auditSyncs;
private final RevisionInfoGenerator revisionInfoGenerator;
public AuditSyncManager(RevisionInfoGenerator revisionInfoGenerator) {
- versionsSyncs = new ConcurrentReferenceHashMap<Transaction, AuditSync>(10,
- ConcurrentReferenceHashMap.ReferenceType.WEAK,
- ConcurrentReferenceHashMap.ReferenceType.STRONG);
+ auditSyncs = new ConcurrentHashMap<Transaction, AuditSync>();
this.revisionInfoGenerator = revisionInfoGenerator;
}
@@ -49,10 +47,11 @@
public AuditSync get(EventSource session) {
Transaction transaction = session.getTransaction();
- AuditSync verSync = versionsSyncs.get(transaction);
+ AuditSync verSync = auditSyncs.get(transaction);
if (verSync == null) {
+ // No worries about registering a transaction twice - a transaction is single thread
verSync = new AuditSync(this, session, revisionInfoGenerator);
- versionsSyncs.put(transaction, verSync);
+ auditSyncs.put(transaction, verSync);
transaction.registerSynchronization(verSync);
}
@@ -61,6 +60,6 @@
}
public void remove(Transaction transaction) {
- versionsSyncs.remove(transaction);
+ auditSyncs.remove(transaction);
}
}
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/query/RevisionConstraintQuery.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/query/RevisionConstraintQuery.java 2008-11-11 20:16:10 UTC (rev 15549)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/query/RevisionConstraintQuery.java 2008-11-12 11:03:15 UTC (rev 15550)
@@ -29,8 +29,10 @@
import org.hibernate.envers.query.RevisionProperty;
import org.hibernate.envers.query.AuditRestrictions;
+import org.hibernate.envers.query.RevisionTypeProperty;
import org.hibernate.envers.test.AbstractEntityTest;
import org.hibernate.envers.test.entities.StrIntTestEntity;
+import org.hibernate.envers.RevisionType;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@@ -184,4 +186,32 @@
assert (Long) result == 4;
}
+
+ @Test
+ public void testRevisionTypeEqQuery() {
+ // The query shouldn't be ordered as always, otherwise - we get an exception.
+ List results = getAuditReader().createQuery()
+ .forRevisionsOfEntity(StrIntTestEntity.class, true, true)
+ .add(AuditRestrictions.idEq(id1))
+ .add(RevisionTypeProperty.eq(RevisionType.MOD))
+ .getResultList();
+
+ assert results.size() == 3;
+ assert results.get(0).equals(new StrIntTestEntity("d", 10, id1));
+ assert results.get(1).equals(new StrIntTestEntity("d", 1, id1));
+ assert results.get(2).equals(new StrIntTestEntity("d", 5, id1));
+ }
+
+ @Test
+ public void testRevisionTypeNeQuery() {
+ // The query shouldn't be ordered as always, otherwise - we get an exception.
+ List results = getAuditReader().createQuery()
+ .forRevisionsOfEntity(StrIntTestEntity.class, true, true)
+ .add(AuditRestrictions.idEq(id1))
+ .add(RevisionTypeProperty.ne(RevisionType.MOD))
+ .getResultList();
+
+ assert results.size() == 1;
+ assert results.get(0).equals(new StrIntTestEntity("a", 10, id1));
+ }
}
\ No newline at end of file
15 years, 10 months
Hibernate SVN: r15549 - in search/trunk: src/test/org/hibernate/search/test/analyzer/solr and 1 other directories.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2008-11-11 15:16:10 -0500 (Tue, 11 Nov 2008)
New Revision: 15549
Added:
search/trunk/src/test-resources/org/hibernate/search/test/analyzer/solr/synonyms.properties
search/trunk/src/test/org/hibernate/search/test/analyzer/solr/InsertWhitespaceFilter.java
search/trunk/src/test/org/hibernate/search/test/analyzer/solr/InsertWhitespaceFilterFactory.java
Modified:
search/trunk/ivy.xml
search/trunk/src/test/org/hibernate/search/test/analyzer/solr/SolrAnalyzerTest.java
search/trunk/src/test/org/hibernate/search/test/analyzer/solr/Team.java
Log:
HSEARCH-255 Added a whole bunch of tests for different tokenizers and filters
Modified: search/trunk/ivy.xml
===================================================================
--- search/trunk/ivy.xml 2008-11-11 13:32:00 UTC (rev 15548)
+++ search/trunk/ivy.xml 2008-11-11 20:16:10 UTC (rev 15549)
@@ -21,10 +21,12 @@
<dependency org="javax.transaction" name="jta" rev="1.1" conf="default->default"/>
<dependency org="org.apache.lucene" name="lucene-core" rev="2.4.0" conf="default->default"/>
<dependency org="org.apache.lucene" name="lucene-snowball" rev="2.4.0" conf="default->default"/>
+ <dependency org="org.apache.lucene" name="lucene-analyzers" rev="2.4.0" conf="default->default"/> <!-- optional -->
+ <dependency org="org.apache.commons" name="commons-codec" rev="1.3" conf="default->default"/> <!-- optional -->
<dependency org="javax.jms" name="jms" rev="1.1" conf="default->default"/> <!-- optional -->
<dependency org="javax.annotation" name="jsr250-api" rev="1.0" conf="default->default"/> <!-- optional -->
- <dependency org="org.apache.solr" name="solr-core" rev="1.3.0" conf="default->default"/>
- <dependency org="org.apache.solr" name="solr-common" rev="1.3.0" conf="default->default"/>
+ <dependency org="org.apache.solr" name="solr-core" rev="1.3.0" conf="default->default"/> <!-- optional -->
+ <dependency org="org.apache.solr" name="solr-common" rev="1.3.0" conf="default->default"/> <!-- optional -->
<!-- transitive dependencies -->
<dependency org="antlr" name="antlr" rev="2.7.6" conf="test->default"/>
@@ -46,4 +48,4 @@
<dependency org="org.apache.derby" name="derby" rev="10.2.1.6" conf="test->default"/>
</dependencies>
-</ivy-module>
\ No newline at end of file
+</ivy-module>
Added: search/trunk/src/test/org/hibernate/search/test/analyzer/solr/InsertWhitespaceFilter.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/analyzer/solr/InsertWhitespaceFilter.java (rev 0)
+++ search/trunk/src/test/org/hibernate/search/test/analyzer/solr/InsertWhitespaceFilter.java 2008-11-11 20:16:10 UTC (rev 15549)
@@ -0,0 +1,36 @@
+// $Id: AbstractTestAnalyzer.java 15547 2008-11-11 12:57:47Z hardy.ferentschik $
+package org.hibernate.search.test.analyzer.solr;
+
+import java.io.Reader;
+import java.io.IOException;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.TokenStream;
+import org.apache.lucene.analysis.Token;
+import org.apache.lucene.analysis.Tokenizer;
+import org.apache.lucene.analysis.TokenFilter;
+import org.apache.lucene.search.Filter;
+
+
+/**
+ * A filter which will actually insert spaces. Most filters/tokenizers remove them, but for testing it is
+ * sometimes better to insert them again ;-)
+ *
+ * @author Hardy Ferentschik
+ */
+public class InsertWhitespaceFilter extends TokenFilter {
+ public InsertWhitespaceFilter(TokenStream in) {
+ super( in );
+ }
+
+ public Token next(final Token reusableToken) throws IOException {
+ Token nextToken = input.next( reusableToken );
+ if ( nextToken != null ) {
+ nextToken.setTermBuffer( " " + nextToken.term() + " " );
+ return nextToken;
+ }
+ else {
+ return null;
+ }
+ }
+}
\ No newline at end of file
Added: search/trunk/src/test/org/hibernate/search/test/analyzer/solr/InsertWhitespaceFilterFactory.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/analyzer/solr/InsertWhitespaceFilterFactory.java (rev 0)
+++ search/trunk/src/test/org/hibernate/search/test/analyzer/solr/InsertWhitespaceFilterFactory.java 2008-11-11 20:16:10 UTC (rev 15549)
@@ -0,0 +1,30 @@
+// $Id$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.search.test.analyzer.solr;
+
+import org.apache.lucene.analysis.TokenStream;
+import org.apache.solr.analysis.BaseTokenFilterFactory;
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class InsertWhitespaceFilterFactory extends BaseTokenFilterFactory {
+ public InsertWhitespaceFilter create(TokenStream input) {
+ return new InsertWhitespaceFilter( input );
+ }
+}
Property changes on: search/trunk/src/test/org/hibernate/search/test/analyzer/solr/InsertWhitespaceFilterFactory.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified: search/trunk/src/test/org/hibernate/search/test/analyzer/solr/SolrAnalyzerTest.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/analyzer/solr/SolrAnalyzerTest.java 2008-11-11 13:32:00 UTC (rev 15548)
+++ search/trunk/src/test/org/hibernate/search/test/analyzer/solr/SolrAnalyzerTest.java 2008-11-11 20:16:10 UTC (rev 15549)
@@ -3,11 +3,14 @@
import org.apache.lucene.index.Term;
import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.Token;
import org.hibernate.Transaction;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.test.SearchTestCase;
+import org.hibernate.search.test.util.AnalyzerUtils;
/**
* Tests the Solr analyzer creation framework.
@@ -62,6 +65,90 @@
fts.close();
}
+ /**
+ * Tests the analyzers defined on {@link Team}.
+ *
+ * @throws Exception in case the test fails.
+ */
+ public void testAnalyzers() throws Exception {
+ FullTextSession fts = Search.getFullTextSession( openSession() );
+
+ Analyzer analyzer = fts.getSearchFactory().getAnalyzer( "standard_analyzer" );
+ String text = "This is just FOOBAR's";
+ Token[] tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
+ AnalyzerUtils.assertTokensEqual( tokens, new String[] { "This", "is", "just", "FOOBAR" } );
+
+ analyzer = fts.getSearchFactory().getAnalyzer( "html_standard_analyzer" );
+ text = "This is <b>foo</b><i>bar's</i>";
+ tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
+ AnalyzerUtils.assertTokensEqual( tokens, new String[] { "This", "is", "foo", "bar" } );
+
+ analyzer = fts.getSearchFactory().getAnalyzer( "html_whitespace_analyzer" );
+ text = "This is <b>foo</b><i>bar's</i>";
+ tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
+ AnalyzerUtils.assertTokensEqual( tokens, new String[] { "This", "is", "foo", "bar's" } );
+
+ analyzer = fts.getSearchFactory().getAnalyzer( "trim_analyzer" );
+ text = " Kittens! ";
+ tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
+ AnalyzerUtils.assertTokensEqual( tokens, new String[] { "kittens" } );
+
+ analyzer = fts.getSearchFactory().getAnalyzer( "length_analyzer" );
+ text = "ab abc abcd abcde abcdef";
+ tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
+ AnalyzerUtils.assertTokensEqual( tokens, new String[] { "abc", "abcd", "abcde" } );
+
+ analyzer = fts.getSearchFactory().getAnalyzer( "length_analyzer" );
+ text = "ab abc abcd abcde abcdef";
+ tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
+ AnalyzerUtils.assertTokensEqual( tokens, new String[] { "abc", "abcd", "abcde" } );
+
+ analyzer = fts.getSearchFactory().getAnalyzer( "porter_analyzer" );
+ text = "bikes bikes biking";
+ tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
+ AnalyzerUtils.assertTokensEqual( tokens, new String[] { "bike", "bike", "bike" } );
+
+ analyzer = fts.getSearchFactory().getAnalyzer( "word_analyzer" );
+ text = "CamelCase";
+ tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
+ AnalyzerUtils.assertTokensEqual( tokens, new String[] { "Camel", "Case" } );
+
+ analyzer = fts.getSearchFactory().getAnalyzer( "synonym_analyzer" );
+ text = "ipod cosmos";
+ tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
+ AnalyzerUtils.assertTokensEqual( tokens, new String[] { "ipod", "i-pod", "universe", "cosmos" } );
+
+ analyzer = fts.getSearchFactory().getAnalyzer( "shingle_analyzer" );
+ text = "please divide this sentence into shingles";
+ tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
+ AnalyzerUtils.assertTokensEqual(
+ tokens,
+ new String[] {
+ "please",
+ "please divide",
+ "divide",
+ "divide this",
+ "this",
+ "this sentence",
+ "sentence",
+ "sentence into",
+ "into",
+ "into shingles",
+ "shingles"
+ }
+ );
+
+ analyzer = fts.getSearchFactory().getAnalyzer( "phonetic_analyzer" );
+ text = "The quick brown fox jumped over the lazy dogs";
+ tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
+ AnalyzerUtils.displayTokens( analyzer, "name", text );
+ AnalyzerUtils.assertTokensEqual(
+ tokens, new String[] { "0", "KK", "BRN", "FKS", "JMPT", "OFR", "0", "LS", "TKS" }
+ );
+
+ fts.close();
+ }
+
protected Class[] getMappings() {
return new Class[] {
Team.class
Modified: search/trunk/src/test/org/hibernate/search/test/analyzer/solr/Team.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/analyzer/solr/Team.java 2008-11-11 13:32:00 UTC (rev 15548)
+++ search/trunk/src/test/org/hibernate/search/test/analyzer/solr/Team.java 2008-11-11 20:16:10 UTC (rev 15549)
@@ -5,14 +5,26 @@
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
+import org.apache.solr.analysis.HTMLStripStandardTokenizerFactory;
+import org.apache.solr.analysis.HTMLStripWhitespaceTokenizerFactory;
import org.apache.solr.analysis.ISOLatin1AccentFilterFactory;
+import org.apache.solr.analysis.LengthFilterFactory;
import org.apache.solr.analysis.LowerCaseFilterFactory;
+import org.apache.solr.analysis.LowerCaseTokenizerFactory;
+import org.apache.solr.analysis.PorterStemFilterFactory;
+import org.apache.solr.analysis.ShingleFilterFactory;
import org.apache.solr.analysis.SnowballPorterFilterFactory;
+import org.apache.solr.analysis.StandardFilterFactory;
import org.apache.solr.analysis.StandardTokenizerFactory;
import org.apache.solr.analysis.StopFilterFactory;
+import org.apache.solr.analysis.SynonymFilterFactory;
+import org.apache.solr.analysis.TrimFilterFactory;
+import org.apache.solr.analysis.WordDelimiterFilterFactory;
+import org.apache.solr.analysis.PhoneticFilterFactory;
import org.hibernate.search.annotations.Analyzer;
import org.hibernate.search.annotations.AnalyzerDef;
+import org.hibernate.search.annotations.AnalyzerDefs;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;
@@ -25,20 +37,94 @@
*/
@Entity
@Indexed
-@AnalyzerDef(name = "customanalyzer",
- tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
- filters = {
- @TokenFilterDef(factory = ISOLatin1AccentFilterFactory.class),
- @TokenFilterDef(factory = LowerCaseFilterFactory.class),
- @TokenFilterDef(factory = StopFilterFactory.class, params = {
- @Parameter(name = "words",
- value = "org/hibernate/search/test/analyzer/solr/stoplist.properties"),
- @Parameter(name = "ignoreCase", value = "true")
+@AnalyzerDefs({
+ @AnalyzerDef(name = "customanalyzer",
+ tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
+ filters = {
+ @TokenFilterDef(factory = ISOLatin1AccentFilterFactory.class),
+ @TokenFilterDef(factory = LowerCaseFilterFactory.class),
+ @TokenFilterDef(factory = StopFilterFactory.class, params = {
+ @Parameter(name = "words",
+ value = "org/hibernate/search/test/analyzer/solr/stoplist.properties"),
+ @Parameter(name = "ignoreCase", value = "true")
+ }),
+ @TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {
+ @Parameter(name = "language", value = "English")
+ })
}),
- @TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {
- @Parameter(name = "language", value = "English")
+
+ @AnalyzerDef(name = "standard_analyzer",
+ tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
+ filters = {
+ @TokenFilterDef(factory = StandardFilterFactory.class)
+ }),
+
+ @AnalyzerDef(name = "html_standard_analyzer",
+ tokenizer = @TokenizerDef(factory = HTMLStripStandardTokenizerFactory.class),
+ filters = {
+ @TokenFilterDef(factory = StandardFilterFactory.class)
+ }),
+
+ @AnalyzerDef(name = "html_whitespace_analyzer",
+ tokenizer = @TokenizerDef(factory = HTMLStripWhitespaceTokenizerFactory.class),
+ filters = {
+ @TokenFilterDef(factory = StandardFilterFactory.class)
+ }),
+
+ @AnalyzerDef(name = "trim_analyzer",
+ tokenizer = @TokenizerDef(factory = LowerCaseTokenizerFactory.class),
+ filters = {
+ @TokenFilterDef(factory = InsertWhitespaceFilterFactory.class),
+ @TokenFilterDef(factory = TrimFilterFactory.class)
+ }),
+
+ @AnalyzerDef(name = "length_analyzer",
+ tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
+ filters = {
+ @TokenFilterDef(factory = LengthFilterFactory.class, params = {
+ @Parameter(name = "min", value = "3"),
+ @Parameter(name = "max", value = "5")
+ })
+ }),
+
+ @AnalyzerDef(name = "porter_analyzer",
+ tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
+ filters = {
+ @TokenFilterDef(factory = PorterStemFilterFactory.class)
+ }),
+
+ @AnalyzerDef(name = "word_analyzer",
+ tokenizer = @TokenizerDef(factory = HTMLStripStandardTokenizerFactory.class),
+ filters = {
+ @TokenFilterDef(factory = WordDelimiterFilterFactory.class, params = {
+ @Parameter(name = "splitOnCaseChange", value = "1")
+ })
+ }),
+
+ @AnalyzerDef(name = "synonym_analyzer",
+ tokenizer = @TokenizerDef(factory = HTMLStripStandardTokenizerFactory.class),
+ filters = {
+ @TokenFilterDef(factory = SynonymFilterFactory.class, params = {
+ @Parameter(name = "synonyms",
+ value = "org/hibernate/search/test/analyzer/solr/synonyms.properties")
+ })
+ }),
+
+ @AnalyzerDef(name = "shingle_analyzer",
+ tokenizer = @TokenizerDef(factory = HTMLStripStandardTokenizerFactory.class),
+ filters = {
+ @TokenFilterDef(factory = ShingleFilterFactory.class)
+ }),
+
+ @AnalyzerDef(name = "phonetic_analyzer",
+ tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
+ filters = {
+ @TokenFilterDef(factory = PhoneticFilterFactory.class, params = {
+ @Parameter(name = "encoder", value = "Metaphone"),
+ @Parameter(name = "inject", value = "true")
+ })
})
- })
+})
public class Team {
@Id
@DocumentId
Added: search/trunk/src/test-resources/org/hibernate/search/test/analyzer/solr/synonyms.properties
===================================================================
--- search/trunk/src/test-resources/org/hibernate/search/test/analyzer/solr/synonyms.properties (rev 0)
+++ search/trunk/src/test-resources/org/hibernate/search/test/analyzer/solr/synonyms.properties 2008-11-11 20:16:10 UTC (rev 15549)
@@ -0,0 +1,2 @@
+ipod, i-pod
+universe , cosmos
15 years, 10 months
Hibernate SVN: r15548 - search/trunk/doc/reference/en/modules.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2008-11-11 08:32:00 -0500 (Tue, 11 Nov 2008)
New Revision: 15548
Modified:
search/trunk/doc/reference/en/modules/query.xml
Log:
HSEARCH-294 - updated docs
Modified: search/trunk/doc/reference/en/modules/query.xml
===================================================================
--- search/trunk/doc/reference/en/modules/query.xml 2008-11-11 12:57:47 UTC (rev 15547)
+++ search/trunk/doc/reference/en/modules/query.xml 2008-11-11 13:32:00 UTC (rev 15548)
@@ -522,9 +522,9 @@
<programlisting>public class BestDriversFilter extends <emphasis
role="bold">org.apache.lucene.search.Filter</emphasis> {
- public BitSet bits(IndexReader reader) throws IOException {
- BitSet bitSet = new BitSet( reader.maxDoc() );
- TermDocs termDocs = reader.termDocs( new Term("score", "5") );
+ public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
+ OpenBitSet bitSet = new OpenBitSet( reader.maxDoc() );
+ TermDocs termDocs = reader.termDocs( new Term( "score", "5" ) );
while ( termDocs.next() ) {
bitSet.set( termDocs.doc() );
}
@@ -536,7 +536,7 @@
Lucene filter which reduces the result set to drivers whose score is 5. In
this example the specified filter implements the
<literal>org.apache.lucene.search.Filter</literal> directly and contains a
- no-arg constructor. </para>
+ no-arg constructor.</para>
<para>If your Filter creation requires additional steps or if the filter
you want to use does not have a no-arg constructor, you can use the
@@ -642,25 +642,23 @@
the actual filter results. In Lucene it is common practice to wrap filters
using the <classname>IndexReader</classname> around a
<classname>CachingWrapperFilter.</classname> The wrapper will cache the
- <classname>BitSet</classname> returned from the
- <methodname>bits(IndexReader reader)</methodname> method to avoid
- expensive recomputation. The <classname>BitSet</classname> uses one bit
- per Document. If for example your index contains ten millions documents,
- the <classname>BitSet</classname> structure will take 1.2 Mb of memory. It
- is important to mention that the computed <classname>BitSet</classname> is
- only cachable for the same <classname>IndexReader</classname> instance,
- because the reader effectively represents the state of the index at the
- moment it was opened. The document list cannot change within an opened
+ <classname>DocIdSet</classname> returned from the
+ <methodname>getDocIdSet(IndexReader reader)</methodname> method to avoid
+ expensive recomputation. It is important to mention that the computed
+ <classname>DocIdSet</classname> is only cachable for the same
+ <classname>IndexReader</classname> instance, because the reader
+ effectively represents the state of the index at the moment it was opened.
+ The document list cannot change within an opened
<classname>IndexReader</classname>. A different/new<classname>
IndexReader</classname> instance, however, works potentially on a
different set of <classname>Document</classname>s (either from a different
index or simply because the index has changed), hence the cached
- <classname>BitSet</classname> has to be recomputed.</para>
+ <classname>DocIdSet</classname> has to be recomputed.</para>
<para>Hibernate Search also helps with this aspect of caching. Per default
the <literal>cache</literal> flag of <classname>@FullTextFilterDef
</classname>is set to
- <literal>FilterCacheModeType.INSTANCE_AND_BITSETRESULTS</literal> which
+ <literal>FilterCacheModeType.INSTANCE_AND_DOCIDSETRESULTS</literal> which
will automatically cache the filter instance as well as wrap the specified
filter around a Hibernate specific implementation of
<classname>CachingWrapperFilter</classname>
@@ -700,20 +698,21 @@
<entry align="left">FilterCacheModeType.INSTANCE_ONLY</entry>
<entry>The filter instance is cached and reused across
- concurrent <methodname>Filter.bits()</methodname> calls.
- <classname>BitSet</classname> results are not cached. This
+ concurrent <methodname>Filter.getDocIdSet()</methodname> calls.
+ <classname>DocIdSet</classname> results are not cached. This
setting is useful when a filter uses its own specific caching
mechanism or the filter results change dynamically due to
- application specific events making <classname>BitSet</classname>
- caching in both cases unnecessary.</entry>
+ application specific events making
+ <classname>DocIdSet</classname> caching in both cases
+ unnecessary.</entry>
</row>
<row>
<entry
- align="left">FilterCacheModeType.INSTANCE_AND_BITSETRESULTS</entry>
+ align="left">FilterCacheModeType.INSTANCE_AND_DOCIDSETRESULTS</entry>
<entry>Both the filter instance and the
- <classname>BitSet</classname> results are cached. This is the
+ <classname>DocIdSet</classname> results are cached. This is the
default value.</entry>
</row>
</tbody>
@@ -728,8 +727,8 @@
</listitem>
<listitem>
- <para>the Filter BitSet is expensive to compute (compared to the time
- spent to execute the query)</para>
+ <para>the Filter's DocIdSet is expensive to compute (compared to the
+ time spent to execute the query)</para>
</listitem>
</itemizedlist>
</section>
15 years, 10 months