[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