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

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Aug 23 13:55:56 EDT 2010


Author: epbernard
Date: 2010-08-23 13:55:53 -0400 (Mon, 23 Aug 2010)
New Revision: 20233

Added:
   search/trunk/hibernate-search/src/main/docbook/en-US/modules/configuration.xml~
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/AllContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/BooleanJunction.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/EntityContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/FieldCustomization.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/FuzzyContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/MustJunction.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/PhraseContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/PhraseMatchingContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/PhraseTermination.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/QueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/QueryContextBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/QueryCustomization.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/RangeContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/RangeMatchingContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/RangeTerminationExcludable.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermFuzzy.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermMatchingContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermTermination.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/Termination.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/WildcardContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/BooleanQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedAllContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedFuzzyContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsPhraseQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsRangeQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsTermQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedPhraseContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedPhraseMatchingContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedQueryContextBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedRangeContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedRangeMatchingContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedTermContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedTermMatchingContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedWildcardContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/FieldContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/Helper.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/PhraseQueryContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/QueryBuildingContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/QueryCustomizer.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/RangeQueryContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/TermQueryContext.java
Removed:
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/AbstractTermQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/BooleanContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/BuildableTermQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/NegatableBooleanContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/SealedQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermQueryBuilderDataStore.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/UnbuildableTermQueryBuilderOnField.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/UnbuildableTermQueryBuilderOnSearch.java
   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/BooleanJunction.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/EntityContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/FieldCustomization.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/FuzzyContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/MustJunction.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseMatchingContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseTermination.java
   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/QueryContextBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryCustomization.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeMatchingContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeTerminationExcludable.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermFuzzy.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/TermTermination.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/Termination.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/WildcardContext.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/ConnectedAllContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedFuzzyContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsPhraseQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsRangeQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsTermQueryBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedPhraseContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedPhraseMatchingContext.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/ConnectedQueryContextBuilder.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedRangeContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedRangeMatchingContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedTermContext.java
   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/ConnectedWildcardContext.java
   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/Helper.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/PhraseQueryContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/QueryBuildingContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/QueryCustomizer.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/RangeQueryContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/TermQueryContext.java
Modified:
   search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/JBossTSTest.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/SearchFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/package-info.java
   search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/dsl/DSLTest.java
Log:
HSEARCH-582 Move from dsl.v2 to dsl, add package JavaDoc and delete obsolete dsl prototype

