[hibernate-commits] Hibernate SVN: r18078 - in search/trunk/src: main/java/org/hibernate/search/cfg and 2 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Nov 27 12:30:32 EST 2009


Author: epbernard
Date: 2009-11-27 12:30:32 -0500 (Fri, 27 Nov 2009)
New Revision: 18078

Modified:
   search/trunk/src/main/docbook/en-US/modules/mapping.xml
   search/trunk/src/main/java/org/hibernate/search/cfg/EntityMapping.java
   search/trunk/src/main/java/org/hibernate/search/cfg/FullTextFilterDefMapping.java
   search/trunk/src/main/java/org/hibernate/search/cfg/IndexedMapping.java
   search/trunk/src/main/java/org/hibernate/search/cfg/ProvidedIdMapping.java
   search/trunk/src/main/java/org/hibernate/search/cfg/SearchMapping.java
   search/trunk/src/main/java/org/hibernate/search/cfg/TokenFilterDefMapping.java
   search/trunk/src/main/java/org/hibernate/search/impl/MappingModelMetadataProvider.java
   search/trunk/src/main/java/org/hibernate/search/impl/SearchFactoryImpl.java
   search/trunk/src/test/java/org/hibernate/search/test/configuration/ProgrammaticMappingTest.java
Log:
HSEARCH-411 fix various issues on programmatic API

Modified: search/trunk/src/main/docbook/en-US/modules/mapping.xml
===================================================================
--- search/trunk/src/main/docbook/en-US/modules/mapping.xml	2009-11-27 16:53:33 UTC (rev 18077)
+++ search/trunk/src/main/docbook/en-US/modules/mapping.xml	2009-11-27 17:30:32 UTC (rev 18078)
@@ -1548,7 +1548,7 @@
     <classname>SearchMapping</classname> object. This object is passed to
     Hibernate Search via a property set to the <classname>Configuration
     </classname>object. The property key is
-    <literal>hibernate.search.mapping_model</literal>. </para>
+    <literal>hibernate.search.mapping_model</literal>.</para>
 
     <programlisting>SearchMapping mapping = new SearchMapping();
 [...]
@@ -1736,18 +1736,19 @@
     </section>
 
     <section>
-      <title>Defining fields for indexing</title>
+      <title>Defining full text filter definitions</title>
 
-      <para>When defining fields for indexing using the programmatic API, call
-      <methodname>field()</methodname> on the <methodname>property(String
-      propertyName, ElementType elementType)</methodname> method. From
-      <methodname>field()</methodname> you can specify the <methodname>name,
-      index</methodname>, <methodname>store</methodname>,
-      <methodname>bridge</methodname> and <methodname>analyzer</methodname>
-      definitions.</para>
+      <para>The programmatic API provides easy mechanism for defining full
+      text filter definitions which is available via
+      <classname>@FullTextFilterDef</classname> and
+      <classname>@FullTextFilterDefs</classname>. Note that contrary to the
+      annotation equivalent, full text filter definitions are a global
+      construct and are not tied to an entity. The next example depicts the
+      creation of full text filter definition using the
+      <methodname>fullTextFilterDef </methodname>method.</para>
 
       <para><example>
-          <title>Indexing fields using programmatic API</title>
+          <title>Defining full text definition programmatically</title>
 
           <programlisting>SearchMapping mapping = new SearchMapping();
 
@@ -1755,26 +1756,30 @@
     .analyzerDef( "en", StandardTokenizerFactory.class )
         .filter( LowerCaseFilterFactory.class )
         .filter( EnglishPorterFilterFactory.class )
-    .entity(Address.class).indexed()
+    <emphasis role="bold">.fullTextFilterDef("security", SecurityFilterFactory.class)
+            .cache(FilterCacheModeType.INSTANCE_ONLY)</emphasis>
+    .entity(Address.class)
+        .indexed()
         .property("addressId", ElementType.METHOD)
             .documentId()
                 .name("id")
         .property("street1", ElementType.METHOD)
-            <emphasis role="bold">.field()
+            .field()
                 .analyzer("en")
                 .store(Store.YES)
-                .index(Index.TOKENIZED) //no useful here as it's the default
             .field()
                 .name("address_data")
