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

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Apr 20 12:44:09 EDT 2010


Author: epbernard
Date: 2010-04-20 12:44:07 -0400 (Tue, 20 Apr 2010)
New Revision: 19253

Added:
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/AllContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedAllContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/FieldContext.java
Modified:
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermMatchingContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/BooleanQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedTermMatchingContext.java
   search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/dsl/DSLTest.java
Log:
HSEARCH-509 Add all() query support

Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/AllContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/AllContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/AllContext.java	2010-04-20 16:44:07 UTC (rev 19253)
@@ -0,0 +1,16 @@
+package org.hibernate.search.query.dsl.v2;
+
+import java.util.List;
+
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.Query;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface AllContext extends QueryCustomization<AllContext>, Termination<AllContext> {
+	/**
+	 * Exclude the documents matching these queries
+	 */
+	AllContext except(Query... queriesMatchingExcludedDocuments);
+}

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryBuilder.java	2010-04-20 15:29:43 UTC (rev 19252)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryBuilder.java	2010-04-20 16:44:07 UTC (rev 19253)
@@ -1,5 +1,7 @@
 package org.hibernate.search.query.dsl.v2;
 
+import org.apache.lucene.search.Query;
+
 /**
  * @author Emmanuel Bernard
  */
@@ -27,4 +29,10 @@
 	 * Boolean query
 	 */
 	BooleanJunction<BooleanJunction> bool();
+
+	/**
+	 * Query matching all documents
+	 * Typically mixed with a boolean query.
+	 */
+	AllContext all();
 }

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermMatchingContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermMatchingContext.java	2010-04-20 15:29:43 UTC (rev 19252)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermMatchingContext.java	2010-04-20 16:44:07 UTC (rev 19253)
@@ -8,4 +8,9 @@
 	 * text searched in the term query (the term is pre-analyzer unless ignoreAnalyzer is called)
 	 */
 	TermTermination matches(String text);
+
+//	/**
+//	 * field / property the term query is executed on
+//	 */
+//	TermMatchingContext onField(String field);
 }

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/BooleanQueryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/BooleanQueryBuilder.java	2010-04-20 15:29:43 UTC (rev 19252)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/BooleanQueryBuilder.java	2010-04-20 16:44:07 UTC (rev 19253)
@@ -31,7 +31,7 @@
 		if ( ! last.getOccur().equals( BooleanClause.Occur.MUST ) ) {
 			throw new AssertionFailure( "Cannot negate class: " + last.getOccur() );
 		}
-		clauses.add( lastIndex, new BooleanClause( last.getQuery(), BooleanClause.Occur.MUST_NOT ) );
+		clauses.set( lastIndex, new BooleanClause( last.getQuery(), BooleanClause.Occur.MUST_NOT ) );
 		return this;
 	}
 
@@ -41,7 +41,7 @@
 	}
 
 	public MustJunction must(Query query) {
-		clauses.add( new BooleanClause( query, BooleanClause.Occur.SHOULD ) );
+		clauses.add( new BooleanClause( query, BooleanClause.Occur.MUST ) );
 		return this;
 	}
 

Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedAllContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedAllContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedAllContext.java	2010-04-20 16:44:07 UTC (rev 19253)
@@ -0,0 +1,63 @@
+package org.hibernate.search.query.dsl.v2.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.Filter;
+import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.Query;
+
+import org.hibernate.search.query.dsl.v2.AllContext;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ConnectedAllContext implements AllContext {
+	private final List<BooleanClause> clauses;
+	private final QueryCustomizer queryCustomizer;
+
+	public ConnectedAllContext() {
+		this.queryCustomizer = new QueryCustomizer();
+		this.clauses = new ArrayList<BooleanClause>(5);
+		this.clauses.add( new BooleanClause( new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD ) );
+	}
+
+	public Query createQuery() {
+		Query query;
+		if ( clauses.size() == 1 ) {
+			query = clauses.get( 0 ).getQuery();
+		}
+		else {
+			BooleanQuery booleanQuery = new BooleanQuery( );
+			for (BooleanClause clause : clauses) {
+				booleanQuery.add( clause );
+			}
+			query = booleanQuery;
+		}
+		return queryCustomizer.setWrappedQuery( query ).createQuery();
+	}
+
+	public AllContext except(Query... queriesMatchingExcludedDocuments) {
+		for (Query query : queriesMatchingExcludedDocuments) {
+			clauses.add( new BooleanClause( query, BooleanClause.Occur.MUST_NOT ) );
+		}
+		return this;
+	}
+
+	public AllContext boostedTo(float boost) {
+		queryCustomizer.boostedTo( boost );
+		return this;
+	}
+
+	public AllContext constantScore() {
+		queryCustomizer.constantScore();
+		return this;
+	}
+
+	public AllContext filter(Filter filter) {
+		queryCustomizer.filter( filter );
+		return this;
+	}
+}

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedQueryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedQueryBuilder.java	2010-04-20 15:29:43 UTC (rev 19252)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedQueryBuilder.java	2010-04-20 16:44:07 UTC (rev 19253)
@@ -3,6 +3,7 @@
 import org.apache.lucene.analysis.Analyzer;
 
 import org.hibernate.search.SearchFactory;
+import org.hibernate.search.query.dsl.v2.AllContext;
 import org.hibernate.search.query.dsl.v2.BooleanJunction;
 import org.hibernate.search.query.dsl.v2.FuzzyContext;
 import org.hibernate.search.query.dsl.v2.QueryBuilder;