Added: search/trunk/hibernate-search/src/main/docbook/en-US/modules/configuration.xml~
===================================================================
--- search/trunk/hibernate-search/src/main/docbook/en-US/modules/configuration.xml~	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/docbook/en-US/modules/configuration.xml~	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,1187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<chapter id="search-configuration">
+  <!--  $Id$ -->
+
+  <title>Configuration</title>
+
+  <section id="search-configuration-directory" revision="1">
+    <title>Directory configuration</title>
+
+    <para>Apache Lucene has a notion of <literal>Directory</literal> to store
+    the index files. The <classname>Directory</classname> implementation can
+    be customized, but Lucene comes bundled with a file system
+    (<literal>FSDirectoryProvider</literal>) and an in memory
+    (<literal>RAMDirectoryProvider</literal>) implementation.
+    <literal>DirectoryProvider</literal>s are the Hibernate Search abstraction
+    around a Lucene <classname>Directory</classname> and handle the
+    configuration and the initialization of the underlying Lucene resources.
+    <xref linkend="directory-provider-table" /> shows the list of the
+    directory providers bundled with Hibernate Search.</para>
+
+    <table id="directory-provider-table">
+      <title>List of built-in Directory Providers</title>
+
+      <tgroup cols="3">
+        <thead>
+          <row>
+            <entry align="center">Class</entry>
+
+            <entry align="center">Description</entry>
+
+            <entry align="center">Properties</entry>
+          </row>
+        </thead>
+
+        <tbody>
+          <row>
+            <entry>org.hibernate.search.store.RAMDirectoryProvider</entry>
+
+            <entry>Memory based directory, the directory will be uniquely
+            identified (in the same deployment unit) by the
+            <literal>@Indexed.index</literal> element</entry>
+
+            <entry>none</entry>
+          </row>
+
+          <row>
+            <entry>org.hibernate.search.store.FSDirectoryProvider</entry>
+
+            <entry>File system based directory. The directory used will be
+            &lt;indexBase&gt;/&lt; indexName &gt;</entry>
+
+            <entry><para><literal>indexBase</literal> : Base
+            directory</para><para><literal>indexName</literal>: override
+            @Indexed.index (useful for sharded indexes)</para><para><literal>
+            locking_strategy</literal> : optional, see <xref
+            linkend="search-configuration-directory-lockfactories" />
+            </para></entry>
+          </row>
+
+          <row>
+            <entry>org.hibernate.search.store.FSMasterDirectoryProvider</entry>
+
+            <entry><para>File system based directory. Like
+            FSDirectoryProvider. It also copies the index to a source
+            directory (aka copy directory) on a regular basis.
+            </para><para>The recommended value for the refresh period is (at
+            least) 50% higher that the time to copy the information (default
+            3600 seconds - 60 minutes).</para><para>Note that the copy is
+            based on an incremental copy mechanism reducing the average copy
+            time.</para><para>DirectoryProvider typically used on the master
+            node in a JMS back end cluster.</para><para>The <literal>
+            buffer_size_on_copy</literal> optimum depends on your operating
+            system and available RAM; most people reported good results using
+            values between 16 and 64MB.</para></entry>
+
+            <entry><para><literal>indexBase</literal>: Base
+            directory</para><para><literal>indexName</literal>: override
+            @Indexed.index (useful for sharded
+            indexes)</para><para><literal>sourceBase</literal>: Source (copy)
+            base directory.</para><para><literal>source</literal>: Source
+            directory suffix (default to <literal>@Indexed.index</literal>).
+            The actual source directory name being
+            <filename>&lt;sourceBase&gt;/&lt;source&gt;</filename>
+            </para><para><literal>refresh</literal>: refresh period in second
+            (the copy will take place every refresh seconds).</para><para>
+            <literal>buffer_size_on_copy</literal>: The amount of MegaBytes to
+            move in a single low level copy instruction; defaults to
+            16MB.</para><para><literal> locking_strategy</literal> : optional,
+            see <xref
+            linkend="search-configuration-directory-lockfactories" />
+            </para></entry>
+          </row>
+
+          <row>
+            <entry>org.hibernate.search.store.FSSlaveDirectoryProvider</entry>
+
+            <entry><para>File system based directory. Like
+            FSDirectoryProvider, but retrieves a master version (source) on a
+            regular basis. To avoid locking and inconsistent search results, 2
+            local copies are kept. </para><para>The recommended value for the
+            refresh period is (at least) 50% higher that the time to copy the
+            information (default 3600 seconds - 60 minutes).</para><para>Note
+            that the copy is based on an incremental copy mechanism reducing
+            the average copy time.</para><para>DirectoryProvider typically
+            used on slave nodes using a JMS back end.</para><para>The
+            <literal> buffer_size_on_copy</literal> optimum depends on your
+            operating system and available RAM; most people reported good
+            results using values between 16 and 64MB.</para></entry>
+
+            <entry><para><literal>indexBase</literal>: Base
+            directory</para><para><literal>indexName</literal>: override
+            @Indexed.index (useful for sharded
+            indexes)</para><para><literal>sourceBase</literal>: Source (copy)
+            base directory.</para><para><literal>source</literal>: Source
+            directory suffix (default to <literal>@Indexed.index</literal>).
+            The actual source directory name being
+            <filename>&lt;sourceBase&gt;/&lt;source&gt;</filename>
+            </para><para><literal>refresh</literal>: refresh period in second
+            (the copy will take place every refresh seconds).</para><para>
+            <literal>buffer_size_on_copy</literal>: The amount of MegaBytes to
+            move in a single low level copy instruction; defaults to
+            16MB.</para><para><literal> locking_strategy</literal> : optional,
+            see <xref
+            linkend="search-configuration-directory-lockfactories" />
+            </para></entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+
+    <para>If the built-in directory providers do not fit your needs, you can
+    write your own directory provider by implementing the
+    <classname>org.hibernate.store.DirectoryProvider</classname>
+    interface.</para>
+
+    <para>Each indexed entity is associated to a Lucene index (an index can be
+    shared by several entities but this is not usually the case). You can
+    configure the index through properties prefixed by
+    <constant>hibernate.search.</constant><replaceable>indexname</replaceable>
+    . Default properties inherited to all indexes can be defined using the
+    prefix <constant>hibernate.search.default.</constant></para>
+
+    <para>To define the directory provider of a given index, you use the
+    <constant>hibernate.search.<replaceable>indexname</replaceable>.directory_provider
+    </constant></para>
+
+    <example>
+      <title>Configuring directory providers</title>
+
+      <programlisting>hibernate.search.default.directory_provider org.hibernate.search.store.FSDirectoryProvider
+hibernate.search.default.indexBase=/usr/lucene/indexes
+hibernate.search.Rules.directory_provider org.hibernate.search.store.RAMDirectoryProvider</programlisting>
+    </example>
+
+    <para>applied on</para>
+
+    <example>
+      <title>Specifying the index name using the <literal>index</literal>
+      parameter of <classname>@Indexed</classname></title>
+
+      <programlisting>@Indexed(index="Status")
+public class Status { ... }
+
+ at Indexed(index="Rules")
+public class Rule { ... }</programlisting>
+    </example>
+
+    <para>will create a file system directory in
+    <filename>/usr/lucene/indexes/Status</filename> where the Status entities
+    will be indexed, and use an in memory directory named
+    <literal>Rules</literal> where Rule entities will be indexed.</para>
+
+    <para>You can easily define common rules like the directory provider and
+    base directory, and override those defaults later on on a per index
+    basis.</para>
+
+    <para>Writing your own <classname>DirectoryProvider</classname>, you can
+    utilize this configuration mechanism as well.</para>
+  </section>
+
+  <section id="search-configuration-directory-sharding" revision="1">
+    <title>Sharding indexes</title>
+
+    <para>In some cases, it is necessary to split (shard) the indexing data of
+    a given entity type into several Lucene indexes. This solution is not
+    recommended unless there is a pressing need because by default, searches
+    will be slower as all shards have to be opened for a single search. In
+    other words don't do it until you have problems :)</para>
+
+    <para>For example, sharding may be desirable if:</para>
+
+    <itemizedlist>
+      <listitem>
+        <para>A single index is so huge that index update times are slowing
+        the application down.</para>
+      </listitem>
+
+      <listitem>
+        <para>A typical search will only hit a sub-set of the index, such as
+        when data is naturally segmented by customer, region or
+        application.</para>
+      </listitem>
+    </itemizedlist>
+
+    <para>Hibernate Search allows you to index a given entity type into
+    several sub indexes. Data is sharded into the different sub indexes thanks
+    to an <classname>IndexShardingStrategy</classname>. By default, no
+    sharding strategy is enabled, unless the number of shards is configured.
+    To configure the number of shards use the following property</para>
+
+    <example>
+      <title>Enabling index sharding by specifying nbr_of_shards for a
+      specific index</title>
+
+      <programlisting>hibernate.search.&lt;indexName&gt;.sharding_strategy.nbr_of_shards 5</programlisting>
+    </example>
+
+    <para>This will use 5 different shards.</para>
+
+    <para>The default sharding strategy, when shards are set up, splits the
+    data according to the hash value of the id string representation
+    (generated by the Field Bridge). This ensures a fairly balanced sharding.
+    You can replace the strategy by implementing
+    <literal>IndexShardingStrategy</literal> and by setting the following
+    property</para>
+
+    <example>
+      <title>Specifying a custom sharding strategy</title>
+
+      <programlisting>hibernate.search.&lt;indexName&gt;.sharding_strategy my.shardingstrategy.Implementation</programlisting>
+    </example>
+
+    <para>Using a custom <classname>IndexShardingStrategy</classname>
+    implementation, it's possible to define what shard a given entity is
+    indexed to.</para>
+
+    <para>It also allows for optimizing searches by selecting which shard to
+    run the query onto. By activating a filter (see <xref
+    linkend="query-filter-shard" />), a sharding strategy can select a subset
+    of the shards used to answer a query
+    (<classname>IndexShardingStrategy.getDirectoryProvidersForQuery</classname>)
+    and thus speed up the query execution.</para>
+
+    <para>Each shard has an independent directory provider configuration as
+    described in <xref linkend="search-configuration-directory" />. The
+    <classname>DirectoryProvider</classname> default name for the previous
+    example are <literal>&lt;indexName&gt;.0</literal> to
+    <literal>&lt;indexName&gt;.4</literal>. In other words, each shard has the
+    name of it's owning index followed by <constant>.</constant> (dot) and its
+    index number.</para>
+
+    <example>
+      <title>Configuring the sharding configuration for an example entity
+      <classname>Animal</classname></title>
+
+      <programlisting>hibernate.search.default.indexBase /usr/lucene/indexes
+
+hibernate.search.Animal.sharding_strategy.nbr_of_shards 5
+hibernate.search.Animal.directory_provider org.hibernate.search.store.FSDirectoryProvider
+hibernate.search.Animal.0.indexName Animal00
+hibernate.search.Animal.3.indexBase /usr/lucene/sharded
+hibernate.search.Animal.3.indexName Animal03</programlisting>
+    </example>
+
+    <para>This configuration uses the default id string hashing strategy and
+    shards the Animal index into 5 subindexes. All subindexes are
+    <classname>FSDirectoryProvider</classname> instances and the directory
+    where each subindex is stored is as followed:</para>
+
+    <itemizedlist>
+      <listitem>
+        <para>for subindex 0: /usr/lucene/indexes/Animal00 (shared indexBase
+        but overridden indexName)</para>
+      </listitem>
+
+      <listitem>
+        <para>for subindex 1: /usr/lucene/indexes/Animal.1 (shared indexBase,
+        default indexName)</para>
+      </listitem>
+
+      <listitem>
+        <para>for subindex 2: /usr/lucene/indexes/Animal.2 (shared indexBase,
+        default indexName)</para>
+      </listitem>
+
+      <listitem>
+        <para>for subindex 3: /usr/lucene/shared/Animal03 (overridden
+        indexBase, overridden indexName)</para>
+      </listitem>
+
+      <listitem>
+        <para>for subindex 4: /usr/lucene/indexes/Animal.4 (shared indexBase,
+        default indexName)</para>
+      </listitem>
+    </itemizedlist>
+  </section>
+
+  <section>
+    <title>Sharing indexes (two entities into the same directory)</title>
+
+    <note>
+      <para>This is only presented here so that you know the option is
+      available. There is really not much benefit in sharing indexes.</para>
+    </note>
+
+    <para>It is technically possible to store the information of more than one
+    entity into a single Lucene index. There are two ways to accomplish
+    this:</para>
+
+    <itemizedlist>
+      <listitem>
+        <para>Configuring the underlying directory providers to point to the
+        same physical index directory. In practice, you set the property
+        <literal>hibernate.search.[fully qualified entity
+        name].indexName</literal> to the same value. As an example let’s use
+        the same index (directory) for the <classname>Furniture</classname>
+        and <classname>Animal</classname> entity. We just set
+        <literal>indexName</literal> for both entities to for example
+        “Animal”. Both entities will then be stored in the Animal
+        directory</para>
+
+        <para><programlisting><code>hibernate.search.org.hibernate.search.test.shards.Furniture.indexName = Animal
+hibernate.search.org.hibernate.search.test.shards.Animal.indexName = Animal</code></programlisting></para>
+      </listitem>
+
+      <listitem>
+        <para>Setting the <code>@Indexed</code> annotation’s
+        <methodname>index</methodname> attribute of the entities you want to
+        merge to the same value. If we again wanted all
+        <classname>Furniture</classname> instances to be indexed in the
+        <classname>Animal</classname> index along with all instances of
+        <classname>Animal</classname> we would specify
+        <code>@Indexed(index=”Animal”)</code> on both
+        <classname>Animal</classname> and <classname>Furniture</classname>
+        classes.</para>
+      </listitem>
+    </itemizedlist>
+  </section>
+
+  <section>
+    <title>Worker configuration</title>
+
+    <para>It is possible to refine how Hibernate Search interacts with Lucene
+    through the worker configuration. The work can be executed to the Lucene
+    directory or sent to a JMS queue for later processing. When processed to
+    the Lucene directory, the work can be processed synchronously or
+    asynchronously to the transaction commit.</para>
+
+    <para>You can define the worker configuration using the following
+    properties</para>
+
+    <table>
+      <title>worker configuration</title>
+
+      <tgroup cols="2">
+        <tbody>
+          <row>
+            <entry>Property</entry>
+
+            <entry>Description</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.worker.backend</literal></entry>
+
+            <entry>Out of the box support for the Apache Lucene back end and
+            the JMS back end. Default to <literal>lucene</literal>. Supports
+            also <literal>jms</literal>, <literal>blackhole</literal>,
+            <literal>jgroupsMaster</literal> and
+            <literal>jgroupsSlave</literal>.</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.worker.execution</literal></entry>
+
+            <entry>Supports synchronous and asynchronous execution. Default to
+            <literal><literal>sync</literal></literal>. Supports also
+            <literal>async</literal>.</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.worker.thread_pool.size</literal></entry>
+
+            <entry>Defines the number of threads in the pool. useful only for
+            asynchronous execution. Default to 1.</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.worker.buffer_queue.max</literal></entry>
+
+            <entry>Defines the maximal number of work queue if the thread poll
+            is starved. Useful only for asynchronous execution. Default to
+            infinite. If the limit is reached, the work is done by the main
+            thread.</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.worker.jndi.*</literal></entry>
+
+            <entry>Defines the JNDI properties to initiate the InitialContext
+            (if needed). JNDI is only used by the JMS back end.</entry>
+          </row>
+
+          <row>
+            <entry><literal>
+            hibernate.search.worker.jms.connection_factory</literal></entry>
+
+            <entry>Mandatory for the JMS back end. Defines the JNDI name to
+            lookup the JMS connection factory from
+            (<literal>/ConnectionFactory</literal> by default in JBoss
+            AS)</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.worker.jms.queue</literal></entry>
+
+            <entry>Mandatory for the JMS back end. Defines the JNDI name to
+            lookup the JMS queue from. The queue will be used to post work
+            messages.</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.worker.jgroups.clusterName</literal></entry>
+
+            <entry>Optional for JGroups back end. Defines the name of JGroups
+            channel.</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.worker.jgroups.configurationFile</literal></entry>
+
+            <entry>Optional JGroups network stack configuration. Defines the
+            name of a JGroups configuration file, which must exist on
+            classpath.</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.worker.jgroups.configurationXml</literal></entry>
+
+            <entry>Optional JGroups network stack configuration. Defines a
+            String representing JGroups configuration as XML.</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.worker.jgroups.configurationString</literal></entry>
+
+            <entry>Optional JGroups network stack configuration. Provides
+            JGroups configuration in plain text.</entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+  </section>
+
+  <section id="jms-backend">
+    <title>JMS Master/Slave configuration</title>
+
+    <para>This section describes in greater detail how to configure the Master
+    / Slaves Hibernate Search architecture.</para>
+
+    <mediaobject>
+      <imageobject role="html">
+        <imagedata align="center" fileref="jms-backend.png" format="PNG" />
+      </imageobject>
+
+      <imageobject role="fo">
+        <imagedata align="center" depth="" fileref="jms-backend.png"
+                   format="PNG" scalefit="1" width="12cm" />
+      </imageobject>
+
+      <caption><para>JMS back end configuration.</para></caption>
+    </mediaobject>
+
+    <section>
+      <title>Slave nodes</title>
+
+      <para>Every index update operation is sent to a JMS queue. Index
+      querying operations are executed on a local index copy.</para>
+
+      <example>
+        <title>JMS Slave configuration</title>
+
+        <programlisting>### slave configuration
+
+## DirectoryProvider
+# (remote) master location
+hibernate.search.default.sourceBase = /mnt/mastervolume/lucenedirs/mastercopy
+
+# local copy location
+hibernate.search.default.indexBase = /Users/prod/lucenedirs
+
+# refresh every half hour
+hibernate.search.default.refresh = 1800
+
+# appropriate directory provider
+hibernate.search.default.directory_provider = org.hibernate.search.store.FSSlaveDirectoryProvider
+
+## Backend configuration
+hibernate.search.worker.backend = jms
+hibernate.search.worker.jms.connection_factory = /ConnectionFactory
+hibernate.search.worker.jms.queue = queue/hibernatesearch
+#optional jndi configuration (check your JMS provider for more information)
+
+## Optional asynchronous execution strategy
+# hibernate.search.worker.execution = async
+# hibernate.search.worker.thread_pool.size = 2
+# hibernate.search.worker.buffer_queue.max = 50</programlisting>
+      </example>
+
+      <para>A file system local copy is recommended for faster search
+      results.</para>
+
+      <para>The refresh period should be higher that the expected time
+      copy.</para>
+    </section>
+
+    <section>
+      <title>Master node</title>
+
+      <para>Every index update operation is taken from a JMS queue and
+      executed. The master index is copied on a regular basis.</para>
+
+      <example>
+        <title>JMS Master configuration</title>
+
+        <programlisting>### master configuration
+
+## DirectoryProvider
+# (remote) master location where information is copied to
+hibernate.search.default.sourceBase = /mnt/mastervolume/lucenedirs/mastercopy
+
+# local master location
+hibernate.search.default.indexBase = /Users/prod/lucenedirs
+
+# refresh every half hour
+hibernate.search.default.refresh = 1800
+
+# appropriate directory provider
+hibernate.search.default.directory_provider = org.hibernate.search.store.FSMasterDirectoryProvider
+
+## Backend configuration
+#Backend is the default lucene one</programlisting>
+      </example>
+
+      <para>The refresh period should be higher that the expected time
+      copy.</para>
+
+      <para>In addition to the Hibernate Search framework configuration, a
+      Message Driven Bean should be written and set up to process the index
+      works queue through JMS.</para>
+
+      <example>
+        <title>Message Driven Bean processing the indexing queue</title>
+
+        <programlisting>@MessageDriven(activationConfig = {
+      @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
+      @ActivationConfigProperty(propertyName="destination", propertyValue="queue/hibernatesearch"),
+      @ActivationConfigProperty(propertyName="DLQMaxResent", propertyValue="1")
+   } )
+public class MDBSearchController extends AbstractJMSHibernateSearchController implements MessageListener {
+    @PersistenceContext EntityManager em;
+    
+    //method retrieving the appropriate session
+    protected Session getSession() {
+        return (Session) em.getDelegate();
+    }
+
+    //potentially close the session opened in #getSession(), not needed here
+    protected void cleanSessionIfNeeded(Session session) 
+    }
+}</programlisting>
+      </example>
+
+      <para>This example inherits from the abstract JMS controller class
+      available in the Hibernate Search source code and implements a JavaEE 5
+      MDB. This implementation is given as an example and, while most likely
+      be more complex, can be adjusted to make use of non Java EE Message
+      Driven Beans. For more information about the
+      <methodname>getSession()</methodname> and
+      <methodname>cleanSessionIfNeeded()</methodname>, please check
+      <classname>AbstractJMSHibernateSearchController</classname>'s
+      javadoc.</para>
+    </section>
+  </section>
+
+  <section id="jgroups-backend">
+    <title>JGroups Master/Slave configuration</title>
+
+    <para>Describes how to configure JGroups Master/Slave back end.
+    Configuration examples illustrated in JMS Master/Slave configuration
+    section (<xref linkend="jms-backend" />) also apply here, only a different
+    backend needs to be set.</para>
+
+    <section>
+      <title>Slave nodes</title>
+
+      <para>Every index update operation is sent through a JGroups channel to
+      the master node. Index querying operations are executed on a local index
+      copy.</para>
+
+      <example>
+        <title>JGroups Slave configuration</title>
+
+        <programlisting>
+### slave configuration
+## Backend configuration
+hibernate.search.worker.backend = jgroupsSlave
+       </programlisting>
+      </example>
+    </section>
+
+    <section>
+      <title>Master node</title>
+
+      <para>Every index update operation is taken from a JGroups channel and
+      executed. The master index is copied on a regular basis.</para>
+
+      <example>
+        <title>JGroups Master configuration</title>
+
+        <programlisting>
+### master configuration
+## Backend configuration
+hibernate.search.worker.backend = jgroupsMaster
+     </programlisting>
+      </example>
+    </section>
+
+    <section>
+      <title>JGroups channel configuration</title>
+
+      <para>Optionally configuration for JGroups transport protocols (UDP,
+      TCP) and channel name can be defined. It can be applied to both master
+      and slave nodes. There are several ways to configure JGroups transport
+      details. If it is not defined explicity, configuration found in the
+      <literal> flush-udp.xml</literal> file is used.</para>
+
+      <example>
+        <title>JGroups transport protocols configuration</title>
+
+        <programlisting>
+## configuration
+#udp.xml file needs to be located in the classpath
+hibernate.search.worker.backend.jgroups.configurationFile = udp.xml
+
+#protocol stack configuration provided in XML format
+hibernate.search.worker.backend.jgroups.configurationXml =
+
+&lt;config xmlns="urn:org:jgroups"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="urn:org:jgroups file:schema/JGroups-2.8.xsd"&gt;
+&lt;UDP
+mcast_addr="${jgroups.udp.mcast_addr:228.10.10.10}"
+mcast_port="${jgroups.udp.mcast_port:45588}"
+tos="8"
+thread_naming_pattern="pl"
+thread_pool.enabled="true"
+thread_pool.min_threads="2"
+thread_pool.max_threads="8"
+thread_pool.keep_alive_time="5000"
+thread_pool.queue_enabled="false"
+thread_pool.queue_max_size="100"
+thread_pool.rejection_policy="Run"/&gt;
+&lt;PING timeout="1000" num_initial_members="3"/&gt;
+&lt;MERGE2 max_interval="30000" min_interval="10000"/&gt;
+&lt;FD_SOCK/&gt;
+&lt;FD timeout="3000" max_tries="3"/&gt;
+&lt;VERIFY_SUSPECT timeout="1500"/&gt;
+&lt;pbcast.STREAMING_STATE_TRANSFER/&gt;
+&lt;pbcast.FLUSH timeout="0"/&gt;
+&lt;/config&gt;
+
+#protocol stack configuration provided in "old style" jgroups format
+hibernate.search.worker.backend.jgroups.configurationString =
+
+UDP(mcast_addr=228.1.2.3;mcast_port=45566;ip_ttl=32):PING(timeout=3000;
+num_initial_members=6):FD(timeout=5000):VERIFY_SUSPECT(timeout=1500):
+pbcast.NAKACK(gc_lag=10;retransmit_timeout=3000):UNICAST(timeout=5000):
+FRAG:pbcast.GMS(join_timeout=3000;shun=false;print_local_addr=true)
+
+    </programlisting>
+      </example>
+
+      <para>Master and slave nodes communicate over JGroups channel that is
+      identified by this same name. Name of the channel can be defined
+      explicity, if not default <literal>HSearchCluster</literal> is
+      used.</para>
+
+      <example>
+        <title>JGroups channel name configuration</title>
+
+        <programlisting>
+## Backend configuration
+hibernate.search.worker.backend.jgroups.clusterName = Hibernate-Search-Cluster
+                </programlisting>
+      </example>
+    </section>
+  </section>
+
+  <section id="configuration-reader-strategy">
+    <title>Reader strategy configuration</title>
+
+    <para>The different reader strategies are described in <xref
+    linkend="search-architecture-readerstrategy" />. Out of the box strategies
+    are:</para>
+
+    <itemizedlist>
+      <listitem>
+        <para><literal>shared</literal>: share index readers across several
+        queries. This strategy is the most efficient.</para>
+      </listitem>
+
+      <listitem>
+        <para><literal>not-shared</literal>: create an index reader for each
+        individual query</para>
+      </listitem>
+    </itemizedlist>
+
+    <para>The default reader strategy is <literal>shared</literal>. This can
+    be adjusted:</para>
+
+    <programlisting>hibernate.search.reader.strategy = not-shared</programlisting>
+
+    <para>Adding this property switches to the <literal>not-shared</literal>
+    strategy.</para>
+
+    <para>Or if you have a custom reader strategy:</para>
+
+    <programlisting>hibernate.search.reader.strategy = my.corp.myapp.CustomReaderProvider</programlisting>
+
+    <para>where <classname>my.corp.myapp.CustomReaderProvider</classname> is
+    the custom strategy implementation.</para>
+  </section>
+
+  <section id="search-configuration-event" revision="2">
+    <title>Enabling Hibernate Search and automatic indexing</title>
+
+    <section>
+      <title>Enabling Hibernate Search</title>
+
+      <para>Hibernate Search is enabled out of the box when detected on the
+      classpath by Hibernate Core. If, for some reason you need to disable it,
+      set <literal>hibernate.search.autoregister_listeners</literal> to false.
+      Note that there is no performance penalty when the listeners are enabled
+      but no entities are annotated as indexed.</para>
+    </section>
+
+    <section>
+      <title>Automatic indexing</title>
+
+      <para>By default, every time an object is inserted, updated or deleted
+      through Hibernate, Hibernate Search updates the according Lucene index.
+      It is sometimes desirable to disable that features if either your index
+      is read-only or if index updates are done in a batch way (see <xref
+      linkend="search-batchindex" />).</para>
+
+      <para>To disable event based indexing, set</para>
+
+      <programlisting>hibernate.search.indexing_strategy = manual</programlisting>
+
+      <note>
+        <para>In most case, the JMS backend provides the best of both world, a
+        lightweight event based system keeps track of all changes in the
+        system, and the heavyweight indexing process is done by a separate
+        process or machine.</para>
+      </note>
+    </section>
+  </section>
+
+  <section id="lucene-indexing-performance" revision="3">
+    <title>Tuning Lucene indexing performance</title>
+
+    <para>Hibernate Search allows you to tune the Lucene indexing performance
+    by specifying a set of parameters which are passed through to underlying
+    Lucene <literal>IndexWriter</literal> such as
+    <literal>mergeFactor</literal>, <literal>maxMergeDocs</literal> and
+    <literal>maxBufferedDocs</literal>. You can specify these parameters
+    either as default values applying for all indexes, on a per index basis,
+    or even per shard.</para>
+
+    <para>There are two sets of parameters allowing for different performance
+    settings depending on the use case. During indexing operations triggered
+    by database modifications, the parameters are grouped by the
+    <literal>transaction</literal> keyword: <programlisting>hibernate.search.[default|&lt;indexname&gt;].indexwriter.transaction.&lt;parameter_name&gt;</programlisting>
+    When indexing occurs via <literal>FullTextSession.index()</literal> or via
+    a <classname>MassIndexer</classname> (see <xref
+    linkend="search-batchindex" />), the used properties are those grouped
+    under the <literal>batch</literal> keyword: <programlisting>hibernate.search.[default|&lt;indexname&gt;].indexwriter.batch.&lt;parameter_name&gt;</programlisting></para>
+
+    <para>If no value is set for a <literal>.batch</literal> value in a
+    specific shard configuration, Hibernate Search will look at the index
+    section, then at the default section: <programlisting>hibernate.search.Animals.2.indexwriter.transaction.max_merge_docs 10
+hibernate.search.Animals.2.indexwriter.transaction.merge_factor 20
+hibernate.search.default.indexwriter.batch.max_merge_docs 100</programlisting>
+    This configuration will result in these settings applied to the second
+    shard of Animals index:</para>
+
+    <itemizedlist>
+      <listitem>
+        <para><literal>transaction.max_merge_docs</literal> = 10</para>
+      </listitem>
+
+      <listitem>
+        <para><literal>batch.max_merge_docs</literal> = 100</para>
+      </listitem>
+
+      <listitem>
+        <para><literal>transaction.merge_factor</literal> = 20</para>
+      </listitem>
+
+      <listitem>
+        <para><literal>batch.merge_factor</literal> = Lucene default</para>
+      </listitem>
+    </itemizedlist>
+
+    <para>All other values will use the defaults defined in Lucene.</para>
+
+    <para>The default for all values is to leave them at Lucene's own default,
+    so the listed values in the following table actually depend on the version
+    of Lucene you are using; values shown are relative to version
+    <literal>2.4</literal>. For more information about Lucene indexing
+    performances, please refer to the Lucene documentation.</para>
+
+    <warning>
+      <para>Previous versions had the <literal>batch</literal> parameters
+      inherit from <literal>transaction</literal> properties. This needs now
+      to be explicitly set.</para>
+    </warning>
+
+    <table>
+      <title>List of indexing performance and behavior properties</title>
+
+      <tgroup cols="3">
+        <thead>
+          <row>
+            <entry align="center">Property</entry>
+
+            <entry align="center">Description</entry>
+
+            <entry align="center">Default Value</entry>
+          </row>
+        </thead>
+
+        <tbody>
+          <row>
+            <entry><literal>hibernate.search.[default|&lt;indexname&gt;].exclusive_index_use</literal></entry>
+
+            <entry><para>Set to <literal>true</literal> when no other process
+            will need to write to the same index: this will enable Hibernate
+            Search to work in exlusive mode on the index and improve
+            performance in writing changes to the index.</para></entry>
+
+            <entry><literal>false</literal> (releases locks as soon as
+            possible)</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.[default|&lt;indexname&gt;].indexwriter.[transaction|batch].max_buffered_delete_terms</literal></entry>
+
+            <entry><para>Determines the minimal number of delete terms
+            required before the buffered in-memory delete terms are applied
+            and flushed. If there are documents buffered in memory at the
+            time, they are merged and a new segment is created.</para></entry>
+
+            <entry>Disabled (flushes by RAM usage)</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.[default|&lt;indexname&gt;].indexwriter.[transaction|batch].max_buffered_docs</literal></entry>
+
+            <entry><para>Controls the amount of documents buffered in memory
+            during indexing. The bigger the more RAM is
+            consumed.</para></entry>
+
+            <entry>Disabled (flushes by RAM usage)</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.[default|&lt;indexname&gt;].indexwriter.[transaction|batch].max_field_length</literal></entry>
+
+            <entry><para>The maximum number of terms that will be indexed for
+            a single field. This limits the amount of memory required for
+            indexing so that very large data will not crash the indexing
+            process by running out of memory. This setting refers to the
+            number of running terms, not to the number of different
+            terms.</para> <para>This silently truncates large documents,
+            excluding from the index all terms that occur further in the
+            document. If you know your source documents are large, be sure to
+            set this value high enough to accommodate the expected size. If
+            you set it to Integer.MAX_VALUE, then the only limit is your
+            memory, but you should anticipate an OutOfMemoryError. </para>
+            <para>If setting this value in <literal>batch</literal>
+            differently than in <literal>transaction</literal> you may get
+            different data (and results) in your index depending on the
+            indexing mode.</para></entry>
+
+            <entry>10000</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.[default|&lt;indexname&gt;].indexwriter.[transaction|batch].max_merge_docs</literal></entry>
+
+            <entry><para>Defines the largest number of documents allowed in a
+            segment. Larger values are best for batched indexing and speedier
+            searches. Small values are best for transaction
+            indexing.</para></entry>
+
+            <entry>Unlimited (Integer.MAX_VALUE)</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.[default|&lt;indexname&gt;].indexwriter.[transaction|batch].merge_factor</literal></entry>
+
+            <entry><para>Controls segment merge frequency and size. </para>
+            <para>Determines how often segment indexes are merged when
+            insertion occurs. With smaller values, less RAM is used while
+            indexing, and searches on unoptimized indexes are faster, but
+            indexing speed is slower. With larger values, more RAM is used
+            during indexing, and while searches on unoptimized indexes are
+            slower, indexing is faster. Thus larger values (&gt; 10) are best
+            for batch index creation, and smaller values (&lt; 10) for indexes
+            that are interactively maintained. The value must no be lower than
+            2.</para></entry>
+
+            <entry>10</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.[default|&lt;indexname&gt;].indexwriter.[transaction|batch].ram_buffer_size</literal></entry>
+
+            <entry><para>Controls the amount of RAM in MB dedicated to
+            document buffers. When used together max_buffered_docs a flush
+            occurs for whichever event happens first.</para> <para>Generally
+            for faster indexing performance it's best to flush by RAM usage
+            instead of document count and use as large a RAM buffer as you
+            can.</para></entry>
+
+            <entry>16 MB</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.[default|&lt;indexname&gt;].indexwriter.[transaction|batch].term_index_interval</literal></entry>
+
+            <entry><para>Expert: Set the interval between indexed
+            terms.</para> <para>Large values cause less memory to be used by
+            IndexReader, but slow random-access to terms. Small values cause
+            more memory to be used by an IndexReader, and speed random-access
+            to terms. See Lucene documentation for more
+            details.</para></entry>
+
+            <entry>128</entry>
+          </row>
+
+          <row>
+            <entry><literal>hibernate.search.[default|&lt;indexname&gt;].indexwriter.[transaction|batch].use_compound_file</literal></entry>
+
+            <entry>The advantage of using the compound file format is that
+            less file descriptors are used. The disadvantage is that indexing
+            takes more time and temporary disk space. You can set this
+            parameter to <literal>false</literal> in an attempt to improve the
+            indexing time, but you could run out of file descriptors if
+            <literal>mergeFactor</literal> is also
+            large.<para></para><para>Boolean parameter, use
+            "<literal>true</literal>" or "<literal>false</literal>". The
+            default value for this option is
+            <literal>true</literal>.</para></entry>
+
+            <entry>true</entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+
+    <tip>
+      <para>When your architecture permits it, always set
+      <literal>hibernate.search.default.exclusive_index_use=true</literal> as
+      it greatly improves efficiency in index writing.</para>
+    </tip>
+
+    <para>To tune the indexing speed it might be useful to time the object
+    loading from database in isolation from the writes to the index. To
+    achieve this set the <literal>blackhole</literal> as worker backend and
+    start you indexing routines. This backend does not disable Hibernate
+    Search: it will still generate the needed changesets to the index, but
+    will discard them instead of flushing them to the index. As opposite to
+    setting the <literal>hibernate.search.indexing_strategy</literal> to
+    <literal>manual</literal> when using <literal>blackhole</literal> it will
+    possibly load more data to rebuild the index from associated
+    entities.</para>
+
+    <programlisting>hibernate.search.worker.backend blackhole</programlisting>
+
+    <para>The recommended approach is to focus first on optimizing the object
+    loading, and then use the timings you achieve as a baseline to tune the
+    indexing process.</para>
+
+    <para>The <literal>blackhole</literal> backend is not meant to be used in
+    production, only as a tool to identify indexing bottlenecks.</para>
+  </section>
+
+  <section id="search-configuration-directory-lockfactories" revision="1">
+     
+
+    <title>LockFactory configuration</title>
+
+     
+
+    <para>Lucene Directories have default locking strategies which work well
+    for most cases, but it's possible to specify for each index managed by
+    Hibernate Search which LockingFactory you want to use.</para>
+
+     
+
+    <para>Some of these locking strategies require a filesystem level lock and
+    may be used even on RAM based indexes, but this is not recommended and of
+    no practical use.</para>
+
+     
+
+    <para>To select a locking factory, set the
+    <literal>hibernate.search.&lt;index&gt;.locking_strategy</literal> option
+    to one of <literal>simple</literal>, <literal>native</literal>,
+    <literal>single</literal> or <literal>none</literal>, or set it to the
+    fully qualified name of an implementation of
+    <literal>org.hibernate.search.store.LockFactoryFactory</literal>;
+    Implementing this interface you can provide a custom
+    <literal>org.apache.lucene.store.LockFactory</literal>. <table
+        id="search-configuration-directory-lockfactories-table">
+        <title>List of available LockFactory implementations</title>
+
+        <tgroup cols="3">
+          <thead>
+            <row>
+              <entry align="center">name</entry>
+
+              <entry align="center">Class</entry>
+
+              <entry align="center">Description</entry>
+            </row>
+          </thead>
+
+          <tbody>
+            <row>
+              <entry>simple</entry>
+
+              <entry>org.apache.lucene.store.SimpleFSLockFactory</entry>
+
+              <entry>
+                <para>Safe implementation based on Java's File API, it marks
+                the usage of the index by creating a marker file.</para>
+
+                <para>If for some reason you had to kill your application, you
+                will need to remove this file before restarting it.</para>
+
+                <para>This is the default implementation for
+                <literal>FSDirectoryProvider</literal>,<literal>FSMasterDirectoryProvider</literal>
+                and <literal>FSSlaveDirectoryProvider</literal>.</para>
+              </entry>
+            </row>
+
+            <row>
+              <entry>native</entry>
+
+              <entry>org.apache.lucene.store.NativeFSLockFactory</entry>
+
+              <entry>
+                <para>As does <literal>simple</literal> this also marks the
+                usage of the index by creating a marker file, but this one is
+                using native OS file locks so that even if your application
+                crashes the locks will be cleaned up.</para>
+
+                <para>This implementation has known problems on NFS.</para>
+              </entry>
+            </row>
+
+            <row>
+              <entry>single</entry>
+
+              <entry>org.apache.lucene.store.SingleInstanceLockFactory</entry>
+
+              <entry>
+                <para>This LockFactory doesn't use a file marker but is a Java
+                object lock held in memory; therefore it's possible to use it
+                only when you are sure the index is not going to be shared by
+                any other process.</para>
+
+                <para>This is the default implementation for
+                <literal>RAMDirectoryProvider</literal>.</para>
+              </entry>
+            </row>
+
+            <row>
+              <entry>none</entry>
+
+              <entry>org.apache.lucene.store.NoLockFactory</entry>
+
+              <entry>
+                <para>All changes to this index are not coordinated by any
+                lock; test your application carefully and make sure you know
+                what it means.</para>
+              </entry>
+            </row>
+          </tbody>
+        </tgroup>
+      </table></para>
+
+     Configuration example: 
+
+    <programlisting>hibernate.search.default.locking_strategy simple
+hibernate.search.Animals.locking_strategy native
+hibernate.search.Books.locking_strategy org.custom.components.MyLockingFactory</programlisting>
+
+     
+
+    <para />
+
+     
+  </section>
+
+  <section>
+    <title>Exception Handling Configuration</title>
+
+    <para>Hibernate Search allows you to configure how exceptions are handled
+    during the indexing process. If no configuration is provided then
+    exceptions are logged to the log output by default. It is possible to
+    explicitly declare the exception logging mechanism as seen below:</para>
+
+    <para><programlisting>hibernate.search.error_handler log</programlisting>
+    The default exception handling occurs for both synchronous and
+    asynchronous indexing. Hibernate Search provides an easy mechanism to
+    override the default error handling implementation.</para>
+
+    <para>In order to provide your own implementation you must implement the
+    <code>ErrorHandler</code> interface, which provides <code>handle (
+    ErrorContext context )</code> method. The <code>ErrorContext</code>
+    provides a reference to the primary <code>LuceneWork</code> that failed,
+    the underlying exception and any subsequent <code>LuceneWork</code> that
+    could not be processed due to the primary exception.</para>
+
+    <para><programlisting>public interface ErrorContext  {
+   List&lt;LuceneWork&gt; getFailingOperations();
+   LuceneWork getOperationAtFault();
+   Throwable getThrowable();
+   boolean hasErrors();
+}</programlisting></para>
+
+    <para>The following provides an example implementation of
+    <code>ErrorHandler</code>:</para>
+
+    <para><programlisting>public class CustomErrorHandler implements ErrorHandler {
+   public void handle ( ErrorContext context ) {
+      ...
+      //publish error context to some internal error handling system
+      ...
+   }
+}</programlisting> To register this error handler with Hibernate Search you
+    must declare the <code>CustomErrorHandler</code> fully qualified classname
+    in the configuration properties:</para>
+
+    <para><programlisting>hibernate.search.error_handler CustomerErrorHandler</programlisting></para>
+  </section>
+</chapter>

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/SearchFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/SearchFactory.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/SearchFactory.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -25,7 +25,7 @@
 
 import org.apache.lucene.analysis.Analyzer;
 