-                .analyzer("en");</emphasis>
+                .analyzer("en")
+                .store(Store.NO);
 
 cfg.getProperties().put( "hibernate.search.mapping_model", mapping );</programlisting>
 
-          <para>The above example of marking fields as indexable is equivalent
-          to defining fields using <classname>@Field</classname> as seen
+          <para>The previous example can effectively been seen as annotating
+          your entity with <classname>@FullTextFilterDef</classname> like
           below:</para>
         </example><example>
-          <title>Indexing fields using annotation</title>
+          <title>Using annotation to define full text filter
+          definition</title>
 
           <programlisting>@Entity
 @Indexed
@@ -1786,39 +1791,42 @@
       @TokenFilterDef(factory = EnglishPorterFilterFactory.class)
    })
 })
+ at FullTextFilterDefs({
+ @FullTextFilterDef(name = "security", impl = SecurityFilterFactory.class, cache = FilterCacheModeType.INSTANCE_ONLY)
+})
 public class Address {
  
  @Id
  @GeneratedValue
  @DocumentId(name="id")
- private Long getAddressId() {...};
+ pubblic Long getAddressId() {...};
 
  @Fields({
       @Field(index=Index.TOKENIZED, store=Store.YES, 
              analyzer=@Analyzer(definition="en")),
       @Field(name="address_data", analyzer=@Analyzer(definition="en"))
  })
- public String getAddress1() {...}
+ public String getAddress1() {...};
 
  ......
+ 
 }</programlisting>
-
-          <para></para>
         </example></para>
     </section>
 
     <section>
-      <title>Defining full text filter definitions</title>
+      <title>Defining fields for indexing</title>
 
-      <para>The programmatic API provides easy mechanism for defining full
-      text filter definitions which is available via
-      <classname>@FullTextFilterDef</classname> and
-      <classname>@FullTextFilterDefs</classname>. The next example depicts the
-      creation of full text filter definition using the
-      <methodname>fullTextFilterDef </methodname>method.</para>
+      <para>When defining fields for indexing using the programmatic API, call
+      <methodname>field()</methodname> on the <methodname>property(String
+      propertyName, ElementType elementType)</methodname> method. From
+      <methodname>field()</methodname> you can specify the <methodname>name,
+      index</methodname>, <methodname>store</methodname>,
+      <methodname>bridge</methodname> and <methodname>analyzer</methodname>
+      definitions.</para>
 
       <para><example>
-          <title>Defining full text definition programmatically</title>
+          <title>Indexing fields using programmatic API</title>
 
           <programlisting>SearchMapping mapping = new SearchMapping();
 
@@ -1826,29 +1834,26 @@
     .analyzerDef( "en", StandardTokenizerFactory.class )
         .filter( LowerCaseFilterFactory.class )
         .filter( EnglishPorterFilterFactory.class )
-    .entity(Address.class)
-        .indexed()
-        <emphasis role="bold">.fullTextFilterDef("security", SecurityFilterFactory.class)
-            .cache(FilterCacheModeType.INSTANCE_ONLY)</emphasis>
+    .entity(Address.class).indexed()
         .property("addressId", ElementType.METHOD)
             .documentId()
                 .name("id")
         .property("street1", ElementType.METHOD)
-            .field()
+            <emphasis role="bold">.field()
                 .analyzer("en")
                 .store(Store.YES)
+                .index(Index.TOKENIZED) //no useful here as it's the default
             .field()
                 .name("address_data")
-                .analyzer("en")
-                .store(Store.NO);
+                .analyzer("en");</emphasis>
 
 cfg.getProperties().put( "hibernate.search.mapping_model", mapping );</programlisting>
 
-          <para>The previous example can effectively been seen as annotating
-          your entity with @FullTextFilterDef like below:</para>
+          <para>The above example of marking fields as indexable is equivalent
+          to defining fields using <classname>@Field</classname> as seen
+          below:</para>
         </example><example>
-          <title>Using annotation to define full text filter
-          definition</title>
+          <title>Indexing fields using annotation</title>
 
           <programlisting>@Entity
 @Indexed
@@ -1860,26 +1865,24 @@
       @TokenFilterDef(factory = EnglishPorterFilterFactory.class)
    })
 })