@@ -39,4 +40,8 @@
 	public BooleanJunction bool() {
 		return new BooleanQueryBuilder();
 	}
+
+	public AllContext all() {
+		return new ConnectedAllContext();
+	}
 }

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedTermMatchingContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedTermMatchingContext.java	2010-04-20 15:29:43 UTC (rev 19252)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedTermMatchingContext.java	2010-04-20 16:44:07 UTC (rev 19253)
@@ -1,5 +1,8 @@
 package org.hibernate.search.query.dsl.v2.impl;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.lucene.analysis.Analyzer;
 
 import org.hibernate.search.SearchFactory;
@@ -15,19 +18,23 @@
 	private final Analyzer queryAnalyzer;
 	private final QueryCustomizer queryCustomizer;
 	private boolean ignoreAnalyzer;
-	private final QueryContext context;
+	private final QueryContext queryContext;
+	private final FieldContext fieldContext;
+	private final List<ConnectedTermMatchingContext> otherFields;
 
-	public ConnectedTermMatchingContext(QueryContext context,
+	public ConnectedTermMatchingContext(QueryContext queryContext,
 			String field, QueryCustomizer queryCustomizer, Analyzer queryAnalyzer, SearchFactory factory) {
 		this.factory = factory;
 		this.field = field;
 		this.queryAnalyzer = queryAnalyzer;
 		this.queryCustomizer = queryCustomizer;
-		this.context = context;
+		this.queryContext = queryContext;
+		this.otherFields = new ArrayList<ConnectedTermMatchingContext>();
+		this.fieldContext = null;
 	}
 
 	public TermTermination matches(String text) {
-		return new ConnectedSingleTermQueryBuilder(context, ignoreAnalyzer, text, field, queryCustomizer, queryAnalyzer, factory);
+		return new ConnectedSingleTermQueryBuilder( queryContext, ignoreAnalyzer, text, field, queryCustomizer, queryAnalyzer, factory);
 	}
 
 	public TermMatchingContext boostedTo(float boost) {

Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/FieldContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/FieldContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/FieldContext.java	2010-04-20 16:44:07 UTC (rev 19253)
@@ -0,0 +1,39 @@
+package org.hibernate.search.query.dsl.v2.impl;
+
+import org.apache.lucene.analysis.Analyzer;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FieldContext {
+	private final String field;
+	private final Analyzer queryAnalyzer;
+	private final QueryCustomizer queryCustomizer;
+	private boolean ignoreAnalyzer;
+
+	public FieldContext(String field, Analyzer queryAnalyzer, QueryCustomizer queryCustomizer) {
+		this.field = field;
+		this.queryAnalyzer = queryAnalyzer;
+		this.queryCustomizer = queryCustomizer;
+	}
+
+	public String getField() {
+		return field;
+	}
+
+	public Analyzer getQueryAnalyzer() {
+		return queryAnalyzer;
+	}
+
+	public QueryCustomizer getQueryCustomizer() {
+		return queryCustomizer;
+	}
+
+	public boolean isIgnoreAnalyzer() {
+		return ignoreAnalyzer;
+	}
+
+	public void setIgnoreAnalyzer(boolean ignoreAnalyzer) {
+		this.ignoreAnalyzer = ignoreAnalyzer;
+	}
+}

Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/dsl/DSLTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/dsl/DSLTest.java	2010-04-20 15:29:43 UTC (rev 19252)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/dsl/DSLTest.java	2010-04-20 16:44:07 UTC (rev 19253)
@@ -137,7 +137,62 @@
 		cleanData( fts );
 	}
 
+	public void testBoolean() throws Exception {
+		FullTextSession fts = initData();
 
+		Transaction transaction = fts.beginTransaction();
+		final QueryBuilder monthQb = fts.getSearchFactory()
+				.buildQueryBuilder().forEntity( Month.class ).get();
+		Query
+
+		//must
+		query = monthQb
+				.bool()
+					.must( monthQb.exact().onField( "mythology" ).matches( "colder" ).createQuery() )
+					.createQuery();
+
+		List<Month> results = fts.createFullTextQuery( query, Month.class ).list();
+		assertEquals( 1, results.size() );
+		assertEquals( "January", results.get( 0 ).getName() );
+
+		//must not + all
+		query = monthQb
+				.bool()
+					.should( monthQb.all().createQuery() )
+					.must( monthQb.exact().onField( "mythology" ).matches( "colder" ).createQuery() )
+						.not()
+					.createQuery();
+		results = fts.createFullTextQuery( query, Month.class ).list();
+		assertEquals( 1, results.size() );
+		assertEquals( "February", results.get( 0 ).getName() );
+
+		//implicit must not + all (not recommended)
+		query = monthQb
+				.bool()
+					.must( monthQb.exact().onField( "mythology" ).matches( "colder" ).createQuery() )
+						.not()
+					.createQuery();
+		results = fts.createFullTextQuery( query, Month.class ).list();
+		assertEquals( 1, results.size() );
+		assertEquals( "February", results.get( 0 ).getName() );
+
+		//all except (recommended)
+		query = monthQb
+				.all()
+					.except( monthQb.exact().onField( "mythology" ).matches( "colder" ).createQuery() )
+					.createQuery();
+
+		results = fts.createFullTextQuery( query, Month.class ).list();
+		assertEquals( 1, results.size() );
+		assertEquals( "February", results.get( 0 ).getName() );
+
+
+		transaction.commit();
+
+		cleanData( fts );
+	}
+
+
 //	public void testTermQueryOnAnalyzer() throws Exception {
 //		FullTextSession fts = initData();
 //



More information about the hibernate-commits mailing list