Skip to content

Commit

Permalink
Merge pull request #7379 from yrodiere/hsearch-6-beta5
Browse files Browse the repository at this point in the history
Upgrade to Hibernate Search 6.0.0.Beta5
  • Loading branch information
gsmet authored Feb 24, 2020
2 parents 4192aa5 + 7327c11 commit dd43758
Show file tree
Hide file tree
Showing 9 changed files with 237 additions and 73 deletions.
4 changes: 2 additions & 2 deletions bom/runtime/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,12 @@
<classmate.version>1.3.4</classmate.version>
<hibernate-orm.version>5.4.12.Final</hibernate-orm.version>
<hibernate-validator.version>6.1.2.Final</hibernate-validator.version>
<hibernate-search.version>6.0.0.Beta4</hibernate-search.version>
<hibernate-search.version>6.0.0.Beta5</hibernate-search.version>
<narayana.version>5.10.0.Final</narayana.version>
<jboss-transaction-api_1.2_spec.version>1.1.1.Final</jboss-transaction-api_1.2_spec.version>
<agroal.version>1.7</agroal.version>
<jboss-transaction-spi.version>7.6.0.Final</jboss-transaction-spi.version>
<elasticsearch-rest-client.version>7.5.0</elasticsearch-rest-client.version>
<elasticsearch-rest-client.version>7.6.0</elasticsearch-rest-client.version>
<rxjava1.version>1.3.8</rxjava1.version>
<rxjava.version>2.2.18</rxjava.version>
<wildfly.openssl.version>1.0.6.Final</wildfly.openssl.version>
Expand Down
2 changes: 1 addition & 1 deletion build-parent/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<properties>
<!-- Maven plugin versions -->
<elasticsearch-maven-plugin.version>6.15</elasticsearch-maven-plugin.version>
<elasticsearch-server.version>7.5.0</elasticsearch-server.version>
<elasticsearch-server.version>7.6.0</elasticsearch-server.version>
<scala-maven-plugin.version>4.1.1</scala-maven-plugin.version>

