[hibernate-commits] Hibernate SVN: r15019 - in search/trunk/src: java/org/hibernate/search/engine and 4 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Aug 6 06:44:02 EDT 2008


Author: hardy.ferentschik
Date: 2008-08-06 06:44:01 -0400 (Wed, 06 Aug 2008)
New Revision: 15019

Added:
   search/trunk/src/test/org/hibernate/search/test/util/AnalyzerUtils.java
Modified:
   search/trunk/src/java/org/hibernate/search/SearchFactory.java
   search/trunk/src/java/org/hibernate/search/engine/DocumentBuilder.java
   search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java
   search/trunk/src/java/org/hibernate/search/util/ScopedAnalyzer.java
   search/trunk/src/test/org/hibernate/search/test/analyzer/AnalyzerTest.java
Log:
now ScopedAnalyzer is not explicitly exposed anymore from SearchFactory.

Modified: search/trunk/src/java/org/hibernate/search/SearchFactory.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/SearchFactory.java	2008-08-05 23:47:13 UTC (rev 15018)
+++ search/trunk/src/java/org/hibernate/search/SearchFactory.java	2008-08-06 10:44:01 UTC (rev 15019)
@@ -4,7 +4,6 @@
 import org.apache.lucene.analysis.Analyzer;
 import org.hibernate.search.reader.ReaderProvider;
 import org.hibernate.search.store.DirectoryProvider;
-import org.hibernate.search.util.ScopedAnalyzer;
 
 /**
  * Provide application wide operations as well as access to the underlying Lucene resources.
@@ -52,5 +51,5 @@
 	 * @throws IllegalArgumentException in case <code>clazz == null</code> or the specified
 	 * class is not an indexed entity.
 	 */
-	ScopedAnalyzer getAnalyzer(Class clazz);
+	Analyzer getAnalyzer(Class clazz);
 }

Modified: search/trunk/src/java/org/hibernate/search/engine/DocumentBuilder.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/engine/DocumentBuilder.java	2008-08-05 23:47:13 UTC (rev 15018)
+++ search/trunk/src/java/org/hibernate/search/engine/DocumentBuilder.java	2008-08-06 10:44:01 UTC (rev 15019)
@@ -705,7 +705,7 @@
 		return shardingStrategy;
 	}
 
-	public ScopedAnalyzer getAnalyzer() {
+	public Analyzer getAnalyzer() {
 		return analyzer;
 	}
 

Modified: search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java	2008-08-05 23:47:13 UTC (rev 15018)
+++ search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java	2008-08-06 10:44:01 UTC (rev 15019)
@@ -308,7 +308,7 @@
 		return analyzer;
 	}
 	
