From aaa1450b2a2755ea090c711ba1a798c931b644d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=A1=8C=E5=B8=85?= Date: Tue, 28 Mar 2023 15:53:42 +0800 Subject: [PATCH] Add hidden support for index. Closes: #4348 Original Pull Request: #4349 --- .../data/mongodb/core/IndexConverters.java | 4 +++ .../data/mongodb/core/index/Index.java | 16 ++++++++++++ .../data/mongodb/core/index/IndexInfo.java | 25 ++++++++++++++++++- .../data/mongodb/core/MongoTemplateTests.java | 3 ++- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/IndexConverters.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/IndexConverters.java index 6ed1bf75d..482287bd1 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/IndexConverters.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/IndexConverters.java @@ -119,6 +119,10 @@ abstract class IndexConverters { ops.wildcardProjection(indexOptions.get("wildcardProjection", Document.class)); } + if (indexOptions.containsKey("hidden")) { + ops = ops.hidden((Boolean) indexOptions.get("hidden")); + } + return ops; }; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/Index.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/Index.java index 00a91d2a7..70dec098c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/Index.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/Index.java @@ -42,6 +42,7 @@ public class Index implements IndexDefinition { private boolean unique = false; private boolean sparse = false; private boolean background = false; + private boolean hidden = false; private long expire = -1; private Optional filter = Optional.empty(); private Optional collation = Optional.empty(); @@ -98,6 +99,18 @@ public class Index implements IndexDefinition { return this; } + /** + * Hidden indexes are not visible to the query planner and cannot be used to support a query. + * + * @return this. + * @see https://www.mongodb.com/docs/manual/core/index-hidden/ + */ + public Index hidden() { + this.hidden = true; + return this; + } + /** * Specifies TTL in seconds. * @@ -195,6 +208,9 @@ public class Index implements IndexDefinition { if (background) { document.put("background", true); } + if (hidden) { + document.put("hidden", true); + } if (expire >= 0) { document.put("expireAfterSeconds", expire); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/IndexInfo.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/IndexInfo.java index 371040f53..4c8a9c556 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/IndexInfo.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/IndexInfo.java @@ -52,6 +52,7 @@ public class IndexInfo { private final boolean unique; private final boolean sparse; private final String language; + private final boolean hidden; private @Nullable Duration expireAfter; private @Nullable String partialFilterExpression; private @Nullable Document collation; @@ -64,6 +65,17 @@ public class IndexInfo { this.unique = unique; this.sparse = sparse; this.language = language; + this.hidden = false; + } + + public IndexInfo(List indexFields, String name, boolean unique, boolean sparse, String language, boolean hidden) { + + this.indexFields = Collections.unmodifiableList(indexFields); + this.name = name; + this.unique = unique; + this.sparse = sparse; + this.language = language; + this.hidden = hidden; } /** @@ -138,6 +150,8 @@ public class IndexInfo { info.wildcardProjection = sourceDocument.get("wildcardProjection", Document.class); } + boolean hidden = sourceDocument.containsKey("hidden") ? (Boolean) sourceDocument.get("hidden") : false; + return info; } @@ -259,12 +273,17 @@ public class IndexInfo { return getIndexFields().stream().anyMatch(IndexField::isWildcard); } + public boolean isHidden() { + return hidden; + } + + @Override public String toString() { return "IndexInfo [indexFields=" + indexFields + ", name=" + name + ", unique=" + unique + ", sparse=" + sparse + ", language=" + language + ", partialFilterExpression=" + partialFilterExpression + ", collation=" + collation - + ", expireAfterSeconds=" + ObjectUtils.nullSafeToString(expireAfter) + "]"; + + ", expireAfterSeconds=" + ObjectUtils.nullSafeToString(expireAfter) + ", hidden=" + hidden + "]"; } @Override @@ -279,6 +298,7 @@ public class IndexInfo { result += 31 * ObjectUtils.nullSafeHashCode(partialFilterExpression); result += 31 * ObjectUtils.nullSafeHashCode(collation); result += 31 * ObjectUtils.nullSafeHashCode(expireAfter); + result += 31 * ObjectUtils.nullSafeHashCode(hidden); return result; } @@ -326,6 +346,9 @@ public class IndexInfo { if (!ObjectUtils.nullSafeEquals(expireAfter, other.expireAfter)) { return false; } + if (hidden != other.hidden) { + return false; + } return true; } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 9bfbe989b..a14732301 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -329,7 +329,7 @@ public class MongoTemplateTests { p2.setAge(40); template.insert(p2); - template.indexOps(Person.class).ensureIndex(new Index().on("age", Direction.DESC).unique()); + template.indexOps(Person.class).ensureIndex(new Index().on("age", Direction.DESC).unique().hidden()); MongoCollection coll = template.getCollection(template.getCollectionName(Person.class)); List indexInfo = new ArrayList<>(); @@ -355,6 +355,7 @@ public class MongoTemplateTests { IndexInfo ii = indexInfoList.get(1); assertThat(ii.isUnique()).isTrue(); assertThat(ii.isSparse()).isFalse(); + assertThat(ii.isHidden()).isTrue(); List indexFields = ii.getIndexFields(); IndexField field = indexFields.get(0);