- at FullTextFilterDefs({
- @FullTextFilterDef(name = "security", impl = SecurityFilterFactory.class, cache = FilterCacheModeType.INSTANCE_ONLY)
-})
 public class Address {
  
  @Id
  @GeneratedValue
  @DocumentId(name="id")
- pubblic Long getAddressId() {...};
+ private Long getAddressId() {...};
 
  @Fields({
       @Field(index=Index.TOKENIZED, store=Store.YES, 
              analyzer=@Analyzer(definition="en")),
       @Field(name="address_data", analyzer=@Analyzer(definition="en"))
  })
- public String getAddress1() {...};
+ public String getAddress1() {...}
 
  ......
- 
 }</programlisting>
+
+          <para></para>
         </example></para>
     </section>
 

Modified: search/trunk/src/main/java/org/hibernate/search/cfg/EntityMapping.java
===================================================================
--- search/trunk/src/main/java/org/hibernate/search/cfg/EntityMapping.java	2009-11-27 16:53:33 UTC (rev 18077)
+++ search/trunk/src/main/java/org/hibernate/search/cfg/EntityMapping.java	2009-11-27 17:30:32 UTC (rev 18078)
@@ -70,7 +70,7 @@
 	
 	
 	public FullTextFilterDefMapping fullTextFilterDef(String name, Class<?> impl) {
-		return new FullTextFilterDefMapping(mapping, entity, name, impl);
+		return new FullTextFilterDefMapping(mapping,name, impl);
 	}
 	
 	public PropertyMapping property(String name, ElementType type) {

Modified: search/trunk/src/main/java/org/hibernate/search/cfg/FullTextFilterDefMapping.java
===================================================================
--- search/trunk/src/main/java/org/hibernate/search/cfg/FullTextFilterDefMapping.java	2009-11-27 16:53:33 UTC (rev 18077)
+++ search/trunk/src/main/java/org/hibernate/search/cfg/FullTextFilterDefMapping.java	2009-11-27 17:30:32 UTC (rev 18078)
@@ -39,15 +39,13 @@
 	
 	private final SearchMapping mapping;
 	private final Map<String,Object> fullTextFilterDef;
-	private final EntityDescriptor entity;
 	
-	public FullTextFilterDefMapping(SearchMapping mapping, EntityDescriptor entity, String name, Class<?> impl) {
+	public FullTextFilterDefMapping(SearchMapping mapping, String name, Class<?> impl) {
 		this.mapping = mapping;
-		this.entity = entity;
 		this.fullTextFilterDef =new HashMap<String, Object>();
 		this.fullTextFilterDef.put("name", name);
 		this.fullTextFilterDef.put("impl", impl);
-		entity.addFulltextFilterDef(fullTextFilterDef);
+		mapping.addFulltextFilterDef(fullTextFilterDef);
 	}
 	
 	/**
@@ -61,13 +59,9 @@
 	}
 
 	public FullTextFilterDefMapping fullTextFilterDef(String name, Class<?> impl) {
-		return new FullTextFilterDefMapping(mapping,entity,name, impl);
+		return new FullTextFilterDefMapping(mapping, name, impl);
 	}
 
-	public PropertyMapping property(String name, ElementType type) {
-		return new PropertyMapping(name, type, entity, mapping);
-	}
-
 	public AnalyzerDefMapping analyzerDef(String name, Class<? extends TokenizerFactory> tokenizerFactory) {
 		return new AnalyzerDefMapping(name, tokenizerFactory, mapping);
 	}
@@ -75,10 +69,4 @@
 	public EntityMapping entity(Class<?> entityType) {
 		return new EntityMapping(entityType, mapping);
 	}
-
-	public ProvidedIdMapping providedId() {
-		return new ProvidedIdMapping(mapping,entity);
-	}
-
-	
 }

Modified: search/trunk/src/main/java/org/hibernate/search/cfg/IndexedMapping.java
===================================================================
--- search/trunk/src/main/java/org/hibernate/search/cfg/IndexedMapping.java	2009-11-27 16:53:33 UTC (rev 18077)
+++ search/trunk/src/main/java/org/hibernate/search/cfg/IndexedMapping.java	2009-11-27 17:30:32 UTC (rev 18078)
@@ -74,7 +74,7 @@
 	
 	
 	public FullTextFilterDefMapping fullTextFilterDef(String name, Class<?> impl) {
-		return new FullTextFilterDefMapping(mapping, entity, name, impl);
+		return new FullTextFilterDefMapping(mapping, name, impl);
 	}
 	
 	public PropertyMapping property(String name, ElementType type) {

Modified: search/trunk/src/main/java/org/hibernate/search/cfg/ProvidedIdMapping.java
===================================================================
--- search/trunk/src/main/java/org/hibernate/search/cfg/ProvidedIdMapping.java	2009-11-27 16:53:33 UTC (rev 18077)
+++ search/trunk/src/main/java/org/hibernate/search/cfg/ProvidedIdMapping.java	2009-11-27 17:30:32 UTC (rev 18078)
@@ -53,7 +53,7 @@
 	}
 	
 	public FullTextFilterDefMapping fullTextFilterDef(String name, Class<?> impl) {
-		return new FullTextFilterDefMapping(searchMapping, entity, name, impl);
+		return new FullTextFilterDefMapping(searchMapping, name, impl);
 	}
 	
 	public PropertyMapping property(String name, ElementType type) {

Modified: search/trunk/src/main/java/org/hibernate/search/cfg/SearchMapping.java
===================================================================
--- search/trunk/src/main/java/org/hibernate/search/cfg/SearchMapping.java	2009-11-27 16:53:33 UTC (rev 18077)
+++ search/trunk/src/main/java/org/hibernate/search/cfg/SearchMapping.java	2009-11-27 17:30:32 UTC (rev 18078)
@@ -38,12 +38,17 @@
  */
 public class SearchMapping {
 	private Set<Map<String, Object>> analyzerDefs = new HashSet<Map<String, Object>>();
+	private Set<Map<String, Object>> fullTextFilterDefs = new HashSet<Map<String, Object>>();
 	private Map<Class<?>, EntityDescriptor> entities = new HashMap<Class<?>, EntityDescriptor>();
 
 	public Set<Map<String, Object>> getAnalyzerDefs() {
 		return analyzerDefs;
 	}
 	
+	public Set<Map<String, Object>> getFullTextFilerDefs() {
+		return fullTextFilterDefs;
+	}
+	
 	public EntityDescriptor getEntityDescriptor(Class<?> entityType) {
 		return entities.get( entityType );
 	}
@@ -51,18 +56,23 @@
 	public AnalyzerDefMapping analyzerDef(String name, Class<? extends TokenizerFactory> tokenizerFactory) {
 		return new AnalyzerDefMapping(name, tokenizerFactory, this);
 	}
-
+	
 	public EntityMapping entity(Class<?> entityType) {
 		return new EntityMapping(entityType, this);
 	}
+	
+	public FullTextFilterDefMapping fullTextFilterDef(String name, Class<?> impl) {
+		return new FullTextFilterDefMapping(this, name, impl );
+	}
 
 	/**
 	 * eg @Containing(things={@Thing(...), @Thing(...)}
 	 * Map<String, Object> addedThing = addElementToAnnotationArray(containing, "things");
 	 */
+
 	static Map<String, Object> addElementToAnnotationArray(Map<String, Object> containingAnnotation,
 													  String attributeName) {
-		List<Map<String, Object>> array = (List<Map<String, Object>>) containingAnnotation.get( attributeName );
+		@SuppressWarnings("unchecked") List<Map<String, Object>> array = (List<Map<String, Object>>) containingAnnotation.get( attributeName );
 		if ( array == null) {
 			array = new ArrayList<Map<String, Object>>();
 			containingAnnotation.put( attributeName, array );
@@ -84,5 +94,9 @@
 		}
 		return entity;
 	}
+
+	void addFulltextFilterDef(Map<String, Object> fullTextFilterDef) {
+		fullTextFilterDefs.add(fullTextFilterDef);
+	}
 	
 }

Modified: search/trunk/src/main/java/org/hibernate/search/cfg/TokenFilterDefMapping.java
===================================================================
--- search/trunk/src/main/java/org/hibernate/search/cfg/TokenFilterDefMapping.java	2009-11-27 16:53:33 UTC (rev 18077)
+++ search/trunk/src/main/java/org/hibernate/search/cfg/TokenFilterDefMapping.java	2009-11-27 17:30:32 UTC (rev 18078)
@@ -69,4 +69,8 @@
 		return new AnalyzerDefMapping(name, tokenizerFactory, mapping);
 	}
 
+	public FullTextFilterDefMapping fullTextFilterDef(String name, Class<?> impl) {
+		return new FullTextFilterDefMapping(mapping, name, impl );
+	}
+
 }

