From f4d2fc6231b24c9f6ab2af3116f9f9a1ee6febfa Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 23 Apr 2020 12:23:54 +0200 Subject: [PATCH] DATAMONGO-2504 - Polishing. Update equals/hashCode implementation to use the Spring Data form. Make fields final where possible. Use diamond syntax. Reorder methods. Reformat code. Extend tests. Original pull request: #848. --- .../data/mongodb/core/query/Term.java | 60 +++++++++++++----- .../data/mongodb/core/query/TextCriteria.java | 63 ++++++++++++------- .../core/query/TextCriteriaUnitTests.java | 40 ++++++++---- 3 files changed, 114 insertions(+), 49 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Term.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Term.java index 379445a84..f7504a417 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Term.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Term.java @@ -15,8 +15,10 @@ */ package org.springframework.data.mongodb.core.query; -import java.util.Objects; +import static org.springframework.util.ObjectUtils.*; + import org.springframework.lang.Nullable; +import org.springframework.util.ObjectUtils; /** * A {@link Term} defines one or multiple words {@link Type#WORD} or phrases {@link Type#PHRASE} to be used in the @@ -91,6 +93,47 @@ public class Term { return negated ? negateRaw(formatted) : formatted; } + /* + * (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object o) { + + if (this == o) { + return true; + } + + if (!(o instanceof Term)) { + return false; + } + + Term term = (Term) o; + + return ObjectUtils.nullSafeEquals(negated, term.negated) && ObjectUtils.nullSafeEquals(type, term.type) + && ObjectUtils.nullSafeEquals(raw, term.raw); + } + + /* + * (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + + int result = 17; + + result += ObjectUtils.nullSafeHashCode(type); + result += ObjectUtils.nullSafeHashCode(raw); + result += ObjectUtils.nullSafeHashCode(negated); + + return result; + } + + /* + * (non-Javadoc) + * @see java.lang.Object#toString() + */ @Override public String toString() { return getFormatted(); @@ -103,19 +146,4 @@ public class Term { protected String negateRaw(String raw) { return "-" + raw; } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Term)) return false; - Term term = (Term) o; - return negated == term.negated && - type == term.type && - Objects.equals(raw, term.raw); - } - - @Override - public int hashCode() { - return Objects.hash(type, raw, negated); - } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/TextCriteria.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/TextCriteria.java index 8c9886064..424a40813 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/TextCriteria.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/TextCriteria.java @@ -17,11 +17,11 @@ package org.springframework.data.mongodb.core.query; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import org.bson.Document; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; /** @@ -35,7 +35,7 @@ import org.springframework.util.StringUtils; public class TextCriteria implements CriteriaDefinition { private final List terms; - private @Nullable String language; + private final @Nullable String language; private @Nullable Boolean caseSensitive; private @Nullable Boolean diacriticSensitive; @@ -52,7 +52,7 @@ public class TextCriteria implements CriteriaDefinition { private TextCriteria(@Nullable String language) { this.language = language; - this.terms = new ArrayList(); + this.terms = new ArrayList<>(); } /** @@ -232,9 +232,47 @@ public class TextCriteria implements CriteriaDefinition { return new Document("$text", document); } + /* + * (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object o) { + + if (this == o) { + return true; + } + if (!(o instanceof TextCriteria)) { + return false; + } + + TextCriteria that = (TextCriteria) o; + + return ObjectUtils.nullSafeEquals(terms, that.terms) && ObjectUtils.nullSafeEquals(language, that.language) + && ObjectUtils.nullSafeEquals(caseSensitive, that.caseSensitive) + && ObjectUtils.nullSafeEquals(diacriticSensitive, that.diacriticSensitive); + } + + /* + * (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + + int result = 17; + + result += ObjectUtils.nullSafeHashCode(terms); + result += ObjectUtils.nullSafeHashCode(language); + result += ObjectUtils.nullSafeHashCode(caseSensitive); + result += ObjectUtils.nullSafeHashCode(diacriticSensitive); + + return result; + } + private String join(Iterable terms) { - List result = new ArrayList(); + List result = new ArrayList<>(); for (Term term : terms) { if (term != null) { @@ -244,21 +282,4 @@ public class TextCriteria implements CriteriaDefinition { return StringUtils.collectionToDelimitedString(result, " "); } - - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof TextCriteria)) return false; - TextCriteria that = (TextCriteria) o; - return Objects.equals(terms, that.terms) && - Objects.equals(language, that.language) && - Objects.equals(caseSensitive, that.caseSensitive) && - Objects.equals(diacriticSensitive, that.diacriticSensitive); - } - - @Override - public int hashCode() { - return Objects.hash(terms, language, caseSensitive, diacriticSensitive); - } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/TextCriteriaUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/TextCriteriaUnitTests.java index 397097abf..0ef553218 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/TextCriteriaUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/TextCriteriaUnitTests.java @@ -26,88 +26,104 @@ import org.springframework.data.mongodb.core.DocumentTestUtils; * Unit tests for {@link TextCriteria}. * * @author Christoph Strobl + * @author Daniel Debray */ -public class TextCriteriaUnitTests { +class TextCriteriaUnitTests { @Test // DATAMONGO-850 - public void shouldNotHaveLanguageField() { + void shouldNotHaveLanguageField() { TextCriteria criteria = TextCriteria.forDefaultLanguage(); + assertThat(criteria.getCriteriaObject()).isEqualTo(searchObject("{ }")); } @Test // DATAMONGO-850 - public void shouldNotHaveLanguageForNonDefaultLanguageField() { + void shouldNotHaveLanguageForNonDefaultLanguageField() { TextCriteria criteria = TextCriteria.forLanguage("spanish"); + assertThat(criteria.getCriteriaObject()).isEqualTo(searchObject("{ \"$language\" : \"spanish\" }")); } @Test // DATAMONGO-850 - public void shouldCreateSearchFieldForSingleTermCorrectly() { + void shouldCreateSearchFieldForSingleTermCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().matching("cake"); + assertThat(criteria.getCriteriaObject()).isEqualTo(searchObject("{ \"$search\" : \"cake\" }")); } @Test // DATAMONGO-850 - public void shouldCreateSearchFieldCorrectlyForMultipleTermsCorrectly() { + void shouldCreateSearchFieldCorrectlyForMultipleTermsCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().matchingAny("bake", "coffee", "cake"); + assertThat(criteria.getCriteriaObject()).isEqualTo(searchObject("{ \"$search\" : \"bake coffee cake\" }")); } @Test // DATAMONGO-850 - public void shouldCreateSearchFieldForPhraseCorrectly() { + void shouldCreateSearchFieldForPhraseCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().matchingPhrase("coffee cake"); + assertThat(DocumentTestUtils.getAsDocument(criteria.getCriteriaObject(), "$text")) .isEqualTo(new Document("$search", "\"coffee cake\"")); } @Test // DATAMONGO-850 - public void shouldCreateNotFieldCorrectly() { + void shouldCreateNotFieldCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().notMatching("cake"); + assertThat(criteria.getCriteriaObject()).isEqualTo(searchObject("{ \"$search\" : \"-cake\" }")); } @Test // DATAMONGO-850 - public void shouldCreateSearchFieldCorrectlyForNotMultipleTermsCorrectly() { + void shouldCreateSearchFieldCorrectlyForNotMultipleTermsCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().notMatchingAny("bake", "coffee", "cake"); + assertThat(criteria.getCriteriaObject()).isEqualTo(searchObject("{ \"$search\" : \"-bake -coffee -cake\" }")); } @Test // DATAMONGO-850 - public void shouldCreateSearchFieldForNotPhraseCorrectly() { + void shouldCreateSearchFieldForNotPhraseCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().notMatchingPhrase("coffee cake"); + assertThat(DocumentTestUtils.getAsDocument(criteria.getCriteriaObject(), "$text")) .isEqualTo(new Document("$search", "-\"coffee cake\"")); } @Test // DATAMONGO-1455 - public void caseSensitiveOperatorShouldBeSetCorrectly() { + void caseSensitiveOperatorShouldBeSetCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().matching("coffee").caseSensitive(true); + assertThat(DocumentTestUtils.getAsDocument(criteria.getCriteriaObject(), "$text")) .isEqualTo(new Document("$search", "coffee").append("$caseSensitive", true)); } @Test // DATAMONGO-1456 - public void diacriticSensitiveOperatorShouldBeSetCorrectly() { + void diacriticSensitiveOperatorShouldBeSetCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().matching("coffee").diacriticSensitive(true); + assertThat(DocumentTestUtils.getAsDocument(criteria.getCriteriaObject(), "$text")) .isEqualTo(new Document("$search", "coffee").append("$diacriticSensitive", true)); } @Test // DATAMONGO-2504 - public void twoIdenticalCriteriaShouldBeEqual() { + void twoIdenticalCriteriaShouldBeEqual() { + TextCriteria criteriaOne = TextCriteria.forDefaultLanguage().matching("coffee"); TextCriteria criteriaTwo = TextCriteria.forDefaultLanguage().matching("coffee"); + assertThat(criteriaOne).isEqualTo(criteriaTwo); + assertThat(criteriaOne).hasSameHashCodeAs(criteriaTwo); + assertThat(criteriaOne).isNotEqualTo(criteriaTwo.diacriticSensitive(false)); + assertThat(criteriaOne.hashCode()).isNotEqualTo(criteriaTwo.diacriticSensitive(false).hashCode()); } private Document searchObject(String json) {