-import org.hibernate.search.query.dsl.v2.QueryContextBuilder;
+import org.hibernate.search.query.dsl.QueryContextBuilder;
 import org.hibernate.search.reader.ReaderProvider;
 import org.hibernate.search.stat.Statistics;
 import org.hibernate.search.store.DirectoryProvider;

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -58,8 +58,8 @@
 import org.hibernate.search.jmx.JMXRegistrar;
 import org.hibernate.search.jmx.StatisticsInfo;
 import org.hibernate.search.jmx.StatisticsInfoMBean;
-import org.hibernate.search.query.dsl.v2.QueryContextBuilder;
-import org.hibernate.search.query.dsl.v2.impl.ConnectedQueryContextBuilder;
+import org.hibernate.search.query.dsl.QueryContextBuilder;
+import org.hibernate.search.query.dsl.impl.ConnectedQueryContextBuilder;
 import org.hibernate.search.reader.ReaderProvider;
 import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.spi.internals.DirectoryProviderData;

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -28,7 +28,6 @@
 import java.util.Set;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
-import javax.management.ObjectName;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.search.Similarity;
@@ -43,7 +42,7 @@
 import org.hibernate.search.engine.FilterDef;
 import org.hibernate.search.exception.ErrorHandler;
 import org.hibernate.search.filter.FilterCachingStrategy;
