1
0
mirror of synced 2026-07-05 17:50:00 +00:00

Compare commits

..

12 Commits

Author SHA1 Message Date
Christoph Strobl fa3e7741f2 Release version 6.0 RC1 (2025.1.0).
See #3171
2025-10-17 12:36:47 +02:00
Christoph Strobl e9e6da239e Prepare 6.0 RC1 (2025.1.0).
See #3171
2025-10-17 12:35:34 +02:00
Peter-Josef Meisch 923d3b413d Upgrade to Elasticsearch 9.1.5.
Original Pull Request #3182
Closes #3180
Signed-off-by: Peter-Josef Meisch <pj.meisch@sothawo.com>
2025-10-17 00:03:18 +02:00
Mark Paluch 16f3addaf6 Remove accidental org.jetbrains:annotations usage.
See spring-projects/spring-data-build#2670
2025-10-10 09:25:17 +02:00
Peter-Josef Meisch 0e1a97a27a Fix string comparison in TypeUtils.
Original Pull Request #3177
Closes #3176
Signed-off-by: Peter-Josef Meisch <pj.meisch@sothawo.com>
2025-10-03 10:48:25 +02:00
Mark Paluch df79368299 Update CI Properties.
See #3171
2025-09-26 12:01:27 +02:00
Mark Paluch 11b3cd5b3e Update GitHub Actions.
See #3171
2025-09-23 10:52:08 +02:00
Peter-Josef Meisch e06aca9594 Upgrade to Elasticsearch 9.1.4
Original Pull Request #3174
Closes #3173

