Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade to Hibernate Search 6.0.0.Beta5 #7379

Merged
merged 4 commits into from
Feb 24, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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