Modified: search/trunk/src/main/java/org/hibernate/search/impl/MappingModelMetadataProvider.java
===================================================================
--- search/trunk/src/main/java/org/hibernate/search/impl/MappingModelMetadataProvider.java	2009-11-27 16:53:33 UTC (rev 18077)
+++ search/trunk/src/main/java/org/hibernate/search/impl/MappingModelMetadataProvider.java	2009-11-27 17:30:32 UTC (rev 18078)
@@ -101,10 +101,15 @@
 					new HashMap<Object, Object>() :
 					new HashMap<Object, Object>(delegateDefaults);
 			defaults.put( AnalyzerDefs.class, createAnalyzerDefArray() );
+			if (!mapping.getFullTextFilerDefs().isEmpty()) {
+				defaults.put(FullTextFilterDefs.class, createFullTextFilterDefsForMapping());
+			}
 		}
 		return defaults;
 	}
 
+	
+
 	public AnnotationReader getAnnotationReader(AnnotatedElement annotatedElement) {
 		AnnotationReader reader = cache.get(annotatedElement);
 		if (reader == null) {
@@ -124,7 +129,36 @@
 		return defs;
 	}
 	
+	private FullTextFilterDef[] createFullTextFilterDefsForMapping() {
+		Set<Map<String, Object>> fullTextFilterDefs = mapping.getFullTextFilerDefs();
+		FullTextFilterDef[] filters = new FullTextFilterDef[fullTextFilterDefs.size()];
+		int index = 0;
+		for(Map<String,Object> filterDef : fullTextFilterDefs) {
+			filters[index] = createFullTextFilterDef(filterDef);
+			index++;
+		}
+		return filters;
+	}
 	
+	private static FullTextFilterDef createFullTextFilterDef(Map<String,Object> filterDef) {
+		AnnotationDescriptor fullTextFilterDefAnnotation = new AnnotationDescriptor( FullTextFilterDef.class );
+		for (Entry<String, Object> entry : filterDef.entrySet()) {
+			fullTextFilterDefAnnotation.setValue(entry.getKey(), entry.getValue());
+		}
+		
+		return AnnotationFactory.create( fullTextFilterDefAnnotation );
+	}
+
+	private static FullTextFilterDef[] createFullTextFilterDefArray(Set<Map<String, Object>> fullTextFilterDefs) {
+		FullTextFilterDef[] filters = new FullTextFilterDef[fullTextFilterDefs.size()];
+		int index = 0;
+		for(Map<String,Object> filterDef : fullTextFilterDefs) {
+			filters[index] = createFullTextFilterDef(filterDef);
+			index++;
+		}
+		return filters;
+	}
+	
 	private AnalyzerDef createAnalyzerDef(Map<String, Object> analyzerDef) {
 		AnnotationDescriptor analyzerDefAnnotation = new AnnotationDescriptor( AnalyzerDef.class );
 		for ( Map.Entry<String, Object> entry : analyzerDef.entrySet() ) {
@@ -436,7 +470,7 @@
 			}
 			if (entity.getFullTextFilterDefs().size() > 0)  {
 				AnnotationDescriptor fullTextFilterDefsAnnotation = new AnnotationDescriptor( FullTextFilterDefs.class );
-				FullTextFilterDef[] fullTextFilterDefArray = createFullTextFilterDefArray(entity);
+				FullTextFilterDef[] fullTextFilterDefArray = createFullTextFilterDefArray(entity.getFullTextFilterDefs());
 				fullTextFilterDefsAnnotation.setValue("value", fullTextFilterDefArray);
 				annotations.put( FullTextFilterDefs.class, AnnotationFactory.create( fullTextFilterDefsAnnotation ) );
 			}
@@ -469,27 +503,6 @@
 			annotations.put( ProvidedId.class, AnnotationFactory.create( annotation ) );
 		}
 		
-		
-		private FullTextFilterDef[] createFullTextFilterDefArray(EntityDescriptor entity) {
-			Set<Map<String, Object>> fullTextFilterDefs = entity.getFullTextFilterDefs();
-			FullTextFilterDef[] filters = new FullTextFilterDef[fullTextFilterDefs.size()];
-			int index = 0;
-			for(Map<String,Object> filterDef : fullTextFilterDefs) {
-				filters[index] = createFullTextFilterDef(filterDef);
-				index++;
-			}
-			return filters;
-		}
-		
-		private FullTextFilterDef createFullTextFilterDef(Map<String,Object> filterDef) {
-			AnnotationDescriptor fullTextFilterDefAnnotation = new AnnotationDescriptor( FullTextFilterDef.class );
-			for (Entry<String, Object> entry : filterDef.entrySet()) {
-				fullTextFilterDefAnnotation.setValue(entry.getKey(), entry.getValue());
-			}
-			
-			return AnnotationFactory.create( fullTextFilterDefAnnotation );
-		}
-		
 		private void populateAnnotationArray() {
 			annotationsArray = new Annotation[ annotations.size() ];
 			int index = 0;

Modified: search/trunk/src/main/java/org/hibernate/search/impl/SearchFactoryImpl.java
===================================================================
--- search/trunk/src/main/java/org/hibernate/search/impl/SearchFactoryImpl.java	2009-11-27 16:53:33 UTC (rev 18077)
+++ search/trunk/src/main/java/org/hibernate/search/impl/SearchFactoryImpl.java	2009-11-27 17:30:32 UTC (rev 18078)
@@ -281,6 +281,20 @@
 			}
 		}
 	}