Signed-off-by: Peter-Josef Meisch <pj.meisch@sothawo.com>
2025-09-21 08:33:51 +02:00
Peter-Josef Meisch 5529af8f76 Adjust test to slower performance of build machines in Jenkins
Signed-off-by: Peter-Josef Meisch <pj.meisch@sothawo.com>
2025-09-20 20:14:59 +02:00
Peter-Josef Meisch c0dd082f4e Speedup Criteria hashcode calculation
Original Pull Request #3172
Closes #3083
Signed-off-by: Peter-Josef Meisch <pj.meisch@sothawo.com>
2025-09-20 19:49:38 +02:00
Christoph Strobl 9aa65560cc After release cleanups.
See #3154
2025-09-12 12:47:16 +02:00
Christoph Strobl 560d1e9153 Prepare next development iteration.
See #3154
2025-09-12 12:47:15 +02:00
20 changed files with 230 additions and 58 deletions
+21
View File
@@ -0,0 +1,21 @@
# GitHub Actions for CodeQL Scanning
name: "CodeQL Advanced"
on:
push:
pull_request:
workflow_dispatch:
schedule:
# https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#schedule
- cron: '0 5 * * *'
permissions: read-all
jobs:
codeql-analysis-call:
permissions:
actions: read
contents: read
security-events: write
uses: spring-io/github-actions/.github/workflows/codeql-analysis.yml@1
+45
View File
@@ -0,0 +1,45 @@
# GitHub Actions to automate GitHub issues for Spring Data Project Management
name: Spring Data GitHub Issues
on:
issues:
types: [opened, edited, reopened]
issue_comment:
types: [created]
pull_request_target:
types: [opened, edited, reopened]
permissions:
contents: read
issues: write
pull-requests: write
jobs:
Inbox:
runs-on: ubuntu-latest
if: github.repository_owner == 'spring-projects' && (github.event.action == 'opened' || github.event.action == 'reopened') && github.event.pull_request == null && !contains(join(github.event.issue.labels.*.name, ', '), 'dependency-upgrade') && !contains(github.event.issue.title, 'Release ')
steps:
- name: Create or Update Issue Card
uses: actions/add-to-project@v1.0.2
with:
project-url: https://github.com/orgs/spring-projects/projects/25
github-token: ${{ secrets.GH_ISSUES_TOKEN_SPRING_DATA }}
Pull-Request:
runs-on: ubuntu-latest
if: github.repository_owner == 'spring-projects' && (github.event.action == 'opened' || github.event.action == 'reopened') && github.event.pull_request != null
steps:
- name: Create or Update Pull Request Card
uses: actions/add-to-project@v1.0.2
with:
project-url: https://github.com/orgs/spring-projects/projects/25
github-token: ${{ secrets.GH_ISSUES_TOKEN_SPRING_DATA }}
Feedback-Provided:
runs-on: ubuntu-latest
if: github.repository_owner == 'spring-projects' && github.event_name == 'issue_comment' && github.event.action == 'created' && github.actor != 'spring-projects-issues' && github.event.pull_request == null && github.event.issue.state == 'open' && contains(toJSON(github.event.issue.labels), 'waiting-for-feedback')
steps:
- name: Update Project Card
uses: actions/add-to-project@v1.0.2
with:
project-url: https://github.com/orgs/spring-projects/projects/25
github-token: ${{ secrets.GH_ISSUES_TOKEN_SPRING_DATA }}
+3 -2
View File
@@ -1,6 +1,6 @@
# Java versions
java.main.tag=24.0.1_9-jdk-noble
java.next.tag=24.0.1_9-jdk-noble
java.main.tag=25-jdk-noble
java.next.tag=25-jdk-noble
# Docker container images - standard
docker.java.main.image=library/eclipse-temurin:${java.main.tag}
@@ -14,6 +14,7 @@ docker.mongodb.8.0.version=8.0.9
# Supported versions of Redis
docker.redis.6.version=6.2.13
docker.redis.7.version=7.2.4
docker.valkey.8.version=8.1.1
# Docker environment settings
docker.java.inside.basic=-v $HOME:/tmp/jenkins-home
+13 -5
View File
@@ -5,12 +5,12 @@
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>6.0.0-M6</version>
<version>6.0.0-RC1</version>
<parent>
<groupId>org.springframework.data.build</groupId>
<artifactId>spring-data-parent</artifactId>
<version>4.0.0-M6</version>
<version>4.0.0-RC1</version>
</parent>
<name>Spring Data Elasticsearch</name>
@@ -18,11 +18,11 @@
<url>https://github.com/spring-projects/spring-data-elasticsearch</url>
<properties>
<springdata.commons>4.0.0-M6</springdata.commons>
<springdata.commons>4.0.0-RC1</springdata.commons>
<!-- version of the ElasticsearchClient -->
<elasticsearch-java>9.1.4</elasticsearch-java>
<elasticsearch-rest-client>9.1.3</elasticsearch-rest-client>
<elasticsearch-java>9.1.5</elasticsearch-java>
<elasticsearch-rest-client>9.1.5</elasticsearch-rest-client>
<hoverfly>0.20.2</hoverfly>
<log4j>2.25.1</log4j>
@@ -243,6 +243,14 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>26.0.2-1</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
@@ -6,7 +6,7 @@
* Upgarde to Spring 7
* Switch to jspecify nullability annotations
* Upgrade to Elasticsearch 9.1.3
* Upgrade to Elasticsearch 9.1.5
* Use the new Elasticsearch Rest5Client as default
@@ -6,7 +6,7 @@ The following table shows the Elasticsearch and Spring versions that are used by
[cols="^,^,^,^",options="header"]
|===
| Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework
| 2025.1 (in development) | 6.0.x | 9.1.3 | 7.0.x
| 2025.1 (in development) | 6.0.x | 9.1.5 | 7.0.x
| 2025.0 | 5.5.x | 8.18.1 | 6.2.x
| 2024.1 | 5.4.x | 8.15.5 | 6.1.x
| 2024.0 | 5.3.xfootnote:oom[Out of maintenance] | 8.13.4 | 6.1.x
@@ -27,7 +27,8 @@ import reactor.core.publisher.Mono;
import java.io.IOException;
import java.util.function.Function;
import org.jetbrains.annotations.Nullable;
import org.jspecify.annotations.Nullable;
/**
* Reactive version of {@link co.elastic.clients.elasticsearch.sql.ElasticsearchSqlClient}.
@@ -48,7 +48,6 @@ import co.elastic.clients.elasticsearch.core.search.Rescore;
import co.elastic.clients.elasticsearch.core.search.SearchRequestBody;
import co.elastic.clients.elasticsearch.core.search.SourceConfig;
import co.elastic.clients.elasticsearch.indices.*;
import co.elastic.clients.elasticsearch.indices.ExistsIndexTemplateRequest;
import co.elastic.clients.elasticsearch.indices.ExistsRequest;
import co.elastic.clients.elasticsearch.indices.update_aliases.Action;
import co.elastic.clients.elasticsearch.sql.query.SqlFormat;
@@ -77,14 +76,16 @@ import java.util.stream.Stream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.Nullable;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.RefreshPolicy;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
import org.springframework.data.elasticsearch.core.document.Document;
import org.springframework.data.elasticsearch.core.index.*;
import org.springframework.data.elasticsearch.core.index.AliasAction;
import org.springframework.data.elasticsearch.core.index.AliasActionParameters;
import org.springframework.data.elasticsearch.core.index.AliasActions;
import org.springframework.data.elasticsearch.core.index.DeleteIndexTemplateRequest;
import org.springframework.data.elasticsearch.core.index.DeleteTemplateRequest;
import org.springframework.data.elasticsearch.core.index.ExistsTemplateRequest;
@@ -310,7 +311,6 @@ class RequestConverter extends AbstractQueryProcessor {
return updateAliasRequestBuilder.build();
}
@NotNull
private Action.Builder getBuilder(AliasAction aliasAction) {
Action.Builder actionBuilder = new Action.Builder();
@@ -1897,7 +1897,6 @@ class RequestConverter extends AbstractQueryProcessor {
});
}
@NotNull
private Map<String, JsonData> getTemplateParams(Set<Map.Entry<String, Object>> query) {
Function<Map.Entry<String, Object>, String> keyMapper = Map.Entry::getKey;
Function<Map.Entry<String, Object>, JsonData> valueMapper = entry -> JsonData.of(entry.getValue(), jsonpMapper);
@@ -435,7 +435,7 @@ final class TypeUtils {
// values taken from the RHLC implementation
if (value == null) {
return -2;
} else if ("all".equals(value.toUpperCase())) {
} else if ("all".equals(value.toLowerCase())) {
return -1;
} else {
try {
@@ -23,8 +23,8 @@ import java.util.stream.Collectors;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.Nullable;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
@@ -62,7 +62,16 @@ import org.springframework.data.mapping.Parameter;
import org.springframework.data.mapping.PersistentPropertyAccessor;
import org.springframework.data.mapping.SimplePropertyHandler;
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mapping.model.*;
import org.springframework.data.mapping.model.CachingValueExpressionEvaluatorFactory;
import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
import org.springframework.data.mapping.model.EntityInstantiator;
import org.springframework.data.mapping.model.EntityInstantiators;
import org.springframework.data.mapping.model.ParameterValueProvider;
import org.springframework.data.mapping.model.PersistentEntityParameterValueProvider;
import org.springframework.data.mapping.model.PropertyValueProvider;
import org.springframework.data.mapping.model.SpELContext;
import org.springframework.data.mapping.model.ValueExpressionEvaluator;
import org.springframework.data.mapping.model.ValueExpressionParameterValueProvider;
import org.springframework.data.util.TypeInformation;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.format.datetime.DateFormatterRegistrar;
@@ -1339,7 +1348,6 @@ public class MappingElasticsearchConverter
.collect(Collectors.toList());
}
@NotNull
private String propertyToFieldName(ElasticsearchPersistentEntity<?> persistentEntity, String propertyName) {
ElasticsearchPersistentProperty persistentProperty = persistentEntity.getPersistentProperty(propertyName);
return persistentProperty != null ? persistentProperty.getFieldName() : propertyName;
@@ -61,12 +61,16 @@ public class Criteria {
private float boost = Float.NaN;
private boolean negating = false;
private final CriteriaChain criteriaChain = new CriteriaChain();
private final Set<CriteriaEntry> queryCriteriaEntries = new LinkedHashSet<>();
private final Set<CriteriaEntry> filterCriteriaEntries = new LinkedHashSet<>();
private final Set<Criteria> subCriteria = new LinkedHashSet<>();
// we cash this and recalculate when properties used in equals change
// see https://github.com/spring-projects/spring-data-elasticsearch/issues/3083
private int hashCode;
// region criteria creation
private final CriteriaChain criteriaChain = new CriteriaChain();
private final Set<CriteriaEntry> queryCriteriaEntries = new LinkedHashSet<>();
private final Set<CriteriaEntry> filterCriteriaEntries = new LinkedHashSet<>();
private final Set<Criteria> subCriteria = new LinkedHashSet<>();
// region criteria creation
/**
* @return factory method to create an and-Criteria that is not bound to a field
@@ -84,7 +88,9 @@ public class Criteria {
return new OrCriteria();
}
public Criteria() {}
public Criteria() {
recalculateHashCode();
}
/**
* Creates a new Criteria with provided field name
@@ -107,6 +113,7 @@ public class Criteria {
this.field = field;
this.criteriaChain.add(this);
recalculateHashCode();
}
/**
@@ -136,6 +143,7 @@ public class Criteria {
this.field = field;
this.criteriaChain.addAll(criteriaChain);
this.criteriaChain.add(this);
recalculateHashCode();
}
/**
@@ -189,6 +197,7 @@ public class Criteria {
*/
public Criteria not() {
this.negating = true;
recalculateHashCode();
return this;
}
@@ -207,6 +216,7 @@ public class Criteria {
Assert.isTrue(boost >= 0, "boost must not be negative");
this.boost = boost;
recalculateHashCode();
return this;
}
@@ -223,7 +233,7 @@ public class Criteria {
}
/**
* @return the set ob subCriteria
* @return the set of subCriteria
* @since 4.1
*/
public Set<Criteria> getSubCriteria() {
@@ -264,6 +274,7 @@ public class Criteria {
Assert.notNull(criteria, "Cannot chain 'null' criteria.");
this.criteriaChain.add(criteria);
recalculateHashCode();
return this;
}
@@ -278,6 +289,7 @@ public class Criteria {
Assert.notNull(criterias, "Cannot chain 'null' criterias.");
this.criteriaChain.addAll(Arrays.asList(criterias));
recalculateHashCode();
return this;
}
@@ -320,6 +332,7 @@ public class Criteria {
orCriteria.subCriteria.addAll(criteria.subCriteria);
orCriteria.boost = criteria.boost;
orCriteria.negating = criteria.isNegating();
orCriteria.recalculateHashCode();
return orCriteria;
}
@@ -335,6 +348,7 @@ public class Criteria {
Assert.notNull(criteria, "criteria must not be null");
subCriteria.add(criteria);
recalculateHashCode();
return this;
}
@@ -349,6 +363,7 @@ public class Criteria {
*/
public Criteria is(Object o) {
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.EQUALS, o));
recalculateHashCode();
return this;
}
@@ -360,6 +375,7 @@ public class Criteria {
*/
public Criteria exists() {
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.EXISTS));
recalculateHashCode();
return this;
}
@@ -378,6 +394,7 @@ public class Criteria {
}
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.BETWEEN, new Object[] { lowerBound, upperBound }));
recalculateHashCode();
return this;
}
@@ -393,6 +410,7 @@ public class Criteria {
assertNoBlankInWildcardQuery(s, false, true);
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.STARTS_WITH, s));
recalculateHashCode();
return this;
}
@@ -409,6 +427,7 @@ public class Criteria {
assertNoBlankInWildcardQuery(s, true, true);
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.CONTAINS, s));
recalculateHashCode();
return this;
}
@@ -425,6 +444,7 @@ public class Criteria {
assertNoBlankInWildcardQuery(s, true, false);
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.ENDS_WITH, s));
recalculateHashCode();
return this;
}
@@ -452,6 +472,7 @@ public class Criteria {
Assert.notNull(values, "Collection of 'in' values must not be null");
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.IN, values));
recalculateHashCode();
return this;
}
@@ -478,6 +499,7 @@ public class Criteria {
Assert.notNull(values, "Collection of 'NotIn' values must not be null");
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.NOT_IN, values));
recalculateHashCode();
return this;
}
@@ -490,6 +512,7 @@ public class Criteria {
*/
public Criteria expression(String s) {
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.EXPRESSION, s));
recalculateHashCode();
return this;
}
@@ -501,6 +524,7 @@ public class Criteria {
*/
public Criteria fuzzy(String s) {
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.FUZZY, s));
recalculateHashCode();
return this;
}
@@ -515,6 +539,7 @@ public class Criteria {
Assert.notNull(upperBound, "upperBound must not be null");
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.LESS_EQUAL, upperBound));
recalculateHashCode();
return this;
}
@@ -529,6 +554,7 @@ public class Criteria {
Assert.notNull(upperBound, "upperBound must not be null");
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.LESS, upperBound));
recalculateHashCode();
return this;
}
@@ -543,6 +569,7 @@ public class Criteria {
Assert.notNull(lowerBound, "lowerBound must not be null");
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.GREATER_EQUAL, lowerBound));
recalculateHashCode();
return this;
}
@@ -557,6 +584,7 @@ public class Criteria {
Assert.notNull(lowerBound, "lowerBound must not be null");
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.GREATER, lowerBound));
recalculateHashCode();
return this;
}
@@ -573,6 +601,7 @@ public class Criteria {
Assert.notNull(value, "value must not be null");
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.MATCHES, value));
recalculateHashCode();
return this;
}
@@ -589,6 +618,7 @@ public class Criteria {
Assert.notNull(value, "value must not be null");
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.MATCHES_ALL, value));
recalculateHashCode();
return this;
}
@@ -601,6 +631,7 @@ public class Criteria {
public Criteria empty() {
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.EMPTY));
recalculateHashCode();
return this;
}
@@ -613,6 +644,7 @@ public class Criteria {
public Criteria notEmpty() {
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.NOT_EMPTY));
recalculateHashCode();
return this;
}
@@ -628,6 +660,7 @@ public class Criteria {
Assert.notNull(value, "value must not be null");
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.REGEXP, value));
recalculateHashCode();
return this;
}
@@ -646,6 +679,7 @@ public class Criteria {
Assert.notNull(boundingBox, "boundingBox value for boundedBy criteria must not be null");
filterCriteriaEntries.add(new CriteriaEntry(OperationKey.BBOX, new Object[] { boundingBox }));
recalculateHashCode();
return this;
}
@@ -662,6 +696,7 @@ public class Criteria {
filterCriteriaEntries
.add(new CriteriaEntry(OperationKey.BBOX, new Object[] { boundingBox.getFirst(), boundingBox.getSecond() }));
recalculateHashCode();
return this;
}
@@ -679,6 +714,7 @@ public class Criteria {
filterCriteriaEntries
.add(new CriteriaEntry(OperationKey.BBOX, new Object[] { topLeftGeohash, bottomRightGeohash }));
recalculateHashCode();
return this;
}
@@ -695,6 +731,7 @@ public class Criteria {
Assert.notNull(bottomRightPoint, "bottomRightPoint must not be null");
filterCriteriaEntries.add(new CriteriaEntry(OperationKey.BBOX, new Object[] { topLeftPoint, bottomRightPoint }));
recalculateHashCode();
return this;
}
@@ -712,6 +749,7 @@ public class Criteria {
filterCriteriaEntries.add(new CriteriaEntry(OperationKey.BBOX,
new Object[] { GeoPoint.fromPoint(topLeftPoint), GeoPoint.fromPoint(bottomRightPoint) }));
recalculateHashCode();
return this;
}
@@ -729,6 +767,7 @@ public class Criteria {
Assert.notNull(location, "Distance value for near criteria must not be null");
filterCriteriaEntries.add(new CriteriaEntry(OperationKey.WITHIN, new Object[] { location, distance }));
recalculateHashCode();
return this;
}
@@ -745,6 +784,7 @@ public class Criteria {
Assert.notNull(location, "Distance value for near criteria must not be null");
filterCriteriaEntries.add(new CriteriaEntry(OperationKey.WITHIN, new Object[] { location, distance }));
recalculateHashCode();
return this;
}
@@ -761,6 +801,7 @@ public class Criteria {
Assert.isTrue(StringUtils.hasLength(geoLocation), "geoLocation value must not be null");
filterCriteriaEntries.add(new CriteriaEntry(OperationKey.WITHIN, new Object[] { geoLocation, distance }));
recalculateHashCode();
return this;
}
@@ -775,6 +816,7 @@ public class Criteria {
Assert.notNull(geoShape, "geoShape must not be null");
filterCriteriaEntries.add(new CriteriaEntry(OperationKey.GEO_INTERSECTS, geoShape));
recalculateHashCode();
return this;
}
@@ -789,6 +831,7 @@ public class Criteria {
Assert.notNull(geoShape, "geoShape must not be null");
filterCriteriaEntries.add(new CriteriaEntry(OperationKey.GEO_IS_DISJOINT, geoShape));
recalculateHashCode();
return this;
}
@@ -802,6 +845,7 @@ public class Criteria {
Assert.notNull(geoShape, "geoShape must not be null");
filterCriteriaEntries.add(new CriteriaEntry(OperationKey.GEO_WITHIN, geoShape));
recalculateHashCode();
return this;
}
@@ -815,6 +859,7 @@ public class Criteria {
Assert.notNull(geoShape, "geoShape must not be null");
filterCriteriaEntries.add(new CriteriaEntry(OperationKey.GEO_CONTAINS, geoShape));
recalculateHashCode();
return this;
}
@@ -828,6 +873,7 @@ public class Criteria {
Assert.notNull(query, "has_child query must not be null.");
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.HAS_CHILD, query));
recalculateHashCode();
return this;
}
@@ -841,6 +887,7 @@ public class Criteria {
Assert.notNull(query, "has_parent query must not be null.");
queryCriteriaEntries.add(new CriteriaEntry(OperationKey.HAS_PARENT, query));
recalculateHashCode();
return this;
}
// endregion
@@ -887,18 +934,22 @@ public class Criteria {
@Override
public int hashCode() {
int result = field != null ? field.hashCode() : 0;
result = 31 * result + (boost != +0.0f ? Float.floatToIntBits(boost) : 0);
result = 31 * result + (negating ? 1 : 0);
// the criteriaChain contains "this" object, so we need to filter it out
// to avoid a stackoverflow here, because the hashcode implementation
// uses the element's hashcodes
result = 31 * result + criteriaChain.filter(this).hashCode();
result = 31 * result + queryCriteriaEntries.hashCode();
result = 31 * result + filterCriteriaEntries.hashCode();
result = 31 * result + subCriteria.hashCode();
return result;
return hashCode;
}
private void recalculateHashCode() {
int result = field != null ? field.hashCode() : 0;
result = 31 * result + (boost != +0.0f ? Float.floatToIntBits(boost) : 0);
result = 31 * result + (negating ? 1 : 0);
// the criteriaChain contains "this" object, so we need to filter it out
// to avoid a stackoverflow here, because the hashcode implementation
// uses the element's hashcodes
result = 31 * result + criteriaChain.filter(this).hashCode();
result = 31 * result + queryCriteriaEntries.hashCode();
result = 31 * result + filterCriteriaEntries.hashCode();
result = 31 * result + subCriteria.hashCode();
this.hashCode = result;
}
// endregion
@Override
@@ -21,7 +21,6 @@ import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.Nullable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
@@ -345,7 +344,6 @@ public class SimpleElasticsearchRepository<T, ID> implements ElasticsearchReposi
deleteAllById(getEntityIds(entities), refreshPolicy);
}
@NotNull
private List<ID> getEntityIds(Iterable<? extends T> entities) {
Assert.notNull(entities, "Cannot delete 'null' list.");
+2 -1
View File
@@ -1,4 +1,4 @@
Spring Data Elasticsearch 6.0 M6 (2025.1.0)
Spring Data Elasticsearch 6.0 RC1 (2025.1.0)
Copyright (c) [2013-2022] Pivotal Software, Inc.
This product is licensed to you under the Apache License, Version 2.0 (the "License").
@@ -13,3 +13,4 @@ conditions of the subcomponent's license, as noted in the LICENSE file.
@@ -20,7 +20,8 @@ import static org.springframework.data.elasticsearch.client.elc.Queries.*;
import co.elastic.clients.elasticsearch._types.query_dsl.ChildScoreMode;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.NonNull;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@@ -46,7 +47,7 @@ public class NestedObjectELCIntegrationTests extends NestedObjectIntegrationTest
}
@Override
protected @NotNull Query getNestedQuery1() {
protected @NonNull Query getNestedQuery1() {
return NativeQuery.builder().withQuery( //
nested(n -> n //
.path("car") //
@@ -61,7 +62,7 @@ public class NestedObjectELCIntegrationTests extends NestedObjectIntegrationTest
}
@Override
protected @NotNull Query getNestedQuery2() {
protected Query getNestedQuery2() {
return NativeQuery.builder().withQuery( //
bool(b -> b //
.must(nested(n -> n //
@@ -80,7 +81,7 @@ public class NestedObjectELCIntegrationTests extends NestedObjectIntegrationTest
}
@Override
protected @NotNull Query getNestedQuery3() {
protected Query getNestedQuery3() {
return NativeQuery.builder().withQuery( //
nested(n -> n //
.path("books") //
@@ -94,7 +95,7 @@ public class NestedObjectELCIntegrationTests extends NestedObjectIntegrationTest
}
@Override
protected @NotNull Query getNestedQuery4() {
protected Query getNestedQuery4() {
return NativeQuery.builder().withQuery( //
nested(n -> n //
.path("buckets") //
@@ -28,7 +28,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
@@ -134,7 +133,7 @@ public abstract class NestedObjectIntegrationTests {
assertThat(persons).hasSize(1);
}
@NotNull
abstract protected Query getNestedQuery1();
@Test
@@ -189,7 +188,7 @@ public abstract class NestedObjectIntegrationTests {
assertThat(personIndexed.getSearchHit(0).getContent().getId()).isEqualTo("1");
}
@NotNull
abstract protected Query getNestedQuery2();
private List<IndexQuery> createPerson() {
@@ -329,7 +328,7 @@ public abstract class NestedObjectIntegrationTests {
return foo;
}
@NotNull
abstract protected Query getNestedQuery3();
@Test // DATAES-73
@@ -413,7 +412,7 @@ public abstract class NestedObjectIntegrationTests {
assertThat(nullResults.getSearchHits()).hasSize(1);
}
@NotNull
abstract protected Query getNestedQuery4();
@Document(indexName = "#{@indexNameProvider.indexName()}-book")
@@ -448,7 +448,7 @@ public class CriteriaQueryMappingUnitTests {
}
// the following test failed because of a wrong implementation in Criteria
// equals and hscode methods.
// equals and hashcode methods.
@Test // #3083
@DisplayName("should map correct subcriteria")
void shouldMapCorrectSubcriteria() throws JSONException {
@@ -0,0 +1,45 @@
/*
* Copyright 2019-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.elasticsearch.core.query;
import static org.junit.jupiter.api.Assertions.*;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
/**
* @author Peter-Josef Meisch
*/
class CriteriaTest {
@Test // #3159
@DisplayName("should not slow down on calculating hashcode for long criteria chains")
void shouldNotSlowDownOnCalculatingHashcodeForLongCriteriaChains() {
assertTimeoutPreemptively(Duration.of(1, ChronoUnit.SECONDS), () -> {
var criteria = new Criteria();
var size = 1000;
for (int i = 1; i <= size; i++) {
criteria = criteria.or("field-" + i).contains("value-" + i);
}
final var criteriaChain = criteria.getCriteriaChain();
assertEquals(size, criteriaChain.size());
final var hashCode = Integer.valueOf(criteria.hashCode());
});
}
}
@@ -24,7 +24,6 @@ import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
@@ -158,7 +157,6 @@ public abstract class ReactiveScriptedAndRuntimeFieldsIntegrationTests {
assertThat(foundEntity.getScriptedValue2()).isEqualTo(9);
}
@NotNull
private static org.springframework.data.elasticsearch.core.query.ScriptedField getScriptedField(String fieldName,
int factor) {
return org.springframework.data.elasticsearch.core.query.ScriptedField.of(
@@ -214,7 +212,6 @@ public abstract class ReactiveScriptedAndRuntimeFieldsIntegrationTests {
assertThat(foundEntity.getScriptedValue2()).isEqualTo(12);
}
@NotNull
private static RuntimeField getRuntimeField(String fieldName, int factor) {
return new RuntimeField(
fieldName,
@@ -21,7 +21,6 @@ import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
@@ -307,7 +306,6 @@ public abstract class ScriptedAndRuntimeFieldsIntegrationTests {
* build a {@link org.springframework.data.elasticsearch.core.query.ScriptedField} to return the product of the
* document's value property and the given factor
*/
@NotNull
private static org.springframework.data.elasticsearch.core.query.ScriptedField buildScriptedField(String fieldName,
int factor) {
return org.springframework.data.elasticsearch.core.query.ScriptedField.of(
@@ -320,7 +318,6 @@ public abstract class ScriptedAndRuntimeFieldsIntegrationTests {
/**
* build a {@link RuntimeField} to return the product of the document's value property and the given factor
*/
@NotNull
private static RuntimeField buildRuntimeField(String fieldName, int factor) {
return new RuntimeField(
fieldName,
@@ -15,7 +15,7 @@
#
#
sde.testcontainers.image-name=docker.elastic.co/elasticsearch/elasticsearch
sde.testcontainers.image-version=9.1.3
sde.testcontainers.image-version=9.1.5
#
#
# needed as we do a DELETE /* at the end of the tests, will be required from 8.0 on, produces a warning since 7.13