<!-- These properties are needed in order for them to be resolvable by the generated projects -->
Expand Down
14 changes: 9 additions & 5 deletions docs/src/main/asciidoc/hibernate-search-elasticsearch.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,7 @@ In our existing `LibraryResource`, we just need to inject the following methods
@QueryParam Optional<Integer> size) {
return Search.session(em) // <5>
.search(Author.class) // <6>
.predicate(f ->
.where(f ->
pattern == null || pattern.trim().isEmpty() ?
f.matchAll() : // <7>
f.simpleQueryString()
Expand All @@ -510,8 +510,11 @@ the mass indexer should then only be used when you change your indexing configur

[NOTE]
====
Hibernate Search supports a significant part of the Elasticsearch predicates (match, range, nested, phrase, spatial...).
Feel free to explore the DSL by using autocompletion.
The Hibernate Search DSL supports a significant subset of the Elasticsearch predicates (match, range, nested, phrase, spatial...).
Feel free to explore the DSL using autocompletion.
When that's not enough, you can always fall back to
[defining a predicate using JSON directly](https://docs.jboss.org/hibernate/search/6.0/reference/en-US/html_single/#search-dsl-predicate-extensions-elasticsearch-from-json).
====

== Configuring the application
Expand All @@ -536,7 +539,7 @@ quarkus.hibernate-search.elasticsearch.version=7 <5>
quarkus.hibernate-search.elasticsearch.analysis.configurer=org.acme.hibernate.search.elasticsearch.config.AnalysisConfigurer <6>
quarkus.hibernate-search.elasticsearch.index-defaults.lifecycle.strategy=drop-and-create <7>
quarkus.hibernate-search.elasticsearch.index-defaults.lifecycle.required-status=yellow <8>
quarkus.hibernate-search.automatic-indexing.synchronization.strategy=searchable <9>
quarkus.hibernate-search.automatic-indexing.synchronization.strategy=sync <9>
----
<1> We won't use SSL so we disable it to have a more compact native executable.
<2> Let's create a PostgreSQL datasource.
Expand All @@ -551,7 +554,8 @@ Since the mapping is created at build time to reduce startup time, Hibernate Sea
This is for testing purposes with the Elasticsearch Docker container.
It should not be used in production.
<9> This means that we wait for the entities to be searchable before considering a write complete.
While, on a production setup, the `committed` default might be a suitable value, using `searchable` is especially important when testing as you need the entities to be searchable immediately.
On a production setup, the `write-sync` default will provide better performance.
Using `sync` is especially important when testing as you need the entities to be searchable immediately.

[TIP]
For more information about the Hibernate Search extension configuration please refer to the <<configuration-reference, Configuration Reference>>.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,28 @@
import java.util.Arrays;
import java.util.List;

import org.hibernate.search.backend.elasticsearch.analysis.model.esnative.impl.AbstractCompositeAnalysisDefinition;
import org.hibernate.search.backend.elasticsearch.analysis.model.esnative.impl.AnalysisDefinition;
import org.hibernate.search.backend.elasticsearch.analysis.model.esnative.impl.AnalysisDefinitionJsonAdapterFactory;
import org.hibernate.search.backend.elasticsearch.analysis.model.esnative.impl.AnalyzerDefinition;
import org.hibernate.search.backend.elasticsearch.analysis.model.esnative.impl.AnalyzerDefinitionJsonAdapterFactory;
import org.hibernate.search.backend.elasticsearch.analysis.model.esnative.impl.CharFilterDefinition;
import org.hibernate.search.backend.elasticsearch.analysis.model.esnative.impl.NormalizerDefinition;
import org.hibernate.search.backend.elasticsearch.analysis.model.esnative.impl.NormalizerDefinitionJsonAdapterFactory;
import org.hibernate.search.backend.elasticsearch.analysis.model.esnative.impl.TokenFilterDefinition;
import org.hibernate.search.backend.elasticsearch.analysis.model.esnative.impl.TokenizerDefinition;
import org.hibernate.search.backend.elasticsearch.document.model.esnative.impl.AbstractTypeMapping;
import org.hibernate.search.backend.elasticsearch.document.model.esnative.impl.AbstractTypeMappingJsonAdapterFactory;
import org.hibernate.search.backend.elasticsearch.document.model.esnative.impl.DynamicType;
import org.hibernate.search.backend.elasticsearch.document.model.esnative.impl.ElasticsearchFormatJsonAdapter;
import org.hibernate.search.backend.elasticsearch.document.model.esnative.impl.ElasticsearchRoutingTypeJsonAdapter;
import org.hibernate.search.backend.elasticsearch.document.model.esnative.impl.PropertyMapping;
import org.hibernate.search.backend.elasticsearch.document.model.esnative.impl.PropertyMappingJsonAdapterFactory;
import org.hibernate.search.backend.elasticsearch.document.model.esnative.impl.RootTypeMapping;
import org.hibernate.search.backend.elasticsearch.document.model.esnative.impl.RootTypeMappingJsonAdapterFactory;
import org.hibernate.search.backend.elasticsearch.document.model.esnative.impl.RoutingType;
import org.hibernate.search.backend.elasticsearch.index.settings.esnative.impl.Analysis;
import org.hibernate.search.backend.elasticsearch.index.settings.esnative.impl.IndexSettings;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.aliases.impl.IndexAliasDefinition;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.aliases.impl.IndexAliasDefinitionJsonAdapterFactory;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.analysis.impl.AnalysisDefinition;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.analysis.impl.AnalysisDefinitionJsonAdapterFactory;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.analysis.impl.AnalyzerDefinition;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.analysis.impl.AnalyzerDefinitionJsonAdapterFactory;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.analysis.impl.CharFilterDefinition;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.analysis.impl.NormalizerDefinition;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.analysis.impl.NormalizerDefinitionJsonAdapterFactory;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.analysis.impl.TokenFilterDefinition;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.analysis.impl.TokenizerDefinition;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.mapping.impl.AbstractTypeMapping;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.mapping.impl.DynamicType;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.mapping.impl.FormatJsonAdapter;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.mapping.impl.PropertyMapping;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.mapping.impl.PropertyMappingJsonAdapterFactory;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.mapping.impl.RootTypeMapping;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.mapping.impl.RootTypeMappingJsonAdapterFactory;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.mapping.impl.RoutingType;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.mapping.impl.RoutingTypeJsonAdapter;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.settings.impl.Analysis;
import org.hibernate.search.backend.elasticsearch.lowlevel.index.settings.impl.IndexSettings;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.TypeMapping;
import org.jboss.jandex.DotName;
Expand All @@ -37,27 +37,27 @@ class HibernateSearchClasses {
org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.PropertyMapping.class.getName());
static final DotName TYPE_MAPPING_META_ANNOTATION = DotName.createSimple(TypeMapping.class.getName());

static final List<DotName> SCHEMA_MAPPING_CLASSES = Arrays.asList(
DotName.createSimple(AbstractTypeMapping.class.getName()),
DotName.createSimple(AbstractTypeMappingJsonAdapterFactory.class.getName()),
DotName.createSimple(DynamicType.class.getName()),
DotName.createSimple(ElasticsearchFormatJsonAdapter.class.getName()),
DotName.createSimple(ElasticsearchRoutingTypeJsonAdapter.class.getName()),
DotName.createSimple(PropertyMapping.class.getName()),
DotName.createSimple(PropertyMappingJsonAdapterFactory.class.getName()),
DotName.createSimple(RootTypeMapping.class.getName()),
DotName.createSimple(RootTypeMappingJsonAdapterFactory.class.getName()),
DotName.createSimple(RoutingType.class.getName()),
DotName.createSimple(IndexSettings.class.getName()),
DotName.createSimple(Analysis.class.getName()),
DotName.createSimple(AnalysisDefinition.class.getName()),
DotName.createSimple(AbstractCompositeAnalysisDefinition.class.getName()),
DotName.createSimple(AnalyzerDefinition.class.getName()),
DotName.createSimple(AnalyzerDefinitionJsonAdapterFactory.class.getName()),
DotName.createSimple(NormalizerDefinition.class.getName()),
DotName.createSimple(NormalizerDefinitionJsonAdapterFactory.class.getName()),
DotName.createSimple(TokenizerDefinition.class.getName()),
DotName.createSimple(TokenFilterDefinition.class.getName()),
DotName.createSimple(CharFilterDefinition.class.getName()),
DotName.createSimple(AnalysisDefinitionJsonAdapterFactory.class.getName()));
static final List<Class<?>> GSON_CLASSES = Arrays.asList(
AbstractTypeMapping.class,
DynamicType.class,
FormatJsonAdapter.class,
RoutingTypeJsonAdapter.class,
PropertyMapping.class,
PropertyMappingJsonAdapterFactory.class,
RootTypeMapping.class,
RootTypeMappingJsonAdapterFactory.class,
RoutingType.class,
IndexSettings.class,
Analysis.class,
AnalysisDefinition.class,
AnalyzerDefinition.class,
AnalyzerDefinitionJsonAdapterFactory.class,
NormalizerDefinition.class,
NormalizerDefinitionJsonAdapterFactory.class,
TokenizerDefinition.class,
TokenFilterDefinition.class,
CharFilterDefinition.class,
AnalysisDefinitionJsonAdapterFactory.class,
IndexAliasDefinition.class,
IndexAliasDefinitionJsonAdapterFactory.class);
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
package io.quarkus.hibernate.search.elasticsearch;

import static io.quarkus.hibernate.search.elasticsearch.HibernateSearchClasses.GSON_CLASSES;
import static io.quarkus.hibernate.search.elasticsearch.HibernateSearchClasses.INDEXED;
import static io.quarkus.hibernate.search.elasticsearch.HibernateSearchClasses.PROPERTY_MAPPING_META_ANNOTATION;
import static io.quarkus.hibernate.search.elasticsearch.HibernateSearchClasses.SCHEMA_MAPPING_CLASSES;
import static io.quarkus.hibernate.search.elasticsearch.HibernateSearchClasses.TYPE_MAPPING_META_ANNOTATION;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Stream;

import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.AnnotationTarget;
Expand Down Expand Up @@ -177,9 +175,15 @@ private void registerReflection(IndexView index, BuildProducer<ReflectiveClassBu
}
}

String[] reflectiveClasses = Stream
.of(reflectiveClassCollector.stream(), SCHEMA_MAPPING_CLASSES.stream())
.flatMap(Function.identity()).map(c -> c.toString()).toArray(String[]::new);
for (Class<?> gsonClass : GSON_CLASSES) {
Class<?> currentClass = gsonClass;
while (currentClass != Object.class) {
reflectiveClassCollector.add(DotName.createSimple(currentClass.getName()));
currentClass = currentClass.getSuperclass();
}
}

String[] reflectiveClasses = reflectiveClassCollector.stream().map(DotName::toString).toArray(String[]::new);
reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, reflectiveClasses));

for (Type reflectiveHierarchyType : reflectiveHierarchyCollector) {
Expand All @@ -204,6 +208,7 @@ private static void addReflectiveClass(IndexView index, Set<DotName> reflectiveC

Type superClassType = classInfo.superClassType();
while (superClassType != null && !superClassType.name().toString().equals("java.lang.Object")) {
reflectiveClassCollector.add(superClassType.name());
if (superClassType instanceof ClassType) {
superClassType = index.getClassByName(superClassType.name()).superClassType();
} else if (superClassType instanceof ParameterizedType) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import org.hibernate.search.backend.elasticsearch.index.IndexLifecycleStrategyName;
import org.hibernate.search.backend.elasticsearch.index.IndexStatus;
import org.hibernate.search.mapper.orm.automaticindexing.AutomaticIndexingSynchronizationStrategyName;
import org.hibernate.search.mapper.orm.automaticindexing.session.AutomaticIndexingSynchronizationStrategyNames;
import org.hibernate.search.mapper.orm.search.loading.EntityLoadingCacheLookupStrategy;
import org.hibernate.search.util.common.SearchException;
import org.hibernate.search.util.common.impl.StringHelper;
Expand Down Expand Up @@ -210,13 +210,167 @@ public static class AutomaticIndexingSynchronizationConfig {
/**
* The synchronization strategy to use when indexing automatically.
* <p>
* Defines the status for which you wait before considering the operation completed by Hibernate Search.
* Defines how complete indexing should be before resuming the application thread
* after a database transaction is committed.
* <p>
* Use {@code queued} or {@code committed} in production environments.
* {@code searchable} is useful in integration tests.
* Available values:
* <table>
* <thead>
* <tr>
* <th rowspan="2">
* <p>
* Strategy
* </p>
* </th>
* <th colspan="3">
* <p>
* Guarantees when the application thread resumes
* </p>
* </th>
* <th rowspan="2">
* <p>
* Throughput
* </p>
* </th>
* </tr>
* <tr>
* <th>
* <p>
* Changes applied
* </p>
* </th>
* <th>
* <p>
* Changes safe from crash/power loss
* </p>
* </th>
* <th>
* <p>
* Changes visible on search
* </p>
* </th>
* </tr>
* </thead>
* <tbody>
* <tr>
* <td>
* <p>
* <code>{@value AutomaticIndexingSynchronizationStrategyNames#ASYNC}</code>
* </p>
* </td>
* <td>
* <p>
* No guarantee
* </p>
* </td>
* <td>
* <p>
* No guarantee
* </p>
* </td>
* <td>
* <p>
* No guarantee
* </p>
* </td>
* <td>
* <p>
* Best
* </p>
* </td>
* </tr>
* <tr>
* <td>
* <p>
* <code>{@value AutomaticIndexingSynchronizationStrategyNames#WRITE_SYNC}</code> (<strong>default</strong>)
* </p>
* </td>
* <td>
* <p>
* Guaranteed
* </p>
* </td>
* <td>
* <p>
* Guaranteed
* </p>
* </td>
* <td>
* <p>
* No guarantee
* </p>
* </td>
* <td>
* <p>
* Medium
* </p>
* </td>
* </tr>
* <tr>
* <td>
* <p>
* <code>{@value AutomaticIndexingSynchronizationStrategyNames#READ_SYNC}</code>
* </p>
* </td>
* <td>
* <p>
* Guaranteed
* </p>
* </td>
* <td>
* <p>
* No guarantee
* </p>
* </td>
* <td>
* <p>
* Guaranteed
* </p>
* </td>
* <td>
* <p>
* Medium to worst
* </p>
* </td>
* </tr>
* <tr>
* <td>
* <p>
* <code>{@value AutomaticIndexingSynchronizationStrategyNames#SYNC}</code>
* </p>
* </td>
* <td>
* <p>
* Guaranteed
* </p>
* </td>
* <td>
* <p>
* Guaranteed
* </p>
* </td>
* <td>
* <p>
* Guaranteed
* </p>
* </td>
* <td>
* <p>
* Worst
* </p>
* </td>
* </tr>
* </tbody>
* </table>
* <p>
* See
* <a href=
* "https://docs.jboss.org/hibernate/search/6.0/reference/en-US/html_single/#mapper-orm-indexing-automatic-synchronization">this
* section of the reference documentation</a>
* for more information.
*/
@ConfigItem(defaultValue = "committed")
AutomaticIndexingSynchronizationStrategyName strategy;
@ConfigItem(defaultValue = AutomaticIndexingSynchronizationStrategyNames.WRITE_SYNC)
String strategy;
}

@ConfigGroup
Expand Down
Loading

0 comments on commit dd43758

Please sign in to comment.