+	
+	
+	private void initProgrammaticallyDefinedFilterDef(ReflectionManager reflectionManager) {
+		@SuppressWarnings("unchecked") Map defaults = reflectionManager.getDefaults();
+		FullTextFilterDef[] filterDefs = (FullTextFilterDef[]) defaults.get(FullTextFilterDefs.class);
+		if (filterDefs != null && filterDefs.length != 0) {
+			for (FullTextFilterDef defAnn : filterDefs) {
+				if ( filterDefinitions.containsKey( defAnn.name() ) ) {
+					throw new SearchException("Multiple definition of @FullTextFilterDef.name=" + defAnn.name());
+				}
+				bindFullTextFilterDef(defAnn);
+			}
+		}
+	}
 
 	private void bindFilterDef(FullTextFilterDef defAnn, XClass mappedXClass) {
 		if ( filterDefinitions.containsKey( defAnn.name() ) ) {
@@ -290,6 +304,10 @@
 			);
 		}
 
+		bindFullTextFilterDef(defAnn);
+	}
+
+	private void bindFullTextFilterDef(FullTextFilterDef defAnn) {
 		FilterDef filterDef = new FilterDef( defAnn );
 		if ( filterDef.getImpl().equals( ShardSensitiveOnlyFilter.class ) ) {
 			//this is a placeholder don't process regularly
@@ -463,6 +481,7 @@
 		DirectoryProviderFactory factory = new DirectoryProviderFactory();
 
 		initProgrammaticAnalyzers(context, reflectionManager);
+		initProgrammaticallyDefinedFilterDef(reflectionManager);
 
 		while ( iter.hasNext() ) {
 			Class mappedClass = iter.next();

Modified: search/trunk/src/test/java/org/hibernate/search/test/configuration/ProgrammaticMappingTest.java
===================================================================
--- search/trunk/src/test/java/org/hibernate/search/test/configuration/ProgrammaticMappingTest.java	2009-11-27 16:53:33 UTC (rev 18077)
+++ search/trunk/src/test/java/org/hibernate/search/test/configuration/ProgrammaticMappingTest.java	2009-11-27 17:30:32 UTC (rev 18078)
@@ -44,7 +44,6 @@
 import org.apache.solr.analysis.NGramFilterFactory;
 import org.apache.solr.analysis.SnowballPorterFilterFactory;
 import org.apache.solr.analysis.StandardTokenizerFactory;
-import org.hibernate.Session;
 import org.hibernate.Transaction;
 import org.hibernate.cfg.Configuration;
 import org.hibernate.search.FullTextQuery;
@@ -54,12 +53,16 @@
 import org.hibernate.search.annotations.Index;
 import org.hibernate.search.annotations.Resolution;
 import org.hibernate.search.annotations.Store;
+import org.hibernate.search.backend.Work;
+import org.hibernate.search.backend.WorkType;
 import org.hibernate.search.bridge.builtin.LongBridge;
 import org.hibernate.search.cfg.ConcatStringBridge;
 import org.hibernate.search.cfg.SearchMapping;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.store.DirectoryProvider;
 import org.hibernate.search.test.SearchTestCase;
 import org.hibernate.search.test.analyzer.inheritance.ISOLatin1Analyzer;
+import org.hibernate.search.test.id.providedId.ManualTransactionContext;
 
 /**
  * @author Emmanuel Bernard
@@ -320,6 +323,9 @@
 	
 	
 	public void testProvidedIdMapping() throws Exception{
+		FullTextSession fullTextSession = Search.getFullTextSession( openSession() );
+		SearchFactoryImplementor sf = (SearchFactoryImplementor) fullTextSession.getSearchFactory();
+		
 		ProvidedIdEntry person1 = new ProvidedIdEntry();
 		person1.setName( "Big Goat" );
 		person1.setBlurb( "Eats grass" );
@@ -332,17 +338,18 @@
 		person3.setName( "Regular goat" );
 		person3.setBlurb( "Is anorexic" );
 
-		Session session = openSession();
-		FullTextSession fullTextSession = Search.getFullTextSession( session );
-		Transaction transaction = session.beginTransaction();
-		session.persist( person1 );
-		session.persist( person2 );
-		session.persist( person3 );
+		ManualTransactionContext tc = new ManualTransactionContext();
 
-		transaction.commit();
-		session.clear();
+		Work<ProvidedIdEntry> work = new Work<ProvidedIdEntry>( person1, 1, WorkType.INDEX );
+		sf.getWorker().performWork( work, tc );
+		work = new Work<ProvidedIdEntry>( person2, 2, WorkType.INDEX );
+		sf.getWorker().performWork( work, tc );
+		Work<ProvidedIdEntry> work2 = new Work<ProvidedIdEntry>( person3, 3, WorkType.INDEX );
+		sf.getWorker().performWork( work2, tc );
 
-		transaction = fullTextSession.beginTransaction();
+		tc.end();
+		
+		Transaction transaction = fullTextSession.beginTransaction();
 
 		QueryParser parser = new QueryParser( "providedidentry.name", new StandardAnalyzer() );
 		Query luceneQuery = parser.parse( "Goat" );
@@ -364,7 +371,7 @@
 	
 	
 	
-	public void testFullTextFilterDef() throws Exception{
+	public void testFullTextFilterDefAtMappingLevel() throws Exception{
 		FullTextSession s = Search.getFullTextSession( openSession() );
 		Transaction tx = s.beginTransaction();
 
@@ -408,7 +415,6 @@
 		s.close();
 	}
 	
-	
 	public void testIndexEmbedded() throws Exception{
 		FullTextSession s = Search.getFullTextSession( openSession() );
 		Transaction tx = s.beginTransaction();
@@ -514,7 +520,8 @@
 		//cfg.setProperty( "hibernate.search.default.directory_provider", FSDirectoryProvider.class.getName() );
 		SearchMapping mapping = new SearchMapping();
 
-		mapping.analyzerDef( "ngram", StandardTokenizerFactory.class )
+		mapping.fullTextFilterDef("security", SecurityFilterFactory.class).cache(FilterCacheModeType.INSTANCE_ONLY)
+				.analyzerDef( "ngram", StandardTokenizerFactory.class )
 					.filter( LowerCaseFilterFactory.class )
 					.filter( NGramFilterFactory.class )
 						.param( "minGramSize", "3" )
@@ -525,10 +532,10 @@
 				.analyzerDef( "de", StandardTokenizerFactory.class )
 					.filter( LowerCaseFilterFactory.class )
 					.filter( GermanStemFilterFactory.class )
-				.entity( Address.class ).indexed()
+				.entity( Address.class )
+					.indexed()
 					.similarity( DefaultSimilarity.class )
 					.boost( 2 )
-					.fullTextFilterDef("security", SecurityFilterFactory.class).cache(FilterCacheModeType.INSTANCE_ONLY)
 					.property( "addressId", ElementType.FIELD ).documentId().name( "id" )
 					.property("lastUpdated", ElementType.FIELD)
 						.field().name("last-updated")



More information about the hibernate-commits mailing list