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>(a)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
+ <indexBase>/< indexName ></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>(a)Indexed.index</literal>).
+ The actual source directory name being
+
<filename><sourceBase>/<source></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>(a)Indexed.index</literal>).
+ The actual source directory name being
+
<filename><sourceBase>/<source></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 { ... }
+
+@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.<indexName>.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.<indexName>.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><indexName>.0</literal> to
+ <literal><indexName>.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 =
+
+<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">
+<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"/>
+<PING timeout="1000" num_initial_members="3"/>
+<MERGE2 max_interval="30000" min_interval="10000"/>
+<FD_SOCK/>
+<FD timeout="3000" max_tries="3"/>
+<VERIFY_SUSPECT timeout="1500"/>
+<pbcast.STREAMING_STATE_TRANSFER/>
+<pbcast.FLUSH timeout="0"/>
+</config>
+
+#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|<indexname>].indexwriter.transaction.<parameter_name></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|<indexname>].indexwriter.batch.<parameter_name></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|<indexname>].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|<indexname>].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|<indexname>].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|<indexname>].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|<indexname>].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|<indexname>].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 (> 10) are best
+ for batch index creation, and smaller values (< 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|<indexname>].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|<indexname>].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|<indexname>].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.<index>.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<LuceneWork> 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;