From 9146ca5487236237c7509cd399621ae24019e1c9 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 11 Jul 2016 12:24:35 +0200 Subject: [PATCH 1/3] DATAMONGO-1455, DATAMONGO-1456 - Add support for $caseSensitive and $diacriticSensitive to $text. Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-cross-store/pom.xml | 4 ++-- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb-log4j/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 3a9b4f5ad7..94e70cfa9f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1455-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml index 6554045e11..8c8956b876 100644 --- a/spring-data-mongodb-cross-store/pom.xml +++ b/spring-data-mongodb-cross-store/pom.xml @@ -6,7 +6,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1455-SNAPSHOT ../pom.xml @@ -48,7 +48,7 @@ org.springframework.data spring-data-mongodb - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1455-SNAPSHOT diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 2d02722262..53358340ca 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1455-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-log4j/pom.xml b/spring-data-mongodb-log4j/pom.xml index ee5e3336db..2f1b19f41b 100644 --- a/spring-data-mongodb-log4j/pom.xml +++ b/spring-data-mongodb-log4j/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1455-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index edfa519fad..ff87160689 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1455-SNAPSHOT ../pom.xml From 13916912daa77a8bc01d4d3530309c5451f9783f Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 11 Jul 2016 12:30:09 +0200 Subject: [PATCH 2/3] DATAMONGO-1455, DATAMONGO-1456 - Add support for $caseSensitive and $diacriticSensitive to $text. We added methods to set values for $caseSensitive and $diacriticSensitive when using TextCriteria. Both operators are optional and will not be used until explicitly set. // { "$text" : { "$search" : "coffee" , "$caseSensitive" : true } } TextCriteria.forDefaultLanguage().matching("coffee").caseSensitive(true); // { "$text" : { "$search" : "coffee" , "$diacriticSensitive" : true } } TextCriteria.forDefaultLanguage().matching("coffee").diacriticSensitive(true); --- .../data/mongodb/core/query/TextCriteria.java | 42 +++++++++++++++++-- .../core/query/TextCriteriaUnitTests.java | 26 +++++++++++- src/main/asciidoc/reference/mongodb.adoc | 2 + 3 files changed, 66 insertions(+), 4 deletions(-) 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 61bd209584..c2637e35a9 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 @@ -1,5 +1,5 @@ /* - * Copyright 2014 the original author or authors. + * Copyright 2014-2016 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. @@ -36,6 +36,8 @@ public class TextCriteria implements CriteriaDefinition { private final List terms; private String language; + private Boolean caseSensitive; + private Boolean diacriticSensitive; /** * Creates a new {@link TextCriteria}. @@ -63,8 +65,8 @@ public static TextCriteria forDefaultLanguage() { } /** - * For a full list of supported languages see the mongodb reference manual for Text Search Languages. + * For a full list of supported languages see the mongodb reference manual for + * Text Search Languages. * * @param language * @return @@ -167,6 +169,32 @@ public TextCriteria matchingPhrase(String phrase) { return this; } + /** + * Optionally enable or disable case sensitive search. + * + * @param caseSensitive boolean flag endable/disable. + * @return never {@literal null}. + * @since 1.10 + */ + public TextCriteria caseSensitive(boolean caseSensitive) { + + this.caseSensitive = caseSensitive; + return this; + } + + /** + * Optionallly enable or disable diacritic sensitive search against version 3 text indexes. + * + * @param diacriticSensitive boolean flag endable/disable. + * @return never {@literal null}. + * @since 1.10 + */ + public TextCriteria diacriticSensitive(boolean diacriticSensitive) { + + this.diacriticSensitive = diacriticSensitive; + return this; + } + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.query.CriteriaDefinition#getKey() @@ -193,6 +221,14 @@ public DBObject getCriteriaObject() { builder.add("$search", join(terms)); } + if (caseSensitive != null) { + builder.add("$caseSensitive", caseSensitive); + } + + if (diacriticSensitive != null) { + builder.add("$diacriticSensitive", diacriticSensitive); + } + return new BasicDBObject("$text", builder.get()); } 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 9a14e7d421..36a44a8983 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 @@ -1,5 +1,5 @@ /* - * Copyright 2014 the original author or authors. + * Copyright 2014-2016 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. @@ -21,6 +21,7 @@ import org.springframework.data.mongodb.core.DBObjectTestUtils; import com.mongodb.BasicDBObject; +import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DBObject; import com.mongodb.util.JSON; @@ -115,6 +116,29 @@ public void shouldCreateSearchFieldForNotPhraseCorrectly() { IsEqual. equalTo(new BasicDBObject("$search", "-\"coffee cake\""))); } + /** + * @see DATAMONGO-1455 + */ + @Test + public void caseSensitiveOperatorShouldBeSetCorrectly() { + + TextCriteria criteria = TextCriteria.forDefaultLanguage().matching("coffee").caseSensitive(true); + Assert.assertThat(DBObjectTestUtils.getAsDBObject(criteria.getCriteriaObject(), "$text"), IsEqual + . equalTo(new BasicDBObjectBuilder().add("$search", "coffee").add("$caseSensitive", true).get())); + } + + /** + * @see DATAMONGO-1456 + */ + @Test + public void diacriticSensitiveOperatorShouldBeSetCorrectly() { + + TextCriteria criteria = TextCriteria.forDefaultLanguage().matching("coffee").diacriticSensitive(true); + Assert.assertThat(DBObjectTestUtils.getAsDBObject(criteria.getCriteriaObject(), "$text"), + IsEqual. equalTo( + new BasicDBObjectBuilder().add("$search", "coffee").add("$diacriticSensitive", true).get())); + } + private DBObject searchObject(String json) { return new BasicDBObject("$text", JSON.parse(json)); } diff --git a/src/main/asciidoc/reference/mongodb.adoc b/src/main/asciidoc/reference/mongodb.adoc index e6697721ac..42a4075bf4 100644 --- a/src/main/asciidoc/reference/mongodb.adoc +++ b/src/main/asciidoc/reference/mongodb.adoc @@ -1356,6 +1356,8 @@ TextQuery.searching(new TextCriteria().matching("\"coffee cake\"")); TextQuery.searching(new TextCriteria().phrase("coffee cake")); ---- +The flags for `$caseSensitive` and `$diacriticSensitive` can be set via the according methods on `TextCriteria`. Please note that these two optional flags have been introduced in MongoDB 3.2 and will not be included in the query unless explicitly set. + include::../{spring-data-commons-docs}/query-by-example.adoc[leveloffset=+1] include::query-by-example.adoc[leveloffset=+1] From 1e54ee55c7c13c499d8e8a5a693233f386eddd80 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 11 Jul 2016 12:47:48 +0200 Subject: [PATCH 3/3] DATAMONGO-1455, DATAMONGO-1456 - Polishing. Use static imports for org.junit.Assert and org.hamcrest.core. --- .../core/query/TextCriteriaUnitTests.java | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) 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 36a44a8983..64d96ff485 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 @@ -15,8 +15,9 @@ */ package org.springframework.data.mongodb.core.query; -import org.hamcrest.core.IsEqual; -import org.junit.Assert; +import static org.hamcrest.core.IsEqual.*; +import static org.junit.Assert.*; + import org.junit.Test; import org.springframework.data.mongodb.core.DBObjectTestUtils; @@ -39,7 +40,7 @@ public class TextCriteriaUnitTests { public void shouldNotHaveLanguageField() { TextCriteria criteria = TextCriteria.forDefaultLanguage(); - Assert.assertThat(criteria.getCriteriaObject(), IsEqual.equalTo(searchObject("{ }"))); + assertThat(criteria.getCriteriaObject(), equalTo(searchObject("{ }"))); } /** @@ -49,7 +50,7 @@ public void shouldNotHaveLanguageField() { public void shouldNotHaveLanguageForNonDefaultLanguageField() { TextCriteria criteria = TextCriteria.forLanguage("spanish"); - Assert.assertThat(criteria.getCriteriaObject(), IsEqual.equalTo(searchObject("{ \"$language\" : \"spanish\" }"))); + assertThat(criteria.getCriteriaObject(), equalTo(searchObject("{ \"$language\" : \"spanish\" }"))); } /** @@ -59,7 +60,7 @@ public void shouldNotHaveLanguageForNonDefaultLanguageField() { public void shouldCreateSearchFieldForSingleTermCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().matching("cake"); - Assert.assertThat(criteria.getCriteriaObject(), IsEqual.equalTo(searchObject("{ \"$search\" : \"cake\" }"))); + assertThat(criteria.getCriteriaObject(), equalTo(searchObject("{ \"$search\" : \"cake\" }"))); } /** @@ -69,8 +70,7 @@ public void shouldCreateSearchFieldForSingleTermCorrectly() { public void shouldCreateSearchFieldCorrectlyForMultipleTermsCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().matchingAny("bake", "coffee", "cake"); - Assert.assertThat(criteria.getCriteriaObject(), - IsEqual.equalTo(searchObject("{ \"$search\" : \"bake coffee cake\" }"))); + assertThat(criteria.getCriteriaObject(), equalTo(searchObject("{ \"$search\" : \"bake coffee cake\" }"))); } /** @@ -80,8 +80,8 @@ public void shouldCreateSearchFieldCorrectlyForMultipleTermsCorrectly() { public void shouldCreateSearchFieldForPhraseCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().matchingPhrase("coffee cake"); - Assert.assertThat(DBObjectTestUtils.getAsDBObject(criteria.getCriteriaObject(), "$text"), - IsEqual. equalTo(new BasicDBObject("$search", "\"coffee cake\""))); + assertThat(DBObjectTestUtils.getAsDBObject(criteria.getCriteriaObject(), "$text"), + equalTo((DBObject) new BasicDBObject("$search", "\"coffee cake\""))); } /** @@ -91,7 +91,7 @@ public void shouldCreateSearchFieldForPhraseCorrectly() { public void shouldCreateNotFieldCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().notMatching("cake"); - Assert.assertThat(criteria.getCriteriaObject(), IsEqual.equalTo(searchObject("{ \"$search\" : \"-cake\" }"))); + assertThat(criteria.getCriteriaObject(), equalTo(searchObject("{ \"$search\" : \"-cake\" }"))); } /** @@ -101,8 +101,7 @@ public void shouldCreateNotFieldCorrectly() { public void shouldCreateSearchFieldCorrectlyForNotMultipleTermsCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().notMatchingAny("bake", "coffee", "cake"); - Assert.assertThat(criteria.getCriteriaObject(), - IsEqual.equalTo(searchObject("{ \"$search\" : \"-bake -coffee -cake\" }"))); + assertThat(criteria.getCriteriaObject(), equalTo(searchObject("{ \"$search\" : \"-bake -coffee -cake\" }"))); } /** @@ -112,8 +111,8 @@ public void shouldCreateSearchFieldCorrectlyForNotMultipleTermsCorrectly() { public void shouldCreateSearchFieldForNotPhraseCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().notMatchingPhrase("coffee cake"); - Assert.assertThat(DBObjectTestUtils.getAsDBObject(criteria.getCriteriaObject(), "$text"), - IsEqual. equalTo(new BasicDBObject("$search", "-\"coffee cake\""))); + assertThat(DBObjectTestUtils.getAsDBObject(criteria.getCriteriaObject(), "$text"), + equalTo((DBObject) new BasicDBObject("$search", "-\"coffee cake\""))); } /** @@ -123,8 +122,8 @@ public void shouldCreateSearchFieldForNotPhraseCorrectly() { public void caseSensitiveOperatorShouldBeSetCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().matching("coffee").caseSensitive(true); - Assert.assertThat(DBObjectTestUtils.getAsDBObject(criteria.getCriteriaObject(), "$text"), IsEqual - . equalTo(new BasicDBObjectBuilder().add("$search", "coffee").add("$caseSensitive", true).get())); + assertThat(DBObjectTestUtils.getAsDBObject(criteria.getCriteriaObject(), "$text"), + equalTo(new BasicDBObjectBuilder().add("$search", "coffee").add("$caseSensitive", true).get())); } /** @@ -134,9 +133,8 @@ public void caseSensitiveOperatorShouldBeSetCorrectly() { public void diacriticSensitiveOperatorShouldBeSetCorrectly() { TextCriteria criteria = TextCriteria.forDefaultLanguage().matching("coffee").diacriticSensitive(true); - Assert.assertThat(DBObjectTestUtils.getAsDBObject(criteria.getCriteriaObject(), "$text"), - IsEqual. equalTo( - new BasicDBObjectBuilder().add("$search", "coffee").add("$diacriticSensitive", true).get())); + assertThat(DBObjectTestUtils.getAsDBObject(criteria.getCriteriaObject(), "$text"), + equalTo((DBObject) new BasicDBObjectBuilder().add("$search", "coffee").add("$diacriticSensitive", true).get())); } private DBObject searchObject(String json) {