-import org.hibernate.search.query.dsl.v2.QueryContextBuilder;
+import org.hibernate.search.query.dsl.QueryContextBuilder;
 import org.hibernate.search.reader.ReaderProvider;
 import org.hibernate.search.spi.SearchFactoryIntegrator;
 import org.hibernate.search.spi.internals.DirectoryProviderData;

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/AbstractTermQueryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/AbstractTermQueryBuilder.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/AbstractTermQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,37 +0,0 @@
-/* $Id$
- * 
- * Hibernate, Relational Persistence for Idiomatic Java
- * 
- * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat, Inc.
- * 
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.hibernate.search.query.dsl;
-
-/**
- * Abstract class that can be used to store state and any information that all the various TermQueryBuilder
- * types might need.
- *
- * @author Navin Surtani
- */
-public abstract class AbstractTermQueryBuilder {
-
-   protected TermQueryBuilderDataStore dataStore;
-   
-}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/AllContext.java (from rev 20232, 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/AllContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/AllContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,13 @@
+package org.hibernate.search.query.dsl;
+
+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);
+}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/BooleanContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/BooleanContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/BooleanContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,72 +0,0 @@
-/* $Id$
- * 
- * Hibernate, Relational Persistence for Idiomatic Java
- * 
- * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat, Inc.
- * 
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.hibernate.search.query.dsl;
-
-import org.apache.lucene.search.BooleanClause;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.Query;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Class that allows users to create BooleanQueries.
- *
- * @author Navin Surtani
- */
-
-//TODO do we want a QueryCreator interface with T extends Query and T createQuery() ?
-public class BooleanContext {
-	
-   private BooleanClause.Occur occur;
-   // List has an allocation of 5 temporarily so that it's not created with an arbitrary one.
-   private final List<Query> clauses = new ArrayList<Query>(5);
-
-   public BooleanContext(BooleanClause.Occur occur) {
-      this.occur = occur;
-   }
-
-   public BooleanContext add(Query clause) {
-      clauses.add( clause );
-      return this;
-   }
-
-   public Query createQuery() {
-      BooleanQuery boolQuery = new BooleanQuery();
-      for (Query clause : clauses) {
-         boolQuery.add( clause, occur );
-      }
-      return boolQuery;
-   }
-
-   protected void setOccur(BooleanClause.Occur occur) {
-      this.occur = occur;
-   }
-
-   protected BooleanClause.Occur getOccur() {
-      return occur;
-   }
-
-}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/BooleanJunction.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/BooleanJunction.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/BooleanJunction.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/BooleanJunction.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,21 @@
+package org.hibernate.search.query.dsl;
+
+import org.apache.lucene.search.Query;
+
+/**
+ * Represents a boolean query that can contains one or more elements to join
+ *
+ * @author Emmanuel Bernard
+ */
+public interface BooleanJunction<T extends BooleanJunction> extends QueryCustomization<T>, Termination {
+	/**
+	 * The boolean query results should match the subquery
+	 */
+	BooleanJunction should(Query query);
+
+	/**
+	 * The boolean query results must (or must not) match the subquery
+	 * Call the .not() method to ensure results of the boolean query do NOT match the subquery.
+	 */
+	MustJunction must(Query query);
+}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/BuildableTermQueryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/BuildableTermQueryBuilder.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/BuildableTermQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,73 +0,0 @@
-/* $Id$
- * 
- * Hibernate, Relational Persistence for Idiomatic Java
- * 
- * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat, Inc.
- * 
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.hibernate.search.query.dsl;
-
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.TermQuery;
-
-import java.util.List;
-
-/**
- * Class that will allow the user to actually build his query.
- *
- * @author Navin Surtani
- */
-public class BuildableTermQueryBuilder extends AbstractTermQueryBuilder {
-	
-   public BuildableTermQueryBuilder(TermQueryBuilderDataStore dataStore) {
-      this.dataStore = dataStore;
-   }
-
-   public UnbuildableTermQueryBuilderOnSearch on(String field) {
-      return new UnbuildableTermQueryBuilderOnSearch(dataStore, field);
-   }
-
-   public Query build() {
-      // Start by getting the lists of fields and searches.
-      List<Term> terms = dataStore.getTerms();
-
-      //TODO:- This kind of sucks. How can we do this nicely?
-      // Create a TermQuery for the first term.
-      Query tq = new TermQuery(terms.get(0));
-
-      // Now create an array of TermQueries for me to do the combine later on.
-      // The array size will be 1 less than that of the list.
-      TermQuery[] termQueries = new TermQuery[terms.size() - 1];
-
-      // Loop through the rest of the list.
-      for (int i = 1; i<terms.size(); i++){
-         // The index of each newly created TermQuery in the array will always be 1 less than that of the list
-         // This is because the first term in the list has already been dealt with, so the first termQuery in the array
-         // will correspond to the second term from the list.
-
-         termQueries[i - 1] = new TermQuery(terms.get(i));
-      }
-
-      tq = tq.combine(termQueries);
-      return tq;
-   }
-   
-}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/EntityContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/EntityContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/EntityContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/EntityContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,13 @@
+package org.hibernate.search.query.dsl;
+
+/**
+* @author Emmanuel Bernard
+*/
+public interface EntityContext {
+	EntityContext overridesForField(String field, String analyzerName);
+
+	/**
+	 * return the query builder
+	 */
+	QueryBuilder get();
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/FieldCustomization.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/FieldCustomization.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/FieldCustomization.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/FieldCustomization.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,29 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface FieldCustomization<T> {
+	/**
+	 * Boost the field to a given value
+	 * Most of the time positive float:
+	 *  - lower than 1 to diminish the weight
+	 *  - higher than 1 to increase the weight
+	 *
+	 * Could be negative but not unless you understand what is going on (advanced)
+	 */
+	T boostedTo(float boost);
+
+	/**
+	 * Advanced
+	 * Do not execute the analyzer on the text.
+	 * (It is usually a good idea to apply the analyzer)
+	 */
+	T ignoreAnalyzer();
+
+	/**
+	 * Do not try and find the field bridge nor apply the object / string conversion
+	 * matching objects should be of type String in this case.
+	 */
+	T ignoreFieldBridge();
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/FuzzyContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/FuzzyContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/FuzzyContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/FuzzyContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,26 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface FuzzyContext extends QueryCustomization<FuzzyContext> {
+	/**
+	 * field / property the term query is executed on
+	 */
+	TermMatchingContext onField(String field);
+
+	/**
+	 * Threshold above which two terms are considered similar enough.
+	 * Value between 0 and 1 (1 excluded)
+	 * Defaults to .5
+	 */
+	FuzzyContext withThreshold(float threshold);
+
+	/**
+	 * Size of the prefix ignored by the fuzzyness.
+	 * A non zero value is recommended if the index contains a huge amount of distinct terms
+	 *
+	 * Defaults to 0
+	 */
+	FuzzyContext withPrefixLength(int prefixLength);
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/MustJunction.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/MustJunction.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/MustJunction.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/MustJunction.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,14 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * Represents the context in which a must clause is described.
+ *  
+ * @author Emmanuel Bernard
+ */
+public interface MustJunction extends BooleanJunction<MustJunction> {
+	/**
+	 * Negate the must clause.
+	 * Results of the boolean query do NOT match the subquery.
+	 */
+	BooleanJunction not();
+}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/NegatableBooleanContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/NegatableBooleanContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/NegatableBooleanContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,72 +0,0 @@
-/* $Id$
- * 
- * Hibernate, Relational Persistence for Idiomatic Java
- * 
- * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat, Inc.
- * 
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.hibernate.search.query.dsl;
-
-import org.apache.lucene.search.BooleanClause;
-import org.apache.lucene.search.Query;
-
-/**
- * // TODO: Document this
- *
- * @author Navin Surtani
- */
-public class NegatableBooleanContext {
-	
-   private final BooleanContext delegate;
-
-   public NegatableBooleanContext(BooleanClause.Occur occur) {
-      this.delegate = new BooleanContext( occur );
-   }
-
-   public NegatableBooleanContext not() {
-      BooleanClause.Occur present = delegate.getOccur();
-      if ( present == null ) {
-         //assertion exception
-      }
-      else if (present == BooleanClause.Occur.SHOULD) {
-         //assertion exception
-      }
-      else if ( present == BooleanClause.Occur.MUST) {
-         delegate.setOccur(BooleanClause.Occur.MUST_NOT);
-      }
-      else if (present == BooleanClause.Occur.MUST_NOT) {
-         delegate.setOccur(BooleanClause.Occur.MUST);
-      }
-      else {
-         //assert failure
-      }
-      return this;
-   }
-
-   public NegatableBooleanContext add(Query clause) {
-      delegate.add(clause);
-      return this;
-   }
-
-   public Query createQuery() {
-      return delegate.createQuery();
-   }
-   
-}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/PhraseContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/PhraseContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/PhraseContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,20 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface PhraseContext extends QueryCustomization<PhraseContext> {
+	/**
+	 * Sets the number of other words permitted between words in query phrase.
+	 * If zero, then this is an exact phrase search.  For larger values this works
+	 * like a <code>WITHIN</code> or <code>NEAR</code> operator.
+	 *
+	 * Defaults to 0
+	 */
+	PhraseContext withSlop(int slop);
+
+	/**
+	 * field / property the term query is executed on
+	 */
+	PhraseMatchingContext onField(String fieldName);
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/PhraseMatchingContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseMatchingContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/PhraseMatchingContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/PhraseMatchingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,16 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface PhraseMatchingContext extends FieldCustomization<PhraseMatchingContext> {
+	/**
+	 * field / property the term query is executed on
+	 */
+	PhraseMatchingContext andField(String field);
+
+	/**
+	 * Sentence to match. It will be processed by the analyzer
+	 */
+	PhraseTermination sentence(String sentence);
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/PhraseTermination.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseTermination.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/PhraseTermination.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/PhraseTermination.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,7 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface PhraseTermination extends Termination<PhraseTermination> {
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/QueryBuilder.java (from rev 20232, 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/QueryBuilder.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/QueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,32 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface QueryBuilder {
+	/**
+	 * build a term query
+	 */
+	TermContext keyword();
+
+	/**
+	 * find matching elements within a range
+	 */
+	RangeContext range();
+
+	/**
+	 * find an sentence (words can be inversed according to the slop factor
+	 */
+	PhraseContext phrase();
+
+	/**
+	 * Boolean query
+	 */
+	BooleanJunction<BooleanJunction> bool();
+
+	/**
+	 * Query matching all documents
+	 * Typically mixed with a boolean query.
+	 */
+	AllContext all();
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/QueryContextBuilder.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryContextBuilder.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/QueryContextBuilder.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/QueryContextBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,23 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * Query builder that needs contextualization:
+ * A query builder should know which entity or analyzer it relies on.
+ *
+ * <code>
+ * QueryBuilder builder =
+ * searchFactory.buildQueryBuilder()
+ *   .forEntity(Customer.class)
+ *     .overridesForField("profession", "acronym-analyzer")
+ *     .get();
+ * </code>
+ *
+ * overridesForField is optional (and usually not needed). This method overrides the
+ * underlying analyzer (for a given field) used to build queries.
+ *
+ * @author Emmanuel Bernard
+ */
+public interface QueryContextBuilder {
+	//TODO make a forEntities
+	EntityContext forEntity(Class<?> entityType);
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/QueryCustomization.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryCustomization.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/QueryCustomization.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/QueryCustomization.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,35 @@
+package org.hibernate.search.query.dsl;
+
+import org.apache.lucene.search.Filter;
+import org.apache.lucene.search.Query;
+
+/**
+ * Operations common to all types of queries
+ *
+ * @author Emmanuel Bernard
+ */
+public interface QueryCustomization<T> {
+
+	/**
+	 * Boost the query to a given value
+	 * Most of the time positive float:
+	 *  - lower than 1 to diminish the weight
+	 *  - higher than 1 to increase the weight
+	 *
+	 * Could be negative but not unless you understand what is going on (advanced)
+	 */
+	T boostedTo(float boost);
+
+	/**
+	 * All results matching the query have a constant score equals to the boost
+	 * FIXME is that true?
+	 */
+	T withConstantScore();
+
+	/**
+	 * Filter the query results with the Filter instance
+	 */
+	T filteredBy(Filter filter);
+
+	//TODO filter(String) + parameters
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/RangeContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/RangeContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/RangeContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,11 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface RangeContext extends QueryCustomization<RangeContext> {
+	/**
+	 * field / property the term query is executed on
+	 */
+	RangeMatchingContext onField(String fieldName);
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/RangeMatchingContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeMatchingContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/RangeMatchingContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/RangeMatchingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,34 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface RangeMatchingContext extends FieldCustomization<RangeMatchingContext> {
+	/**
+	 * field / property the term query is executed on
+	 */
+	RangeMatchingContext andField(String field);
+
+	//TODO what about numeric range query, I guess we can detect it automatically based on the field bridge
+	//TODO get info on precisionStepDesc (index time info)
+	//FIXME: Is <T> correct or should we specialize to String and Numeric (or all the numeric types?
+	<T> FromRangeContext<T> from(T from);
+
+	public interface FromRangeContext<T> {
+		RangeTerminationExcludable to(T to);
+		FromRangeContext<T> excludeLimit();
+	}
+
+	/**
+	 * The field value must be below <code>below</code>
+	 * You can exclude the value <code>below</code> by calling <code>.excludeLimit()</code>
+	 */
+	RangeTerminationExcludable below(Object below);
+
+	/**
+	 * The field value must be above <code>above</code>
+	 * You can exclude the value <code>above</code> by calling <code>.excludeLimit()</code>
+	 */
+	RangeTerminationExcludable above(Object above);
+
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/RangeTerminationExcludable.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeTerminationExcludable.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/RangeTerminationExcludable.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/RangeTerminationExcludable.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,8 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface RangeTerminationExcludable extends Termination<RangeTerminationExcludable> {
+	RangeTerminationExcludable excludeLimit();
+}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/SealedQueryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/SealedQueryBuilder.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/SealedQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,54 +0,0 @@
-/* $Id$
- * 
- * Hibernate, Relational Persistence for Idiomatic Java
- * 
- * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat, Inc.
- * 
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.hibernate.search.query.dsl;
-
-import org.apache.lucene.search.BooleanClause;
-
-/**
- * Starting class that will allow users to build their queries using the DSL.
- *
- * //TODO: This needs to be tied into the SearchFactory somehow so that users can actually "access" it.
- *
- * @author Navin Surtani
- */
-public class SealedQueryBuilder {
-
-   public SealedQueryBuilder(){
-
-   }
-
-   public BooleanContext should() {
-      return new BooleanContext(BooleanClause.Occur.SHOULD);
-   }
-
-   public NegatableBooleanContext must(){
-      return new NegatableBooleanContext(BooleanClause.Occur.MUST);
-   }
-
-   public UnbuildableTermQueryBuilderOnField term(){
-      return new UnbuildableTermQueryBuilderOnField();
-   }
-   
-}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,27 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface TermContext extends QueryCustomization<TermContext> {
+	/**
+	 * field / property the term query is executed on
+	 */
+	TermMatchingContext onField(String field);
+
+	TermMatchingContext onFields(String... field);
+
+	/**
+	 * Use a fuzzy search approximation (aka edit distance)
+	 */
+	FuzzyContext fuzzy();
+
+	/**
+	 * Treat the query as a wildcard:
+	 *  - ? represents any single character
+	 *  - * represents any character sequence
+	 * For faster results, it is recommended that the query text does not
+	 * start with ? or *
+	 */
+	WildcardContext wildcard();
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermFuzzy.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermFuzzy.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermFuzzy.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermFuzzy.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,21 @@
+package org.hibernate.search.query.dsl;
+
+/**
+* @author Emmanuel Bernard
+*/
+public interface TermFuzzy extends TermTermination {
+	/**
+	 * Threshold above which two terms are considered similar enough.
+	 * Value between 0 and 1 (1 excluded)
+	 * Defaults to .5
+	 */
+	TermFuzzy withThreshold(float threshold);
+
+	/**
+	 * Size of the prefix ignored by the fuzzyness.
+	 * A non zero value is recommended if the index contains a huge amount of distinct terms
+	 *
+	 * Defaults to 0
+	 */
+	TermFuzzy withPrefixLength(int prefixLength);
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermMatchingContext.java (from rev 20232, 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/TermMatchingContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermMatchingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,19 @@
+package org.hibernate.search.query.dsl;
+
+/**
+* @author Emmanuel Bernard
+*/
+public interface TermMatchingContext extends FieldCustomization<TermMatchingContext> {
+	/**
+	 * Value searched in the field or fields.
+	 * The value is passed to the field's:
+	 *  - field bridge
+	 *  - analyzer (unless ignoreAnalyzer is called).
+	 */
+	TermTermination matching(Object value);
+
+	/**
+	 * field / property the term query is executed on
+	 */
+	TermMatchingContext andField(String field);
+}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermQueryBuilderDataStore.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermQueryBuilderDataStore.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermQueryBuilderDataStore.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,53 +0,0 @@
-/* $Id$
- * 
- * Hibernate, Relational Persistence for Idiomatic Java
- * 
- * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat, Inc.
- * 
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.hibernate.search.query.dsl;
-
-import org.apache.lucene.index.Term;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This class will just store the required terms.
- *
- * @author Navin Surtani
- */
-public class TermQueryBuilderDataStore {
-
-   private List<Term> terms;
-
-   public TermQueryBuilderDataStore(){
-      terms = new ArrayList<Term>();
-   }
-
-   public List<Term> getTerms(){
-      return terms;
-   }
-
-   public void addTerm(Term term){
-      terms.add(term);
-   }
-
-}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermTermination.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermTermination.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermTermination.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/TermTermination.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,7 @@
+package org.hibernate.search.query.dsl;
+
+/**
+* @author Emmanuel Bernard
+*/
+public interface TermTermination extends Termination<TermTermination> {
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/Termination.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/Termination.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/Termination.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/Termination.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,13 @@
+package org.hibernate.search.query.dsl;
+
+import org.apache.lucene.search.Query;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Termination<T> {
+	/**
+	 * Return the lucene query representing the operation
+	 */
+	Query createQuery();
+}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/UnbuildableTermQueryBuilderOnField.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/UnbuildableTermQueryBuilderOnField.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/UnbuildableTermQueryBuilderOnField.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,43 +0,0 @@
-/* $Id$
- * 
- * Hibernate, Relational Persistence for Idiomatic Java
- * 
- * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat, Inc.
- * 
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.hibernate.search.query.dsl;
-
-/**
- * Class that exposes only the on(String field) method as this class will only be returned to a user when
- * SealedQueryBuilder.term() is called.
- *
- * @author Navin Surtani
- */
-public class UnbuildableTermQueryBuilderOnField extends AbstractTermQueryBuilder {
-   
-   public UnbuildableTermQueryBuilderOnField(){
-      dataStore = new TermQueryBuilderDataStore();
-   }
-
-   public UnbuildableTermQueryBuilderOnSearch on(String field){
-      return new UnbuildableTermQueryBuilderOnSearch(dataStore, field);
-   }
-   
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/UnbuildableTermQueryBuilderOnSearch.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/UnbuildableTermQueryBuilderOnSearch.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/UnbuildableTermQueryBuilderOnSearch.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,53 +0,0 @@
-/* $Id$
- * 
- * Hibernate, Relational Persistence for Idiomatic Java
- * 
- * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat, Inc.
- * 
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.hibernate.search.query.dsl;
-
-import org.apache.lucene.index.Term;
-
-/**
- * Class that allows users to continue building their TermQueries.
- * However, a TermQuery cannot be built from an instance of this class, as there is not enough information
- * to do so.
- *
- * @author Navin Surtani
- */
-public class UnbuildableTermQueryBuilderOnSearch extends AbstractTermQueryBuilder {
-
-   private String field;
-
-   public UnbuildableTermQueryBuilderOnSearch(TermQueryBuilderDataStore dataStore, String field) {
-      this.dataStore = dataStore;
-      this.field = field;
-   }
-
-   public BuildableTermQueryBuilder matches(String search) {
-      // Now that I've got enough information to create a term I can do so
-      Term term = new Term(field, search);
-      dataStore.addTerm(term);
-      // return the Buildable type.
-      return new BuildableTermQueryBuilder(dataStore);
-   }
-
-}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/WildcardContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/WildcardContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/WildcardContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/WildcardContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,12 @@
+package org.hibernate.search.query.dsl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface WildcardContext extends QueryCustomization<WildcardContext> {
+	/**
+	 * field / property the term query is executed on
+	 */
+	TermMatchingContext onField(String field);
+
+}
\ No newline at end of file

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/BooleanQueryBuilder.java (from rev 20232, 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/impl/BooleanQueryBuilder.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/BooleanQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,87 @@
+package org.hibernate.search.query.dsl.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.annotations.common.AssertionFailure;
+import org.hibernate.search.query.dsl.BooleanJunction;
+import org.hibernate.search.query.dsl.MustJunction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+class BooleanQueryBuilder implements MustJunction {
+	private final List<BooleanClause> clauses;
+	private final QueryCustomizer queryCustomizer;
+
+	BooleanQueryBuilder() {
+		clauses = new ArrayList<BooleanClause>(5);
+		queryCustomizer = new QueryCustomizer();
+	}
+	
+	public BooleanJunction not() {
+		final int lastIndex = clauses.size() -1;
+		final BooleanClause last = clauses.get(lastIndex);
+		if ( ! last.getOccur().equals( BooleanClause.Occur.MUST ) ) {
+			throw new AssertionFailure( "Cannot negate class: " + last.getOccur() );
+		}
+		clauses.set( lastIndex, new BooleanClause( last.getQuery(), BooleanClause.Occur.MUST_NOT ) );
+		return this;
+	}
+
+	public BooleanJunction should(Query query) {
+		clauses.add( new BooleanClause( query, BooleanClause.Occur.SHOULD ) );
+		return this;
+	}
+
+	public MustJunction must(Query query) {
+		clauses.add( new BooleanClause( query, BooleanClause.Occur.MUST ) );
+		return this;
+	}
+
+	public MustJunction boostedTo(float boost) {
+		queryCustomizer.boostedTo( boost );
+		return this;
+	}
+
+	public MustJunction withConstantScore() {
+		queryCustomizer.withConstantScore();
+		return this;
+	}
+
+	public MustJunction filteredBy(Filter filter) {
+		queryCustomizer.filteredBy(filter);
+		return this;
+	}
+
+	public Query createQuery() {
+		final int nbrOfClauses = clauses.size();
+		if ( nbrOfClauses == 0) {
+			throw new AssertionFailure( "Cannot create an empty boolean query" );
+		}
+		else if ( nbrOfClauses == 1 ) {
+			final BooleanClause uniqueClause = clauses.get( 0 );
+			if ( uniqueClause.getOccur().equals( BooleanClause.Occur.MUST_NOT ) ) {
+				//FIXME We have two choices here, raise an exception or combine with an All query. #2 is done atm.
+				//TODO which normfield to use and how to pass it?
+				should( new MatchAllDocsQuery() );
+			}
+			else {
+				//optimize
+				return queryCustomizer.setWrappedQuery( uniqueClause.getQuery() ).createQuery();
+			}
+		}
+
+		BooleanQuery query = new BooleanQuery( );
+		for (BooleanClause clause : clauses) {
+			query.add( clause );
+		}
+		return queryCustomizer.setWrappedQuery( query ).createQuery();
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedAllContext.java (from rev 20232, 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/impl/ConnectedAllContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedAllContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,63 @@
+package org.hibernate.search.query.dsl.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.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 withConstantScore() {
+		queryCustomizer.withConstantScore();
+		return this;
+	}
+
+	public AllContext filteredBy(Filter filter) {
+		queryCustomizer.filteredBy( filter );
+		return this;
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedFuzzyContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedFuzzyContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedFuzzyContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedFuzzyContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,51 @@
+package org.hibernate.search.query.dsl.impl;
+
+import org.apache.lucene.search.Filter;
+
+import org.hibernate.search.query.dsl.FuzzyContext;
+import org.hibernate.search.query.dsl.TermMatchingContext;
+
+/**
+ * @author Emmanuel Bernard
+ */
+class ConnectedFuzzyContext implements FuzzyContext {
+	private final QueryBuildingContext queryContext;
+	private final QueryCustomizer queryCustomizer;
+	private final TermQueryContext termContext;
+
+	public ConnectedFuzzyContext(QueryCustomizer queryCustomizer, QueryBuildingContext queryContext) {
+		this.queryCustomizer = queryCustomizer;
+		this.termContext = new TermQueryContext( TermQueryContext.Approximation.FUZZY);
+		this.queryContext = queryContext;
+	}
+
+	public TermMatchingContext onField(String field) {
+		return new ConnectedTermMatchingContext(termContext, field, queryCustomizer, queryContext);
+	}
+
+	public ConnectedFuzzyContext withThreshold(float threshold) {
+		termContext.setThreshold( threshold );
+		return this;
+	}
+
+	public ConnectedFuzzyContext withPrefixLength(int prefixLength) {
+		termContext.setPrefixLength( prefixLength );
+		return this;
+	}
+
+	public FuzzyContext boostedTo(float boost) {
+		queryCustomizer.boostedTo( boost );
+		return this;
+	}
+
+	public FuzzyContext withConstantScore() {
+		queryCustomizer.withConstantScore();
+		return this;
+	}
+
+	public FuzzyContext filteredBy(Filter filter) {
+		queryCustomizer.filteredBy(filter);
+		return this;
+	}
+
+}
\ No newline at end of file

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsPhraseQueryBuilder.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsPhraseQueryBuilder.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsPhraseQueryBuilder.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsPhraseQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,159 @@
+package org.hibernate.search.query.dsl.impl;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.lucene.analysis.TokenStream;
+import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
+import org.apache.lucene.analysis.tokenattributes.TermAttribute;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.MultiPhraseQuery;
+import org.apache.lucene.search.PhraseQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TermQuery;
+
+import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.search.SearchException;
+import org.hibernate.search.query.dsl.PhraseTermination;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ConnectedMultiFieldsPhraseQueryBuilder implements PhraseTermination {
+	private final PhraseQueryContext phraseContext;
+	private final QueryBuildingContext queryContext;
+	private final QueryCustomizer queryCustomizer;
+	private final List<FieldContext> fieldContexts;
+
+	public ConnectedMultiFieldsPhraseQueryBuilder(PhraseQueryContext phraseContext, QueryCustomizer queryCustomizer,
+												  List<FieldContext> fieldContexts, QueryBuildingContext queryContext) {
+		this.phraseContext = phraseContext;
+		this.queryContext = queryContext;
+		this.queryCustomizer = queryCustomizer;
+		this.fieldContexts = fieldContexts;
+	}
+
+	public Query createQuery() {
+		final int size = fieldContexts.size();
+		if ( size == 1 ) {
+			return queryCustomizer.setWrappedQuery( createQuery( fieldContexts.get( 0 ) ) ).createQuery();
+		}
+		else {
+			BooleanQuery aggregatedFieldsQuery = new BooleanQuery( );
+			for ( FieldContext fieldContext : fieldContexts ) {
+				aggregatedFieldsQuery.add( createQuery( fieldContext ), BooleanClause.Occur.SHOULD );
+			}
+			return  queryCustomizer.setWrappedQuery( aggregatedFieldsQuery ).createQuery();
+		}
+	}
+
+	public Query createQuery(FieldContext fieldContext) {
+		final Query perFieldQuery;
+		final String fieldName = fieldContext.getField();
+
+		/*
+		 * Store terms per position and detect if for a given position more than one term is present
+		 */
+		TokenStream stream = null;
+		boolean isMultiPhrase = false;
+		Map<Integer, List<Term>> termsPerPosition = new HashMap<Integer, List<Term>>();
+		final String sentence = phraseContext.getSentence();
+		try {
+			Reader reader = new StringReader( sentence );
+			stream = queryContext.getQueryAnalyzer().reusableTokenStream( fieldName, reader);
+
+			TermAttribute termAttribute = (TermAttribute) stream.addAttribute( TermAttribute.class );
+			PositionIncrementAttribute positionAttribute = (PositionIncrementAttribute) stream.addAttribute( PositionIncrementAttribute.class );
+
+			stream.reset();
+			int position = -1; //start at -1 since we apply at least one increment
+			List<Term> termsAtSamePosition = null;
+			while ( stream.incrementToken() ) {
+				int positionIncrement = 1;
+				if ( positionAttribute != null ) {
+					positionIncrement = positionAttribute.getPositionIncrement();
+				}
+
+				if ( positionIncrement > 0 ) {
+					position+=positionIncrement;
+					termsAtSamePosition = termsPerPosition.get(position);
+				}
+
+				if (termsAtSamePosition == null) {
+					termsAtSamePosition = new ArrayList<Term>();
+					termsPerPosition.put( position, termsAtSamePosition  );
+				}
+
+				termsAtSamePosition.add( new Term( fieldName, termAttribute.term() ) );
+				if ( termsAtSamePosition.size() > 1 ) {
+					isMultiPhrase = true;
+				}
+			}
+		}
+		catch ( IOException e ) {
+			throw new AssertionFailure( "IOException while reading a string. Doh!", e);
+		}
+		finally {
+			if ( stream != null ) {
+				try {
+					stream.end();
+					stream.close();
+				}
+				catch ( IOException e ) {
+					throw new AssertionFailure( "IOException while reading a string. Doh!", e);
+				}
+			}
+		}
+
+		/*
+		 * Create the appropriate query depending on the conditions
+		 * note that a MultiPhraseQuery is needed if several terms share the same position
+		 * as it will do a OR and not a AND like PhraseQuery
+		 */
+		final int size = termsPerPosition.size();
+		if ( size == 0 ) {
+			throw new SearchException( "phrase query returns no term. Is there a problem with your analyzers? " + sentence);
+		}
+		if ( size == 1 ) {
+			final List<Term> terms = termsPerPosition.values().iterator().next();
+			if ( terms.size() == 1 ) {
+				perFieldQuery = new TermQuery( terms.get( 0 ) );
+			}
+			else {
+				BooleanQuery query = new BooleanQuery( );
+				for ( Term term : terms ) {
+					query.add( new TermQuery(term), BooleanClause.Occur.SHOULD );
+				}
+				perFieldQuery = query;
+			}
+		}
+		else {
+			if (isMultiPhrase) {
+				MultiPhraseQuery query = new MultiPhraseQuery();
+				query.setSlop( phraseContext.getSlop() );
+				for ( Map.Entry<Integer,List<Term>> entry : termsPerPosition.entrySet() ) {
+					final List<Term> value = entry.getValue();
+					query.add( value.toArray( new Term[value.size()] ), entry.getKey() );
+				}
+				perFieldQuery = query;
+			}
+			else {
+				PhraseQuery query = new PhraseQuery();
+				query.setSlop(  phraseContext.getSlop() );
+				for ( Map.Entry<Integer,List<Term>> entry : termsPerPosition.entrySet() ) {
+					final List<Term> value = entry.getValue();
+					query.add( value.get(0), entry.getKey() );
+				}
+				perFieldQuery = query;
+			}
+		}
+		return fieldContext.getFieldCustomizer().setWrappedQuery( perFieldQuery ).createQuery();
+	}
+}
\ No newline at end of file

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsRangeQueryBuilder.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsRangeQueryBuilder.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsRangeQueryBuilder.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsRangeQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,97 @@
+package org.hibernate.search.query.dsl.impl;
+
+import java.util.List;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TermRangeQuery;
+
+import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
+import org.hibernate.search.query.dsl.RangeTerminationExcludable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ConnectedMultiFieldsRangeQueryBuilder implements RangeTerminationExcludable {
+	private final RangeQueryContext rangeContext;
+	private final QueryCustomizer queryCustomizer;
+	private final List<FieldContext> fieldContexts;
+	private final QueryBuildingContext queryContext;
+
+	public ConnectedMultiFieldsRangeQueryBuilder(RangeQueryContext rangeContext,
+												 QueryCustomizer queryCustomizer, List<FieldContext> fieldContexts,
+												 QueryBuildingContext queryContext) {
+		this.rangeContext = rangeContext;
+		this.queryCustomizer = queryCustomizer;
+		this.fieldContexts = fieldContexts;
+		this.queryContext = queryContext;
+	}
+
+	public RangeTerminationExcludable excludeLimit() {
+		if ( rangeContext.getFrom() != null && rangeContext.getTo() != null ) {
+			rangeContext.setExcludeTo( true );
+		}
+		else if ( rangeContext.getFrom() != null ) {
+			rangeContext.setExcludeTo( true );
+		}
+		else if ( rangeContext.getTo() != null ) {
+			rangeContext.setExcludeTo( true );
+		}
+		else {
+			throw new AssertionFailure( "Both from and to clause of a range query are null" );
+		}
+		return this;
+	}
+
+	public Query createQuery() {
+		final int size = fieldContexts.size();
+		if ( size == 1 ) {
+			return queryCustomizer.setWrappedQuery( createQuery( fieldContexts.get( 0 ) ) ).createQuery();
+		}
+		else {
+			BooleanQuery aggregatedFieldsQuery = new BooleanQuery( );
+			for ( FieldContext fieldContext : fieldContexts ) {
+				aggregatedFieldsQuery.add( createQuery( fieldContext ), BooleanClause.Occur.SHOULD );
+			}
+			return  queryCustomizer.setWrappedQuery( aggregatedFieldsQuery ).createQuery();
+		}
+	}
+
+	public Query createQuery(FieldContext fieldContext) {
+		final Query perFieldQuery;
+		final String fieldName = fieldContext.getField();
+		final Analyzer queryAnalyzer = queryContext.getQueryAnalyzer();
+
+		final DocumentBuilderIndexedEntity<?> documentBuilder = Helper.getDocumentBuilder( queryContext );
+
+		final Object fromObject = rangeContext.getFrom();
+		final String fromString  = fieldContext.isIgnoreFieldBridge() ?
+				fromObject == null ? null : fromObject.toString() :
+				documentBuilder.objectToString( fieldName, fromObject );
+		final String lowerTerm = fromString == null ?
+				null :
+				Helper.getAnalyzedTerm( fieldName, fromString, "from", queryAnalyzer, fieldContext );
+
+		final Object toObject = rangeContext.getTo();
+		final String toString  = fieldContext.isIgnoreFieldBridge() ?
+				toObject == null ? null : toObject.toString() :
+				documentBuilder.objectToString( fieldName, toObject );
+		final String upperTerm = toString == null ?
+				null :
+				Helper.getAnalyzedTerm( fieldName, toString, "to", queryAnalyzer, fieldContext );
+		
+		perFieldQuery = new TermRangeQuery(
+				fieldName,
+				lowerTerm,
+				upperTerm,
+				!rangeContext.isExcludeFrom(),
+				!rangeContext.isExcludeTo()
+		);
+		return fieldContext.getFieldCustomizer().setWrappedQuery( perFieldQuery ).createQuery();
+	}
+
+
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsTermQueryBuilder.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsTermQueryBuilder.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsTermQueryBuilder.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsTermQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,126 @@
+package org.hibernate.search.query.dsl.impl;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.FuzzyQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.WildcardQuery;
+
+import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.search.SearchException;
+import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
+import org.hibernate.search.query.dsl.TermTermination;
+
+/**
+* @author Emmanuel Bernard
+*/
+public class ConnectedMultiFieldsTermQueryBuilder implements TermTermination {
+	private final Object value;
+	private final QueryCustomizer queryCustomizer;
+	private final TermQueryContext termContext;
+	private final List<FieldContext> fieldContexts;
+	private final QueryBuildingContext queryContext;
+
+	public ConnectedMultiFieldsTermQueryBuilder(TermQueryContext termContext,
+												Object value,
+												List<FieldContext> fieldContexts,
+												QueryCustomizer queryCustomizer,
+												QueryBuildingContext queryContext) {
+		this.termContext = termContext;
+		this.value = value;
+		this.queryContext = queryContext;
+		this.queryCustomizer = queryCustomizer;
+		this.fieldContexts = fieldContexts;
+	}
+
+	public Query createQuery() {
+		final int size = fieldContexts.size();
+		if ( size == 1 ) {
+			return queryCustomizer.setWrappedQuery( createQuery( fieldContexts.get( 0 ) ) ).createQuery();
+		}
+		else {
+			BooleanQuery aggregatedFieldsQuery = new BooleanQuery( );
+			for ( FieldContext fieldContext : fieldContexts ) {
+				aggregatedFieldsQuery.add( createQuery( fieldContext ), BooleanClause.Occur.SHOULD );
+			}
+			return  queryCustomizer.setWrappedQuery( aggregatedFieldsQuery ).createQuery();
+		}
+	}
+
+	public Query createQuery(FieldContext fieldContext) {
+		final Query perFieldQuery;
+		final DocumentBuilderIndexedEntity<?> documentBuilder = Helper.getDocumentBuilder( queryContext );
+		String text = fieldContext.isIgnoreFieldBridge() ? 
+					value.toString() :
+					documentBuilder.objectToString( fieldContext.getField(), value );
+		if ( fieldContext.isIgnoreAnalyzer() ) {
+			perFieldQuery = createTermQuery( fieldContext, text );
+		}
+		else {
+			List<String> terms;
+			try {
+				terms = getAllTermsFromText( fieldContext.getField(), text, queryContext.getQueryAnalyzer() );
+			}
+			catch ( IOException e ) {
+				throw new AssertionFailure("IO exception while reading String stream??", e);
+			}
+			if ( terms.size() == 0 ) {
+				throw new SearchException( "try to search with an empty string: " + fieldContext.getField() );
+			}
+			else if (terms.size() == 1 ) {
+				perFieldQuery = createTermQuery( fieldContext, terms.get( 0 ) );
+			}
+			else {
+				BooleanQuery booleanQuery = new BooleanQuery();
+				for (String localTerm : terms) {
+					Query termQuery = createTermQuery(fieldContext, localTerm);
+					booleanQuery.add( termQuery, BooleanClause.Occur.SHOULD );
+				}
+				perFieldQuery = booleanQuery;
+			}
+		}
+		return fieldContext.getFieldCustomizer().setWrappedQuery( perFieldQuery ).createQuery();
+	}
+
+	private Query createTermQuery(FieldContext fieldContext, String term) {
+		Query query;
+		final String fieldName = fieldContext.getField();
+		switch ( termContext.getApproximation() ) {
+			case EXACT:
+				query = new TermQuery( new Term( fieldName, term ) );
+				break;
+			case WILDCARD:
+				query = new WildcardQuery( new Term( fieldName, term ) );
+				break;
+			case FUZZY:
+				query = new FuzzyQuery(
+						new Term( fieldName, term ),
+						termContext.getThreshold(),
+						termContext.getPrefixLength() );
+				break;
+			default:
+				throw new AssertionFailure( "Unknown approximation: " + termContext.getApproximation() );
+		}
+		return query;
+	}
+
+	private List<String> getAllTermsFromText(String fieldName, String localText, Analyzer analyzer) throws IOException {
+		//it's better not to apply the analyzer with wildcard as * and ? can be mistakenly removed
+		List<String> terms = new ArrayList<String>();
+		if ( termContext.getApproximation() == TermQueryContext.Approximation.WILDCARD ) {
+			terms.add( localText );
+		}
+		else {
+			terms = Helper.getAllTermsFromText( fieldName, localText, analyzer );
+		}
+		return terms;
+	}
+
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedPhraseContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedPhraseContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedPhraseContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedPhraseContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,46 @@
+package org.hibernate.search.query.dsl.impl;
+
+import org.apache.lucene.search.Filter;
+
+import org.hibernate.search.query.dsl.PhraseContext;
+import org.hibernate.search.query.dsl.PhraseMatchingContext;
+
+/**
+ * @author Emmanuel Bernard
+ */
+class ConnectedPhraseContext implements PhraseContext {
+	private final QueryBuildingContext queryContext;
+	private final QueryCustomizer queryCustomizer;
+	private final PhraseQueryContext phraseContext;
+
+
+	public ConnectedPhraseContext(QueryBuildingContext queryContext) {
+		this.queryCustomizer = new QueryCustomizer();
+		this.phraseContext = new PhraseQueryContext();
+		this.queryContext = queryContext;
+	}
+
+	public PhraseContext withSlop(int slop) {
+		phraseContext.setSlop( slop );
+		return this;
+	}
+
+	public PhraseMatchingContext onField(String fieldName) {
+		return new ConnectedPhraseMatchingContext(fieldName, phraseContext, queryCustomizer, queryContext);
+	}
+
+	public PhraseContext boostedTo(float boost) {
+		queryCustomizer.boostedTo( boost );
+		return this;
+	}
+
+	public PhraseContext withConstantScore() {
+		queryCustomizer.withConstantScore();
+		return this;
+	}
+
+	public PhraseContext filteredBy(Filter filter) {
+		queryCustomizer.filteredBy(filter);
+		return this;
+	}
+}
\ No newline at end of file

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedPhraseMatchingContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedPhraseMatchingContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedPhraseMatchingContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedPhraseMatchingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,65 @@
+package org.hibernate.search.query.dsl.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.search.query.dsl.PhraseMatchingContext;
+import org.hibernate.search.query.dsl.PhraseTermination;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ConnectedPhraseMatchingContext implements PhraseMatchingContext {
+	private final QueryBuildingContext queryContext;
+	private final QueryCustomizer queryCustomizer;
+	private final PhraseQueryContext phraseContext;
+	private final List<FieldContext> fieldContexts;
+	//when a varargs of fields are passed, apply the same customization for all.
+	//keep the index of the first context in this queue
+	private int firstOfContext = 0;
+
+	public ConnectedPhraseMatchingContext(String fieldName,
+											PhraseQueryContext phraseContext,
+											QueryCustomizer queryCustomizer,
+											QueryBuildingContext queryContext) {
+		this.queryContext = queryContext;
+		this.queryCustomizer = queryCustomizer;
+		this.phraseContext = phraseContext;
+		this.fieldContexts = new ArrayList<FieldContext>(4);
+		this.fieldContexts.add( new FieldContext( fieldName ) );
+	}
+
+	public PhraseMatchingContext andField(String field) {
+		this.fieldContexts.add( new FieldContext( field ) );
+		this.firstOfContext = fieldContexts.size() - 1;
+		return this;
+	}
+
+	public PhraseTermination sentence(String sentence) {
+		phraseContext.setSentence(sentence);
+		return new ConnectedMultiFieldsPhraseQueryBuilder( phraseContext, queryCustomizer, fieldContexts, queryContext );
+	}
+
+	public PhraseMatchingContext boostedTo(float boost) {
+		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
+			fieldContext.getFieldCustomizer().boostedTo( boost );
+		}
+		return this;
+	}
+
+	private List<FieldContext> getCurrentFieldContexts() {
+		return fieldContexts.subList( firstOfContext, fieldContexts.size() );
+	}
+
+	public PhraseMatchingContext ignoreAnalyzer() {
+		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
+			fieldContext.setIgnoreAnalyzer( true );
+		}
+		return this;
+	}
+
+	public PhraseMatchingContext ignoreFieldBridge() {
+		//this is a no-op
+		return this;
+	}
+}
\ No newline at end of file

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedQueryBuilder.java (from rev 20232, 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/impl/ConnectedQueryBuilder.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,42 @@
+package org.hibernate.search.query.dsl.impl;
+
+import org.hibernate.search.query.dsl.AllContext;
+import org.hibernate.search.query.dsl.PhraseContext;
+import org.hibernate.search.query.dsl.QueryBuilder;
+import org.hibernate.search.query.dsl.BooleanJunction;
+import org.hibernate.search.query.dsl.RangeContext;
+import org.hibernate.search.query.dsl.TermContext;
+
+/**
+ * Assuming connection with the search factory
+ * 
+ * @author Emmanuel Bernard
+ */
+public class ConnectedQueryBuilder implements QueryBuilder {
+	private final QueryBuildingContext context;
+
+	public ConnectedQueryBuilder(QueryBuildingContext context) {
+		this.context = context;
+	}
+
+	public TermContext keyword() {
+		return new ConnectedTermContext(context);
+	}
+
+	public RangeContext range() {
+		return new ConnectedRangeContext(context);
+	}
+
+	public PhraseContext phrase() {
+		return new ConnectedPhraseContext(context);
+	}
+
+	//fixme Have to use raw types but would be nice to not have to
+	public BooleanJunction bool() {
+		return new BooleanQueryBuilder();
+	}
+
+	public AllContext all() {
+		return new ConnectedAllContext();
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedQueryContextBuilder.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedQueryContextBuilder.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedQueryContextBuilder.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedQueryContextBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,44 @@
+package org.hibernate.search.query.dsl.impl;
+
+import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.query.dsl.EntityContext;
+import org.hibernate.search.query.dsl.QueryBuilder;
+import org.hibernate.search.query.dsl.QueryContextBuilder;
+import org.hibernate.search.util.ScopedAnalyzer;
+
+/**
+ * Assuming connection with the search factory
+ *
+ * @author Emmanuel Bernard
+ */
+public class ConnectedQueryContextBuilder implements QueryContextBuilder {
+	private final SearchFactoryImplementor factory;
+
+	public ConnectedQueryContextBuilder(SearchFactoryImplementor factory) {
+		this.factory = factory;
+	}
+
+	public EntityContext forEntity(Class<?> entityType) {
+		return new HSearchEntityContext(entityType, factory );
+	}
+
+	public final class HSearchEntityContext implements EntityContext {
+		private final ScopedAnalyzer queryAnalyzer;
+		private final QueryBuildingContext context;
+
+		public HSearchEntityContext(Class<?> entityType, SearchFactoryImplementor factory) {
+			queryAnalyzer = new ScopedAnalyzer();
+			queryAnalyzer.setGlobalAnalyzer( factory.getAnalyzer( entityType ) );
+			context = new QueryBuildingContext( factory, queryAnalyzer, entityType);
+		}
+
+		public EntityContext overridesForField(String field, String analyzerName) {
+			queryAnalyzer.addScopedAnalyzer( field, factory.getAnalyzer( analyzerName ) );
+			return this;
+		}
+
+		public QueryBuilder get() {
+			return new ConnectedQueryBuilder(context);
+		}
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedRangeContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedRangeContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedRangeContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedRangeContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,38 @@
+package org.hibernate.search.query.dsl.impl;
+
+import org.apache.lucene.search.Filter;
+
+import org.hibernate.search.query.dsl.RangeContext;
+import org.hibernate.search.query.dsl.RangeMatchingContext;
+
+/**
+ * @author Emmanuel Bernard
+ */
+class ConnectedRangeContext implements RangeContext {
+	private final QueryBuildingContext queryContext;
+	private final QueryCustomizer queryCustomizer;
+
+	public ConnectedRangeContext(QueryBuildingContext queryContext) {
+		this.queryContext = queryContext;
+		this.queryCustomizer = new QueryCustomizer();
+	}
+
+	public RangeMatchingContext onField(String fieldName) {
+		return new ConnectedRangeMatchingContext(fieldName, queryCustomizer, queryContext);
+	}
+
+	public RangeContext boostedTo(float boost) {
+		queryCustomizer.boostedTo( boost );
+		return this;
+	}
+
+	public RangeContext withConstantScore() {
+		queryCustomizer.withConstantScore();
+		return this;
+	}
+
+	public RangeContext filteredBy(Filter filter) {
+		queryCustomizer.filteredBy(filter);
+		return this;
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedRangeMatchingContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedRangeMatchingContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedRangeMatchingContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedRangeMatchingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,98 @@
+package org.hibernate.search.query.dsl.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.search.query.dsl.RangeMatchingContext;
+import org.hibernate.search.query.dsl.RangeTerminationExcludable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ConnectedRangeMatchingContext implements RangeMatchingContext {
+	private final QueryBuildingContext queryContext;
+	private final QueryCustomizer queryCustomizer;
+	private final RangeQueryContext rangeContext;
+	private final List<FieldContext> fieldContexts;
+	//when a varargs of fields are passed, apply the same customization for all.
+	//keep the index of the first context in this queue
+	private int firstOfContext = 0;
+
+	public ConnectedRangeMatchingContext(String fieldName,
+										 QueryCustomizer queryCustomizer,
+										 QueryBuildingContext queryContext) {
+		this.queryContext = queryContext;
+		this.queryCustomizer = queryCustomizer;
+		this.rangeContext = new RangeQueryContext();
+		this.fieldContexts = new ArrayList<FieldContext>(4);
+		this.fieldContexts.add( new FieldContext( fieldName ) );
+	}
+
+	public RangeMatchingContext andField(String field) {
+		this.fieldContexts.add( new FieldContext( field ) );
+		this.firstOfContext = fieldContexts.size() - 1;
+		return this;
+	}
+
+	public <T> FromRangeContext<T> from(T from) {
+		rangeContext.setFrom( from );
+		return new ConnectedFromRangeContext<T>(this);
+	}
+
+	static class ConnectedFromRangeContext<T> implements FromRangeContext<T> {
+		private ConnectedRangeMatchingContext mother;
+
+		ConnectedFromRangeContext(ConnectedRangeMatchingContext mother) {
+			this.mother = mother;
+		}
+
+		public RangeTerminationExcludable to(T to) {
+			mother.rangeContext.setTo(to);
+			return new ConnectedMultiFieldsRangeQueryBuilder(
+					mother.rangeContext,
+					mother.queryCustomizer,
+					mother.fieldContexts,
+					mother.queryContext);
+		}
+
+		public FromRangeContext<T> excludeLimit() {
+			mother.rangeContext.setExcludeFrom( true );
+			return this;
+		}
+	}
+
+	public RangeTerminationExcludable below(Object below) {
+		rangeContext.setTo( below );
+		return new ConnectedMultiFieldsRangeQueryBuilder( rangeContext, queryCustomizer, fieldContexts, queryContext);
+	}
+
+	public RangeTerminationExcludable above(Object above) {
+		rangeContext.setFrom( above );
+		return new ConnectedMultiFieldsRangeQueryBuilder( rangeContext, queryCustomizer, fieldContexts, queryContext);
+	}
+
+	public RangeMatchingContext boostedTo(float boost) {
+		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
+			fieldContext.getFieldCustomizer().boostedTo( boost );
+		}
+		return this;
+	}
+
+	private List<FieldContext> getCurrentFieldContexts() {
+		return fieldContexts.subList( firstOfContext, fieldContexts.size() );
+	}
+
+	public RangeMatchingContext ignoreAnalyzer() {
+		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
+			fieldContext.setIgnoreAnalyzer( true );
+		}
+		return this;
+	}
+
+	public RangeMatchingContext ignoreFieldBridge() {
+		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
+			fieldContext.setIgnoreFieldBridge( true );
+		}
+		return this;
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedTermContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedTermContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedTermContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedTermContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,54 @@
+package org.hibernate.search.query.dsl.impl;
+
+import org.apache.lucene.search.Filter;
+
+import org.hibernate.search.query.dsl.FuzzyContext;
+import org.hibernate.search.query.dsl.TermMatchingContext;
+import org.hibernate.search.query.dsl.TermContext;
+import org.hibernate.search.query.dsl.WildcardContext;
+
+/**
+ * @author Emmanuel Bernard
+ */
+class ConnectedTermContext implements TermContext {
+	private final QueryBuildingContext queryContext;
+	private final QueryCustomizer queryCustomizer;
+	private final TermQueryContext termContext;
+
+	public ConnectedTermContext(QueryBuildingContext queryContext) {
+		this.queryContext = queryContext;
+		this.queryCustomizer = new QueryCustomizer();
+		this.termContext = new TermQueryContext( TermQueryContext.Approximation.EXACT);
+	}
+
+	public TermMatchingContext onField(String field) {
+		return new ConnectedTermMatchingContext( termContext, field, queryCustomizer, queryContext);
+	}
+
+	public TermMatchingContext onFields(String... fields) {
+		return new ConnectedTermMatchingContext( termContext, fields, queryCustomizer, queryContext);
+	}
+
+	public FuzzyContext fuzzy() {
+		return new ConnectedFuzzyContext( queryCustomizer, queryContext );
+	}
+
+	public WildcardContext wildcard() {
+		return new ConnectedWildcardContext(queryCustomizer, queryContext);
+	}
+
+	public ConnectedTermContext boostedTo(float boost) {
+		queryCustomizer.boostedTo( boost );
+		return this;
+	}
+
+	public ConnectedTermContext withConstantScore() {
+		queryCustomizer.withConstantScore();
+		return this;
+	}
+
+	public ConnectedTermContext filteredBy(Filter filter) {
+		queryCustomizer.filteredBy(filter);
+		return this;
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedTermMatchingContext.java (from rev 20232, 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/impl/ConnectedTermMatchingContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedTermMatchingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,75 @@
+package org.hibernate.search.query.dsl.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.search.query.dsl.TermTermination;
+import org.hibernate.search.query.dsl.TermMatchingContext;
+
+/**
+* @author Emmanuel Bernard
+*/
+public class ConnectedTermMatchingContext implements TermMatchingContext {
+	private final QueryBuildingContext queryContext;
+	private final QueryCustomizer queryCustomizer;
+	private final TermQueryContext termContext;
+	private final List<FieldContext> fieldContexts;
+	//when a varargs of fields are passed, apply the same customization for all.
+	//keep the index of the first context in this queue
+	private int firstOfContext = 0;
+
+	public ConnectedTermMatchingContext(TermQueryContext termContext,
+			String field, QueryCustomizer queryCustomizer, QueryBuildingContext queryContext) {
+		this.queryContext = queryContext;
+		this.queryCustomizer = queryCustomizer;
+		this.termContext = termContext;
+		this.fieldContexts = new ArrayList<FieldContext>(4);
+		this.fieldContexts.add( new FieldContext( field ) );
+	}
+
+	public ConnectedTermMatchingContext(TermQueryContext termContext,
+			String[] fields, QueryCustomizer queryCustomizer, QueryBuildingContext queryContext) {
+		this.queryContext = queryContext;
+		this.queryCustomizer = queryCustomizer;
+		this.termContext = termContext;
+		this.fieldContexts = new ArrayList<FieldContext>(fields.length);
+		for (String field : fields) {
+			this.fieldContexts.add( new FieldContext( field ) );
+		}
+	}
+
+	public TermTermination matching(Object value) {
+		return new ConnectedMultiFieldsTermQueryBuilder( termContext, value, fieldContexts, queryCustomizer, queryContext);
+	}
+
+	public TermMatchingContext andField(String field) {
+		this.fieldContexts.add( new FieldContext( field ) );
+		this.firstOfContext = fieldContexts.size() - 1;
+		return this;
+	}
+
+	public TermMatchingContext boostedTo(float boost) {
+		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
+			fieldContext.getFieldCustomizer().boostedTo( boost );
+		}
+		return this;
+	}
+
+	private List<FieldContext> getCurrentFieldContexts() {
+		return fieldContexts.subList( firstOfContext, fieldContexts.size() );
+	}
+
+	public TermMatchingContext ignoreAnalyzer() {
+		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
+			fieldContext.setIgnoreAnalyzer( true );
+		}
+		return this;
+	}
+
+	public TermMatchingContext ignoreFieldBridge() {
+		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
+			fieldContext.setIgnoreFieldBridge( true );
+		}
+		return this;
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedWildcardContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedWildcardContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedWildcardContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedWildcardContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,40 @@
+package org.hibernate.search.query.dsl.impl;
+
+import org.apache.lucene.search.Filter;
+
+import org.hibernate.search.query.dsl.TermMatchingContext;
+import org.hibernate.search.query.dsl.WildcardContext;
+
+/**
+ * @author Emmanuel Bernard
+ */
+class ConnectedWildcardContext implements WildcardContext {
+	private final QueryBuildingContext queryContext;
+	private final QueryCustomizer queryCustomizer;
+	private final TermQueryContext termContext;
+
+	public ConnectedWildcardContext(QueryCustomizer queryCustomizer, QueryBuildingContext queryContext) {
+		this.queryContext = queryContext;
+		this.queryCustomizer = queryCustomizer;
+		this.termContext = new TermQueryContext(TermQueryContext.Approximation.WILDCARD);
+	}
+
+	public TermMatchingContext onField(String field) {
+		return new ConnectedTermMatchingContext( termContext, field, queryCustomizer, queryContext);
+	}
+
+	public WildcardContext boostedTo(float boost) {
+		queryCustomizer.boostedTo( boost );
+		return this;
+	}
+
+	public WildcardContext withConstantScore() {
+		queryCustomizer.withConstantScore();
+		return this;
+	}
+
+	public WildcardContext filteredBy(Filter filter) {
+		queryCustomizer.filteredBy(filter);
+		return this;
+	}
+}
\ No newline at end of file

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/FieldContext.java (from rev 20232, 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/impl/FieldContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/FieldContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,40 @@
+package org.hibernate.search.query.dsl.impl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FieldContext {
+	private final String field;
+	private boolean ignoreAnalyzer;
+	private final QueryCustomizer fieldCustomizer;
+	private boolean ignoreFieldBridge;
+
+	public FieldContext(String field) {
+		this.field = field;
+		this.fieldCustomizer = new QueryCustomizer();
+	}
+
+	public String getField() {
+		return field;
+	}
+
+	public boolean isIgnoreAnalyzer() {
+		return ignoreAnalyzer;
+	}
+
+	public void setIgnoreAnalyzer(boolean ignoreAnalyzer) {
+		this.ignoreAnalyzer = ignoreAnalyzer;
+	}
+
+	public QueryCustomizer getFieldCustomizer() {
+		return fieldCustomizer;
+	}
+
+	public boolean isIgnoreFieldBridge() {
+		return ignoreFieldBridge;
+	}
+
+	public void setIgnoreFieldBridge(boolean ignoreFieldBridge) {
+		this.ignoreFieldBridge = ignoreFieldBridge;
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/Helper.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/Helper.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/Helper.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/Helper.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,77 @@
+package org.hibernate.search.query.dsl.impl;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.TokenStream;
+import org.apache.lucene.analysis.tokenattributes.TermAttribute;
+
+import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.search.SearchException;
+import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
+import org.hibernate.search.engine.SearchFactoryImplementor;
+
+/**
+ * @author Emmanuel Bernard
+ */
+class Helper {
+	/**
+	 * return the analyzed value for a given field. If several terms are created, an exception is raised.
+	 */
+	static String getAnalyzedTerm(String fieldName, String value, String name, Analyzer queryAnalyzer, FieldContext fieldContext) {
+		if ( fieldContext.isIgnoreAnalyzer() ) return value;
+		
+		try {
+			final List<String> termsFromText = getAllTermsFromText(
+					fieldName, value.toString(), queryAnalyzer
+			);
+			if (termsFromText.size() > 1) {
+				StringBuilder error = new StringBuilder( "The ")
+						.append( name )
+						.append( " parameter leads to several terms when analyzed: " );
+				for ( String term : termsFromText ) {
+					error.append( term ).append( ", " );
+				}
+				final int length = error.length();
+				throw new SearchException( error.delete( length - 1, length ).toString() );
+			}
+			return termsFromText.size() == 0 ? null : termsFromText.get( 0 );
+		}
+		catch ( IOException e ) {
+			throw new AssertionFailure("IO exception while reading String stream??", e);
+		}
+	}
+
+	static List<String> getAllTermsFromText(String fieldName, String localText, Analyzer analyzer) throws IOException {
+		List<String> terms = new ArrayList<String>();
+
+		Reader reader = new StringReader(localText);
+		TokenStream stream = analyzer.reusableTokenStream( fieldName, reader);
+		TermAttribute attribute = (TermAttribute) stream.addAttribute( TermAttribute.class );
+		stream.reset();
+
+		while ( stream.incrementToken() ) {
+			if ( attribute.termLength() > 0 ) {
+				String term = attribute.term();
+				terms.add( term );
+			}
+		}
+		stream.end();
+		stream.close();
+		return terms;
+	}
+
+	static DocumentBuilderIndexedEntity<?> getDocumentBuilder(QueryBuildingContext queryContext) {
+		final SearchFactoryImplementor factory = queryContext.getFactory();
+		final Class<?> type = queryContext.getEntityType();
+		DocumentBuilderIndexedEntity<?> builder = factory.getDocumentBuilderIndexedEntity( type );
+		if ( builder == null ) {
+			throw new AssertionFailure( "Class in not indexed: " + type );
+		}
+		return builder;
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/PhraseQueryContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/PhraseQueryContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/PhraseQueryContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/PhraseQueryContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,25 @@
+package org.hibernate.search.query.dsl.impl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class PhraseQueryContext {
+	private int slop = 0;
+	private String sentence;
+
+	public int getSlop() {
+		return slop;
+	}
+
+	public void setSlop(int slop) {
+		this.slop = slop;
+	}
+
+	public String getSentence() {
+		return sentence;
+	}
+
+	public void setSentence(String sentence) {
+		this.sentence = sentence;
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/QueryBuildingContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/QueryBuildingContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/QueryBuildingContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/QueryBuildingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,34 @@
+package org.hibernate.search.query.dsl.impl;
+
+import org.apache.lucene.analysis.Analyzer;
+
+import org.hibernate.search.engine.SearchFactoryImplementor;
+
+/**
+ * Keep the query builder contextual information
+ * 
+ * @author Emmanuel Bernard
+ */
+public class QueryBuildingContext {
+	private final SearchFactoryImplementor factory;
+	private final Analyzer queryAnalyzer;
+	private final Class<?> entityType;
+
+	public QueryBuildingContext(SearchFactoryImplementor factory, Analyzer queryAnalyzer, Class<?> entityType) {
+		this.factory = factory;
+		this.queryAnalyzer = queryAnalyzer;
+		this.entityType = entityType;
+	}
+
+	public SearchFactoryImplementor getFactory() {
+		return factory;
+	}
+
+	public Analyzer getQueryAnalyzer() {
+		return queryAnalyzer;
+	}
+
+	public Class<?> getEntityType() {
+		return entityType;
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/QueryCustomizer.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/QueryCustomizer.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/QueryCustomizer.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/QueryCustomizer.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,55 @@
+package org.hibernate.search.query.dsl.impl;
+
+import org.apache.lucene.search.ConstantScoreQuery;
+import org.apache.lucene.search.Filter;
+import org.apache.lucene.search.FilteredQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.QueryWrapperFilter;
+
+import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.search.query.dsl.QueryCustomization;
+
+/**
+ * @author Emmanuel Bernard
+ */
+class QueryCustomizer implements QueryCustomization<QueryCustomizer> {
+	private float boost = 1f;
+	private boolean constantScore;
+	private Query wrappedQuery;
+	private Filter filter;
+
+	public QueryCustomizer boostedTo(float boost) {
+		this.boost = boost * this.boost;
+		return this;
+	}
+
+	public QueryCustomizer withConstantScore() {
+		constantScore = true;
+		return this;
+	}
+
+	public QueryCustomizer filteredBy(Filter filter) {
+		this.filter = filter;
+		return this;
+	}
+
+	public QueryCustomizer setWrappedQuery(Query wrappedQuery) {
+		this.wrappedQuery = wrappedQuery;
+		return this;
+	}
+
+	public Query createQuery() {
+		Query finalQuery = wrappedQuery;
+		if (wrappedQuery == null) {
+			throw new AssertionFailure( "wrapped query not set" );
+		}
+		finalQuery.setBoost( boost * finalQuery.getBoost() );
+		if (filter != null) {
+			finalQuery = new FilteredQuery(finalQuery, filter);
+		}
+		if ( constantScore ) {
+			finalQuery = new ConstantScoreQuery( new QueryWrapperFilter( finalQuery ) );
+		}
+		return finalQuery;
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/RangeQueryContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/RangeQueryContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/RangeQueryContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/RangeQueryContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,44 @@
+package org.hibernate.search.query.dsl.impl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class RangeQueryContext {
+	//RANGE
+	private Object from;
+	private Object to;
+	private boolean excludeFrom;
+	private boolean excludeTo;
+
+	public Object getFrom() {
+		return from;
+	}
+
+	public void setFrom(Object from) {
+		this.from = from;
+	}
+
+	public Object getTo() {
+		return to;
+	}
+
+	public void setTo(Object to) {
+		this.to = to;
+	}
+
+	public boolean isExcludeFrom() {
+		return excludeFrom;
+	}
+
+	public void setExcludeFrom(boolean excludeFrom) {
+		this.excludeFrom = excludeFrom;
+	}
+
+	public boolean isExcludeTo() {
+		return excludeTo;
+	}
+
+	public void setExcludeTo(boolean excludeTo) {
+		this.excludeTo = excludeTo;
+	}
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/TermQueryContext.java (from rev 20232, search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/TermQueryContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/TermQueryContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/impl/TermQueryContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -0,0 +1,43 @@
+package org.hibernate.search.query.dsl.impl;
+
+/**
+* @author Emmanuel Bernard
+*/
+class TermQueryContext {
+	private final Approximation approximation;
+	//FUZZY
+	private float threshold = .5f;
+
+	//WILDCARD
+	private int prefixLength = 0;
+
+	public TermQueryContext(Approximation approximation) {
+		this.approximation = approximation;
+	}
+
+	public void setThreshold(float threshold) {
+		this.threshold = threshold;
+	}
+
+	public void setPrefixLength(int prefixLength) {
+		this.prefixLength = prefixLength;
+	}
+
+	public Approximation getApproximation() {
+		return approximation;
+	}
+
+	public float getThreshold() {
+		return threshold;
+	}
+
+	public int getPrefixLength() {
+		return prefixLength;
+	}
+
+	public static enum Approximation {
+		EXACT,
+		WILDCARD,
+		FUZZY
+	}
+}

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/package-info.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/package-info.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/package-info.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -23,8 +23,9 @@
  * Boston, MA  02110-1301  USA
  */
 /**
- * This package contains various experimentations. Do not use.
- *
  * Provide a domain specific language to write Lucene queries.
+ * 
+ * While this API is slightly subject to change we highly encourage users to
+ * to go for it as it provides many benefits.
  */
 package org.hibernate.search.query.dsl;
\ No newline at end of file

Deleted: 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	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/AllContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,16 +0,0 @@
-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);
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/BooleanJunction.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/BooleanJunction.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/BooleanJunction.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,21 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-import org.apache.lucene.search.Query;
-
-/**
- * Represents a boolean query that can contains one or more elements to join
- *
- * @author Emmanuel Bernard
- */
-public interface BooleanJunction<T extends BooleanJunction> extends QueryCustomization<T>, Termination {
-	/**
-	 * The boolean query results should match the subquery
-	 */
-	BooleanJunction should(Query query);
-
-	/**
-	 * The boolean query results must (or must not) match the subquery
-	 * Call the .not() method to ensure results of the boolean query do NOT match the subquery.
-	 */
-	MustJunction must(Query query);
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/EntityContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/EntityContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/EntityContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,13 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
-* @author Emmanuel Bernard
-*/
-public interface EntityContext {
-	EntityContext overridesForField(String field, String analyzerName);
-
-	/**
-	 * return the query builder
-	 */
-	QueryBuilder get();
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/FieldCustomization.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/FieldCustomization.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/FieldCustomization.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,29 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface FieldCustomization<T> {
-	/**
-	 * Boost the field to a given value
-	 * Most of the time positive float:
-	 *  - lower than 1 to diminish the weight
-	 *  - higher than 1 to increase the weight
-	 *
-	 * Could be negative but not unless you understand what is going on (advanced)
-	 */
-	T boostedTo(float boost);
-
-	/**
-	 * Advanced
-	 * Do not execute the analyzer on the text.
-	 * (It is usually a good idea to apply the analyzer)
-	 */
-	T ignoreAnalyzer();
-
-	/**
-	 * Do not try and find the field bridge nor apply the object / string conversion
-	 * matching objects should be of type String in this case.
-	 */
-	T ignoreFieldBridge();
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/FuzzyContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/FuzzyContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/FuzzyContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,26 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface FuzzyContext extends QueryCustomization<FuzzyContext> {
-	/**
-	 * field / property the term query is executed on
-	 */
-	TermMatchingContext onField(String field);
-
-	/**
-	 * Threshold above which two terms are considered similar enough.
-	 * Value between 0 and 1 (1 excluded)
-	 * Defaults to .5
-	 */
-	FuzzyContext withThreshold(float threshold);
-
-	/**
-	 * Size of the prefix ignored by the fuzzyness.
-	 * A non zero value is recommended if the index contains a huge amount of distinct terms
-	 *
-	 * Defaults to 0
-	 */
-	FuzzyContext withPrefixLength(int prefixLength);
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/MustJunction.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/MustJunction.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/MustJunction.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,14 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
- * Represents the context in which a must clause is described.
- *  
- * @author Emmanuel Bernard
- */
-public interface MustJunction extends BooleanJunction<MustJunction> {
-	/**
-	 * Negate the must clause.
-	 * Results of the boolean query do NOT match the subquery.
-	 */
-	BooleanJunction not();
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,20 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface PhraseContext extends QueryCustomization<PhraseContext> {
-	/**
-	 * Sets the number of other words permitted between words in query phrase.
-	 * If zero, then this is an exact phrase search.  For larger values this works
-	 * like a <code>WITHIN</code> or <code>NEAR</code> operator.
-	 *
-	 * Defaults to 0
-	 */
-	PhraseContext withSlop(int slop);
-
-	/**
-	 * field / property the term query is executed on
-	 */
-	PhraseMatchingContext onField(String fieldName);
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseMatchingContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseMatchingContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseMatchingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,16 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface PhraseMatchingContext extends FieldCustomization<PhraseMatchingContext> {
-	/**
-	 * field / property the term query is executed on
-	 */
-	PhraseMatchingContext andField(String field);
-
-	/**
-	 * Sentence to match. It will be processed by the analyzer
-	 */
-	PhraseTermination sentence(String sentence);
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseTermination.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseTermination.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/PhraseTermination.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,7 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface PhraseTermination extends Termination<PhraseTermination> {
-}

Deleted: 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-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,34 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-import org.apache.lucene.search.Query;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface QueryBuilder {
-	/**
-	 * build a term query
-	 */
-	TermContext keyword();
-
-	/**
-	 * find matching elements within a range
-	 */
-	RangeContext range();
-
-	/**
-	 * find an sentence (words can be inversed according to the slop factor
-	 */
-	PhraseContext phrase();
-
-	/**
-	 * Boolean query
-	 */
-	BooleanJunction<BooleanJunction> bool();
-
-	/**
-	 * Query matching all documents
-	 * Typically mixed with a boolean query.
-	 */
-	AllContext all();
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryContextBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryContextBuilder.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryContextBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,23 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
- * Query builder that needs contextualization:
- * A query builder should know which entity or analyzer it relies on.
- *
- * <code>
- * QueryBuilder builder =
- * searchFactory.buildQueryBuilder()
- *   .forEntity(Customer.class)
- *     .overridesForField("profession", "acronym-analyzer")
- *     .get();
- * </code>
- *
- * overridesForField is optional (and usually not needed). This method overrides the
- * underlying analyzer (for a given field) used to build queries.
- *
- * @author Emmanuel Bernard
- */
-public interface QueryContextBuilder {
-	//TODO make a forEntities
-	EntityContext forEntity(Class<?> entityType);
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryCustomization.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryCustomization.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/QueryCustomization.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,35 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-import org.apache.lucene.search.Filter;
-import org.apache.lucene.search.Query;
-
-/**
- * Operations common to all types of queries
- *
- * @author Emmanuel Bernard
- */
-public interface QueryCustomization<T> {
-
-	/**
-	 * Boost the query to a given value
-	 * Most of the time positive float:
-	 *  - lower than 1 to diminish the weight
-	 *  - higher than 1 to increase the weight
-	 *
-	 * Could be negative but not unless you understand what is going on (advanced)
-	 */
-	T boostedTo(float boost);
-
-	/**
-	 * All results matching the query have a constant score equals to the boost
-	 * FIXME is that true?
-	 */
-	T withConstantScore();
-
-	/**
-	 * Filter the query results with the Filter instance
-	 */
-	T filteredBy(Filter filter);
-
-	//TODO filter(String) + parameters
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,11 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface RangeContext extends QueryCustomization<RangeContext> {
-	/**
-	 * field / property the term query is executed on
-	 */
-	RangeMatchingContext onField(String fieldName);
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeMatchingContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeMatchingContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeMatchingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,34 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface RangeMatchingContext extends FieldCustomization<RangeMatchingContext> {
-	/**
-	 * field / property the term query is executed on
-	 */
-	RangeMatchingContext andField(String field);
-
-	//TODO what about numeric range query, I guess we can detect it automatically based on the field bridge
-	//TODO get info on precisionStepDesc (index time info)
-	//FIXME: Is <T> correct or should we specialize to String and Numeric (or all the numeric types?
-	<T> FromRangeContext<T> from(T from);
-
-	public interface FromRangeContext<T> {
-		RangeTerminationExcludable to(T to);
-		FromRangeContext<T> excludeLimit();
-	}
-
-	/**
-	 * The field value must be below <code>below</code>
-	 * You can exclude the value <code>below</code> by calling <code>.excludeLimit()</code>
-	 */
-	RangeTerminationExcludable below(Object below);
-
-	/**
-	 * The field value must be above <code>above</code>
-	 * You can exclude the value <code>above</code> by calling <code>.excludeLimit()</code>
-	 */
-	RangeTerminationExcludable above(Object above);
-
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeTerminationExcludable.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeTerminationExcludable.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/RangeTerminationExcludable.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,8 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface RangeTerminationExcludable extends Termination<RangeTerminationExcludable> {
-	RangeTerminationExcludable excludeLimit();
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,29 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-import org.apache.lucene.search.Query;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface TermContext extends QueryCustomization<TermContext> {
-	/**
-	 * field / property the term query is executed on
-	 */
-	TermMatchingContext onField(String field);
-
-	TermMatchingContext onFields(String... field);
-
-	/**
-	 * Use a fuzzy search approximation (aka edit distance)
-	 */
-	FuzzyContext fuzzy();
-
-	/**
-	 * Treat the query as a wildcard:
-	 *  - ? represents any single character
-	 *  - * represents any character sequence
-	 * For faster results, it is recommended that the query text does not
-	 * start with ? or *
-	 */
-	WildcardContext wildcard();
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermFuzzy.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermFuzzy.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermFuzzy.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,21 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
-* @author Emmanuel Bernard
-*/
-public interface TermFuzzy extends TermTermination {
-	/**
-	 * Threshold above which two terms are considered similar enough.
-	 * Value between 0 and 1 (1 excluded)
-	 * Defaults to .5
-	 */
-	TermFuzzy withThreshold(float threshold);
-
-	/**
-	 * Size of the prefix ignored by the fuzzyness.
-	 * A non zero value is recommended if the index contains a huge amount of distinct terms
-	 *
-	 * Defaults to 0
-	 */
-	TermFuzzy withPrefixLength(int prefixLength);
-}

Deleted: 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-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermMatchingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,19 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
-* @author Emmanuel Bernard
-*/
-public interface TermMatchingContext extends FieldCustomization<TermMatchingContext> {
-	/**
-	 * Value searched in the field or fields.
-	 * The value is passed to the field's:
-	 *  - field bridge
-	 *  - analyzer (unless ignoreAnalyzer is called).
-	 */
-	TermTermination matching(Object value);
-
-	/**
-	 * field / property the term query is executed on
-	 */
-	TermMatchingContext andField(String field);
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermTermination.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermTermination.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/TermTermination.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,7 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
-* @author Emmanuel Bernard
-*/
-public interface TermTermination extends Termination<TermTermination> {
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/Termination.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/Termination.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/Termination.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,13 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-import org.apache.lucene.search.Query;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface Termination<T> {
-	/**
-	 * Return the lucene query representing the operation
-	 */
-	Query createQuery();
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/WildcardContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/WildcardContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/WildcardContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,12 +0,0 @@
-package org.hibernate.search.query.dsl.v2;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface WildcardContext extends QueryCustomization<WildcardContext> {
-	/**
-	 * field / property the term query is executed on
-	 */
-	TermMatchingContext onField(String field);
-
-}
\ No newline at end of file

Deleted: 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-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/BooleanQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,87 +0,0 @@
-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.annotations.common.AssertionFailure;
-import org.hibernate.search.query.dsl.v2.BooleanJunction;
-import org.hibernate.search.query.dsl.v2.MustJunction;
-
-/**
- * @author Emmanuel Bernard
- */
-class BooleanQueryBuilder implements MustJunction {
-	private final List<BooleanClause> clauses;
-	private final QueryCustomizer queryCustomizer;
-
-	BooleanQueryBuilder() {
-		clauses = new ArrayList<BooleanClause>(5);
-		queryCustomizer = new QueryCustomizer();
-	}
-	
-	public BooleanJunction not() {
-		final int lastIndex = clauses.size() -1;
-		final BooleanClause last = clauses.get(lastIndex);
-		if ( ! last.getOccur().equals( BooleanClause.Occur.MUST ) ) {
-			throw new AssertionFailure( "Cannot negate class: " + last.getOccur() );
-		}
-		clauses.set( lastIndex, new BooleanClause( last.getQuery(), BooleanClause.Occur.MUST_NOT ) );
-		return this;
-	}
-
-	public BooleanJunction should(Query query) {
-		clauses.add( new BooleanClause( query, BooleanClause.Occur.SHOULD ) );
-		return this;
-	}
-
-	public MustJunction must(Query query) {
-		clauses.add( new BooleanClause( query, BooleanClause.Occur.MUST ) );
-		return this;
-	}
-
-	public MustJunction boostedTo(float boost) {
-		queryCustomizer.boostedTo( boost );
-		return this;
-	}
-
-	public MustJunction withConstantScore() {
-		queryCustomizer.withConstantScore();
-		return this;
-	}
-
-	public MustJunction filteredBy(Filter filter) {
-		queryCustomizer.filteredBy(filter);
-		return this;
-	}
-
-	public Query createQuery() {
-		final int nbrOfClauses = clauses.size();
-		if ( nbrOfClauses == 0) {
-			throw new AssertionFailure( "Cannot create an empty boolean query" );
-		}
-		else if ( nbrOfClauses == 1 ) {
-			final BooleanClause uniqueClause = clauses.get( 0 );
-			if ( uniqueClause.getOccur().equals( BooleanClause.Occur.MUST_NOT ) ) {
-				//FIXME We have two choices here, raise an exception or combine with an All query. #2 is done atm.
-				//TODO which normfield to use and how to pass it?
-				should( new MatchAllDocsQuery() );
-			}
-			else {
-				//optimize
-				return queryCustomizer.setWrappedQuery( uniqueClause.getQuery() ).createQuery();
-			}
-		}
-
-		BooleanQuery query = new BooleanQuery( );
-		for (BooleanClause clause : clauses) {
-			query.add( clause );
-		}
-		return queryCustomizer.setWrappedQuery( query ).createQuery();
-	}
-}

Deleted: 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	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedAllContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,63 +0,0 @@
-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 withConstantScore() {
-		queryCustomizer.withConstantScore();
-		return this;
-	}
-
-	public AllContext filteredBy(Filter filter) {
-		queryCustomizer.filteredBy( filter );
-		return this;
-	}
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedFuzzyContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedFuzzyContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedFuzzyContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,51 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import org.apache.lucene.search.Filter;
-
-import org.hibernate.search.query.dsl.v2.FuzzyContext;
-import org.hibernate.search.query.dsl.v2.TermMatchingContext;
-
-/**
- * @author Emmanuel Bernard
- */
-class ConnectedFuzzyContext implements FuzzyContext {
-	private final QueryBuildingContext queryContext;
-	private final QueryCustomizer queryCustomizer;
-	private final TermQueryContext termContext;
-
-	public ConnectedFuzzyContext(QueryCustomizer queryCustomizer, QueryBuildingContext queryContext) {
-		this.queryCustomizer = queryCustomizer;
-		this.termContext = new TermQueryContext( TermQueryContext.Approximation.FUZZY);
-		this.queryContext = queryContext;
-	}
-
-	public TermMatchingContext onField(String field) {
-		return new ConnectedTermMatchingContext(termContext, field, queryCustomizer, queryContext);
-	}
-
-	public ConnectedFuzzyContext withThreshold(float threshold) {
-		termContext.setThreshold( threshold );
-		return this;
-	}
-
-	public ConnectedFuzzyContext withPrefixLength(int prefixLength) {
-		termContext.setPrefixLength( prefixLength );
-		return this;
-	}
-
-	public FuzzyContext boostedTo(float boost) {
-		queryCustomizer.boostedTo( boost );
-		return this;
-	}
-
-	public FuzzyContext withConstantScore() {
-		queryCustomizer.withConstantScore();
-		return this;
-	}
-
-	public FuzzyContext filteredBy(Filter filter) {
-		queryCustomizer.filteredBy(filter);
-		return this;
-	}
-
-}
\ No newline at end of file

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsPhraseQueryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsPhraseQueryBuilder.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsPhraseQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,159 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.lucene.analysis.TokenStream;
-import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
-import org.apache.lucene.analysis.tokenattributes.TermAttribute;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.BooleanClause;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.MultiPhraseQuery;
-import org.apache.lucene.search.PhraseQuery;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.TermQuery;
-
-import org.hibernate.annotations.common.AssertionFailure;
-import org.hibernate.search.SearchException;
-import org.hibernate.search.query.dsl.v2.PhraseTermination;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ConnectedMultiFieldsPhraseQueryBuilder implements PhraseTermination {
-	private final PhraseQueryContext phraseContext;
-	private final QueryBuildingContext queryContext;
-	private final QueryCustomizer queryCustomizer;
-	private final List<FieldContext> fieldContexts;
-
-	public ConnectedMultiFieldsPhraseQueryBuilder(PhraseQueryContext phraseContext, QueryCustomizer queryCustomizer,
-												  List<FieldContext> fieldContexts, QueryBuildingContext queryContext) {
-		this.phraseContext = phraseContext;
-		this.queryContext = queryContext;
-		this.queryCustomizer = queryCustomizer;
-		this.fieldContexts = fieldContexts;
-	}
-
-	public Query createQuery() {
-		final int size = fieldContexts.size();
-		if ( size == 1 ) {
-			return queryCustomizer.setWrappedQuery( createQuery( fieldContexts.get( 0 ) ) ).createQuery();
-		}
-		else {
-			BooleanQuery aggregatedFieldsQuery = new BooleanQuery( );
-			for ( FieldContext fieldContext : fieldContexts ) {
-				aggregatedFieldsQuery.add( createQuery( fieldContext ), BooleanClause.Occur.SHOULD );
-			}
-			return  queryCustomizer.setWrappedQuery( aggregatedFieldsQuery ).createQuery();
-		}
-	}
-
-	public Query createQuery(FieldContext fieldContext) {
-		final Query perFieldQuery;
-		final String fieldName = fieldContext.getField();
-
-		/*
-		 * Store terms per position and detect if for a given position more than one term is present
-		 */
-		TokenStream stream = null;
-		boolean isMultiPhrase = false;
-		Map<Integer, List<Term>> termsPerPosition = new HashMap<Integer, List<Term>>();
-		final String sentence = phraseContext.getSentence();
-		try {
-			Reader reader = new StringReader( sentence );
-			stream = queryContext.getQueryAnalyzer().reusableTokenStream( fieldName, reader);
-
-			TermAttribute termAttribute = (TermAttribute) stream.addAttribute( TermAttribute.class );
-			PositionIncrementAttribute positionAttribute = (PositionIncrementAttribute) stream.addAttribute( PositionIncrementAttribute.class );
-
-			stream.reset();
-			int position = -1; //start at -1 since we apply at least one increment
-			List<Term> termsAtSamePosition = null;
-			while ( stream.incrementToken() ) {
-				int positionIncrement = 1;
-				if ( positionAttribute != null ) {
-					positionIncrement = positionAttribute.getPositionIncrement();
-				}
-
-				if ( positionIncrement > 0 ) {
-					position+=positionIncrement;
-					termsAtSamePosition = termsPerPosition.get(position);
-				}
-
-				if (termsAtSamePosition == null) {
-					termsAtSamePosition = new ArrayList<Term>();
-					termsPerPosition.put( position, termsAtSamePosition  );
-				}
-
-				termsAtSamePosition.add( new Term( fieldName, termAttribute.term() ) );
-				if ( termsAtSamePosition.size() > 1 ) {
-					isMultiPhrase = true;
-				}
-			}
-		}
-		catch ( IOException e ) {
-			throw new AssertionFailure( "IOException while reading a string. Doh!", e);
-		}
-		finally {
-			if ( stream != null ) {
-				try {
-					stream.end();
-					stream.close();
-				}
-				catch ( IOException e ) {
-					throw new AssertionFailure( "IOException while reading a string. Doh!", e);
-				}
-			}
-		}
-
-		/*
-		 * Create the appropriate query depending on the conditions
-		 * note that a MultiPhraseQuery is needed if several terms share the same position
-		 * as it will do a OR and not a AND like PhraseQuery
-		 */
-		final int size = termsPerPosition.size();
-		if ( size == 0 ) {
-			throw new SearchException( "phrase query returns no term. Is there a problem with your analyzers? " + sentence);
-		}
-		if ( size == 1 ) {
-			final List<Term> terms = termsPerPosition.values().iterator().next();
-			if ( terms.size() == 1 ) {
-				perFieldQuery = new TermQuery( terms.get( 0 ) );
-			}
-			else {
-				BooleanQuery query = new BooleanQuery( );
-				for ( Term term : terms ) {
-					query.add( new TermQuery(term), BooleanClause.Occur.SHOULD );
-				}
-				perFieldQuery = query;
-			}
-		}
-		else {
-			if (isMultiPhrase) {
-				MultiPhraseQuery query = new MultiPhraseQuery();
-				query.setSlop( phraseContext.getSlop() );
-				for ( Map.Entry<Integer,List<Term>> entry : termsPerPosition.entrySet() ) {
-					final List<Term> value = entry.getValue();
-					query.add( value.toArray( new Term[value.size()] ), entry.getKey() );
-				}
-				perFieldQuery = query;
-			}
-			else {
-				PhraseQuery query = new PhraseQuery();
-				query.setSlop(  phraseContext.getSlop() );
-				for ( Map.Entry<Integer,List<Term>> entry : termsPerPosition.entrySet() ) {
-					final List<Term> value = entry.getValue();
-					query.add( value.get(0), entry.getKey() );
-				}
-				perFieldQuery = query;
-			}
-		}
-		return fieldContext.getFieldCustomizer().setWrappedQuery( perFieldQuery ).createQuery();
-	}
-}
\ No newline at end of file

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsRangeQueryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsRangeQueryBuilder.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsRangeQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,97 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import java.util.List;
-
-import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.search.BooleanClause;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.TermRangeQuery;
-
-import org.hibernate.annotations.common.AssertionFailure;
-import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
-import org.hibernate.search.query.dsl.v2.RangeTerminationExcludable;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ConnectedMultiFieldsRangeQueryBuilder implements RangeTerminationExcludable {
-	private final RangeQueryContext rangeContext;
-	private final QueryCustomizer queryCustomizer;
-	private final List<FieldContext> fieldContexts;
-	private final QueryBuildingContext queryContext;
-
-	public ConnectedMultiFieldsRangeQueryBuilder(RangeQueryContext rangeContext,
-												 QueryCustomizer queryCustomizer, List<FieldContext> fieldContexts,
-												 QueryBuildingContext queryContext) {
-		this.rangeContext = rangeContext;
-		this.queryCustomizer = queryCustomizer;
-		this.fieldContexts = fieldContexts;
-		this.queryContext = queryContext;
-	}
-
-	public RangeTerminationExcludable excludeLimit() {
-		if ( rangeContext.getFrom() != null && rangeContext.getTo() != null ) {
-			rangeContext.setExcludeTo( true );
-		}
-		else if ( rangeContext.getFrom() != null ) {
-			rangeContext.setExcludeTo( true );
-		}
-		else if ( rangeContext.getTo() != null ) {
-			rangeContext.setExcludeTo( true );
-		}
-		else {
-			throw new AssertionFailure( "Both from and to clause of a range query are null" );
-		}
-		return this;
-	}
-
-	public Query createQuery() {
-		final int size = fieldContexts.size();
-		if ( size == 1 ) {
-			return queryCustomizer.setWrappedQuery( createQuery( fieldContexts.get( 0 ) ) ).createQuery();
-		}
-		else {
-			BooleanQuery aggregatedFieldsQuery = new BooleanQuery( );
-			for ( FieldContext fieldContext : fieldContexts ) {
-				aggregatedFieldsQuery.add( createQuery( fieldContext ), BooleanClause.Occur.SHOULD );
-			}
-			return  queryCustomizer.setWrappedQuery( aggregatedFieldsQuery ).createQuery();
-		}
-	}
-
-	public Query createQuery(FieldContext fieldContext) {
-		final Query perFieldQuery;
-		final String fieldName = fieldContext.getField();
-		final Analyzer queryAnalyzer = queryContext.getQueryAnalyzer();
-
-		final DocumentBuilderIndexedEntity<?> documentBuilder = Helper.getDocumentBuilder( queryContext );
-
-		final Object fromObject = rangeContext.getFrom();
-		final String fromString  = fieldContext.isIgnoreFieldBridge() ?
-				fromObject == null ? null : fromObject.toString() :
-				documentBuilder.objectToString( fieldName, fromObject );
-		final String lowerTerm = fromString == null ?
-				null :
-				Helper.getAnalyzedTerm( fieldName, fromString, "from", queryAnalyzer, fieldContext );
-
-		final Object toObject = rangeContext.getTo();
-		final String toString  = fieldContext.isIgnoreFieldBridge() ?
-				toObject == null ? null : toObject.toString() :
-				documentBuilder.objectToString( fieldName, toObject );
-		final String upperTerm = toString == null ?
-				null :
-				Helper.getAnalyzedTerm( fieldName, toString, "to", queryAnalyzer, fieldContext );
-		
-		perFieldQuery = new TermRangeQuery(
-				fieldName,
-				lowerTerm,
-				upperTerm,
-				!rangeContext.isExcludeFrom(),
-				!rangeContext.isExcludeTo()
-		);
-		return fieldContext.getFieldCustomizer().setWrappedQuery( perFieldQuery ).createQuery();
-	}
-
-
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsTermQueryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsTermQueryBuilder.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedMultiFieldsTermQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,126 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.BooleanClause;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.FuzzyQuery;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.search.WildcardQuery;
-
-import org.hibernate.annotations.common.AssertionFailure;
-import org.hibernate.search.SearchException;
-import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
-import org.hibernate.search.query.dsl.v2.TermTermination;
-
-/**
-* @author Emmanuel Bernard
-*/
-public class ConnectedMultiFieldsTermQueryBuilder implements TermTermination {
-	private final Object value;
-	private final QueryCustomizer queryCustomizer;
-	private final TermQueryContext termContext;
-	private final List<FieldContext> fieldContexts;
-	private final QueryBuildingContext queryContext;
-
-	public ConnectedMultiFieldsTermQueryBuilder(TermQueryContext termContext,
-												Object value,
-												List<FieldContext> fieldContexts,
-												QueryCustomizer queryCustomizer,
-												QueryBuildingContext queryContext) {
-		this.termContext = termContext;
-		this.value = value;
-		this.queryContext = queryContext;
-		this.queryCustomizer = queryCustomizer;
-		this.fieldContexts = fieldContexts;
-	}
-
-	public Query createQuery() {
-		final int size = fieldContexts.size();
-		if ( size == 1 ) {
-			return queryCustomizer.setWrappedQuery( createQuery( fieldContexts.get( 0 ) ) ).createQuery();
-		}
-		else {
-			BooleanQuery aggregatedFieldsQuery = new BooleanQuery( );
-			for ( FieldContext fieldContext : fieldContexts ) {
-				aggregatedFieldsQuery.add( createQuery( fieldContext ), BooleanClause.Occur.SHOULD );
-			}
-			return  queryCustomizer.setWrappedQuery( aggregatedFieldsQuery ).createQuery();
-		}
-	}
-
-	public Query createQuery(FieldContext fieldContext) {
-		final Query perFieldQuery;
-		final DocumentBuilderIndexedEntity<?> documentBuilder = Helper.getDocumentBuilder( queryContext );
-		String text = fieldContext.isIgnoreFieldBridge() ? 
-					value.toString() :
-					documentBuilder.objectToString( fieldContext.getField(), value );
-		if ( fieldContext.isIgnoreAnalyzer() ) {
-			perFieldQuery = createTermQuery( fieldContext, text );
-		}
-		else {
-			List<String> terms;
-			try {
-				terms = getAllTermsFromText( fieldContext.getField(), text, queryContext.getQueryAnalyzer() );
-			}
-			catch ( IOException e ) {
-				throw new AssertionFailure("IO exception while reading String stream??", e);
-			}
-			if ( terms.size() == 0 ) {
-				throw new SearchException( "try to search with an empty string: " + fieldContext.getField() );
-			}
-			else if (terms.size() == 1 ) {
-				perFieldQuery = createTermQuery( fieldContext, terms.get( 0 ) );
-			}
-			else {
-				BooleanQuery booleanQuery = new BooleanQuery();
-				for (String localTerm : terms) {
-					Query termQuery = createTermQuery(fieldContext, localTerm);
-					booleanQuery.add( termQuery, BooleanClause.Occur.SHOULD );
-				}
-				perFieldQuery = booleanQuery;
-			}
-		}
-		return fieldContext.getFieldCustomizer().setWrappedQuery( perFieldQuery ).createQuery();
-	}
-
-	private Query createTermQuery(FieldContext fieldContext, String term) {
-		Query query;
-		final String fieldName = fieldContext.getField();
-		switch ( termContext.getApproximation() ) {
-			case EXACT:
-				query = new TermQuery( new Term( fieldName, term ) );
-				break;
-			case WILDCARD:
-				query = new WildcardQuery( new Term( fieldName, term ) );
-				break;
-			case FUZZY:
-				query = new FuzzyQuery(
-						new Term( fieldName, term ),
-						termContext.getThreshold(),
-						termContext.getPrefixLength() );
-				break;
-			default:
-				throw new AssertionFailure( "Unknown approximation: " + termContext.getApproximation() );
-		}
-		return query;
-	}
-
-	private List<String> getAllTermsFromText(String fieldName, String localText, Analyzer analyzer) throws IOException {
-		//it's better not to apply the analyzer with wildcard as * and ? can be mistakenly removed
-		List<String> terms = new ArrayList<String>();
-		if ( termContext.getApproximation() == TermQueryContext.Approximation.WILDCARD ) {
-			terms.add( localText );
-		}
-		else {
-			terms = Helper.getAllTermsFromText( fieldName, localText, analyzer );
-		}
-		return terms;
-	}
-
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedPhraseContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedPhraseContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedPhraseContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,46 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import org.apache.lucene.search.Filter;
-
-import org.hibernate.search.query.dsl.v2.PhraseContext;
-import org.hibernate.search.query.dsl.v2.PhraseMatchingContext;
-
-/**
- * @author Emmanuel Bernard
- */
-class ConnectedPhraseContext implements PhraseContext {
-	private final QueryBuildingContext queryContext;
-	private final QueryCustomizer queryCustomizer;
-	private final PhraseQueryContext phraseContext;
-
-
-	public ConnectedPhraseContext(QueryBuildingContext queryContext) {
-		this.queryCustomizer = new QueryCustomizer();
-		this.phraseContext = new PhraseQueryContext();
-		this.queryContext = queryContext;
-	}
-
-	public PhraseContext withSlop(int slop) {
-		phraseContext.setSlop( slop );
-		return this;
-	}
-
-	public PhraseMatchingContext onField(String fieldName) {
-		return new ConnectedPhraseMatchingContext(fieldName, phraseContext, queryCustomizer, queryContext);
-	}
-
-	public PhraseContext boostedTo(float boost) {
-		queryCustomizer.boostedTo( boost );
-		return this;
-	}
-
-	public PhraseContext withConstantScore() {
-		queryCustomizer.withConstantScore();
-		return this;
-	}
-
-	public PhraseContext filteredBy(Filter filter) {
-		queryCustomizer.filteredBy(filter);
-		return this;
-	}
-}
\ No newline at end of file

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedPhraseMatchingContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedPhraseMatchingContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedPhraseMatchingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,65 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.hibernate.search.query.dsl.v2.PhraseMatchingContext;
-import org.hibernate.search.query.dsl.v2.PhraseTermination;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ConnectedPhraseMatchingContext implements PhraseMatchingContext {
-	private final QueryBuildingContext queryContext;
-	private final QueryCustomizer queryCustomizer;
-	private final PhraseQueryContext phraseContext;
-	private final List<FieldContext> fieldContexts;
-	//when a varargs of fields are passed, apply the same customization for all.
-	//keep the index of the first context in this queue
-	private int firstOfContext = 0;
-
-	public ConnectedPhraseMatchingContext(String fieldName,
-											PhraseQueryContext phraseContext,
-											QueryCustomizer queryCustomizer,
-											QueryBuildingContext queryContext) {
-		this.queryContext = queryContext;
-		this.queryCustomizer = queryCustomizer;
-		this.phraseContext = phraseContext;
-		this.fieldContexts = new ArrayList<FieldContext>(4);
-		this.fieldContexts.add( new FieldContext( fieldName ) );
-	}
-
-	public PhraseMatchingContext andField(String field) {
-		this.fieldContexts.add( new FieldContext( field ) );
-		this.firstOfContext = fieldContexts.size() - 1;
-		return this;
-	}
-
-	public PhraseTermination sentence(String sentence) {
-		phraseContext.setSentence(sentence);
-		return new ConnectedMultiFieldsPhraseQueryBuilder( phraseContext, queryCustomizer, fieldContexts, queryContext );
-	}
-
-	public PhraseMatchingContext boostedTo(float boost) {
-		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
-			fieldContext.getFieldCustomizer().boostedTo( boost );
-		}
-		return this;
-	}
-
-	private List<FieldContext> getCurrentFieldContexts() {
-		return fieldContexts.subList( firstOfContext, fieldContexts.size() );
-	}
-
-	public PhraseMatchingContext ignoreAnalyzer() {
-		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
-			fieldContext.setIgnoreAnalyzer( true );
-		}
-		return this;
-	}
-
-	public PhraseMatchingContext ignoreFieldBridge() {
-		//this is a no-op
-		return this;
-	}
-}
\ No newline at end of file

Deleted: 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-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedQueryBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,48 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import org.apache.lucene.analysis.Analyzer;
-
-import org.hibernate.search.SearchFactory;
-import org.hibernate.search.engine.SearchFactoryImplementor;
-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.PhraseContext;
-import org.hibernate.search.query.dsl.v2.QueryBuilder;
-import org.hibernate.search.query.dsl.v2.RangeContext;
-import org.hibernate.search.query.dsl.v2.TermContext;
-import org.hibernate.search.query.dsl.v2.WildcardContext;
-
-/**
- * Assuming connection with the search factory
- * 
- * @author Emmanuel Bernard
- */
-public class ConnectedQueryBuilder implements QueryBuilder {
-	private final QueryBuildingContext context;
-
-	public ConnectedQueryBuilder(QueryBuildingContext context) {
-		this.context = context;
-	}
-
-	public TermContext keyword() {
-		return new ConnectedTermContext(context);
-	}
-
-	public RangeContext range() {
-		return new ConnectedRangeContext(context);
-	}
-
-	public PhraseContext phrase() {
-		return new ConnectedPhraseContext(context);
-	}
-
-	//fixme Have to use raw types but would be nice to not have to
-	public BooleanJunction bool() {
-		return new BooleanQueryBuilder();
-	}
-
-	public AllContext all() {
-		return new ConnectedAllContext();
-	}
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedQueryContextBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedQueryContextBuilder.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedQueryContextBuilder.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,45 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import org.hibernate.search.SearchFactory;
-import org.hibernate.search.engine.SearchFactoryImplementor;
-import org.hibernate.search.query.dsl.v2.EntityContext;
-import org.hibernate.search.query.dsl.v2.QueryBuilder;
-import org.hibernate.search.query.dsl.v2.QueryContextBuilder;
-import org.hibernate.search.util.ScopedAnalyzer;
-
-/**
- * Assuming connection with the search factory
- *
- * @author Emmanuel Bernard
- */
-public class ConnectedQueryContextBuilder implements QueryContextBuilder {
-	private final SearchFactoryImplementor factory;
-
-	public ConnectedQueryContextBuilder(SearchFactoryImplementor factory) {
-		this.factory = factory;
-	}
-
-	public EntityContext forEntity(Class<?> entityType) {
-		return new HSearchEntityContext(entityType, factory );
-	}
-
-	public final class HSearchEntityContext implements EntityContext {
-		private final ScopedAnalyzer queryAnalyzer;
-		private final QueryBuildingContext context;
-
-		public HSearchEntityContext(Class<?> entityType, SearchFactoryImplementor factory) {
-			queryAnalyzer = new ScopedAnalyzer();
-			queryAnalyzer.setGlobalAnalyzer( factory.getAnalyzer( entityType ) );
-			context = new QueryBuildingContext( factory, queryAnalyzer, entityType);
-		}
-
-		public EntityContext overridesForField(String field, String analyzerName) {
-			queryAnalyzer.addScopedAnalyzer( field, factory.getAnalyzer( analyzerName ) );
-			return this;
-		}
-
-		public QueryBuilder get() {
-			return new ConnectedQueryBuilder(context);
-		}
-	}
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedRangeContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedRangeContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedRangeContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,38 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import org.apache.lucene.search.Filter;
-
-import org.hibernate.search.query.dsl.v2.RangeContext;
-import org.hibernate.search.query.dsl.v2.RangeMatchingContext;
-
-/**
- * @author Emmanuel Bernard
- */
-class ConnectedRangeContext implements RangeContext {
-	private final QueryBuildingContext queryContext;
-	private final QueryCustomizer queryCustomizer;
-
-	public ConnectedRangeContext(QueryBuildingContext queryContext) {
-		this.queryContext = queryContext;
-		this.queryCustomizer = new QueryCustomizer();
-	}
-
-	public RangeMatchingContext onField(String fieldName) {
-		return new ConnectedRangeMatchingContext(fieldName, queryCustomizer, queryContext);
-	}
-
-	public RangeContext boostedTo(float boost) {
-		queryCustomizer.boostedTo( boost );
-		return this;
-	}
-
-	public RangeContext withConstantScore() {
-		queryCustomizer.withConstantScore();
-		return this;
-	}
-
-	public RangeContext filteredBy(Filter filter) {
-		queryCustomizer.filteredBy(filter);
-		return this;
-	}
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedRangeMatchingContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedRangeMatchingContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedRangeMatchingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,98 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.hibernate.search.query.dsl.v2.RangeMatchingContext;
-import org.hibernate.search.query.dsl.v2.RangeTerminationExcludable;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ConnectedRangeMatchingContext implements RangeMatchingContext {
-	private final QueryBuildingContext queryContext;
-	private final QueryCustomizer queryCustomizer;
-	private final RangeQueryContext rangeContext;
-	private final List<FieldContext> fieldContexts;
-	//when a varargs of fields are passed, apply the same customization for all.
-	//keep the index of the first context in this queue
-	private int firstOfContext = 0;
-
-	public ConnectedRangeMatchingContext(String fieldName,
-										 QueryCustomizer queryCustomizer,
-										 QueryBuildingContext queryContext) {
-		this.queryContext = queryContext;
-		this.queryCustomizer = queryCustomizer;
-		this.rangeContext = new RangeQueryContext();
-		this.fieldContexts = new ArrayList<FieldContext>(4);
-		this.fieldContexts.add( new FieldContext( fieldName ) );
-	}
-
-	public RangeMatchingContext andField(String field) {
-		this.fieldContexts.add( new FieldContext( field ) );
-		this.firstOfContext = fieldContexts.size() - 1;
-		return this;
-	}
-
-	public <T> FromRangeContext<T> from(T from) {
-		rangeContext.setFrom( from );
-		return new ConnectedFromRangeContext<T>(this);
-	}
-
-	static class ConnectedFromRangeContext<T> implements FromRangeContext<T> {
-		private ConnectedRangeMatchingContext mother;
-
-		ConnectedFromRangeContext(ConnectedRangeMatchingContext mother) {
-			this.mother = mother;
-		}
-
-		public RangeTerminationExcludable to(T to) {
-			mother.rangeContext.setTo(to);
-			return new ConnectedMultiFieldsRangeQueryBuilder(
-					mother.rangeContext,
-					mother.queryCustomizer,
-					mother.fieldContexts,
-					mother.queryContext);
-		}
-
-		public FromRangeContext<T> excludeLimit() {
-			mother.rangeContext.setExcludeFrom( true );
-			return this;
-		}
-	}
-
-	public RangeTerminationExcludable below(Object below) {
-		rangeContext.setTo( below );
-		return new ConnectedMultiFieldsRangeQueryBuilder( rangeContext, queryCustomizer, fieldContexts, queryContext);
-	}
-
-	public RangeTerminationExcludable above(Object above) {
-		rangeContext.setFrom( above );
-		return new ConnectedMultiFieldsRangeQueryBuilder( rangeContext, queryCustomizer, fieldContexts, queryContext);
-	}
-
-	public RangeMatchingContext boostedTo(float boost) {
-		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
-			fieldContext.getFieldCustomizer().boostedTo( boost );
-		}
-		return this;
-	}
-
-	private List<FieldContext> getCurrentFieldContexts() {
-		return fieldContexts.subList( firstOfContext, fieldContexts.size() );
-	}
-
-	public RangeMatchingContext ignoreAnalyzer() {
-		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
-			fieldContext.setIgnoreAnalyzer( true );
-		}
-		return this;
-	}
-
-	public RangeMatchingContext ignoreFieldBridge() {
-		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
-			fieldContext.setIgnoreFieldBridge( true );
-		}
-		return this;
-	}
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedTermContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedTermContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedTermContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,54 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import org.apache.lucene.search.Filter;
-
-import org.hibernate.search.query.dsl.v2.FuzzyContext;
-import org.hibernate.search.query.dsl.v2.TermContext;
-import org.hibernate.search.query.dsl.v2.TermMatchingContext;
-import org.hibernate.search.query.dsl.v2.WildcardContext;
-
-/**
- * @author Emmanuel Bernard
- */
-class ConnectedTermContext implements TermContext {
-	private final QueryBuildingContext queryContext;
-	private final QueryCustomizer queryCustomizer;
-	private final TermQueryContext termContext;
-
-	public ConnectedTermContext(QueryBuildingContext queryContext) {
-		this.queryContext = queryContext;
-		this.queryCustomizer = new QueryCustomizer();
-		this.termContext = new TermQueryContext( TermQueryContext.Approximation.EXACT);
-	}
-
-	public TermMatchingContext onField(String field) {
-		return new ConnectedTermMatchingContext( termContext, field, queryCustomizer, queryContext);
-	}
-
-	public TermMatchingContext onFields(String... fields) {
-		return new ConnectedTermMatchingContext( termContext, fields, queryCustomizer, queryContext);
-	}
-
-	public FuzzyContext fuzzy() {
-		return new ConnectedFuzzyContext( queryCustomizer, queryContext );
-	}
-
-	public WildcardContext wildcard() {
-		return new ConnectedWildcardContext(queryCustomizer, queryContext);
-	}
-
-	public ConnectedTermContext boostedTo(float boost) {
-		queryCustomizer.boostedTo( boost );
-		return this;
-	}
-
-	public ConnectedTermContext withConstantScore() {
-		queryCustomizer.withConstantScore();
-		return this;
-	}
-
-	public ConnectedTermContext filteredBy(Filter filter) {
-		queryCustomizer.filteredBy(filter);
-		return this;
-	}
-}

Deleted: 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-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedTermMatchingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,75 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.hibernate.search.query.dsl.v2.TermMatchingContext;
-import org.hibernate.search.query.dsl.v2.TermTermination;
-
-/**
-* @author Emmanuel Bernard
-*/
-public class ConnectedTermMatchingContext implements TermMatchingContext {
-	private final QueryBuildingContext queryContext;
-	private final QueryCustomizer queryCustomizer;
-	private final TermQueryContext termContext;
-	private final List<FieldContext> fieldContexts;
-	//when a varargs of fields are passed, apply the same customization for all.
-	//keep the index of the first context in this queue
-	private int firstOfContext = 0;
-
-	public ConnectedTermMatchingContext(TermQueryContext termContext,
-			String field, QueryCustomizer queryCustomizer, QueryBuildingContext queryContext) {
-		this.queryContext = queryContext;
-		this.queryCustomizer = queryCustomizer;
-		this.termContext = termContext;
-		this.fieldContexts = new ArrayList<FieldContext>(4);
-		this.fieldContexts.add( new FieldContext( field ) );
-	}
-
-	public ConnectedTermMatchingContext(TermQueryContext termContext,
-			String[] fields, QueryCustomizer queryCustomizer, QueryBuildingContext queryContext) {
-		this.queryContext = queryContext;
-		this.queryCustomizer = queryCustomizer;
-		this.termContext = termContext;
-		this.fieldContexts = new ArrayList<FieldContext>(fields.length);
-		for (String field : fields) {
-			this.fieldContexts.add( new FieldContext( field ) );
-		}
-	}
-
-	public TermTermination matching(Object value) {
-		return new ConnectedMultiFieldsTermQueryBuilder( termContext, value, fieldContexts, queryCustomizer, queryContext);
-	}
-
-	public TermMatchingContext andField(String field) {
-		this.fieldContexts.add( new FieldContext( field ) );
-		this.firstOfContext = fieldContexts.size() - 1;
-		return this;
-	}
-
-	public TermMatchingContext boostedTo(float boost) {
-		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
-			fieldContext.getFieldCustomizer().boostedTo( boost );
-		}
-		return this;
-	}
-
-	private List<FieldContext> getCurrentFieldContexts() {
-		return fieldContexts.subList( firstOfContext, fieldContexts.size() );
-	}
-
-	public TermMatchingContext ignoreAnalyzer() {
-		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
-			fieldContext.setIgnoreAnalyzer( true );
-		}
-		return this;
-	}
-
-	public TermMatchingContext ignoreFieldBridge() {
-		for ( FieldContext fieldContext : getCurrentFieldContexts() ) {
-			fieldContext.setIgnoreFieldBridge( true );
-		}
-		return this;
-	}
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedWildcardContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedWildcardContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/ConnectedWildcardContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,40 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import org.apache.lucene.search.Filter;
-
-import org.hibernate.search.query.dsl.v2.TermMatchingContext;
-import org.hibernate.search.query.dsl.v2.WildcardContext;
-
-/**
- * @author Emmanuel Bernard
- */
-class ConnectedWildcardContext implements WildcardContext {
-	private final QueryBuildingContext queryContext;
-	private final QueryCustomizer queryCustomizer;
-	private final TermQueryContext termContext;
-
-	public ConnectedWildcardContext(QueryCustomizer queryCustomizer, QueryBuildingContext queryContext) {
-		this.queryContext = queryContext;
-		this.queryCustomizer = queryCustomizer;
-		this.termContext = new TermQueryContext(TermQueryContext.Approximation.WILDCARD);
-	}
-
-	public TermMatchingContext onField(String field) {
-		return new ConnectedTermMatchingContext( termContext, field, queryCustomizer, queryContext);
-	}
-
-	public WildcardContext boostedTo(float boost) {
-		queryCustomizer.boostedTo( boost );
-		return this;
-	}
-
-	public WildcardContext withConstantScore() {
-		queryCustomizer.withConstantScore();
-		return this;
-	}
-
-	public WildcardContext filteredBy(Filter filter) {
-		queryCustomizer.filteredBy(filter);
-		return this;
-	}
-}
\ No newline at end of file

Deleted: 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	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/FieldContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,42 +0,0 @@
-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 boolean ignoreAnalyzer;
-	private final QueryCustomizer fieldCustomizer;
-	private boolean ignoreFieldBridge;
-
-	public FieldContext(String field) {
-		this.field = field;
-		this.fieldCustomizer = new QueryCustomizer();
-	}
-
-	public String getField() {
-		return field;
-	}
-
-	public boolean isIgnoreAnalyzer() {
-		return ignoreAnalyzer;
-	}
-
-	public void setIgnoreAnalyzer(boolean ignoreAnalyzer) {
-		this.ignoreAnalyzer = ignoreAnalyzer;
-	}
-
-	public QueryCustomizer getFieldCustomizer() {
-		return fieldCustomizer;
-	}
-
-	public boolean isIgnoreFieldBridge() {
-		return ignoreFieldBridge;
-	}
-
-	public void setIgnoreFieldBridge(boolean ignoreFieldBridge) {
-		this.ignoreFieldBridge = ignoreFieldBridge;
-	}
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/Helper.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/Helper.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/Helper.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,77 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.analysis.TokenStream;
-import org.apache.lucene.analysis.tokenattributes.TermAttribute;
-
-import org.hibernate.annotations.common.AssertionFailure;
-import org.hibernate.search.SearchException;
-import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
-import org.hibernate.search.engine.SearchFactoryImplementor;
-
-/**
- * @author Emmanuel Bernard
- */
-class Helper {
-	/**
-	 * return the analyzed value for a given field. If several terms are created, an exception is raised.
-	 */
-	static String getAnalyzedTerm(String fieldName, String value, String name, Analyzer queryAnalyzer, FieldContext fieldContext) {
-		if ( fieldContext.isIgnoreAnalyzer() ) return value;
-		
-		try {
-			final List<String> termsFromText = getAllTermsFromText(
-					fieldName, value.toString(), queryAnalyzer
-			);
-			if (termsFromText.size() > 1) {
-				StringBuilder error = new StringBuilder( "The ")
-						.append( name )
-						.append( " parameter leads to several terms when analyzed: " );
-				for ( String term : termsFromText ) {
-					error.append( term ).append( ", " );
-				}
-				final int length = error.length();
-				throw new SearchException( error.delete( length - 1, length ).toString() );
-			}
-			return termsFromText.size() == 0 ? null : termsFromText.get( 0 );
-		}
-		catch ( IOException e ) {
-			throw new AssertionFailure("IO exception while reading String stream??", e);
-		}
-	}
-
-	static List<String> getAllTermsFromText(String fieldName, String localText, Analyzer analyzer) throws IOException {
-		List<String> terms = new ArrayList<String>();
-
-		Reader reader = new StringReader(localText);
-		TokenStream stream = analyzer.reusableTokenStream( fieldName, reader);
-		TermAttribute attribute = (TermAttribute) stream.addAttribute( TermAttribute.class );
-		stream.reset();
-
-		while ( stream.incrementToken() ) {
-			if ( attribute.termLength() > 0 ) {
-				String term = attribute.term();
-				terms.add( term );
-			}
-		}
-		stream.end();
-		stream.close();
-		return terms;
-	}
-
-	static DocumentBuilderIndexedEntity<?> getDocumentBuilder(QueryBuildingContext queryContext) {
-		final SearchFactoryImplementor factory = queryContext.getFactory();
-		final Class<?> type = queryContext.getEntityType();
-		DocumentBuilderIndexedEntity<?> builder = factory.getDocumentBuilderIndexedEntity( type );
-		if ( builder == null ) {
-			throw new AssertionFailure( "Class in not indexed: " + type );
-		}
-		return builder;
-	}
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/PhraseQueryContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/PhraseQueryContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/PhraseQueryContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,25 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-/**
- * @author Emmanuel Bernard
- */
-public class PhraseQueryContext {
-	private int slop = 0;
-	private String sentence;
-
-	public int getSlop() {
-		return slop;
-	}
-
-	public void setSlop(int slop) {
-		this.slop = slop;
-	}
-
-	public String getSentence() {
-		return sentence;
-	}
-
-	public void setSentence(String sentence) {
-		this.sentence = sentence;
-	}
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/QueryBuildingContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/QueryBuildingContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/QueryBuildingContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,34 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import org.apache.lucene.analysis.Analyzer;
-
-import org.hibernate.search.engine.SearchFactoryImplementor;
-
-/**
- * Keep the query builder contextual information
- * 
- * @author Emmanuel Bernard
- */
-public class QueryBuildingContext {
-	private final SearchFactoryImplementor factory;
-	private final Analyzer queryAnalyzer;
-	private final Class<?> entityType;
-
-	public QueryBuildingContext(SearchFactoryImplementor factory, Analyzer queryAnalyzer, Class<?> entityType) {
-		this.factory = factory;
-		this.queryAnalyzer = queryAnalyzer;
-		this.entityType = entityType;
-	}
-
-	public SearchFactoryImplementor getFactory() {
-		return factory;
-	}
-
-	public Analyzer getQueryAnalyzer() {
-		return queryAnalyzer;
-	}
-
-	public Class<?> getEntityType() {
-		return entityType;
-	}
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/QueryCustomizer.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/QueryCustomizer.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/QueryCustomizer.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,56 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-import org.apache.lucene.search.ConstantScoreQuery;
-import org.apache.lucene.search.Filter;
-import org.apache.lucene.search.FilteredQuery;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.QueryFilter;
-import org.apache.lucene.search.QueryWrapperFilter;
-
-import org.hibernate.annotations.common.AssertionFailure;
-import org.hibernate.search.query.dsl.v2.QueryCustomization;
-
-/**
- * @author Emmanuel Bernard
- */
-class QueryCustomizer implements QueryCustomization<QueryCustomizer> {
-	private float boost = 1f;
-	private boolean constantScore;
-	private Query wrappedQuery;
-	private Filter filter;
-
-	public QueryCustomizer boostedTo(float boost) {
-		this.boost = boost * this.boost;
-		return this;
-	}
-
-	public QueryCustomizer withConstantScore() {
-		constantScore = true;
-		return this;
-	}
-
-	public QueryCustomizer filteredBy(Filter filter) {
-		this.filter = filter;
-		return this;
-	}
-
-	public QueryCustomizer setWrappedQuery(Query wrappedQuery) {
-		this.wrappedQuery = wrappedQuery;
-		return this;
-	}
-
-	public Query createQuery() {
-		Query finalQuery = wrappedQuery;
-		if (wrappedQuery == null) {
-			throw new AssertionFailure( "wrapped query not set" );
-		}
-		finalQuery.setBoost( boost * finalQuery.getBoost() );
-		if (filter != null) {
-			finalQuery = new FilteredQuery(finalQuery, filter);
-		}
-		if ( constantScore ) {
-			finalQuery = new ConstantScoreQuery( new QueryWrapperFilter( finalQuery ) );
-		}
-		return finalQuery;
-	}
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/RangeQueryContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/RangeQueryContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/RangeQueryContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,44 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-/**
- * @author Emmanuel Bernard
- */
-public class RangeQueryContext {
-	//RANGE
-	private Object from;
-	private Object to;
-	private boolean excludeFrom;
-	private boolean excludeTo;
-
-	public Object getFrom() {
-		return from;
-	}
-
-	public void setFrom(Object from) {
-		this.from = from;
-	}
-
-	public Object getTo() {
-		return to;
-	}
-
-	public void setTo(Object to) {
-		this.to = to;
-	}
-
-	public boolean isExcludeFrom() {
-		return excludeFrom;
-	}
-
-	public void setExcludeFrom(boolean excludeFrom) {
-		this.excludeFrom = excludeFrom;
-	}
-
-	public boolean isExcludeTo() {
-		return excludeTo;
-	}
-
-	public void setExcludeTo(boolean excludeTo) {
-		this.excludeTo = excludeTo;
-	}
-}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/TermQueryContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/TermQueryContext.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/dsl/v2/impl/TermQueryContext.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -1,43 +0,0 @@
-package org.hibernate.search.query.dsl.v2.impl;
-
-/**
-* @author Emmanuel Bernard
-*/
-class TermQueryContext {
-	private final Approximation approximation;
-	//FUZZY
-	private float threshold = .5f;
-
-	//WILDCARD
-	private int prefixLength = 0;
-
-	public TermQueryContext(Approximation approximation) {
-		this.approximation = approximation;
-	}
-
-	public void setThreshold(float threshold) {
-		this.threshold = threshold;
-	}
-
-	public void setPrefixLength(int prefixLength) {
-		this.prefixLength = prefixLength;
-	}
-
-	public Approximation getApproximation() {
-		return approximation;
-	}
-
-	public float getThreshold() {
-		return threshold;
-	}
-
-	public int getPrefixLength() {
-		return prefixLength;
-	}
-
-	public static enum Approximation {
-		EXACT,
-		WILDCARD,
-		FUZZY
-	}
-}

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-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/dsl/DSLTest.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -23,7 +23,7 @@
 import org.hibernate.search.Search;
 import org.hibernate.search.annotations.Factory;
 import org.hibernate.search.cfg.SearchMapping;
-import org.hibernate.search.query.dsl.v2.QueryBuilder;
+import org.hibernate.search.query.dsl.QueryBuilder;
 import org.hibernate.search.test.SearchTestCase;
 
 /**

Modified: search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/JBossTSTest.java
===================================================================
--- search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/JBossTSTest.java	2010-08-23 17:51:26 UTC (rev 20232)
+++ search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/JBossTSTest.java	2010-08-23 17:55:53 UTC (rev 20233)
@@ -25,7 +25,7 @@
 import org.hibernate.ejb.HibernatePersistence;
 import org.hibernate.search.jpa.FullTextEntityManager;
 import org.hibernate.search.jpa.Search;
-import org.hibernate.search.query.dsl.v2.QueryBuilder;
+import org.hibernate.search.query.dsl.QueryBuilder;
 import org.hibernate.search.test.integration.jbossjta.infra.JBossTADataSourceBuilder;
 import org.hibernate.search.test.integration.jbossjta.infra.JBossTSStandaloneTransactionManagerLookup;
 import org.hibernate.search.test.integration.jbossjta.infra.PersistenceUnitInfoBuilder;



More information about the hibernate-commits mailing list