-	public ScopedAnalyzer getAnalyzer(Class clazz) {
+	public Analyzer getAnalyzer(Class clazz) {
 		if ( clazz ==  null) {
 			throw new IllegalArgumentException( "A class has to be specified for retrieving a scoped analyzer" );
 		}

Modified: search/trunk/src/java/org/hibernate/search/util/ScopedAnalyzer.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/util/ScopedAnalyzer.java	2008-08-05 23:47:13 UTC (rev 15018)
+++ search/trunk/src/java/org/hibernate/search/util/ScopedAnalyzer.java	2008-08-06 10:44:01 UTC (rev 15019)
@@ -4,49 +4,45 @@
 import java.io.Reader;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.TokenStream;
 
 /**
+ * A <code>ScopedAnalyzer</code> is a wrapper class containing all analyzers for a given class.
+ * <code>ScopedAnalyzer</code> behaves similar to <code>PerFieldAnalyzerWrapper</code> by delegating requests for
+ * <code>TokenStream</code>s to the underlying <code>Analyzer</code> depending on the requested the field name.
+ * 
  * @author Emmanuel Bernard
  */
 public class ScopedAnalyzer extends Analyzer {
-	public ScopedAnalyzer() {}
+	public ScopedAnalyzer() {
+	}
 
 	private Analyzer globalAnalyzer;
 	private Map<String, Analyzer> scopedAnalyzers = new HashMap<String, Analyzer>();
 
-	public void setGlobalAnalyzer(Analyzer globalAnalyzer) {
+	public void setGlobalAnalyzer( Analyzer globalAnalyzer ) {
 		this.globalAnalyzer = globalAnalyzer;
 	}
-	
-	public Analyzer getGlobalAnalyzer() {
-		return globalAnalyzer;
-	}	
 
-	public void addScopedAnalyzer(String scope, Analyzer scopedAnalyzer) {
-		scopedAnalyzers.put( scope, scopedAnalyzer );
+	public void addScopedAnalyzer( String scope, Analyzer scopedAnalyzer ) {
+		scopedAnalyzers.put(scope, scopedAnalyzer);
 	}
 
-	public TokenStream tokenStream(String fieldName, Reader reader) {
-		return getAnalyzer( fieldName ).tokenStream( fieldName, reader );
+	public TokenStream tokenStream( String fieldName, Reader reader ) {
+		return getAnalyzer(fieldName).tokenStream(fieldName, reader);
 	}
 
-	public int getPositionIncrementGap(String fieldName) {
-		return getAnalyzer( fieldName ).getPositionIncrementGap( fieldName );
+	public int getPositionIncrementGap( String fieldName ) {
+		return getAnalyzer(fieldName).getPositionIncrementGap(fieldName);
 	}
 
-	public Analyzer getAnalyzer(String fieldName) {
-		Analyzer analyzer = scopedAnalyzers.get( fieldName );
-		if (analyzer == null) {
+	private Analyzer getAnalyzer( String fieldName ) {
+		Analyzer analyzer = scopedAnalyzers.get(fieldName);
+		if ( analyzer == null ) {
 			analyzer = globalAnalyzer;
 		}
 		return analyzer;
 	}
-	
-	public Set<String> getFields() {
-		return scopedAnalyzers.keySet();
-	}
 }

Modified: search/trunk/src/test/org/hibernate/search/test/analyzer/AnalyzerTest.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/analyzer/AnalyzerTest.java	2008-08-05 23:47:13 UTC (rev 15018)
+++ search/trunk/src/test/org/hibernate/search/test/analyzer/AnalyzerTest.java	2008-08-06 10:44:01 UTC (rev 15019)
@@ -1,9 +1,8 @@
 // $Id$
 package org.hibernate.search.test.analyzer;
 
-import java.util.HashSet;
-import java.util.Set;
-
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.Token;
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 import org.apache.lucene.queryParser.QueryParser;
 import org.hibernate.Transaction;
@@ -12,7 +11,7 @@
 import org.hibernate.search.Search;
 import org.hibernate.search.SearchFactory;
 import org.hibernate.search.test.SearchTestCase;
-import org.hibernate.search.util.ScopedAnalyzer;
+import org.hibernate.search.test.util.AnalyzerUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -21,83 +20,77 @@
  */
 public class AnalyzerTest extends SearchTestCase {
 
-	public static final Logger log = LoggerFactory.getLogger( AnalyzerTest.class );
+	public static final Logger log = LoggerFactory.getLogger(AnalyzerTest.class);
 
 	public void testScopedAnalyzers() throws Exception {
 		MyEntity en = new MyEntity();
-		en.setEntity( "Entity" );
-		en.setField( "Field" );
-		en.setProperty( "Property" );
-		en.setComponent( new MyComponent() );
-		en.getComponent().setComponentProperty( "component property" );
-		FullTextSession s = Search.getFullTextSession( openSession() );
+		en.setEntity("Entity");
+		en.setField("Field");
+		en.setProperty("Property");
+		en.setComponent(new MyComponent());
+		en.getComponent().setComponentProperty("component property");
+		FullTextSession s = Search.getFullTextSession(openSession());
 		Transaction tx = s.beginTransaction();
-		s.persist( en );
+		s.persist(en);
 		tx.commit();
 
 		tx = s.beginTransaction();
-		QueryParser parser = new QueryParser( "id", new StandardAnalyzer() );
-		org.apache.lucene.search.Query luceneQuery = parser.parse( "entity:alarm" );
-		FullTextQuery query = s.createFullTextQuery( luceneQuery, MyEntity.class );
-		assertEquals( 1, query.getResultSize() );
+		QueryParser parser = new QueryParser("id", new StandardAnalyzer());
+		org.apache.lucene.search.Query luceneQuery = parser.parse("entity:alarm");
+		FullTextQuery query = s.createFullTextQuery(luceneQuery, MyEntity.class);
+		assertEquals(1, query.getResultSize());
 
-		luceneQuery = parser.parse( "property:cat" );
-		query = s.createFullTextQuery( luceneQuery, MyEntity.class );
-		assertEquals( 1, query.getResultSize() );
+		luceneQuery = parser.parse("property:cat");
+		query = s.createFullTextQuery(luceneQuery, MyEntity.class);
+		assertEquals(1, query.getResultSize());
 
-		luceneQuery = parser.parse( "field:energy" );
-		query = s.createFullTextQuery( luceneQuery, MyEntity.class );
-		assertEquals( 1, query.getResultSize() );
+		luceneQuery = parser.parse("field:energy");
+		query = s.createFullTextQuery(luceneQuery, MyEntity.class);
+		assertEquals(1, query.getResultSize());
 
-		luceneQuery = parser.parse( "component.componentProperty:noise" );
-		query = s.createFullTextQuery( luceneQuery, MyEntity.class );
-		assertEquals( 1, query.getResultSize() );
+		luceneQuery = parser.parse("component.componentProperty:noise");
+		query = s.createFullTextQuery(luceneQuery, MyEntity.class);
+		assertEquals(1, query.getResultSize());
 
-		s.delete( query.uniqueResult() );
+		s.delete(query.uniqueResult());
 		tx.commit();
 
 		s.close();
 	}
 
-	public void testScopedAnalyzersAPI() throws Exception {
-		FullTextSession session = Search.getFullTextSession( openSession() );
+	public void testScopedAnalyzersFromSearchFactory() throws Exception {
+		FullTextSession session = Search.getFullTextSession(openSession());
 		SearchFactory searchFactory = session.getSearchFactory();
-		ScopedAnalyzer analzyer = searchFactory.getAnalyzer( MyEntity.class );
+		Analyzer analyzer = searchFactory.getAnalyzer(MyEntity.class);
 
-		// explicitly get the global analyzer
-		assertEquals( "Wrong analyzer", Test1Analyzer.class, analzyer.getGlobalAnalyzer().getClass() );
+		// you can pass what so ever into the analysis since the used analyzers are
+		// returning the same tokens all the time. We just want to make sure that
+		// the right analyzers are used.
+		Token[] tokens = AnalyzerUtils.tokensFromAnalysis(analyzer, "entity", "");
+		AnalyzerUtils.assertTokensEqual(tokens, new String[] { "alarm", "dog", "performance" });
 
-		// get the global analyzer by specifying a non existing field or null
-		assertEquals( "Wrong analyzer", Test1Analyzer.class, analzyer.getAnalyzer("").getClass() );
-		assertEquals( "Wrong analyzer", Test1Analyzer.class, analzyer.getAnalyzer(null).getClass() );
-		
-		// get a field analyzer
-		assertEquals( "Wrong analyzer", Test1Analyzer.class, analzyer.getAnalyzer("entity").getClass() );
-		assertEquals( "Wrong analyzer", Test2Analyzer.class, analzyer.getAnalyzer("property").getClass() );
-		assertEquals( "Wrong analyzer", Test3Analyzer.class, analzyer.getAnalyzer("field").getClass() );
-		assertEquals( "Wrong analyzer", Test4Analyzer.class, analzyer.getAnalyzer("component.componentProperty").getClass() );
-		
-		// get the field set
-		Set<String> fields = new HashSet<String>();
-		fields.add( "entity" );
-		fields.add( "property" );
-		fields.add( "field" );
-		fields.add( "component.componentProperty" );
-		assertEquals( "Wrong field set", fields, analzyer.getFields());
-		
+		tokens = AnalyzerUtils.tokensFromAnalysis(analyzer, "property", "");
+		AnalyzerUtils.assertTokensEqual(tokens, new String[] { "sound", "cat", "speed" });
+
+		tokens = AnalyzerUtils.tokensFromAnalysis(analyzer, "field", "");
+		AnalyzerUtils.assertTokensEqual(tokens, new String[] { "music", "elephant", "energy" });
+
+		tokens = AnalyzerUtils.tokensFromAnalysis(analyzer, "component.componentProperty", "");
+		AnalyzerUtils.assertTokensEqual(tokens, new String[] { "noise", "mouse", "light" });
+
 		// test border cases
 		try {
-			searchFactory.getAnalyzer( (Class) null );
-		} catch (IllegalArgumentException iae) {
-			log.debug( "success" );
+			searchFactory.getAnalyzer((Class) null);
+		} catch ( IllegalArgumentException iae ) {
+			log.debug("success");
 		}
-		
+
 		try {
-			searchFactory.getAnalyzer( String.class );
-		} catch (IllegalArgumentException iae) {
-			log.debug( "success" );
-		}		
-		
+			searchFactory.getAnalyzer(String.class);
+		} catch ( IllegalArgumentException iae ) {
+			log.debug("success");
+		}
+
 		session.close();
 	}
 

Added: search/trunk/src/test/org/hibernate/search/test/util/AnalyzerUtils.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/util/AnalyzerUtils.java	                        (rev 0)
+++ search/trunk/src/test/org/hibernate/search/test/util/AnalyzerUtils.java	2008-08-06 10:44:01 UTC (rev 15019)
@@ -0,0 +1,101 @@
+// $Id:$
+package org.hibernate.search.test.util;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.Token;
+import org.apache.lucene.analysis.TokenStream;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Helper class to test analyzers. Taken and modified from <i>Lucene in Action</i>.
+ * 
+ * @author Hardy Ferentschik
+ */
+public class AnalyzerUtils {
+
+	public static final Logger log = LoggerFactory.getLogger(AnalyzerUtils.class);
+
+	public static Token[] tokensFromAnalysis(Analyzer analyzer, String field, String text) throws IOException {
+		TokenStream stream = analyzer.tokenStream(field, new StringReader(text));
+		List<Token> tokenList = new ArrayList<Token>();
+		while ( true ) {
+			Token token = stream.next();
+			if ( token == null )
+				break;
+
+			tokenList.add(token);
+		}
+
+		return (Token[]) tokenList.toArray(new Token[0]);
+	}
+
+	public static void displayTokens(Analyzer analyzer, String field, String text) throws IOException {
+		Token[] tokens = tokensFromAnalysis(analyzer, field, text);
+
+		for ( int i = 0; i < tokens.length; i++ ) {
+			Token token = tokens[i];
+			log.debug("[" + getTermText(token) + "] ");
+		}
+	}
+
+	public static void displayTokensWithPositions(Analyzer analyzer, String field, String text) throws IOException {
+		Token[] tokens = tokensFromAnalysis(analyzer, field, text);
+
+		int position = 0;
+
+		for ( int i = 0; i < tokens.length; i++ ) {
+			Token token = tokens[i];
+
+			int increment = token.getPositionIncrement();
+
+			if ( increment > 0 ) {
+				position = position + increment;
+				System.out.println();
+				System.out.print(position + ": ");
+			}
+
+			log.debug("[" + getTermText(token) + "] ");
+		}
+	}
+
+	public static void displayTokensWithFullDetails(Analyzer analyzer, String field, String text) throws IOException {
+		Token[] tokens = tokensFromAnalysis(analyzer, field, text);
+		StringBuilder builder = new StringBuilder();
+		int position = 0;
+
+		for ( int i = 0; i < tokens.length; i++ ) {
+			Token token = tokens[i];
+
+			int increment = token.getPositionIncrement();
+
+			if ( increment > 0 ) {
+				position = position + increment;
+				builder.append("\n").append(position).append(": ");
+			}
+
+			builder.append("[").append(getTermText(token)).append(":").append(token.startOffset()).append("->").append(
+					token.endOffset()).append(":").append(token.type()).append("] ");
+			log.debug(builder.toString());
+		}
+	}
+
+	public static void assertTokensEqual(Token[] tokens, String[] strings) {
+		Assert.assertEquals(strings.length, tokens.length);
+
+		for ( int i = 0; i < tokens.length; i++ ) {
+			Assert.assertEquals("index " + i, strings[i], getTermText(tokens[i]));
+		}
+	}
+	
+	public static String getTermText(Token token) {
+		return new String(token.termBuffer(), 0, token.termLength());
+	}
+}


Property changes on: search/trunk/src/test/org/hibernate/search/test/util/AnalyzerUtils.java
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native




More information about the hibernate-commits mailing list