[hibernate-commits] Hibernate SVN: r16250 - in search/trunk/src: main/java/org/hibernate/search/impl and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Thu Apr 2 08:24:02 EDT 2009


Author: epbernard
Date: 2009-04-02 08:24:02 -0400 (Thu, 02 Apr 2009)
New Revision: 16250

Modified:
   search/trunk/src/main/java/org/hibernate/search/cfg/PropertyDescriptor.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-352 add analyzerDef support

Modified: search/trunk/src/main/java/org/hibernate/search/cfg/PropertyDescriptor.java
===================================================================
--- search/trunk/src/main/java/org/hibernate/search/cfg/PropertyDescriptor.java	2009-04-02 12:10:40 UTC (rev 16249)
+++ search/trunk/src/main/java/org/hibernate/search/cfg/PropertyDescriptor.java	2009-04-02 12:24:02 UTC (rev 16250)
@@ -4,6 +4,8 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.Collection;
+import java.util.ArrayList;
 
 /**
  * @author Emmanuel Bernard
@@ -11,7 +13,7 @@
 public class PropertyDescriptor {
 	private ElementType type;
 	private String name;
-	private Set<Map<String, Object>> fields = new HashSet<Map<String, Object>>();
+	private Collection<Map<String, Object>> fields = new ArrayList<Map<String, Object>>();
 
 	public PropertyDescriptor(String name, ElementType type) {
 		this.name = name;
@@ -22,7 +24,7 @@
 		fields.add( field );
 	}
 
-	public Set<Map<String, Object>> getFields() {
+	public Collection<Map<String, Object>> getFields() {
 		return fields;
 	}
 }

Modified: search/trunk/src/main/java/org/hibernate/search/impl/MappingModelMetadataProvider.java
===================================================================
--- search/trunk/src/main/java/org/hibernate/search/impl/MappingModelMetadataProvider.java	2009-04-02 12:10:40 UTC (rev 16249)
+++ search/trunk/src/main/java/org/hibernate/search/impl/MappingModelMetadataProvider.java	2009-04-02 12:24:02 UTC (rev 16250)
@@ -5,6 +5,7 @@
 import java.util.Set;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Collection;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
@@ -25,6 +26,11 @@
 import org.hibernate.search.annotations.Indexed;
 import org.hibernate.search.annotations.Analyzer;
 import org.hibernate.search.annotations.Fields;
+import org.hibernate.search.annotations.AnalyzerDef;
+import org.hibernate.search.annotations.TokenizerDef;
+import org.hibernate.search.annotations.Parameter;
+import org.hibernate.search.annotations.TokenFilterDef;
+import org.hibernate.search.annotations.AnalyzerDefs;
 
 /**
  * @author Emmanuel Bernard
@@ -44,13 +50,22 @@
 	private final MetadataProvider delegate;
 	private final SearchMapping mapping;
 	private final Map<AnnotatedElement, AnnotationReader> cache = new HashMap<AnnotatedElement, AnnotationReader>(100);
+	private Map<Object, Object> defaults;
 
 	public MappingModelMetadataProvider(MetadataProvider delegate, SearchMapping mapping) {
 		this.delegate = delegate;
 		this.mapping = mapping;
 	}
+
 	public Map<Object, Object> getDefaults() {
-		return delegate.getDefaults();
+		if (defaults == null) {
+			final Map<Object, Object> delegateDefaults = delegate.getDefaults();
+			defaults = delegateDefaults == null ?
+					new HashMap<Object, Object>() :
+					new HashMap<Object, Object>(delegateDefaults);
+			defaults.put( AnalyzerDefs.class, createAnalyzerDefArray() );
+		}
+		return defaults;
 	}
 
 	public AnnotationReader getAnnotationReader(AnnotatedElement annotatedElement) {
@@ -62,6 +77,78 @@
 		return reader;
 	}
 
+	private AnalyzerDef[] createAnalyzerDefArray() {
+		AnalyzerDef[] defs = new AnalyzerDef[ mapping.getAnalyzerDefs().size() ];
+		int index = 0;
+		for ( Map<String, Object> analyzerDef : mapping.getAnalyzerDefs() ) {
+			defs[index] = createAnalyzerDef( analyzerDef );
+			index++;
+		}
+		return defs;
+	}
+
+	private AnalyzerDef createAnalyzerDef(Map<String, Object> analyzerDef) {
+		AnnotationDescriptor analyzerDefAnnotation = new AnnotationDescriptor( AnalyzerDef.class );
+		for ( Map.Entry<String, Object> entry : analyzerDef.entrySet() ) {
+			if ( entry.getKey().equals( "tokenizer" ) ) {
+				AnnotationDescriptor tokenizerAnnotation = new AnnotationDescriptor( TokenizerDef.class );
+				@SuppressWarnings( "unchecked" )
+				Map<String, Object> tokenizer = (Map<String, Object>) entry.getValue();
+				for( Map.Entry<String, Object> tokenizerEntry : tokenizer.entrySet() ) {
+					if ( tokenizerEntry.getKey().equals( "params" ) ) {
+						Parameter[] paramsArray = createParams( (List<Map<String, Object>>) tokenizerEntry.getValue() );
+						tokenizerAnnotation.setValue( "params", paramsArray );
+					}
+					else {
+						tokenizerAnnotation.setValue( tokenizerEntry.getKey(), tokenizerEntry.getValue() );
+					}
+				}
+				analyzerDefAnnotation.setValue( "tokenizer", AnnotationFactory.create( tokenizerAnnotation ) );
+			}
+			else if ( entry.getKey().equals( "filters" ) ) {
+				TokenFilterDef[] filtersArray = createFilters( (List<Map<String, Object>>) entry.getValue() );
+				analyzerDefAnnotation.setValue( "filters", filtersArray );
+			}
+			else {
+				analyzerDefAnnotation.setValue( entry.getKey(), entry.getValue() );
+			}
+		}
+		return AnnotationFactory.create( analyzerDefAnnotation );
+	}
+
+	private TokenFilterDef[] createFilters(List<Map<String, Object>> filters) {
+		TokenFilterDef[] filtersArray = new TokenFilterDef[filters.size()];
+		int index = 0;
+		for (Map<String, Object> filter : filters) {
+			AnnotationDescriptor filterAnn = new AnnotationDescriptor( TokenFilterDef.class );
+			for ( Map.Entry<String, Object> filterEntry : filter.entrySet() ) {
+				if ( filterEntry.getKey().equals( "params" ) ) {
+					Parameter[] paramsArray = createParams( (List<Map<String, Object>>) filterEntry.getValue() );
+					filterAnn.setValue( "params", paramsArray );
+				}
+				else {
+					filterAnn.setValue( filterEntry.getKey(), filterEntry.getValue() );
+				}
+			}
+			filtersArray[index] = AnnotationFactory.create( filterAnn );
+			index++;
+		}
+		return filtersArray;
+	}
+
+	private Parameter[] createParams(List<Map<String, Object>> params) {
+		Parameter[] paramArray = new Parameter[ params.size() ];
+		int index = 0;
+		for ( Map<String, Object> entry : params) {
+			AnnotationDescriptor paramAnnotation = new AnnotationDescriptor( Parameter.class );
+			paramAnnotation.setValue( "name", entry.get("name") );
+			paramAnnotation.setValue( "value", entry.get("value") );
+			paramArray[index] = AnnotationFactory.create( paramAnnotation );
+			index++;
+		}
+		return paramArray;
+	}
+
 	private static class MappingModelAnnotationReader implements AnnotationReader {
 		private AnnotationReader delegate;
 		private SearchMapping mapping;
@@ -147,7 +234,7 @@
 		}
 
 		private void createFields(PropertyDescriptor property) {
-			final Set<Map<String,Object>> fields = property.getFields();
+			final Collection<Map<String,Object>> fields = property.getFields();
 			List<org.hibernate.search.annotations.Field> fieldAnnotations =
 					new ArrayList<org.hibernate.search.annotations.Field>( fields.size() );
 			for(Map<String, Object> field : fields) {
@@ -172,7 +259,8 @@
 
 			final org.hibernate.search.annotations.Field[] fieldArray =
 					new org.hibernate.search.annotations.Field[fieldAnnotations.size()];
-			fieldsAnnotation.setValue( "value", fieldAnnotations.toArray( fieldArray ));
+			final org.hibernate.search.annotations.Field[] fieldAsArray = fieldAnnotations.toArray( fieldArray );
+			fieldsAnnotation.setValue( "value", fieldAsArray );
 			annotations.put( Fields.class, AnnotationFactory.create( fieldsAnnotation ) );
 		}
 

Modified: search/trunk/src/main/java/org/hibernate/search/impl/SearchFactoryImpl.java
===================================================================
--- search/trunk/src/main/java/org/hibernate/search/impl/SearchFactoryImpl.java	2009-04-02 12:10:40 UTC (rev 16249)
+++ search/trunk/src/main/java/org/hibernate/search/impl/SearchFactoryImpl.java	2009-04-02 12:24:02 UTC (rev 16250)
@@ -33,6 +33,8 @@
 import org.hibernate.search.annotations.FullTextFilterDefs;
 import org.hibernate.search.annotations.Indexed;
 import org.hibernate.search.annotations.Key;
+import org.hibernate.search.annotations.AnalyzerDef;
+import org.hibernate.search.annotations.AnalyzerDefs;
 import org.hibernate.search.backend.BackendQueueProcessorFactory;
 import org.hibernate.search.backend.LuceneIndexingParameters;
 import org.hibernate.search.backend.LuceneWork;
@@ -403,6 +405,8 @@
 		Iterator<Class<?>> iter = cfg.getClassMappings();
 		DirectoryProviderFactory factory = new DirectoryProviderFactory();
 
+		initProgrammaticAnalyzers(context, reflectionManager);
+
 		while ( iter.hasNext() ) {
 			Class mappedClass = iter.next();
 			if ( mappedClass == null ) {
@@ -452,6 +456,17 @@
 		factory.startDirectoryProviders();
 	}
 
+	private void initProgrammaticAnalyzers(InitContext context, ReflectionManager reflectionManager) {
+		final Map defaults = reflectionManager.getDefaults();
+
+		if (defaults != null) {
+			AnalyzerDef[] defs = (AnalyzerDef[]) defaults.get( AnalyzerDefs.class );
+			for (AnalyzerDef def : defs) {
+				context.addAnalyzerDef( def );
+			}
+		}
+	}
+
 	private static FilterCachingStrategy buildFilterCachingStrategy(Properties properties) {
 		FilterCachingStrategy filterCachingStrategy;
 		String impl = properties.getProperty( Environment.FILTER_CACHING_STRATEGY );

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-04-02 12:10:40 UTC (rev 16249)
+++ search/trunk/src/test/java/org/hibernate/search/test/configuration/ProgrammaticMappingTest.java	2009-04-02 12:24:02 UTC (rev 16250)
@@ -7,6 +7,7 @@
 import org.apache.solr.analysis.LowerCaseFilterFactory;
 import org.apache.solr.analysis.NGramFilterFactory;
 import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.queryParser.MultiFieldQueryParser;
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 
 import org.hibernate.search.cfg.SearchMapping;
@@ -17,6 +18,8 @@
 import org.hibernate.search.FullTextSession;
 import org.hibernate.search.Search;
 import org.hibernate.search.FullTextQuery;
+import org.hibernate.search.store.RAMDirectoryProvider;
+import org.hibernate.search.store.FSDirectoryProvider;
 import org.hibernate.cfg.Configuration;
 import org.hibernate.Transaction;
 
@@ -39,7 +42,7 @@
 
 		tx = s.beginTransaction();
 
-		QueryParser parser = new QueryParser( "id", new StandardAnalyzer() );
+		QueryParser parser = new QueryParser( "id", new StandardAnalyzer( ) );
 		org.apache.lucene.search.Query luceneQuery = parser.parse( "street1:peachtree" );
 		FullTextQuery query = s.createFullTextQuery( luceneQuery ).setProjection( "idx_street2", FullTextQuery.THIS );
 		assertEquals( "Not properly indexed", 1, query.getResultSize() );
@@ -52,16 +55,49 @@
 
 	}
 
+	public void testAnalyzerDef() throws Exception{
+		Address address = new Address();
+		address.setStreet1( "3340 Peachtree Rd NE" );
+		address.setStreet2( "JBoss" );
+
+		FullTextSession s = Search.getFullTextSession( openSession() );
+		Transaction tx = s.beginTransaction();
+		s.persist( address );
+		tx.commit();
+
+		s.clear();
+
+		tx = s.beginTransaction();
+
+		QueryParser parser = new QueryParser( "id", new StandardAnalyzer( ) );
+		org.apache.lucene.search.Query luceneQuery =  parser.parse( "street1_ngram:pea" );
+		System.out.print( luceneQuery.toString() );
+		final FullTextQuery query = s.createFullTextQuery( luceneQuery );
+		assertEquals( "Analyzer inoperant", 1, query.getResultSize() );
+
+		s.delete( query.list().get( 0 ));
+		tx.commit();
+		s.close();
+
+	}
+
 	@Override
 	protected void configure(Configuration cfg) {
 		super.configure( cfg );
+		//cfg.setProperty( "hibernate.search.default.directory_provider", FSDirectoryProvider.class.getName() );
 		SearchMapping mapping = new SearchMapping();
-		mapping.indexedClass( Address.class )
-				.property( "street1", ElementType.FIELD )
-					.field()
-				.property( "street2", ElementType.METHOD )
-					.field().name( "idx_street2" )
-							.store( Store.YES );
+		mapping.analyzerDef( "ngram", StandardTokenizerFactory.class )
+					.filter( LowerCaseFilterFactory.class )
+					.filter( NGramFilterFactory.class )
+						.param( "minGramSize", "3" )
+						.param( "maxGramSize", "3" )
+
+				.indexedClass( Address.class )
+					.property( "street1", ElementType.FIELD )
+						.field()
+						.field().name( "street1_ngram" ).analyzer( "ngram" )
+					.property( "street2", ElementType.METHOD )
+						.field().name( "idx_street2" ).store( Store.YES );
 		cfg.getProperties().put( "hibernate.search.mapping_model", mapping );
 	}
 




More information about the hibernate-commits mailing list