[hibernate-issues] [Hibernate-JIRA] Created: (HSEARCH-1088) Specifying an analyzer on an entity class bridge using the programmatic API is broken

Michael Heinrichs (JIRA) noreply at atlassian.com
Wed Apr 4 11:40:48 EDT 2012


Specifying an analyzer on an entity class bridge using the programmatic API is broken
-------------------------------------------------------------------------------------

                 Key: HSEARCH-1088
                 URL: https://hibernate.onjira.com/browse/HSEARCH-1088
             Project: Hibernate Search
          Issue Type: Bug
          Components: engine
    Affects Versions: 4.1.0.CR3
         Environment: Hibernate 4.1.1.Final
            Reporter: Michael Heinrichs
         Attachments: MappingModelMetadataProvider.java.diff

The programmatic API provides the ability to specify an analyzer on an entity class bridge (ClassBridgeMapping), but during initialization, an exception is thrown.  See below for an example search mapping, exception stack trace, and the diff for my fix.

I modified the Hibernate Search code by copying the analyzer initialization code from the creation of fields into the creation of class bridges.  It appears that there may be other attributes that are not being properly processed for class bridges, but this fix solves my immediate problem.

Here is an example:

        SearchMapping searchMapping = new SearchMapping();
        searchMapping
        	.analyzerDef("customanalyzer", StandardTokenizerFactory.class)
        		.filter(LowerCaseFilterFactory.class)
        		.filter(NGramFilterFactory.class)
        			.param("minGramSize", "3")
        			.param("maxGramSize", "3")
        	.entity(Person.class)
        		.classBridge(NameAppendingBridge.class)
        			.name("fullName")
        			.analyzer("customanalyzer")
        			.index(Index.YES)
        			.store(Store.YES)
        			.param("fields", "frstName,othrName,lastName,mdnName")
        		.indexed()
...

java.lang.ClassCastException: java.util.HashMap cannot be cast to org.hibernate.search.annotations.Analyzer
	at $Proxy26.analyzer(Unknown Source)
	at org.hibernate.search.engine.spi.AbstractDocumentBuilder.bindClassBridgeAnnotation(AbstractDocumentBuilder.java:885)
	at org.hibernate.search.engine.spi.AbstractDocumentBuilder.initializeClassLevelAnnotations(AbstractDocumentBuilder.java:425)
	at org.hibernate.search.engine.spi.AbstractDocumentBuilder.initializeClass(AbstractDocumentBuilder.java:352)
	at org.hibernate.search.engine.spi.AbstractDocumentBuilder.<init>(AbstractDocumentBuilder.java:151)
	at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.<init>(DocumentBuilderIndexedEntity.java:179)
	at org.hibernate.search.spi.SearchFactoryBuilder.initDocumentBuilders(SearchFactoryBuilder.java:419)
	at org.hibernate.search.spi.SearchFactoryBuilder.buildNewSearchFactory(SearchFactoryBuilder.java:221)
	at org.hibernate.search.spi.SearchFactoryBuilder.buildSearchFactory(SearchFactoryBuilder.java:145)
	at org.hibernate.search.event.impl.FullTextIndexEventListener.initialize(FullTextIndexEventListener.java:129)
	at org.hibernate.search.hcore.impl.HibernateSearchIntegrator.integrate(HibernateSearchIntegrator.java:82)
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:304)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1740)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1778)


hibernate-search-4.1.0.CR3/project/hibernate-search-engine/src/main/java/org/hibernate/search/impl/MappingModelMetadataProvider.java.diff:

575c575,584
<                               if ( entry.getKey().equals( "params" ) ) {
---
>                               if ( entry.getKey().equals( "analyzer" ) ) {
>                                       AnnotationDescriptor analyzerAnnotation = new AnnotationDescriptor( Analyzer.class );
>                                       @SuppressWarnings("unchecked")
>                                       Map<String, Object> analyzer = (Map<String, Object>) entry.getValue();
>                                       for ( Map.Entry<String, Object> analyzerEntry : analyzer.entrySet() ) {
>                                               analyzerAnnotation.setValue( analyzerEntry.getKey(), analyzerEntry.getValue() );
>                                       }
>                                       annotation.setValue( "analyzer", AnnotationFactory.create( analyzerAnnotation ) );
>                               }
>                               else if ( entry.getKey().equals( "params" ) ) {


--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list