Compare commits

..

97 Commits

Author SHA1 Message Date
Mark Paluch
2db55ab0aa Release version 4.0 M3 (2022.0.0).
See #4003
2022-03-22 14:00:23 +01:00
Mark Paluch
79602b7dbe Prepare 4.0 M3 (2022.0.0).
See #4003
2022-03-22 14:00:02 +01:00
Mark Paluch
d5d2371b9e After release cleanups.
See #3937
2022-03-21 16:44:41 +01:00
Mark Paluch
c95e8a5748 Prepare next development iteration.
See #3937
2022-03-21 16:44:39 +01:00
Mark Paluch
f0c0a86118 Release version 4.0 M2 (2022.0.0).
See #3937
2022-03-21 16:35:08 +01:00
Mark Paluch
3d82e12e6b Prepare 4.0 M2 (2022.0.0).
See #3937
2022-03-21 16:34:37 +01:00
Mark Paluch
8672808222 Polishing.
Reformat code. Tweak documentation wording.

See #3596
Original pull request: #3982.
2022-03-21 09:20:47 +01:00
Christoph Strobl
29fb085d8b Add support for PropertyValueConverters.
Closes: #3596
Original pull request: #3982.
2022-03-21 09:20:34 +01:00
Mark Paluch
15cac49f9c Polishing.
Refine API naming towards merge/property instead of combine/specify. Tweak documentation. Introduce Resolution.ofValue(…) for easier creation.

See #3870
Original pull request: #3986.
2022-03-18 14:11:35 +01:00
Christoph Strobl
946deac48c Support generating JsonSchema for Polymorphic fields.
This commit introduces MergedJsonSchema and MergedJsonSchemaProperty that can be used to merge properties of multiple objects into one as long as the additions do not conflict with another (eg. due to usage of different types).
To resolve previously mentioned errors it is required to provide a ConflictResolutionFunction.

Closes #3870
Original pull request: #3986.
2022-03-18 14:11:35 +01:00
Mark Paluch
02229f291c Polishing.
Reformat code.

See #3998
2022-03-16 16:44:06 +01:00
Mark Paluch
1009491920 Create a new conversion context for projection properties.
We now create a new conversion context to ensure that we use the correct property type to avoid type retention when mapping complex objects within a projection.

Closes #3998
2022-03-16 16:29:14 +01:00
Mark Paluch
05730ded1b Fix CI trigger.
Use correct Spring Data Commons version as build trigger.

See #3973
2022-03-15 14:38:54 +01:00
Mark Paluch
612845f59c Polishing.
Extract CreateCollectionOptions conversion to EntityOperations to unify collection creation. Adopt tests.

See #3984
Original pull request: #3990.
2022-03-11 15:21:05 +01:00
Mark Paluch
1f06954952 Polishing.
Add missing Override annotations to template API methods.

See #3984
2022-03-11 15:20:20 +01:00
Christoph Strobl
7bcf0322d2 Propagate time series options correctly.
This commit fixes an issue when creating a collection via MongoTemplate without passing on type information. In this case potential time series information was lost.

Closes #3984
Original pull request: #3990.
2022-03-11 15:18:58 +01:00
Mark Paluch
7dd2f350eb Polishing.
Remove duplicate dependency declaration.

See: #3522
2022-03-11 14:10:49 +01:00
Mark Paluch
e433375cac Polishing.
Reorder methods. Add links to Javadoc. Tweak wording.

See: #3522
Original pull request: #3951.
2022-03-11 14:09:58 +01:00
Christoph Strobl
d16013aa6b Allow to estimate document count.
This commit introduce an option that allows users to opt in on using estimatedDocumentCount instead of countDocuments in case the used filter query is empty.
To still be able to retrieve the exact number of matching documents we also introduced MongoTemplate#exactCount.

Closes: #3522
Original pull request: #3951.
2022-03-11 14:06:30 +01:00
Christoph Strobl
dab5473740 Modify visibility of methods in TypedJsonSchemaObject.
Change visibility to public as it should have been in first place.

Closes: #3989
2022-03-10 09:23:25 +01:00
sangyongchoi
e6fce75dfd Remove duplicate condition in GeoConverters.
Closes: #3981
2022-03-03 13:29:24 +01:00
Mark Paluch
e75f022844 Update CI properties.
See #3937
2022-02-23 14:33:13 -06:00
Christoph Strobl
611ece049b Serialize values for debug output safely in AbstractMongoEventListener.
We now make sure that codec configuration will not cause an exception when debug logging is turned on.

Resolves: #3968
Original Pull Request: #3970
2022-02-18 10:15:28 +01:00
Christoph Strobl
be2286edf7 Update copyright year to 2022.
See: #3966
2022-02-17 10:49:44 +01:00
Christoph Strobl
b99648672b Introduce Update annotation.
Switch update execution to an annotation based model that allows usage of both the classic update as well as the aggregation pipeline variant. Add the reactive variant of it.
Make sure to allow parameter binding for update expressions and verify method return types.
Update Javadoc and reference documentation.

See: #2107
Original Pull Request: #284
2022-02-17 10:31:46 +01:00
Thomas Darimont
28708ce24e Add support for modifying documents via repository method.
We now support findAndModify operations on derived query methods.

Closes: #2107
Original Pull Request: #284
2022-02-17 10:29:37 +01:00
Christoph Strobl
1c6c703640 Deprecate mapReduce.
Closes: #3945
2022-02-16 14:45:01 +01:00
blu10ph
67b1fe5fbc Avoid obtaining mapped sort multiple times for mapReduce.
Apply already mapped sort for map reduce instead of running the source document through the mapping layer again.

Closes: #3960
2022-02-16 14:42:57 +01:00
Christoph Strobl
4f6501f140 Update GeoJson section in reference documentation.
Mention the relation of Point/GeoJsonPoint x/y coordinates to longitude/latitude.

Original Pull Request: #3956
2022-02-16 14:42:19 +01:00
sangyongchoi
2a3f746cb6 Update GeoJsonPoint Javadoc.
Mention x -> longitude, y -> latitude relation.

Closes: #3956
2022-02-16 14:41:33 +01:00
Mark Paluch
90b8ba7246 Polishing.
Extract docker credentials into properties file.
Use tabs for indentation instead of spaces.

See #3949
2022-02-16 13:36:39 +01:00
Oliver Drotbohm
f12648af4c Adapt to API changes regarding object creation metadata. 2022-02-15 17:37:58 +01:00
Greg L. Turnquist
e812f89b47 Update CI properties.
See #3937
2022-02-15 09:00:21 -06:00
Christoph Strobl
f96d700d8d Favor Base64Utils over bson internal Base64 type.
org.bson.internal.Base64 is no longer available in MongoDB driver 4.5.0.

Related to: #3962
2022-02-14 11:09:26 +01:00
Christoph Strobl
32e7f2032d Upgrade to MongoDB driver 4.5.0
Closes: #3962
2022-02-14 11:09:14 +01:00
Mark Paluch
43ac1984ab Adapt repository to List-based interface variants.
Closes #3964
2022-02-14 11:07:27 +01:00
Greg L. Turnquist
28f262309c Use Harbor Proxy for containers.
Leverage internal infrastructure for pulling Docker container images. Reduces pressure on Docker Hub and reduces risk of hitting rate limits.

See #3954.
Related https://github.com/spring-projects/spring-data-build/issues/1630.
2022-02-07 10:59:50 -06:00
Mark Paluch
eefe6b3b21 Update CI properties.
See #3937
2022-02-07 09:32:15 +01:00
Mark Paluch
d0f2ca9efc Polishing.
Refine build script.

See #3949
2022-02-04 08:49:49 +01:00
Mark Paluch
e6c8ee037a Polishing.
Extract docker credentials into properties file.
Use tabs for indentation instead of spaces.

See #3949
2022-02-04 08:46:05 +01:00
Christoph Strobl
e63013deac Remove previously deprecated API.
This commit removes and moves off deprecated API.
Additionally some blocks got deprecated due to changes in MongoDB server API.

Resolves: #3952
2022-02-03 16:44:03 +01:00
Mark Paluch
2367379b6d Use Java 8 Stream as return type for Template operations returning a stream.
We now use Stream instead of CloseableIterator for easier stream creation.

Closes: #3944
Original Pull Request: #3946
2022-02-03 08:30:27 +01:00
Mark Paluch
a1c483f2e1 After release cleanups.
See #3927
2022-02-03 08:08:50 +01:00
Mark Paluch
64b8b500ae Prepare next development iteration.
See #3927
2022-02-03 08:08:50 +01:00
Mark Paluch
2d15e37bc7 Release version 4.0 M1 (2022.0.0).
See #3927
2022-02-03 08:08:50 +01:00
Mark Paluch
54655b88c0 Prepare 4.0 M1 (2022.0.0).
See #3927
2022-02-03 08:08:49 +01:00
Jens Schauder
cd395e3324 Remove Eclipse Non-Javadoc comments.
Closes #3924
2022-02-03 08:08:00 +01:00
Mark Paluch
33bdbbe851 Polishing. 2022-02-03 08:08:00 +01:00
Christoph Strobl
9f1448df44 Drop support for RxJava 1 and 2.
Closes: #3839
2022-02-03 08:08:00 +01:00
Christoph Strobl
e3a4bada63 Move to Jakarta EE9
Closes: #3830
2022-02-03 08:08:00 +01:00
Christoph Strobl
dcdf3a2365 Prepare Spring Data MongoDB 4.x branch.
Upgrade to data-commons 3.0 and Java 17 (still source level 16 due to asm).
Remove support for threeten, joda-time.
Transition to PersistentEntitiesFactoryBean from data-commons.
Update build to MongoDB 4.4 and 5 with Java17. Remove Java8 setup.
Fix javadoc tooling error on cdi 1 vs. 2 version mix.
Disabled internal package cycle analysis as this requires transition to ArchUnit.
2022-02-03 08:07:59 +01:00
Mihail Cornescu
423e10b7bc Add IgnoreCase to repository queries documentation.
Update reference documentaion and add missing IgnoreCase keyword.

Closes: #3916
Original Pull Request: #3950
2022-02-02 13:13:10 +01:00
Greg L. Turnquist
f62feac421 Externalize build properties.
By reading a properties file from an external location, it is possible to inject a consistent set of properties from Spring Data Build. This also supports repeatable builds.

Closes #3949.
2022-01-31 16:33:45 -06:00
Christoph Strobl
bcbefa9264 Support aggregation operators $first and $last via expression method reference.
This commit registers the first(...) and last(...) methods for transformation via SpEL.
Also update reference and java documentation and add issue reference to tests.

Original Pull Request: #3866
2022-01-24 09:22:33 +01:00
Divya Srivastava
a2243536b2 Add support for $first & $last aggregation operators.
Closes: #3694
Original Pull Request: #3866
2022-01-24 09:22:27 +01:00
Christoph Strobl
a36e292158 Update aggregation StringOperators documentation.
Update reference and java documentation.
Add issue reference to tests.
Align method names and format code.

Original Pull Request: #3861
2022-01-21 10:42:19 +01:00
Divya Srivastava
494c22b192 Add support for $replaceOne & $replaceAll aggregation operators.
Closes: #3695
Original Pull Request: #3861
2022-01-21 10:40:54 +01:00
Christoph Strobl
030f12023c Support aggregation operators $acos and $acosh via expression method reference.
This commit registers the acos(...) and acosh(...) methods for transformation via SpEL.

Original Pull Request: #3858
2022-01-20 16:18:23 +01:00
Christoph Strobl
31f640a398 Polishing.
Update java doc and add issue references to tests.

Original Pull Request: #3858
2022-01-20 16:18:10 +01:00
Divya Srivastava
54f098a906 Add support for $acos & $acosh aggregation operators.
Resolves: #3707
Original Pull Request: #3858
2022-01-20 16:17:55 +01:00
Christoph Strobl
885d05965b Revert query modification in json parsing tests.
Add tests and move json string treatment into the ParameterBindingDocumentCodec.
Finally add issue references and format code.

Original Pull Request: #3907
2022-01-20 14:49:39 +01:00
rolag-it
a8a0fb5dba Fix expression defining entire query in annotated repository methods.
This fix enables defining an entire JSON-based query in Query and Aggregate annotations using a single parameter or SpEL Expression.

Resolves: #3871
Original Pull Request: #3907
2022-01-20 13:43:32 +01:00
Christoph Strobl
67edae8602 After release cleanups.
See #3936
2022-01-18 09:21:33 +01:00
Christoph Strobl
249e7746d5 Prepare next development iteration.
See #3936
2022-01-18 09:21:29 +01:00
Christoph Strobl
6a979088b5 Release version 3.4 M2 (2021.2.0).
See #3936
2022-01-18 09:09:36 +01:00
Christoph Strobl
fca629c117 Prepare 3.4 M2 (2021.2.0).
See #3936
2022-01-18 09:09:00 +01:00
Mark Paluch
dfbd1bded5 Polishing.
Run mvnw -version command in Artifactory build to display Java version.

See #3882
2022-01-17 13:55:53 +01:00
Christoph Strobl
f9e98669b9 After release cleanups.
See #3882
2022-01-14 11:08:02 +01:00
Christoph Strobl
96d4abdf24 Prepare next development iteration.
See #3882
2022-01-14 11:07:59 +01:00
Christoph Strobl
23442ef639 Release version 3.4 M1 (2021.2.0).
See #3882
2022-01-14 10:58:16 +01:00
Christoph Strobl
01b571dec9 Prepare 3.4 M1 (2021.2.0).
See #3882
2022-01-14 10:57:50 +01:00
Christoph Strobl
04ec49eb9e Avoid schema keyId uuid representation errors.
To avoid driver configuration specific UUID representation format errors (binary subtype 3 vs. subtype 4) we now directly convert the given key into its subtype 4 format.

Resolves: #3929
Original pull request: #3931.
2022-01-13 15:26:53 +01:00
Mark Paluch
d61cf8f57e Polishing.
Simplify assertions, reformat code.

See #3921
Original pull request: #3930.
2022-01-13 11:01:48 +01:00
Christoph Strobl
50a12121f2 Use index instead of iterator to map position and map keys for updates.
This commit removes usage of the iterator and replaces map key and positional parameter mappings with an index based token lookup.

Closes #3921
Original pull request: #3930.
2022-01-13 11:01:35 +01:00
Mark Paluch
998bd1f9bb Polishing.
Reformat code. Tweak documentation wording and callout syntax.

See #3914, see #3901
Original pull request: #3915.
2022-01-12 15:59:14 +01:00
Christoph Strobl
e0a57fa19b Avoid creating invalid index definitions for Map-like properties.
This commit makes sure to exclude Map like structures from index inspection unless annotated with WilcardIndexed.

Closes #3914, closes #3901
Original pull request: #3915.
2022-01-12 15:57:19 +01:00
Mark Paluch
9c78802c47 Polishing.
Add author tags, extend copyright license years, simplify tests.

See #3892
2022-01-12 15:30:36 +01:00
rolag-it
a958ffb5c8 Fix pagination with reactive fluent Querydsl query definition.
Pageable object was not passed to Query, so fetchPage retrieved erroneously the whole dataset as Page content.

Closes #3892
2022-01-12 15:30:31 +01:00
Hett
c31872d979 Avoid double call of fetch method in DefaultReferenceResolver.
This commit fixes an issue where the fetch method is called twice when looking up singe value references.

Resolves: #3918
Original Pull Request: #3919
2022-01-11 08:57:02 +01:00
Mark Paluch
212509f56a Upgrade to MongoDB driver 4.4.1.
Closes #3926
2022-01-10 08:52:57 +01:00
Mark Paluch
b348bb6679 Adopt to Mockito changes.
Closes #3923
2022-01-04 14:41:47 +01:00
Christoph Strobl
8be5dd3909 Adapt to changes in data-commons.
See: spring-projects/spring-data-commons#2514
Related to: #3894
2021-12-14 15:31:45 +01:00
Christoph Strobl
f2c4370584 Fix meta field mapping when computing fields for projections.
Related to: #3894
2021-12-14 14:58:53 +01:00
Christoph Strobl
fdff74f7b5 Polishing.
Add tests for projections on dbref properties update java- and reference documentation.

Original Pull Request: #3894
2021-12-14 11:31:00 +01:00
Mark Paluch
0070b12f95 Add general support for direct projections.
Closes: #3894
2021-12-14 11:30:45 +01:00
Mark Paluch
bafc2bebf2 Polishing.
Tweak Javadoc.

See #3898
Original pull request: #3904.
2021-12-14 09:36:19 +01:00
Christoph Strobl
7146fb33e9 Fix field inclusion in aggregation project operation.
Closes #3898
Original pull request: #3904.
2021-12-14 09:36:14 +01:00
Mark Paluch
75999d9e36 Propagate Bean ClassLoader to MongoTypeMapper.
We now set the ClassLoader from the ApplicationContext to the type mapper to ensure the type mapper has access to entities. Previously, `SimpleTypeInformationMapper` used the contextual class loader and that failed in Fork/Join-Pool threads such as parallel streams as ForkJoinPool uses the system classloader. Running e.g. a packaged Boot application sets up an application ClassLoader that has access to packaged code while the system ClassLoader does not.

Also, consistently access the MongoTypeMapper through its getter.

Closes #3905
2021-12-09 11:33:47 +01:00
John Blum
7a64025669 Edit README.
Fix punctation, change wording and correct case in build from source section.
2021-12-07 17:58:54 -08:00
John Blum
113106037a Polish for retaining the sort order when using text search sort by score.
Closes gh-3896.
2021-12-07 17:37:24 -08:00
Christoph Strobl
132834b1e6 Retain sort order when using text search sort by score.
We now make sure to capture the position to apply sort by score.
2021-12-07 17:37:10 -08:00
Christoph Strobl
36a4b7f727 Polishing - Update outdated links in Javadoc.
Original Pull Request #3883
2021-11-16 14:26:21 +01:00
Mark Paluch
a8432f5bf1 Polishing.
Remove unused fields.

Original Pull Request #3883
2021-11-16 14:26:02 +01:00
Christoph Strobl
e5a295bb8f Guard potentially expensive log message computations.
Original Pull Request #3883
2021-11-16 14:25:40 +01:00
Mark Paluch
f7cbd4264a Migrate off SLF4J to Spring JCL.
Closes #3881
Original Pull Request #3883
2021-11-16 14:25:18 +01:00
Jens Schauder
0c37a20a0b After release cleanups.
See #3865
2021-11-12 10:59:43 +01:00
Jens Schauder
230775f98e Prepare next development iteration.
See #3865
2021-11-12 10:59:41 +01:00
443 changed files with 7350 additions and 11231 deletions

142
Jenkinsfile vendored
View File

@@ -9,7 +9,7 @@ pipeline {
triggers { triggers {
pollSCM 'H/10 * * * *' pollSCM 'H/10 * * * *'
upstream(upstreamProjects: "spring-data-commons/2.6.x", threshold: hudson.model.Result.SUCCESS) upstream(upstreamProjects: "spring-data-commons/3.0.x", threshold: hudson.model.Result.SUCCESS)
} }
options { options {
@@ -20,64 +20,7 @@ pipeline {
stages { stages {
stage("Docker images") { stage("Docker images") {
parallel { parallel {
stage('Publish JDK (main) + MongoDB 4.0') { stage('Publish JDK (Java 17) + MongoDB 4.4') {
when {
anyOf {
changeset "ci/openjdk8-mongodb-4.0/**"
changeset "ci/pipeline.properties"
}
}
agent { label 'data' }
options { timeout(time: 30, unit: 'MINUTES') }
steps {
script {
def image = docker.build("springci/spring-data-with-mongodb-4.0:${p['java.main.tag']}", "--build-arg BASE=${p['docker.java.main.image']} --build-arg MONGODB=${p['docker.mongodb.4.0.version']} ci/openjdk8-mongodb-4.0/")
docker.withRegistry(p['docker.registry'], p['docker.credentials']) {
image.push()
}
}
}
}
stage('Publish JDK (main) + MongoDB 4.4') {
when {
anyOf {
changeset "ci/openjdk8-mongodb-4.4/**"
changeset "ci/pipeline.properties"
}
}
agent { label 'data' }
options { timeout(time: 30, unit: 'MINUTES') }
steps {
script {
def image = docker.build("springci/spring-data-with-mongodb-4.4:${p['java.main.tag']}", "--build-arg BASE=${p['docker.java.main.image']} --build-arg MONGODB=${p['docker.mongodb.4.4.version']} ci/openjdk8-mongodb-4.4/")
docker.withRegistry(p['docker.registry'], p['docker.credentials']) {
image.push()
}
}
}
}
stage('Publish JDK (main) + MongoDB 5.0') {
when {
anyOf {
changeset "ci/openjdk8-mongodb-5.0/**"
changeset "ci/pipeline.properties"
}
}
agent { label 'data' }
options { timeout(time: 30, unit: 'MINUTES') }
steps {
script {
def image = docker.build("springci/spring-data-with-mongodb-5.0:${p['java.main.tag']}", "--build-arg BASE=${p['docker.java.main.image']} --build-arg MONGODB=${p['docker.mongodb.5.0.version']} ci/openjdk8-mongodb-5.0/")
docker.withRegistry(p['docker.registry'], p['docker.credentials']) {
image.push()
}
}
}
}
stage('Publish JDK (LTS) + MongoDB 4.4') {
when { when {
anyOf { anyOf {
changeset "ci/openjdk17-mongodb-4.4/**" changeset "ci/openjdk17-mongodb-4.4/**"
@@ -89,7 +32,26 @@ pipeline {
steps { steps {
script { script {
def image = docker.build("springci/spring-data-with-mongodb-4.4:${p['java.lts.tag']}", "--build-arg BASE=${p['docker.java.lts.image']} --build-arg MONGODB=${p['docker.mongodb.4.4.version']} ci/openjdk17-mongodb-4.4/") def image = docker.build("springci/spring-data-with-mongodb-4.4:${p['java.main.tag']}", "--build-arg BASE=${p['docker.java.main.image']} --build-arg MONGODB=${p['docker.mongodb.4.4.version']} ci/openjdk17-mongodb-4.4/")
docker.withRegistry(p['docker.registry'], p['docker.credentials']) {
image.push()
}
}
}
}
stage('Publish JDK (Java 17) + MongoDB 5.0') {
when {
anyOf {
changeset "ci/openjdk17-mongodb-5.0/**"
changeset "ci/pipeline.properties"
}
}
agent { label 'data' }
options { timeout(time: 30, unit: 'MINUTES') }
steps {
script {
def image = docker.build("springci/spring-data-with-mongodb-5.0:${p['java.main.tag']}", "--build-arg BASE=${p['docker.java.main.image']} --build-arg MONGODB=${p['docker.mongodb.5.0.version']} ci/openjdk17-mongodb-5.0/")
docker.withRegistry(p['docker.registry'], p['docker.credentials']) { docker.withRegistry(p['docker.registry'], p['docker.credentials']) {
image.push() image.push()
} }
@@ -99,7 +61,7 @@ pipeline {
} }
} }
stage("test: baseline (main)") { stage("test: baseline (Java 17)") {
when { when {
beforeAgent(true) beforeAgent(true)
anyOf { anyOf {
@@ -112,12 +74,12 @@ pipeline {
} }
options { timeout(time: 30, unit: 'MINUTES') } options { timeout(time: 30, unit: 'MINUTES') }
environment { environment {
ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') ARTIFACTORY = credentials("${p['artifactory.credentials']}")
} }
steps { steps {
script { script {
docker.withRegistry(p['docker.registry'], p['docker.credentials']) { docker.withRegistry(p['docker.registry'], p['docker.credentials']) {
docker.image("harbor-repo.vmware.com/dockerhub-proxy-cache/springci/spring-data-with-mongodb-4.0:${p['java.main.tag']}").inside(p['docker.java.inside.basic']) { docker.image("harbor-repo.vmware.com/dockerhub-proxy-cache/springci/spring-data-with-mongodb-4.4:${p['java.main.tag']}").inside(p['docker.java.inside.basic']) {
sh 'mkdir -p /tmp/mongodb/db /tmp/mongodb/log' sh 'mkdir -p /tmp/mongodb/db /tmp/mongodb/log'
sh 'mongod --setParameter transactionLifetimeLimitSeconds=90 --setParameter maxTransactionLockRequestTimeoutMillis=10000 --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &' sh 'mongod --setParameter transactionLifetimeLimitSeconds=90 --setParameter maxTransactionLockRequestTimeoutMillis=10000 --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &'
sh 'sleep 10' sh 'sleep 10'
@@ -139,37 +101,14 @@ pipeline {
} }
} }
parallel { parallel {
stage("test: mongodb 4.4 (main)") {
agent {
label 'data'
}
options { timeout(time: 30, unit: 'MINUTES') }
environment {
ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c')
}
steps {
script {
docker.withRegistry(p['docker.registry'], p['docker.credentials']) {
docker.image("harbor-repo.vmware.com/dockerhub-proxy-cache/springci/spring-data-with-mongodb-4.4:${p['java.main.tag']}").inside(p['docker.java.inside.basic']) {
sh 'mkdir -p /tmp/mongodb/db /tmp/mongodb/log'
sh 'mongod --setParameter transactionLifetimeLimitSeconds=90 --setParameter maxTransactionLockRequestTimeoutMillis=10000 --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &'
sh 'sleep 10'
sh 'mongo --eval "rs.initiate({_id: \'rs0\', members:[{_id: 0, host: \'127.0.0.1:27017\'}]});"'
sh 'sleep 15'
sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -s settings.xml clean dependency:list test -Duser.name=jenkins -Dsort -U -B'
}
}
}
}
}
stage("test: mongodb 5.0 (main)") { stage("test: mongodb 5.0 (Java 17)") {
agent { agent {
label 'data' label 'data'
} }
options { timeout(time: 30, unit: 'MINUTES') } options { timeout(time: 30, unit: 'MINUTES') }
environment { environment {
ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') ARTIFACTORY = credentials("${p['artifactory.credentials']}")
} }
steps { steps {
script { script {
@@ -186,30 +125,6 @@ pipeline {
} }
} }
} }
stage("test: baseline (LTS)") {
agent {
label 'data'
}
options { timeout(time: 30, unit: 'MINUTES') }
environment {
ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c')
}
steps {
script {
docker.withRegistry(p['docker.registry'], p['docker.credentials']) {
docker.image("harbor-repo.vmware.com/dockerhub-proxy-cache/springci/spring-data-with-mongodb-4.4:${p['java.lts.tag']}").inside(p['docker.java.inside.basic']) {
sh 'mkdir -p /tmp/mongodb/db /tmp/mongodb/log'
sh 'mongod --setParameter transactionLifetimeLimitSeconds=90 --setParameter maxTransactionLockRequestTimeoutMillis=10000 --dbpath /tmp/mongodb/db --replSet rs0 --fork --logpath /tmp/mongodb/log/mongod.log &'
sh 'sleep 10'
sh 'mongo --eval "rs.initiate({_id: \'rs0\', members:[{_id: 0, host: \'127.0.0.1:27017\'}]});"'
sh 'sleep 15'
sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -s settings.xml -Pjava11 clean dependency:list test -Duser.name=jenkins -Dsort -U -B'
}
}
}
}
}
} }
} }
@@ -227,13 +142,14 @@ pipeline {
options { timeout(time: 20, unit: 'MINUTES') } options { timeout(time: 20, unit: 'MINUTES') }
environment { environment {
ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') ARTIFACTORY = credentials("${p['artifactory.credentials']}")
} }
steps { steps {
script { script {
docker.withRegistry(p['docker.registry'], p['docker.credentials']) { docker.withRegistry(p['docker.registry'], p['docker.credentials']) {
docker.image(p['docker.java.main.image']).inside(p['docker.java.inside.basic']) { docker.image(p['docker.java.main.image']).inside(p['docker.java.inside.basic']) {
sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -v'
sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -s settings.xml -Pci,artifactory ' + sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -s settings.xml -Pci,artifactory ' +
'-Dartifactory.server=https://repo.spring.io ' + '-Dartifactory.server=https://repo.spring.io ' +
"-Dartifactory.username=${ARTIFACTORY_USR} " + "-Dartifactory.username=${ARTIFACTORY_USR} " +

View File

@@ -271,7 +271,7 @@ The https://spring.io/[spring.io] site contains several guides that show how to
[[building-from-source]] [[building-from-source]]
== Building from Source == Building from Source
You do not need to build from source to use Spring Data. Binaries are available in https://repo.spring.io[repo.spring.io]. You do not need to build from source to use Spring Data. Binaries are available in https://repo.spring.io[repo.spring.io]
and accessible from Maven using the Maven configuration noted <<maven-configuration,above>>. and accessible from Maven using the Maven configuration noted <<maven-configuration,above>>.
NOTE: Configuration for Gradle is similar to Maven. NOTE: Configuration for Gradle is similar to Maven.
@@ -281,16 +281,17 @@ Follow this https://start.spring.io/#type=maven-project&language=java&platformVe
to build an imperative application and this https://start.spring.io/#type=maven-project&language=java&platformVersion=2.5.4&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=demo&name=demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.demo&dependencies=data-mongodb-reactive[link] to build an imperative application and this https://start.spring.io/#type=maven-project&language=java&platformVersion=2.5.4&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=demo&name=demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.demo&dependencies=data-mongodb-reactive[link]
to build a reactive one. to build a reactive one.
However, if you want to try out the latest and greatest, Spring Data can be easily built with the https://github.com/takari/maven-wrapper[maven wrapper] However, if you want to try out the latest and greatest, Spring Data MongoDB can be easily built with the https://github.com/takari/maven-wrapper[Maven wrapper]
and minimally JDK 8 (https://www.oracle.com/java/technologies/downloads/[JDK downloads]). and minimally, JDK 8 (https://www.oracle.com/java/technologies/downloads/[JDK downloads]).
In order to build Spring Data MongoDB, first you will need to https://www.mongodb.com/try/download/community[download] In order to build Spring Data MongoDB, you will need to https://www.mongodb.com/try/download/community[download]
and https://docs.mongodb.com/manual/installation/[install a MongoDB distribution]. and https://docs.mongodb.com/manual/installation/[install a MongoDB distribution].
Once you have installed MongoDB, you need to start a MongoDB server. It is convenient to set an environment variable to Once you have installed MongoDB, you need to start a MongoDB server. It is convenient to set an environment variable to
your MongoDB installation (e.g. `MONGODB_HOME`). your MongoDB installation directory (e.g. `MONGODB_HOME`).
To run the full test suite a https://docs.mongodb.com/manual/tutorial/deploy-replica-set/[MongoDB Replica Set] is required. To run the full test suite, a https://docs.mongodb.com/manual/tutorial/deploy-replica-set/[MongoDB Replica Set]
is required.
To run the MongoDB server enter the following command from a command-line: To run the MongoDB server enter the following command from a command-line:
@@ -331,7 +332,7 @@ In case you need to, you can adjust the `ulimit` with the following command (327
$ ulimit -n 32768 $ ulimit -n 32768
---- ----
You can use `ulimit -a` again to verify the `ulimit` on "_open files_" was set appropriately. You can use `ulimit -a` again to verify the `ulimit` for "_open files_" was set appropriately.
Now you are ready to build Spring Data MongoDB. Simply enter the following `mvnw` (Maven Wrapper) command: Now you are ready to build Spring Data MongoDB. Simply enter the following `mvnw` (Maven Wrapper) command:

View File

@@ -1,21 +0,0 @@
ARG BASE
FROM ${BASE}
# Any ARG statements before FROM are cleared.
ARG MONGODB
ENV TZ=Etc/UTC
ENV DEBIAN_FRONTEND=noninteractive
RUN set -eux; \
sed -i -e 's/archive.ubuntu.com/mirror.one.com/g' /etc/apt/sources.list; \
sed -i -e 's/security.ubuntu.com/mirror.one.com/g' /etc/apt/sources.list; \
sed -i -e 's/http/https/g' /etc/apt/sources.list ; \
apt-get update && apt-get install -y apt-transport-https apt-utils gnupg2 ; \
apt-key adv --keyserver hkps://keyserver.ubuntu.com:443 --recv 656408E390CFB1F5 ; \
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list; \
echo ${TZ} > /etc/timezone;
RUN apt-get update ; \
apt-get install -y mongodb-org=${MONGODB} mongodb-org-server=${MONGODB} mongodb-org-shell=${MONGODB} mongodb-org-mongos=${MONGODB} mongodb-org-tools=${MONGODB} ; \
apt-get clean; \
rm -rf /var/lib/apt/lists/*;

View File

@@ -1,21 +0,0 @@
ARG BASE
FROM ${BASE}
# Any ARG statements before FROM are cleared.
ARG MONGODB
ENV TZ=Etc/UTC
ENV DEBIAN_FRONTEND=noninteractive
RUN RUN set -eux; \
sed -i -e 's/archive.ubuntu.com/mirror.one.com/g' /etc/apt/sources.list; \
sed -i -e 's/security.ubuntu.com/mirror.one.com/g' /etc/apt/sources.list; \
sed -i -e 's/http/https/g' /etc/apt/sources.list ; \
apt-get update && apt-get install -y apt-transport-https apt-utils gnupg2 ; \
apt-key adv --keyserver hkps://keyserver.ubuntu.com:443 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4 ; \
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.0.list; \
echo ${TZ} > /etc/timezone;
RUN apt-get update ; \
apt-get install -y mongodb-org=${MONGODB} mongodb-org-server=${MONGODB} mongodb-org-shell=${MONGODB} mongodb-org-mongos=${MONGODB} mongodb-org-tools=${MONGODB} ; \
apt-get clean; \
rm -rf /var/lib/apt/lists/*;

View File

@@ -1,23 +0,0 @@
ARG BASE
FROM ${BASE}
# Any ARG statements before FROM are cleared.
ARG MONGODB
ENV TZ=Etc/UTC
ENV DEBIAN_FRONTEND=noninteractive
RUN set -eux; \
sed -i -e 's/archive.ubuntu.com/mirror.one.com/g' /etc/apt/sources.list; \
sed -i -e 's/security.ubuntu.com/mirror.one.com/g' /etc/apt/sources.list; \
sed -i -e 's/http/https/g' /etc/apt/sources.list ; \
apt-get update && apt-get install -y apt-transport-https apt-utils gnupg2 ; \
apt-key adv --keyserver hkps://keyserver.ubuntu.com:443 --recv 656408E390CFB1F5 ; \
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list; \
echo ${TZ} > /etc/timezone;
RUN apt-get update ; \
ln -T /bin/true /usr/bin/systemctl ; \
apt-get install -y mongodb-org=${MONGODB} mongodb-org-server=${MONGODB} mongodb-org-shell=${MONGODB} mongodb-org-mongos=${MONGODB} mongodb-org-tools=${MONGODB} ; \
rm /usr/bin/systemctl ; \
apt-get clean ; \
rm -rf /var/lib/apt/lists/* ;

View File

@@ -1,23 +1,18 @@
# Java versions # Java versions
java.main.tag=8u312-b07-jdk java.main.tag=17.0.2_8-jdk
java.next.tag=11.0.13_8-jdk
java.lts.tag=17.0.1_12-jdk
# Docker container images - standard # Docker container images - standard
docker.java.main.image=harbor-repo.vmware.com/dockerhub-proxy-cache/library/eclipse-temurin:${java.main.tag} docker.java.main.image=harbor-repo.vmware.com/dockerhub-proxy-cache/library/eclipse-temurin:${java.main.tag}
docker.java.next.image=harbor-repo.vmware.com/dockerhub-proxy-cache/library/eclipse-temurin:${java.next.tag}
docker.java.lts.image=harbor-repo.vmware.com/dockerhub-proxy-cache/library/eclipse-temurin:${java.lts.tag}
# Supported versions of MongoDB # Supported versions of MongoDB
docker.mongodb.4.0.version=4.0.23 docker.mongodb.4.4.version=4.4.12
docker.mongodb.4.4.version=4.4.4 docker.mongodb.5.0.version=5.0.6
docker.mongodb.5.0.version=5.0.3
# Supported versions of Redis # Supported versions of Redis
docker.redis.6.version=6.2.4 docker.redis.6.version=6.2.6
# Supported versions of Cassandra # Supported versions of Cassandra
docker.cassandra.3.version=3.11.10 docker.cassandra.3.version=3.11.12
# Docker environment settings # Docker environment settings
docker.java.inside.basic=-v $HOME:/tmp/jenkins-home docker.java.inside.basic=-v $HOME:/tmp/jenkins-home

13
pom.xml
View File

@@ -5,7 +5,7 @@
<groupId>org.springframework.data</groupId> <groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId> <artifactId>spring-data-mongodb-parent</artifactId>
<version>3.3.2</version> <version>4.0.0-M3</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>Spring Data MongoDB</name> <name>Spring Data MongoDB</name>
@@ -15,7 +15,7 @@
<parent> <parent>
<groupId>org.springframework.data.build</groupId> <groupId>org.springframework.data.build</groupId>
<artifactId>spring-data-parent</artifactId> <artifactId>spring-data-parent</artifactId>
<version>2.6.2</version> <version>3.0.0-M3</version>
</parent> </parent>
<modules> <modules>
@@ -24,10 +24,11 @@
</modules> </modules>
<properties> <properties>
<source.level>16</source.level>
<project.type>multi</project.type> <project.type>multi</project.type>
<dist.id>spring-data-mongodb</dist.id> <dist.id>spring-data-mongodb</dist.id>
<springdata.commons>2.6.2</springdata.commons> <springdata.commons>3.0.0-M3</springdata.commons>
<mongo>4.4.2</mongo> <mongo>4.5.0</mongo>
<mongo.reactivestreams>${mongo}</mongo.reactivestreams> <mongo.reactivestreams>${mongo}</mongo.reactivestreams>
<jmh.version>1.19</jmh.version> <jmh.version>1.19</jmh.version>
</properties> </properties>
@@ -134,8 +135,8 @@
<repositories> <repositories>
<repository> <repository>
<id>spring-libs-release</id> <id>spring-libs-milestone</id>
<url>https://repo.spring.io/libs-release</url> <url>https://repo.spring.io/libs-milestone</url>
</repository> </repository>
<repository> <repository>
<id>sonatype-libs-snapshot</id> <id>sonatype-libs-snapshot</id>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.springframework.data</groupId> <groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId> <artifactId>spring-data-mongodb-parent</artifactId>
<version>3.3.2</version> <version>4.0.0-M3</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

View File

@@ -14,7 +14,7 @@
<parent> <parent>
<groupId>org.springframework.data</groupId> <groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId> <artifactId>spring-data-mongodb-parent</artifactId>
<version>3.3.2</version> <version>4.0.0-M3</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

View File

@@ -11,7 +11,7 @@
<parent> <parent>
<groupId>org.springframework.data</groupId> <groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId> <artifactId>spring-data-mongodb-parent</artifactId>
<version>3.3.2</version> <version>4.0.0-M3</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
@@ -122,27 +122,6 @@
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>io.reactivex</groupId>
<artifactId>rxjava</artifactId>
<version>${rxjava}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.reactivex</groupId>
<artifactId>rxjava-reactive-streams</artifactId>
<version>${rxjava-reactive-streams}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>
<version>${rxjava2}</version>
<optional>true</optional>
</dependency>
<dependency> <dependency>
<groupId>io.reactivex.rxjava3</groupId> <groupId>io.reactivex.rxjava3</groupId>
<artifactId>rxjava</artifactId> <artifactId>rxjava</artifactId>
@@ -152,12 +131,6 @@
<!-- CDI --> <!-- CDI -->
<!-- Dependency order required to build against CDI 1.0 and test with CDI 2.0 --> <!-- Dependency order required to build against CDI 1.0 and test with CDI 2.0 -->
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jcdi_2.0_spec</artifactId>
<version>1.0.1</version>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>javax.interceptor</groupId> <groupId>javax.interceptor</groupId>
@@ -167,31 +140,48 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.enterprise</groupId> <groupId>jakarta.enterprise</groupId>
<artifactId>cdi-api</artifactId> <artifactId>jakarta.enterprise.cdi-api</artifactId>
<version>${cdi}</version> <version>${cdi}</version>
<scope>provided</scope> <scope>provided</scope>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.annotation</groupId> <groupId>jakarta.annotation</groupId>
<artifactId>javax.annotation-api</artifactId> <artifactId>jakarta.annotation-api</artifactId>
<version>${javax-annotation-api}</version> <version>${jakarta-annotation-api}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.openwebbeans</groupId> <groupId>org.apache.openwebbeans</groupId>
<artifactId>openwebbeans-se</artifactId> <artifactId>openwebbeans-se</artifactId>
<classifier>jakarta</classifier>
<version>${webbeans}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.openwebbeans</groupId>
<artifactId>openwebbeans-spi</artifactId>
<classifier>jakarta</classifier>
<version>${webbeans}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.openwebbeans</groupId>
<artifactId>openwebbeans-impl</artifactId>
<classifier>jakarta</classifier>
<version>${webbeans}</version> <version>${webbeans}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<!-- JSR 303 Validation --> <!-- JSR 303 Validation -->
<dependency> <dependency>
<groupId>javax.validation</groupId> <groupId>jakarta.validation</groupId>
<artifactId>validation-api</artifactId> <artifactId>jakarta.validation-api</artifactId>
<version>${validation}</version> <version>${validation}</version>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
@@ -206,28 +196,23 @@
<dependency> <dependency>
<groupId>org.hibernate</groupId> <groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId> <artifactId>hibernate-validator</artifactId>
<version>5.4.3.Final</version> <version>7.0.1.Final</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>jakarta.el</groupId>
<artifactId>jakarta.el-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency> <dependency>
<groupId>org.glassfish</groupId> <groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId> <artifactId>jakarta.el</artifactId>
<version>3.0.1-b11</version> <version>4.0.2</version>
<scope>test</scope> <scope>provided</scope>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${jodatime}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.threeten</groupId>
<artifactId>threetenbp</artifactId>
<version>${threetenbp}</version>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
@@ -237,13 +222,6 @@
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${slf4j}</version>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>nl.jqno.equalsverifier</groupId> <groupId>nl.jqno.equalsverifier</groupId>
<artifactId>equalsverifier</artifactId> <artifactId>equalsverifier</artifactId>
@@ -279,9 +257,9 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.transaction</groupId> <groupId>jakarta.transaction</groupId>
<artifactId>jta</artifactId> <artifactId>jakarta.transaction-api</artifactId>
<version>1.1</version> <version>2.0.0</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>

View File

@@ -103,19 +103,11 @@ public class BindableMongoExpression implements MongoExpression {
return new BindableMongoExpression(expressionString, codecRegistryProvider, args); return new BindableMongoExpression(expressionString, codecRegistryProvider, args);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.MongoExpression#toDocument()
*/
@Override @Override
public Document toDocument() { public Document toDocument() {
return target.get(); return target.get();
} }
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override @Override
public String toString() { public String toString() {
return "BindableMongoExpression{" + "expressionString='" + expressionString + '\'' + ", args=" return "BindableMongoExpression{" + "expressionString='" + expressionString + '\'' + ", args="

View File

@@ -193,19 +193,11 @@ public class MongoDatabaseUtils {
this.resourceHolder = resourceHolder; this.resourceHolder = resourceHolder;
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.support.ResourceHolderSynchronization#shouldReleaseBeforeCompletion()
*/
@Override @Override
protected boolean shouldReleaseBeforeCompletion() { protected boolean shouldReleaseBeforeCompletion() {
return false; return false;
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.support.ResourceHolderSynchronization#processResourceAfterCommit(java.lang.Object)
*/
@Override @Override
protected void processResourceAfterCommit(MongoResourceHolder resourceHolder) { protected void processResourceAfterCommit(MongoResourceHolder resourceHolder) {
@@ -214,10 +206,6 @@ public class MongoDatabaseUtils {
} }
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.support.ResourceHolderSynchronization#afterCompletion(int)
*/
@Override @Override
public void afterCompletion(int status) { public void afterCompletion(int status) {
@@ -228,10 +216,6 @@ public class MongoDatabaseUtils {
super.afterCompletion(status); super.afterCompletion(status);
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.support.ResourceHolderSynchronization#releaseResource(java.lang.Object, java.lang.Object)
*/
@Override @Override
protected void releaseResource(MongoResourceHolder resourceHolder, Object resourceKey) { protected void releaseResource(MongoResourceHolder resourceHolder, Object resourceKey) {

View File

@@ -1,57 +0,0 @@
/*
* Copyright 2011-2022 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.mongodb;
import org.springframework.dao.DataAccessException;
import com.mongodb.client.MongoDatabase;
/**
* Interface for factories creating {@link MongoDatabase} instances.
*
* @author Mark Pollack
* @author Thomas Darimont
* @author Christoph Strobl
* @deprecated since 3.0, use {@link MongoDatabaseFactory} instead.
*/
@Deprecated
public interface MongoDbFactory extends MongoDatabaseFactory {
/**
* Creates a default {@link MongoDatabase} instance.
*
* @return never {@literal null}.
* @throws DataAccessException
* @deprecated since 3.0. Use {@link #getMongoDatabase()} instead.
*/
@Deprecated
default MongoDatabase getDb() throws DataAccessException {
return getMongoDatabase();
}
/**
* Obtain a {@link MongoDatabase} instance to access the database with the given name.
*
* @param dbName must not be {@literal null} or empty.
* @return never {@literal null}.
* @throws DataAccessException
* @deprecated since 3.0. Use {@link #getMongoDatabase(String)} instead.
*/
@Deprecated
default MongoDatabase getDb(String dbName) throws DataAccessException {
return getMongoDatabase(dbName);
}
}

View File

@@ -106,10 +106,6 @@ public class MongoTransactionManager extends AbstractPlatformTransactionManager
this.options = options; this.options = options;
} }
/*
* (non-Javadoc)
* org.springframework.transaction.support.AbstractPlatformTransactionManager#doGetTransaction()
*/
@Override @Override
protected Object doGetTransaction() throws TransactionException { protected Object doGetTransaction() throws TransactionException {
@@ -118,19 +114,11 @@ public class MongoTransactionManager extends AbstractPlatformTransactionManager
return new MongoTransactionObject(resourceHolder); return new MongoTransactionObject(resourceHolder);
} }
/*
* (non-Javadoc)
* org.springframework.transaction.support.AbstractPlatformTransactionManager#isExistingTransaction(java.lang.Object)
*/
@Override @Override
protected boolean isExistingTransaction(Object transaction) throws TransactionException { protected boolean isExistingTransaction(Object transaction) throws TransactionException {
return extractMongoTransaction(transaction).hasResourceHolder(); return extractMongoTransaction(transaction).hasResourceHolder();
} }
/*
* (non-Javadoc)
* org.springframework.transaction.support.AbstractPlatformTransactionManager#doBegin(java.lang.Object, org.springframework.transaction.TransactionDefinition)
*/
@Override @Override
protected void doBegin(Object transaction, TransactionDefinition definition) throws TransactionException { protected void doBegin(Object transaction, TransactionDefinition definition) throws TransactionException {
@@ -160,10 +148,6 @@ public class MongoTransactionManager extends AbstractPlatformTransactionManager
TransactionSynchronizationManager.bindResource(getRequiredDbFactory(), resourceHolder); TransactionSynchronizationManager.bindResource(getRequiredDbFactory(), resourceHolder);
} }
/*
* (non-Javadoc)
* org.springframework.transaction.support.AbstractPlatformTransactionManager#doSuspend(java.lang.Object)
*/
@Override @Override
protected Object doSuspend(Object transaction) throws TransactionException { protected Object doSuspend(Object transaction) throws TransactionException {
@@ -173,19 +157,11 @@ public class MongoTransactionManager extends AbstractPlatformTransactionManager
return TransactionSynchronizationManager.unbindResource(getRequiredDbFactory()); return TransactionSynchronizationManager.unbindResource(getRequiredDbFactory());
} }
/*
* (non-Javadoc)
* org.springframework.transaction.support.AbstractPlatformTransactionManager#doResume(java.lang.Object, java.lang.Object)
*/
@Override @Override
protected void doResume(@Nullable Object transaction, Object suspendedResources) { protected void doResume(@Nullable Object transaction, Object suspendedResources) {
TransactionSynchronizationManager.bindResource(getRequiredDbFactory(), suspendedResources); TransactionSynchronizationManager.bindResource(getRequiredDbFactory(), suspendedResources);
} }
/*
* (non-Javadoc)
* org.springframework.transaction.support.AbstractPlatformTransactionManager#doCommit(org.springframework.transaction.support.DefaultTransactionStatus)
*/
@Override @Override
protected final void doCommit(DefaultTransactionStatus status) throws TransactionException { protected final void doCommit(DefaultTransactionStatus status) throws TransactionException {
@@ -236,10 +212,6 @@ public class MongoTransactionManager extends AbstractPlatformTransactionManager
transactionObject.commitTransaction(); transactionObject.commitTransaction();
} }
/*
* (non-Javadoc)
* org.springframework.transaction.support.AbstractPlatformTransactionManager#doRollback(org.springframework.transaction.support.DefaultTransactionStatus)
*/
@Override @Override
protected void doRollback(DefaultTransactionStatus status) throws TransactionException { protected void doRollback(DefaultTransactionStatus status) throws TransactionException {
@@ -259,10 +231,6 @@ public class MongoTransactionManager extends AbstractPlatformTransactionManager
} }
} }
/*
* (non-Javadoc)
* org.springframework.transaction.support.AbstractPlatformTransactionManager#doSetRollbackOnly(org.springframework.transaction.support.DefaultTransactionStatus)
*/
@Override @Override
protected void doSetRollbackOnly(DefaultTransactionStatus status) throws TransactionException { protected void doSetRollbackOnly(DefaultTransactionStatus status) throws TransactionException {
@@ -270,10 +238,6 @@ public class MongoTransactionManager extends AbstractPlatformTransactionManager
transactionObject.getRequiredResourceHolder().setRollbackOnly(); transactionObject.getRequiredResourceHolder().setRollbackOnly();
} }
/*
* (non-Javadoc)
* org.springframework.transaction.support.AbstractPlatformTransactionManager#doCleanupAfterCompletion(java.lang.Object)
*/
@Override @Override
protected void doCleanupAfterCompletion(Object transaction) { protected void doCleanupAfterCompletion(Object transaction) {
@@ -325,19 +289,11 @@ public class MongoTransactionManager extends AbstractPlatformTransactionManager
return dbFactory; return dbFactory;
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.support.ResourceTransactionManager#getResourceFactory()
*/
@Override @Override
public MongoDatabaseFactory getResourceFactory() { public MongoDatabaseFactory getResourceFactory() {
return getRequiredDbFactory(); return getRequiredDbFactory();
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
@Override @Override
public void afterPropertiesSet() { public void afterPropertiesSet() {
getRequiredDbFactory(); getRequiredDbFactory();
@@ -505,19 +461,11 @@ public class MongoTransactionManager extends AbstractPlatformTransactionManager
return session; return session;
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.support.SmartTransactionObject#isRollbackOnly()
*/
@Override @Override
public boolean isRollbackOnly() { public boolean isRollbackOnly() {
return this.resourceHolder != null && this.resourceHolder.isRollbackOnly(); return this.resourceHolder != null && this.resourceHolder.isRollbackOnly();
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.support.SmartTransactionObject#flush()
*/
@Override @Override
public void flush() { public void flush() {
TransactionSynchronizationUtils.triggerFlush(); TransactionSynchronizationUtils.triggerFlush();

View File

@@ -214,19 +214,11 @@ public class ReactiveMongoDatabaseUtils {
this.resourceHolder = resourceHolder; this.resourceHolder = resourceHolder;
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.ReactiveResourceSynchronization#shouldReleaseBeforeCompletion()
*/
@Override @Override
protected boolean shouldReleaseBeforeCompletion() { protected boolean shouldReleaseBeforeCompletion() {
return false; return false;
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.ReactiveResourceSynchronization#processResourceAfterCommit(java.lang.Object)
*/
@Override @Override
protected Mono<Void> processResourceAfterCommit(ReactiveMongoResourceHolder resourceHolder) { protected Mono<Void> processResourceAfterCommit(ReactiveMongoResourceHolder resourceHolder) {
@@ -237,10 +229,6 @@ public class ReactiveMongoDatabaseUtils {
return Mono.empty(); return Mono.empty();
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.ReactiveResourceSynchronization#afterCompletion(int)
*/
@Override @Override
public Mono<Void> afterCompletion(int status) { public Mono<Void> afterCompletion(int status) {
@@ -256,10 +244,6 @@ public class ReactiveMongoDatabaseUtils {
}); });
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.ReactiveResourceSynchronization#releaseResource(java.lang.Object, java.lang.Object)
*/
@Override @Override
protected Mono<Void> releaseResource(ReactiveMongoResourceHolder resourceHolder, Object resourceKey) { protected Mono<Void> releaseResource(ReactiveMongoResourceHolder resourceHolder, Object resourceKey) {

View File

@@ -110,10 +110,6 @@ public class ReactiveMongoTransactionManager extends AbstractReactiveTransaction
this.options = options; this.options = options;
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.AbstractReactiveTransactionManager#doGetTransaction(org.springframework.transaction.reactive.TransactionSynchronizationManager)
*/
@Override @Override
protected Object doGetTransaction(TransactionSynchronizationManager synchronizationManager) protected Object doGetTransaction(TransactionSynchronizationManager synchronizationManager)
throws TransactionException { throws TransactionException {
@@ -123,19 +119,11 @@ public class ReactiveMongoTransactionManager extends AbstractReactiveTransaction
return new ReactiveMongoTransactionObject(resourceHolder); return new ReactiveMongoTransactionObject(resourceHolder);
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.AbstractReactiveTransactionManager#isExistingTransaction(java.lang.Object)
*/
@Override @Override
protected boolean isExistingTransaction(Object transaction) throws TransactionException { protected boolean isExistingTransaction(Object transaction) throws TransactionException {
return extractMongoTransaction(transaction).hasResourceHolder(); return extractMongoTransaction(transaction).hasResourceHolder();
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.AbstractReactiveTransactionManager#doBegin(org.springframework.transaction.reactive.TransactionSynchronizationManager, java.lang.Object, org.springframework.transaction.TransactionDefinition)
*/
@Override @Override
protected Mono<Void> doBegin(TransactionSynchronizationManager synchronizationManager, Object transaction, protected Mono<Void> doBegin(TransactionSynchronizationManager synchronizationManager, Object transaction,
TransactionDefinition definition) throws TransactionException { TransactionDefinition definition) throws TransactionException {
@@ -175,10 +163,6 @@ public class ReactiveMongoTransactionManager extends AbstractReactiveTransaction
}); });
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.AbstractReactiveTransactionManager#doSuspend(org.springframework.transaction.reactive.TransactionSynchronizationManager, java.lang.Object)
*/
@Override @Override
protected Mono<Object> doSuspend(TransactionSynchronizationManager synchronizationManager, Object transaction) protected Mono<Object> doSuspend(TransactionSynchronizationManager synchronizationManager, Object transaction)
throws TransactionException { throws TransactionException {
@@ -192,10 +176,6 @@ public class ReactiveMongoTransactionManager extends AbstractReactiveTransaction
}); });
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.AbstractReactiveTransactionManager#doResume(org.springframework.transaction.reactive.TransactionSynchronizationManager, java.lang.Object, java.lang.Object)
*/
@Override @Override
protected Mono<Void> doResume(TransactionSynchronizationManager synchronizationManager, @Nullable Object transaction, protected Mono<Void> doResume(TransactionSynchronizationManager synchronizationManager, @Nullable Object transaction,
Object suspendedResources) { Object suspendedResources) {
@@ -203,10 +183,6 @@ public class ReactiveMongoTransactionManager extends AbstractReactiveTransaction
.fromRunnable(() -> synchronizationManager.bindResource(getRequiredDatabaseFactory(), suspendedResources)); .fromRunnable(() -> synchronizationManager.bindResource(getRequiredDatabaseFactory(), suspendedResources));
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.AbstractReactiveTransactionManager#doCommit(org.springframework.transaction.reactive.TransactionSynchronizationManager, org.springframework.transaction.reactive.GenericReactiveTransaction)
*/
@Override @Override
protected final Mono<Void> doCommit(TransactionSynchronizationManager synchronizationManager, protected final Mono<Void> doCommit(TransactionSynchronizationManager synchronizationManager,
GenericReactiveTransaction status) throws TransactionException { GenericReactiveTransaction status) throws TransactionException {
@@ -243,10 +219,6 @@ public class ReactiveMongoTransactionManager extends AbstractReactiveTransaction
return transactionObject.commitTransaction(); return transactionObject.commitTransaction();
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.AbstractReactiveTransactionManager#doRollback(org.springframework.transaction.reactive.TransactionSynchronizationManager, org.springframework.transaction.reactive.GenericReactiveTransaction)
*/
@Override @Override
protected Mono<Void> doRollback(TransactionSynchronizationManager synchronizationManager, protected Mono<Void> doRollback(TransactionSynchronizationManager synchronizationManager,
GenericReactiveTransaction status) { GenericReactiveTransaction status) {
@@ -268,10 +240,6 @@ public class ReactiveMongoTransactionManager extends AbstractReactiveTransaction
}); });
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.AbstractReactiveTransactionManager#doSetRollbackOnly(org.springframework.transaction.reactive.TransactionSynchronizationManager, org.springframework.transaction.reactive.GenericReactiveTransaction)
*/
@Override @Override
protected Mono<Void> doSetRollbackOnly(TransactionSynchronizationManager synchronizationManager, protected Mono<Void> doSetRollbackOnly(TransactionSynchronizationManager synchronizationManager,
GenericReactiveTransaction status) throws TransactionException { GenericReactiveTransaction status) throws TransactionException {
@@ -282,10 +250,6 @@ public class ReactiveMongoTransactionManager extends AbstractReactiveTransaction
}); });
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.reactive.AbstractReactiveTransactionManager#doCleanupAfterCompletion(org.springframework.transaction.reactive.TransactionSynchronizationManager, java.lang.Object)
*/
@Override @Override
protected Mono<Void> doCleanupAfterCompletion(TransactionSynchronizationManager synchronizationManager, protected Mono<Void> doCleanupAfterCompletion(TransactionSynchronizationManager synchronizationManager,
Object transaction) { Object transaction) {
@@ -340,10 +304,6 @@ public class ReactiveMongoTransactionManager extends AbstractReactiveTransaction
return databaseFactory; return databaseFactory;
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
@Override @Override
public void afterPropertiesSet() { public void afterPropertiesSet() {
getRequiredDatabaseFactory(); getRequiredDatabaseFactory();
@@ -509,19 +469,11 @@ public class ReactiveMongoTransactionManager extends AbstractReactiveTransaction
return session; return session;
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.support.SmartTransactionObject#isRollbackOnly()
*/
@Override @Override
public boolean isRollbackOnly() { public boolean isRollbackOnly() {
return this.resourceHolder != null && this.resourceHolder.isRollbackOnly(); return this.resourceHolder != null && this.resourceHolder.isRollbackOnly();
} }
/*
* (non-Javadoc)
* @see org.springframework.transaction.support.SmartTransactionObject#flush()
*/
@Override @Override
public void flush() { public void flush() {
throw new UnsupportedOperationException("flush() not supported"); throw new UnsupportedOperationException("flush() not supported");

View File

@@ -95,10 +95,6 @@ public class SessionAwareMethodInterceptor<D, C> implements MethodInterceptor {
this.sessionType = sessionType; this.sessionType = sessionType;
} }
/*
* (non-Javadoc)
* @see org.aopalliance.intercept.MethodInterceptor(org.aopalliance.intercept.MethodInvocation)
*/
@Nullable @Nullable
@Override @Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable { public Object invoke(MethodInvocation methodInvocation) throws Throwable {

View File

@@ -15,8 +15,8 @@
*/ */
package org.springframework.data.mongodb; package org.springframework.data.mongodb;
import org.slf4j.Logger; import org.apache.commons.logging.Log;
import org.slf4j.LoggerFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.data.util.Version; import org.springframework.data.util.Version;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@@ -31,7 +31,7 @@ import com.mongodb.MongoDriverInformation;
*/ */
public class SpringDataMongoDB { public class SpringDataMongoDB {
private static final Logger LOGGER = LoggerFactory.getLogger(SpringDataMongoDB.class); private static final Log LOGGER = LogFactory.getLog(SpringDataMongoDB.class);
private static final Version FALLBACK_VERSION = new Version(3); private static final Version FALLBACK_VERSION = new Version(3);
private static final MongoDriverInformation DRIVER_INFORMATION = MongoDriverInformation private static final MongoDriverInformation DRIVER_INFORMATION = MongoDriverInformation
@@ -68,7 +68,7 @@ public class SpringDataMongoDB {
try { try {
return Version.parse(versionString); return Version.parse(versionString);
} catch (Exception e) { } catch (Exception e) {
LOGGER.debug("Cannot read Spring Data MongoDB version '{}'.", versionString); LOGGER.debug(String.format("Cannot read Spring Data MongoDB version '%s'.", versionString));
} }
return FALLBACK_VERSION; return FALLBACK_VERSION;

View File

@@ -25,9 +25,7 @@ import org.springframework.data.mongodb.core.convert.DbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.lang.Nullable;
import com.mongodb.MongoClientSettings; import com.mongodb.MongoClientSettings;
import com.mongodb.MongoClientSettings.Builder; import com.mongodb.MongoClientSettings.Builder;
@@ -80,24 +78,6 @@ public abstract class AbstractMongoClientConfiguration extends MongoConfiguratio
return new SimpleMongoClientDatabaseFactory(mongoClient(), getDatabaseName()); return new SimpleMongoClientDatabaseFactory(mongoClient(), getDatabaseName());
} }
/**
* Return the base package to scan for mapped {@link Document}s. Will return the package name of the configuration
* class' (the concrete class, not this one here) by default. So if you have a {@code com.acme.AppConfig} extending
* {@link AbstractMongoClientConfiguration} the base package will be considered {@code com.acme} unless the method is
* overridden to implement alternate behavior.
*
* @return the base package to scan for mapped {@link Document} classes or {@literal null} to not enable scanning for
* entities.
* @deprecated use {@link #getMappingBasePackages()} instead.
*/
@Deprecated
@Nullable
protected String getMappingBasePackage() {
Package mappingBasePackage = getClass().getPackage();
return mappingBasePackage == null ? null : mappingBasePackage.getName();
}
/** /**
* Creates a {@link MappingMongoConverter} using the configured {@link #mongoDbFactory()} and * Creates a {@link MappingMongoConverter} using the configured {@link #mongoDbFactory()} and
* {@link #mongoMappingContext(MongoCustomConversions)}. Will get {@link #customConversions()} applied. * {@link #mongoMappingContext(MongoCustomConversions)}. Will get {@link #customConversions()} applied.

View File

@@ -30,10 +30,6 @@ import com.mongodb.ConnectionString;
*/ */
public class ConnectionStringPropertyEditor extends PropertyEditorSupport { public class ConnectionStringPropertyEditor extends PropertyEditorSupport {
/*
* (non-Javadoc)
* @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
*/
@Override @Override
public void setAsText(@Nullable String connectionString) { public void setAsText(@Nullable String connectionString) {

View File

@@ -34,10 +34,6 @@ import org.w3c.dom.Element;
*/ */
class GridFsTemplateParser extends AbstractBeanDefinitionParser { class GridFsTemplateParser extends AbstractBeanDefinitionParser {
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#resolveId(org.w3c.dom.Element, org.springframework.beans.factory.support.AbstractBeanDefinition, org.springframework.beans.factory.xml.ParserContext)
*/
@Override @Override
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext)
throws BeanDefinitionStoreException { throws BeanDefinitionStoreException {
@@ -46,10 +42,6 @@ class GridFsTemplateParser extends AbstractBeanDefinitionParser {
return StringUtils.hasText(id) ? id : BeanNames.GRID_FS_TEMPLATE_BEAN_NAME; return StringUtils.hasText(id) ? id : BeanNames.GRID_FS_TEMPLATE_BEAN_NAME;
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#parseInternal(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext)
*/
@Override @Override
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {

View File

@@ -80,7 +80,7 @@ import org.w3c.dom.Element;
public class MappingMongoConverterParser implements BeanDefinitionParser { public class MappingMongoConverterParser implements BeanDefinitionParser {
private static final String BASE_PACKAGE = "base-package"; private static final String BASE_PACKAGE = "base-package";
private static final boolean JSR_303_PRESENT = ClassUtils.isPresent("javax.validation.Validator", private static final boolean JSR_303_PRESENT = ClassUtils.isPresent("jakarta.validation.Validator",
MappingMongoConverterParser.class.getClassLoader()); MappingMongoConverterParser.class.getClassLoader());
/* (non-Javadoc) /* (non-Javadoc)
@@ -376,10 +376,6 @@ public class MappingMongoConverterParser implements BeanDefinitionParser {
this.delegates = new HashSet<>(Arrays.asList(filters)); this.delegates = new HashSet<>(Arrays.asList(filters));
} }
/*
* (non-Javadoc)
* @see org.springframework.core.type.filter.TypeFilter#match(org.springframework.core.type.classreading.MetadataReader, org.springframework.core.type.classreading.MetadataReaderFactory)
*/
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
throws IOException { throws IOException {

View File

@@ -47,28 +47,16 @@ public class MongoAuditingBeanDefinitionParser extends AbstractSingleBeanDefinit
private static boolean PROJECT_REACTOR_AVAILABLE = ClassUtils.isPresent("reactor.core.publisher.Mono", private static boolean PROJECT_REACTOR_AVAILABLE = ClassUtils.isPresent("reactor.core.publisher.Mono",
MongoAuditingRegistrar.class.getClassLoader()); MongoAuditingRegistrar.class.getClassLoader());
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser#getBeanClass(org.w3c.dom.Element)
*/
@Override @Override
protected Class<?> getBeanClass(Element element) { protected Class<?> getBeanClass(Element element) {
return AuditingEntityCallback.class; return AuditingEntityCallback.class;
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#shouldGenerateId()
*/
@Override @Override
protected boolean shouldGenerateId() { protected boolean shouldGenerateId() {
return true; return true;
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser#doParse(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext, org.springframework.beans.factory.support.BeanDefinitionBuilder)
*/
@Override @Override
protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {

View File

@@ -18,6 +18,7 @@ package org.springframework.data.mongodb.config;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistry;
@@ -27,6 +28,8 @@ import org.springframework.data.auditing.IsNewAwareAuditingHandler;
import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport; import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport;
import org.springframework.data.auditing.config.AuditingConfiguration; import org.springframework.data.auditing.config.AuditingConfiguration;
import org.springframework.data.config.ParsingUtils; import org.springframework.data.config.ParsingUtils;
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.core.mapping.event.AuditingEntityCallback; import org.springframework.data.mongodb.core.mapping.event.AuditingEntityCallback;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@@ -39,28 +42,16 @@ import org.springframework.util.Assert;
*/ */
class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport { class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
/*
* (non-Javadoc)
* @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#getAnnotation()
*/
@Override @Override
protected Class<? extends Annotation> getAnnotation() { protected Class<? extends Annotation> getAnnotation() {
return EnableMongoAuditing.class; return EnableMongoAuditing.class;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#getAuditingHandlerBeanName()
*/
@Override @Override
protected String getAuditingHandlerBeanName() { protected String getAuditingHandlerBeanName() {
return "mongoAuditingHandler"; return "mongoAuditingHandler";
} }
/*
* (non-Javadoc)
* @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#registerBeanDefinitions(org.springframework.core.type.AnnotationMetadata, org.springframework.beans.factory.support.BeanDefinitionRegistry)
*/
@Override @Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) { public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
@@ -70,10 +61,6 @@ class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
super.registerBeanDefinitions(annotationMetadata, registry); super.registerBeanDefinitions(annotationMetadata, registry);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#getAuditHandlerBeanDefinitionBuilder(org.springframework.data.auditing.config.AuditingConfiguration)
*/
@Override @Override
protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingConfiguration configuration) { protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingConfiguration configuration) {
@@ -81,17 +68,13 @@ class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(IsNewAwareAuditingHandler.class); BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(IsNewAwareAuditingHandler.class);
BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(PersistentEntitiesFactoryBean.class); BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(org.springframework.data.repository.config.PersistentEntitiesFactoryBean.class);
definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR); definition.addConstructorArgValue(new RuntimeBeanReference(MappingContext.class));
builder.addConstructorArgValue(definition.getBeanDefinition()); builder.addConstructorArgValue(definition.getBeanDefinition());
return configureDefaultAuditHandlerAttributes(configuration, builder); return configureDefaultAuditHandlerAttributes(configuration, builder);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#registerAuditListener(org.springframework.beans.factory.config.BeanDefinition, org.springframework.beans.factory.support.BeanDefinitionRegistry)
*/
@Override @Override
protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandlerDefinition, protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandlerDefinition,
BeanDefinitionRegistry registry) { BeanDefinitionRegistry registry) {

View File

@@ -35,10 +35,6 @@ import org.w3c.dom.Element;
*/ */
public class MongoClientParser implements BeanDefinitionParser { public class MongoClientParser implements BeanDefinitionParser {
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.BeanDefinitionParser#parse(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext)
*/
public BeanDefinition parse(Element element, ParserContext parserContext) { public BeanDefinition parse(Element element, ParserContext parserContext) {
Object source = parserContext.extractSource(element); Object source = parserContext.extractSource(element);

View File

@@ -51,10 +51,6 @@ public class MongoCredentialPropertyEditor extends PropertyEditorSupport {
private static final String OPTIONS_DELIMITER = "?"; private static final String OPTIONS_DELIMITER = "?";
private static final String OPTION_VALUE_DELIMITER = "&"; private static final String OPTION_VALUE_DELIMITER = "&";
/*
* (non-Javadoc)
* @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
*/
@Override @Override
public void setAsText(@Nullable String text) throws IllegalArgumentException { public void setAsText(@Nullable String text) throws IllegalArgumentException {

View File

@@ -62,10 +62,6 @@ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser {
MONGO_URI_ALLOWED_ADDITIONAL_ATTRIBUTES = Collections.unmodifiableSet(mongoUriAllowedAdditionalAttributes); MONGO_URI_ALLOWED_ADDITIONAL_ATTRIBUTES = Collections.unmodifiableSet(mongoUriAllowedAdditionalAttributes);
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#resolveId(org.w3c.dom.Element, org.springframework.beans.factory.support.AbstractBeanDefinition, org.springframework.beans.factory.xml.ParserContext)
*/
@Override @Override
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext)
throws BeanDefinitionStoreException { throws BeanDefinitionStoreException {
@@ -74,10 +70,6 @@ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser {
return StringUtils.hasText(id) ? id : BeanNames.DB_FACTORY_BEAN_NAME; return StringUtils.hasText(id) ? id : BeanNames.DB_FACTORY_BEAN_NAME;
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#parseInternal(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext)
*/
@Override @Override
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {

View File

@@ -26,10 +26,6 @@ import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
*/ */
public class MongoNamespaceHandler extends NamespaceHandlerSupport { public class MongoNamespaceHandler extends NamespaceHandlerSupport {
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.NamespaceHandler#init()
*/
public void init() { public void init() {
registerBeanDefinitionParser("mapping-converter", new MappingMongoConverterParser()); registerBeanDefinitionParser("mapping-converter", new MappingMongoConverterParser());

View File

@@ -40,7 +40,6 @@ import org.w3c.dom.Element;
* @author Christoph Strobl * @author Christoph Strobl
* @author Mark Paluch * @author Mark Paluch
*/ */
@SuppressWarnings("deprecation")
abstract class MongoParsingUtils { abstract class MongoParsingUtils {
private MongoParsingUtils() {} private MongoParsingUtils() {}

View File

@@ -39,10 +39,6 @@ import org.w3c.dom.Element;
*/ */
class MongoTemplateParser extends AbstractBeanDefinitionParser { class MongoTemplateParser extends AbstractBeanDefinitionParser {
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#resolveId(org.w3c.dom.Element, org.springframework.beans.factory.support.AbstractBeanDefinition, org.springframework.beans.factory.xml.ParserContext)
*/
@Override @Override
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext)
throws BeanDefinitionStoreException { throws BeanDefinitionStoreException {
@@ -51,10 +47,6 @@ class MongoTemplateParser extends AbstractBeanDefinitionParser {
return StringUtils.hasText(id) ? id : BeanNames.MONGO_TEMPLATE_BEAN_NAME; return StringUtils.hasText(id) ? id : BeanNames.MONGO_TEMPLATE_BEAN_NAME;
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#parseInternal(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext)
*/
@Override @Override
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {

View File

@@ -41,19 +41,11 @@ public class PersistentEntitiesFactoryBean implements FactoryBean<PersistentEnti
this.converter = converter; this.converter = converter;
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.FactoryBean#getObject()
*/
@Override @Override
public PersistentEntities getObject() { public PersistentEntities getObject() {
return PersistentEntities.of(converter.getMappingContext()); return PersistentEntities.of(converter.getMappingContext());
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.FactoryBean#getObjectType()
*/
@Override @Override
public Class<?> getObjectType() { public Class<?> getObjectType() {
return PersistentEntities.class; return PersistentEntities.class;

View File

@@ -38,28 +38,16 @@ import org.springframework.util.Assert;
*/ */
class ReactiveMongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport { class ReactiveMongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
/*
* (non-Javadoc)
* @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#getAnnotation()
*/
@Override @Override
protected Class<? extends Annotation> getAnnotation() { protected Class<? extends Annotation> getAnnotation() {
return EnableReactiveMongoAuditing.class; return EnableReactiveMongoAuditing.class;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#getAuditingHandlerBeanName()
*/
@Override @Override
protected String getAuditingHandlerBeanName() { protected String getAuditingHandlerBeanName() {
return "reactiveMongoAuditingHandler"; return "reactiveMongoAuditingHandler";
} }
/*
* (non-Javadoc)
* @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#getAuditHandlerBeanDefinitionBuilder(org.springframework.data.auditing.config.AuditingConfiguration)
*/
@Override @Override
protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingConfiguration configuration) { protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingConfiguration configuration) {
@@ -74,10 +62,6 @@ class ReactiveMongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupp
return configureDefaultAuditHandlerAttributes(configuration, builder); return configureDefaultAuditHandlerAttributes(configuration, builder);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#registerAuditListener(org.springframework.beans.factory.config.BeanDefinition, org.springframework.beans.factory.support.BeanDefinitionRegistry)
*/
@Override @Override
protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandlerDefinition, protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandlerDefinition,
BeanDefinitionRegistry registry) { BeanDefinitionRegistry registry) {

View File

@@ -32,10 +32,6 @@ import com.mongodb.ReadConcernLevel;
*/ */
public class ReadConcernPropertyEditor extends PropertyEditorSupport { public class ReadConcernPropertyEditor extends PropertyEditorSupport {
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.BeanDefinitionParser#parse(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext)
*/
@Override @Override
public void setAsText(@Nullable String readConcernString) { public void setAsText(@Nullable String readConcernString) {

View File

@@ -29,10 +29,6 @@ import com.mongodb.ReadPreference;
*/ */
public class ReadPreferencePropertyEditor extends PropertyEditorSupport { public class ReadPreferencePropertyEditor extends PropertyEditorSupport {
/*
* (non-Javadoc)
* @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
*/
@Override @Override
public void setAsText(@Nullable String readPreferenceString) throws IllegalArgumentException { public void setAsText(@Nullable String readPreferenceString) throws IllegalArgumentException {

View File

@@ -21,8 +21,8 @@ import java.net.UnknownHostException;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.slf4j.Logger; import org.apache.commons.logging.Log;
import org.slf4j.LoggerFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@@ -43,13 +43,9 @@ public class ServerAddressPropertyEditor extends PropertyEditorSupport {
* A port is a number without a leading 0 at the end of the address that is proceeded by just a single :. * A port is a number without a leading 0 at the end of the address that is proceeded by just a single :.
*/ */
private static final String HOST_PORT_SPLIT_PATTERN = "(?<!:):(?=[123456789]\\d*$)"; private static final String HOST_PORT_SPLIT_PATTERN = "(?<!:):(?=[123456789]\\d*$)";
private static final String COULD_NOT_PARSE_ADDRESS_MESSAGE = "Could not parse address {} '{}'. Check your replica set configuration!"; private static final String COULD_NOT_PARSE_ADDRESS_MESSAGE = "Could not parse address %s '%s'. Check your replica set configuration!";
private static final Logger LOG = LoggerFactory.getLogger(ServerAddressPropertyEditor.class); private static final Log LOG = LogFactory.getLog(ServerAddressPropertyEditor.class);
/*
* (non-Javadoc)
* @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
*/
@Override @Override
public void setAsText(@Nullable String replicaSetString) { public void setAsText(@Nullable String replicaSetString) {
@@ -88,14 +84,18 @@ public class ServerAddressPropertyEditor extends PropertyEditorSupport {
private ServerAddress parseServerAddress(String source) { private ServerAddress parseServerAddress(String source) {
if (!StringUtils.hasText(source)) { if (!StringUtils.hasText(source)) {
LOG.warn(COULD_NOT_PARSE_ADDRESS_MESSAGE, "source", source); if(LOG.isWarnEnabled()) {
LOG.warn(String.format(COULD_NOT_PARSE_ADDRESS_MESSAGE, "source", source));
}
return null; return null;
} }
String[] hostAndPort = extractHostAddressAndPort(source.trim()); String[] hostAndPort = extractHostAddressAndPort(source.trim());
if (hostAndPort.length > 2) { if (hostAndPort.length > 2) {
LOG.warn(COULD_NOT_PARSE_ADDRESS_MESSAGE, "source", source); if(LOG.isWarnEnabled()) {
LOG.warn(String.format(COULD_NOT_PARSE_ADDRESS_MESSAGE, "source", source));
}
return null; return null;
} }
@@ -105,9 +105,13 @@ public class ServerAddressPropertyEditor extends PropertyEditorSupport {
return port == null ? new ServerAddress(hostAddress) : new ServerAddress(hostAddress, port); return port == null ? new ServerAddress(hostAddress) : new ServerAddress(hostAddress, port);
} catch (UnknownHostException e) { } catch (UnknownHostException e) {
LOG.warn(COULD_NOT_PARSE_ADDRESS_MESSAGE, "host", hostAndPort[0]); if(LOG.isWarnEnabled()) {
LOG.warn(String.format(COULD_NOT_PARSE_ADDRESS_MESSAGE, "host", hostAndPort[0]));
}
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
LOG.warn(COULD_NOT_PARSE_ADDRESS_MESSAGE, "port", hostAndPort[1]); if(LOG.isWarnEnabled()) {
LOG.warn(String.format(COULD_NOT_PARSE_ADDRESS_MESSAGE, "port", hostAndPort[1]));
}
} }
return null; return null;

View File

@@ -26,10 +26,6 @@ import com.mongodb.WriteConcern;
*/ */
public class StringToWriteConcernConverter implements Converter<String, WriteConcern> { public class StringToWriteConcernConverter implements Converter<String, WriteConcern> {
/*
* (non-Javadoc)
* @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object)
*/
public WriteConcern convert(String source) { public WriteConcern convert(String source) {
WriteConcern writeConcern = WriteConcern.valueOf(source); WriteConcern writeConcern = WriteConcern.valueOf(source);

View File

@@ -29,10 +29,6 @@ import org.springframework.util.StringUtils;
*/ */
public class UUidRepresentationPropertyEditor extends PropertyEditorSupport { public class UUidRepresentationPropertyEditor extends PropertyEditorSupport {
/*
* (non-Javadoc)
* @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
*/
@Override @Override
public void setAsText(@Nullable String value) { public void setAsText(@Nullable String value) {

View File

@@ -189,10 +189,6 @@ public class ChangeStreamEvent<T> {
String.format("No converter found capable of converting %s to %s", fullDocument.getClass(), targetType)); String.format("No converter found capable of converting %s to %s", fullDocument.getClass(), targetType));
} }
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override @Override
public String toString() { public String toString() {
return "ChangeStreamEvent {" + "raw=" + raw + ", targetType=" + targetType + '}'; return "ChangeStreamEvent {" + "raw=" + raw + ", targetType=" + targetType + '}';

View File

@@ -47,20 +47,6 @@ public class CollectionOptions {
private ValidationOptions validationOptions; private ValidationOptions validationOptions;
private @Nullable TimeSeriesOptions timeSeriesOptions; private @Nullable TimeSeriesOptions timeSeriesOptions;
/**
* Constructs a new <code>CollectionOptions</code> instance.
*
* @param size the collection size in bytes, this data space is preallocated. Can be {@literal null}.
* @param maxDocuments the maximum number of documents in the collection. Can be {@literal null}.
* @param capped true to created a "capped" collection (fixed size with auto-FIFO behavior based on insertion order),
* false otherwise. Can be {@literal null}.
* @deprecated since 2.0 please use {@link CollectionOptions#empty()} as entry point.
*/
@Deprecated
public CollectionOptions(@Nullable Long size, @Nullable Long maxDocuments, @Nullable Boolean capped) {
this(size, maxDocuments, capped, null, ValidationOptions.none(), null);
}
private CollectionOptions(@Nullable Long size, @Nullable Long maxDocuments, @Nullable Boolean capped, private CollectionOptions(@Nullable Long size, @Nullable Long maxDocuments, @Nullable Boolean capped,
@Nullable Collation collation, ValidationOptions validationOptions, @Nullable Collation collation, ValidationOptions validationOptions,
@Nullable TimeSeriesOptions timeSeriesOptions) { @Nullable TimeSeriesOptions timeSeriesOptions) {

View File

@@ -109,10 +109,6 @@ class DefaultBulkOperations implements BulkOperations {
this.defaultWriteConcern = defaultWriteConcern; this.defaultWriteConcern = defaultWriteConcern;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.BulkOperations#insert(java.lang.Object)
*/
@Override @Override
public BulkOperations insert(Object document) { public BulkOperations insert(Object document) {
@@ -125,10 +121,6 @@ class DefaultBulkOperations implements BulkOperations {
return this; return this;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.BulkOperations#insert(java.util.List)
*/
@Override @Override
public BulkOperations insert(List<? extends Object> documents) { public BulkOperations insert(List<? extends Object> documents) {
@@ -139,10 +131,6 @@ class DefaultBulkOperations implements BulkOperations {
return this; return this;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.BulkOperations#updateOne(org.springframework.data.mongodb.core.query.Query, org.springframework.data.mongodb.core.query.Update)
*/
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public BulkOperations updateOne(Query query, Update update) { public BulkOperations updateOne(Query query, Update update) {
@@ -153,10 +141,6 @@ class DefaultBulkOperations implements BulkOperations {
return updateOne(Collections.singletonList(Pair.of(query, update))); return updateOne(Collections.singletonList(Pair.of(query, update)));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.BulkOperations#updateOne(java.util.List)
*/
@Override @Override
public BulkOperations updateOne(List<Pair<Query, Update>> updates) { public BulkOperations updateOne(List<Pair<Query, Update>> updates) {
@@ -169,10 +153,6 @@ class DefaultBulkOperations implements BulkOperations {
return this; return this;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.BulkOperations#updateMulti(org.springframework.data.mongodb.core.query.Query, org.springframework.data.mongodb.core.query.Update)
*/
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public BulkOperations updateMulti(Query query, Update update) { public BulkOperations updateMulti(Query query, Update update) {
@@ -183,10 +163,6 @@ class DefaultBulkOperations implements BulkOperations {
return updateMulti(Collections.singletonList(Pair.of(query, update))); return updateMulti(Collections.singletonList(Pair.of(query, update)));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.BulkOperations#updateMulti(java.util.List)
*/
@Override @Override
public BulkOperations updateMulti(List<Pair<Query, Update>> updates) { public BulkOperations updateMulti(List<Pair<Query, Update>> updates) {
@@ -199,19 +175,11 @@ class DefaultBulkOperations implements BulkOperations {
return this; return this;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.BulkOperations#upsert(org.springframework.data.mongodb.core.query.Query, org.springframework.data.mongodb.core.query.Update)
*/
@Override @Override
public BulkOperations upsert(Query query, Update update) { public BulkOperations upsert(Query query, Update update) {
return update(query, update, true, true); return update(query, update, true, true);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.BulkOperations#upsert(java.util.List)
*/
@Override @Override
public BulkOperations upsert(List<Pair<Query, Update>> updates) { public BulkOperations upsert(List<Pair<Query, Update>> updates) {
@@ -222,10 +190,6 @@ class DefaultBulkOperations implements BulkOperations {
return this; return this;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.BulkOperations#remove(org.springframework.data.mongodb.core.query.Query)
*/
@Override @Override
public BulkOperations remove(Query query) { public BulkOperations remove(Query query) {
@@ -239,10 +203,6 @@ class DefaultBulkOperations implements BulkOperations {
return this; return this;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.BulkOperations#remove(java.util.List)
*/
@Override @Override
public BulkOperations remove(List<Query> removes) { public BulkOperations remove(List<Query> removes) {
@@ -255,10 +215,6 @@ class DefaultBulkOperations implements BulkOperations {
return this; return this;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.BulkOperations#replaceOne(org.springframework.data.mongodb.core.query.Query, java.lang.Object, org.springframework.data.mongodb.core.FindAndReplaceOptions)
*/
@Override @Override
public BulkOperations replaceOne(Query query, Object replacement, FindAndReplaceOptions options) { public BulkOperations replaceOne(Query query, Object replacement, FindAndReplaceOptions options) {
@@ -278,10 +234,6 @@ class DefaultBulkOperations implements BulkOperations {
return this; return this;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.BulkOperations#executeBulk()
*/
@Override @Override
public com.mongodb.bulk.BulkWriteResult execute() { public com.mongodb.bulk.BulkWriteResult execute() {

View File

@@ -112,10 +112,6 @@ public class DefaultIndexOperations implements IndexOperations {
this.type = type; this.type = type;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.index.IndexOperations#ensureIndex(org.springframework.data.mongodb.core.index.IndexDefinition)
*/
public String ensureIndex(final IndexDefinition indexDefinition) { public String ensureIndex(final IndexDefinition indexDefinition) {
return execute(collection -> { return execute(collection -> {
@@ -150,10 +146,6 @@ public class DefaultIndexOperations implements IndexOperations {
return null; return null;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.index.IndexOperations#dropIndex(java.lang.String)
*/
public void dropIndex(final String name) { public void dropIndex(final String name) {
execute(collection -> { execute(collection -> {
@@ -163,18 +155,10 @@ public class DefaultIndexOperations implements IndexOperations {
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.index.IndexOperations#dropAllIndexes()
*/
public void dropAllIndexes() { public void dropAllIndexes() {
dropIndex("*"); dropIndex("*");
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.index.IndexOperations#getIndexInfo()
*/
public List<IndexInfo> getIndexInfo() { public List<IndexInfo> getIndexInfo() {
return execute(new CollectionCallback<List<IndexInfo>>() { return execute(new CollectionCallback<List<IndexInfo>>() {

View File

@@ -42,10 +42,6 @@ class DefaultIndexOperationsProvider implements IndexOperationsProvider {
this.mapper = mapper; this.mapper = mapper;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.index.IndexOperationsProvider#reactiveIndexOps(java.lang.String)
*/
@Override @Override
public IndexOperations indexOps(String collectionName, Class<?> type) { public IndexOperations indexOps(String collectionName, Class<?> type) {
return new DefaultIndexOperations(mongoDbFactory, collectionName, mapper, type); return new DefaultIndexOperations(mongoDbFactory, collectionName, mapper, type);

View File

@@ -86,10 +86,6 @@ public class DefaultReactiveIndexOperations implements ReactiveIndexOperations {
this.type = type; this.type = type;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.index.ReactiveIndexOperations#ensureIndex(org.springframework.data.mongodb.core.index.IndexDefinition)
*/
public Mono<String> ensureIndex(final IndexDefinition indexDefinition) { public Mono<String> ensureIndex(final IndexDefinition indexDefinition) {
return mongoOperations.execute(collectionName, collection -> { return mongoOperations.execute(collectionName, collection -> {
@@ -119,26 +115,14 @@ public class DefaultReactiveIndexOperations implements ReactiveIndexOperations {
.orElse(null); .orElse(null);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.index.ReactiveIndexOperations#dropIndex(java.lang.String)
*/
public Mono<Void> dropIndex(final String name) { public Mono<Void> dropIndex(final String name) {
return mongoOperations.execute(collectionName, collection -> collection.dropIndex(name)).then(); return mongoOperations.execute(collectionName, collection -> collection.dropIndex(name)).then();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.index.ReactiveIndexOperations#dropAllIndexes()
*/
public Mono<Void> dropAllIndexes() { public Mono<Void> dropAllIndexes() {
return dropIndex("*"); return dropIndex("*");
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.index.ReactiveIndexOperations#getIndexInfo()
*/
public Flux<IndexInfo> getIndexInfo() { public Flux<IndexInfo> getIndexInfo() {
return mongoOperations.execute(collectionName, collection -> collection.listIndexes(Document.class)) // return mongoOperations.execute(collectionName, collection -> collection.listIndexes(Document.class)) //

View File

@@ -70,19 +70,11 @@ class DefaultScriptOperations implements ScriptOperations {
this.mongoOperations = mongoOperations; this.mongoOperations = mongoOperations;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ScriptOperations#register(org.springframework.data.mongodb.core.script.ExecutableMongoScript)
*/
@Override @Override
public NamedMongoScript register(ExecutableMongoScript script) { public NamedMongoScript register(ExecutableMongoScript script) {
return register(new NamedMongoScript(generateScriptName(), script)); return register(new NamedMongoScript(generateScriptName(), script));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ScriptOperations#register(org.springframework.data.mongodb.core.script.NamedMongoScript)
*/
@Override @Override
public NamedMongoScript register(NamedMongoScript script) { public NamedMongoScript register(NamedMongoScript script) {
@@ -92,10 +84,6 @@ class DefaultScriptOperations implements ScriptOperations {
return script; return script;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ScriptOperations#execute(org.springframework.data.mongodb.core.script.ExecutableMongoScript, java.lang.Object[])
*/
@Override @Override
public Object execute(final ExecutableMongoScript script, final Object... args) { public Object execute(final ExecutableMongoScript script, final Object... args) {
@@ -115,10 +103,6 @@ class DefaultScriptOperations implements ScriptOperations {
}); });
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ScriptOperations#call(java.lang.String, java.lang.Object[])
*/
@Override @Override
public Object call(final String scriptName, final Object... args) { public Object call(final String scriptName, final Object... args) {
@@ -135,10 +119,6 @@ class DefaultScriptOperations implements ScriptOperations {
}); });
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ScriptOperations#exists(java.lang.String)
*/
@Override @Override
public boolean exists(String scriptName) { public boolean exists(String scriptName) {
@@ -147,10 +127,6 @@ class DefaultScriptOperations implements ScriptOperations {
return mongoOperations.exists(query(where("_id").is(scriptName)), NamedMongoScript.class, SCRIPT_COLLECTION_NAME); return mongoOperations.exists(query(where("_id").is(scriptName)), NamedMongoScript.class, SCRIPT_COLLECTION_NAME);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ScriptOperations#getScriptNames()
*/
@Override @Override
public Set<String> getScriptNames() { public Set<String> getScriptNames() {

View File

@@ -21,8 +21,10 @@ import java.util.Map;
import java.util.Optional; import java.util.Optional;
import org.bson.Document; import org.bson.Document;
import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.ConversionService;
import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.convert.CustomConversions;
import org.springframework.data.mapping.IdentifierAccessor; import org.springframework.data.mapping.IdentifierAccessor;
import org.springframework.data.mapping.MappingException; import org.springframework.data.mapping.MappingException;
import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.PersistentEntity;
@@ -30,7 +32,10 @@ import org.springframework.data.mapping.PersistentPropertyAccessor;
import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mapping.model.ConvertingPropertyAccessor; import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
import org.springframework.data.mongodb.core.CollectionOptions.TimeSeriesOptions; import org.springframework.data.mongodb.core.CollectionOptions.TimeSeriesOptions;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.convert.MongoJsonSchemaMapper;
import org.springframework.data.mongodb.core.convert.MongoWriter; import org.springframework.data.mongodb.core.convert.MongoWriter;
import org.springframework.data.mongodb.core.convert.QueryMapper;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes; import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes;
@@ -39,6 +44,11 @@ import org.springframework.data.mongodb.core.query.Collation;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.timeseries.Granularity; import org.springframework.data.mongodb.core.timeseries.Granularity;
import org.springframework.data.mongodb.core.validation.Validator;
import org.springframework.data.projection.EntityProjection;
import org.springframework.data.projection.EntityProjectionIntrospector;
import org.springframework.data.projection.ProjectionFactory;
import org.springframework.data.util.Optionals;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
@@ -47,6 +57,10 @@ import org.springframework.util.MultiValueMap;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import com.mongodb.client.model.CreateCollectionOptions;
import com.mongodb.client.model.TimeSeriesGranularity;
import com.mongodb.client.model.ValidationOptions;
/** /**
* Common operations performed on an entity in the context of it's mapping metadata. * Common operations performed on an entity in the context of it's mapping metadata.
* *
@@ -62,9 +76,31 @@ class EntityOperations {
private static final String ID_FIELD = "_id"; private static final String ID_FIELD = "_id";
private final MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> context; private final MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> context;
private final QueryMapper queryMapper;
EntityOperations(MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> context) { private final EntityProjectionIntrospector introspector;
private final MongoJsonSchemaMapper schemaMapper;
EntityOperations(MongoConverter converter) {
this(converter, new QueryMapper(converter));
}
EntityOperations(MongoConverter converter, QueryMapper queryMapper) {
this(converter, converter.getMappingContext(), converter.getCustomConversions(), converter.getProjectionFactory(),
queryMapper);
}
EntityOperations(MongoConverter converter,
MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> context,
CustomConversions conversions, ProjectionFactory projectionFactory, QueryMapper queryMapper) {
this.context = context; this.context = context;
this.queryMapper = queryMapper;
this.introspector = EntityProjectionIntrospector.create(projectionFactory,
EntityProjectionIntrospector.ProjectionPredicate.typeHierarchy()
.and(((target, underlyingType) -> !conversions.isSimpleType(target))),
context);
this.schemaMapper = new MongoJsonSchemaMapper(converter);
} }
/** /**
@@ -229,6 +265,89 @@ class EntityOperations {
return UntypedOperations.instance(); return UntypedOperations.instance();
} }
/**
* Introspect the given {@link Class result type} in the context of the {@link Class entity type} whether the returned
* type is a projection and what property paths are participating in the projection.
*
* @param resultType the type to project on. Must not be {@literal null}.
* @param entityType the source domain type. Must not be {@literal null}.
* @return the introspection result.
* @since 3.4
* @see EntityProjectionIntrospector#introspect(Class, Class)
*/
public <M, D> EntityProjection<M, D> introspectProjection(Class<M> resultType, Class<D> entityType) {
return introspector.introspect(resultType, entityType);
}
/**
* Convert {@link CollectionOptions} to {@link CreateCollectionOptions} using {@link Class entityType} to obtain
* mapping metadata.
*
* @param collectionOptions
* @param entityType
* @return
* @since 3.4
*/
public CreateCollectionOptions convertToCreateCollectionOptions(@Nullable CollectionOptions collectionOptions,
Class<?> entityType) {
Optional<Collation> collation = Optionals.firstNonEmpty(
() -> Optional.ofNullable(collectionOptions).flatMap(CollectionOptions::getCollation),
() -> forType(entityType).getCollation());//
CreateCollectionOptions result = new CreateCollectionOptions();
collation.map(Collation::toMongoCollation).ifPresent(result::collation);
if (collectionOptions == null) {
return result;
}
collectionOptions.getCapped().ifPresent(result::capped);
collectionOptions.getSize().ifPresent(result::sizeInBytes);
collectionOptions.getMaxDocuments().ifPresent(result::maxDocuments);
collectionOptions.getCollation().map(Collation::toMongoCollation).ifPresent(result::collation);
collectionOptions.getValidationOptions().ifPresent(it -> {
ValidationOptions validationOptions = new ValidationOptions();
it.getValidationAction().ifPresent(validationOptions::validationAction);
it.getValidationLevel().ifPresent(validationOptions::validationLevel);
it.getValidator().ifPresent(val -> validationOptions.validator(getMappedValidator(val, entityType)));
result.validationOptions(validationOptions);
});
collectionOptions.getTimeSeriesOptions().map(forType(entityType)::mapTimeSeriesOptions).ifPresent(it -> {
com.mongodb.client.model.TimeSeriesOptions options = new com.mongodb.client.model.TimeSeriesOptions(
it.getTimeField());
if (StringUtils.hasText(it.getMetaField())) {
options.metaField(it.getMetaField());
}
if (!Granularity.DEFAULT.equals(it.getGranularity())) {
options.granularity(TimeSeriesGranularity.valueOf(it.getGranularity().name().toUpperCase()));
}
result.timeSeriesOptions(options);
});
return result;
}
private Document getMappedValidator(Validator validator, Class<?> domainType) {
Document validationRules = validator.toDocument();
if (validationRules.containsKey("$jsonSchema")) {
return schemaMapper.mapSchema(validationRules, domainType);
}
return queryMapper.getMappedObject(validationRules, context.getPersistentEntity(domainType));
}
/** /**
* A representation of information about an entity. * A representation of information about an entity.
* *
@@ -373,37 +492,21 @@ class EntityOperations {
this.map = map; this.map = map;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#getIdPropertyName()
*/
@Override @Override
public String getIdFieldName() { public String getIdFieldName() {
return ID_FIELD; return ID_FIELD;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#getId()
*/
@Override @Override
public Object getId() { public Object getId() {
return map.get(ID_FIELD); return map.get(ID_FIELD);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#getByIdQuery()
*/
@Override @Override
public Query getByIdQuery() { public Query getByIdQuery() {
return Query.query(Criteria.where(ID_FIELD).is(map.get(ID_FIELD))); return Query.query(Criteria.where(ID_FIELD).is(map.get(ID_FIELD)));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.MutablePersistableSource#populateIdIfNecessary(java.lang.Object)
*/
@Nullable @Nullable
@Override @Override
public T populateIdIfNecessary(@Nullable Object id) { public T populateIdIfNecessary(@Nullable Object id) {
@@ -413,19 +516,11 @@ class EntityOperations {
return map; return map;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#getQueryForVersion()
*/
@Override @Override
public Query getQueryForVersion() { public Query getQueryForVersion() {
throw new MappingException("Cannot query for version on plain Documents!"); throw new MappingException("Cannot query for version on plain Documents!");
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#toMappedDocument(org.springframework.data.mongodb.core.convert.MongoWriter)
*/
@Override @Override
public MappedDocument toMappedDocument(MongoWriter<? super T> writer) { public MappedDocument toMappedDocument(MongoWriter<? super T> writer) {
return MappedDocument.of(map instanceof Document // return MappedDocument.of(map instanceof Document //
@@ -433,47 +528,27 @@ class EntityOperations {
: new Document(map)); : new Document(map));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.MutablePersistableSource#initializeVersionProperty()
*/
@Override @Override
public T initializeVersionProperty() { public T initializeVersionProperty() {
return map; return map;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.MutablePersistableSource#getVersion()
*/
@Override @Override
@Nullable @Nullable
public Number getVersion() { public Number getVersion() {
return null; return null;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.MutablePersistableSource#incrementVersion()
*/
@Override @Override
public T incrementVersion() { public T incrementVersion() {
return map; return map;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#getBean()
*/
@Override @Override
public T getBean() { public T getBean() {
return map; return map;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.Entity#isNew()
*/
@Override @Override
public boolean isNew() { public boolean isNew() {
return map.get(ID_FIELD) != null; return map.get(ID_FIELD) != null;
@@ -486,10 +561,6 @@ class EntityOperations {
super(map); super(map);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#toMappedDocument(org.springframework.data.mongodb.core.convert.MongoWriter)
*/
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public MappedDocument toMappedDocument(MongoWriter<? super T> writer) { public MappedDocument toMappedDocument(MongoWriter<? super T> writer) {
@@ -529,28 +600,16 @@ class EntityOperations {
return new MappedEntity<>(entity, identifierAccessor, propertyAccessor); return new MappedEntity<>(entity, identifierAccessor, propertyAccessor);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#getIdPropertyName()
*/
@Override @Override
public String getIdFieldName() { public String getIdFieldName() {
return entity.getRequiredIdProperty().getFieldName(); return entity.getRequiredIdProperty().getFieldName();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#getId()
*/
@Override @Override
public Object getId() { public Object getId() {
return idAccessor.getRequiredIdentifier(); return idAccessor.getRequiredIdentifier();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#getByIdQuery()
*/
@Override @Override
public Query getByIdQuery() { public Query getByIdQuery() {
@@ -563,10 +622,6 @@ class EntityOperations {
return Query.query(Criteria.where(idProperty.getName()).is(getId())); return Query.query(Criteria.where(idProperty.getName()).is(getId()));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#getQueryForVersion(java.lang.Object)
*/
@Override @Override
public Query getQueryForVersion() { public Query getQueryForVersion() {
@@ -577,10 +632,6 @@ class EntityOperations {
.and(versionProperty.getName()).is(getVersion())); .and(versionProperty.getName()).is(getVersion()));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#toMappedDocument(org.springframework.data.mongodb.core.convert.MongoWriter)
*/
@Override @Override
public MappedDocument toMappedDocument(MongoWriter<? super T> writer) { public MappedDocument toMappedDocument(MongoWriter<? super T> writer) {
@@ -596,10 +647,6 @@ class EntityOperations {
return MappedDocument.of(document); return MappedDocument.of(document);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.Entity#assertUpdateableIdIfNotSet()
*/
public void assertUpdateableIdIfNotSet() { public void assertUpdateableIdIfNotSet() {
if (!entity.hasIdProperty()) { if (!entity.hasIdProperty()) {
@@ -620,38 +667,22 @@ class EntityOperations {
} }
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#isVersionedEntity()
*/
@Override @Override
public boolean isVersionedEntity() { public boolean isVersionedEntity() {
return entity.hasVersionProperty(); return entity.hasVersionProperty();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#getVersion()
*/
@Override @Override
@Nullable @Nullable
public Object getVersion() { public Object getVersion() {
return propertyAccessor.getProperty(entity.getRequiredVersionProperty()); return propertyAccessor.getProperty(entity.getRequiredVersionProperty());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.PersistableSource#getBean()
*/
@Override @Override
public T getBean() { public T getBean() {
return propertyAccessor.getBean(); return propertyAccessor.getBean();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.Entity#isNew()
*/
@Override @Override
public boolean isNew() { public boolean isNew() {
return entity.isNew(propertyAccessor.getBean()); return entity.isNew(propertyAccessor.getBean());
@@ -686,10 +717,6 @@ class EntityOperations {
new ConvertingPropertyAccessor<>(propertyAccessor, conversionService)); new ConvertingPropertyAccessor<>(propertyAccessor, conversionService));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.AdaptibleEntity#populateIdIfNecessary(java.lang.Object)
*/
@Nullable @Nullable
@Override @Override
public T populateIdIfNecessary(@Nullable Object id) { public T populateIdIfNecessary(@Nullable Object id) {
@@ -711,10 +738,6 @@ class EntityOperations {
return propertyAccessor.getBean(); return propertyAccessor.getBean();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.MappedEntity#getVersion()
*/
@Override @Override
@Nullable @Nullable
public Number getVersion() { public Number getVersion() {
@@ -724,10 +747,6 @@ class EntityOperations {
return propertyAccessor.getProperty(versionProperty, Number.class); return propertyAccessor.getProperty(versionProperty, Number.class);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.AdaptibleEntity#initializeVersionProperty()
*/
@Override @Override
public T initializeVersionProperty() { public T initializeVersionProperty() {
@@ -742,10 +761,6 @@ class EntityOperations {
return propertyAccessor.getBean(); return propertyAccessor.getBean();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.AdaptibleEntity#incrementVersion()
*/
@Override @Override
public T incrementVersion() { public T incrementVersion() {
@@ -817,19 +832,11 @@ class EntityOperations {
return (TypedOperations) INSTANCE; return (TypedOperations) INSTANCE;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.TypedOperations#getCollation()
*/
@Override @Override
public Optional<Collation> getCollation() { public Optional<Collation> getCollation() {
return Optional.empty(); return Optional.empty();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.TypedOperations#getCollation(org.springframework.data.mongodb.core.query.Query)
*/
@Override @Override
public Optional<Collation> getCollation(Query query) { public Optional<Collation> getCollation(Query query) {
@@ -864,19 +871,11 @@ class EntityOperations {
this.entity = entity; this.entity = entity;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.TypedOperations#getCollation()
*/
@Override @Override
public Optional<Collation> getCollation() { public Optional<Collation> getCollation() {
return Optional.ofNullable(entity.getCollation()); return Optional.ofNullable(entity.getCollation());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.EntityOperations.TypedOperations#getCollation(org.springframework.data.mongodb.core.query.Query)
*/
@Override @Override
public Optional<Collation> getCollation(Query query) { public Optional<Collation> getCollation(Query query) {

View File

@@ -15,9 +15,10 @@
*/ */
package org.springframework.data.mongodb.core; package org.springframework.data.mongodb.core;
import java.util.stream.Stream;
import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.util.CloseableIterator;
/** /**
* {@link ExecutableAggregationOperation} allows creation and execution of MongoDB aggregation operations in a fluent * {@link ExecutableAggregationOperation} allows creation and execution of MongoDB aggregation operations in a fluent
@@ -88,12 +89,12 @@ public interface ExecutableAggregationOperation {
/** /**
* Apply pipeline operations as specified and stream all matching elements. <br /> * Apply pipeline operations as specified and stream all matching elements. <br />
* Returns a {@link CloseableIterator} that wraps the a Mongo DB {@link com.mongodb.client.FindIterable} * Returns a {@link Stream} that wraps the Mongo DB {@link com.mongodb.client.FindIterable}
* *
* @return a {@link CloseableIterator} that wraps the a Mongo DB {@link com.mongodb.client.FindIterable} that needs to be closed. * @return the result {@link Stream}, containing mapped objects, needing to be closed once fully processed (e.g.
* Never {@literal null}. * through a try-with-resources clause).
*/ */
CloseableIterator<T> stream(); Stream<T> stream();
} }
/** /**

View File

@@ -15,10 +15,11 @@
*/ */
package org.springframework.data.mongodb.core; package org.springframework.data.mongodb.core;
import java.util.stream.Stream;
import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.TypedAggregation; import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
import org.springframework.data.util.CloseableIterator;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@@ -37,10 +38,6 @@ class ExecutableAggregationOperationSupport implements ExecutableAggregationOper
this.template = template; this.template = template;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableAggregationOperation#aggregateAndReturn(java.lang.Class)
*/
@Override @Override
public <T> ExecutableAggregation<T> aggregateAndReturn(Class<T> domainType) { public <T> ExecutableAggregation<T> aggregateAndReturn(Class<T> domainType) {
@@ -69,10 +66,6 @@ class ExecutableAggregationOperationSupport implements ExecutableAggregationOper
this.collection = collection; this.collection = collection;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableAggregationOperation.AggregationWithCollection#inCollection(java.lang.String)
*/
@Override @Override
public AggregationWithAggregation<T> inCollection(String collection) { public AggregationWithAggregation<T> inCollection(String collection) {
@@ -81,10 +74,6 @@ class ExecutableAggregationOperationSupport implements ExecutableAggregationOper
return new ExecutableAggregationSupport<>(template, domainType, aggregation, collection); return new ExecutableAggregationSupport<>(template, domainType, aggregation, collection);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableAggregationOperation.AggregationWithAggregation#by(org.springframework.data.mongodb.core.aggregation.Aggregation)
*/
@Override @Override
public TerminatingAggregation<T> by(Aggregation aggregation) { public TerminatingAggregation<T> by(Aggregation aggregation) {
@@ -93,21 +82,13 @@ class ExecutableAggregationOperationSupport implements ExecutableAggregationOper
return new ExecutableAggregationSupport<>(template, domainType, aggregation, collection); return new ExecutableAggregationSupport<>(template, domainType, aggregation, collection);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableAggregationOperation.TerminatingAggregation#all()
*/
@Override @Override
public AggregationResults<T> all() { public AggregationResults<T> all() {
return template.aggregate(aggregation, getCollectionName(aggregation), domainType); return template.aggregate(aggregation, getCollectionName(aggregation), domainType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableAggregationOperation.TerminatingAggregation#stream()
*/
@Override @Override
public CloseableIterator<T> stream() { public Stream<T> stream() {
return template.aggregateStream(aggregation, getCollectionName(aggregation), domainType); return template.aggregateStream(aggregation, getCollectionName(aggregation), domainType);
} }

View File

@@ -118,8 +118,8 @@ public interface ExecutableFindOperation {
/** /**
* Stream all matching elements. * Stream all matching elements.
* *
* @return a {@link Stream} that wraps the a Mongo DB {@link com.mongodb.client.FindIterable} that needs to be closed. Never * @return the result {@link Stream}, containing mapped objects, needing to be closed once fully processed (e.g.
* {@literal null}. * through a try-with-resources clause).
*/ */
Stream<T> stream(); Stream<T> stream();

View File

@@ -20,12 +20,11 @@ import java.util.Optional;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.bson.Document; import org.bson.Document;
import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.data.mongodb.core.query.NearQuery; import org.springframework.data.mongodb.core.query.NearQuery;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.SerializationUtils; import org.springframework.data.mongodb.core.query.SerializationUtils;
import org.springframework.data.util.CloseableIterator;
import org.springframework.data.util.StreamUtils;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
@@ -51,10 +50,6 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
this.template = template; this.template = template;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation#query(java.lang.Class)
*/
@Override @Override
public <T> ExecutableFind<T> query(Class<T> domainType) { public <T> ExecutableFind<T> query(Class<T> domainType) {
@@ -74,11 +69,11 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
private final MongoTemplate template; private final MongoTemplate template;
private final Class<?> domainType; private final Class<?> domainType;
private final Class<T> returnType; private final Class<T> returnType;
@Nullable private final String collection; private final @Nullable String collection;
private final Query query; private final Query query;
ExecutableFindSupport(MongoTemplate template, Class<?> domainType, Class<T> returnType, ExecutableFindSupport(MongoTemplate template, Class<?> domainType, Class<T> returnType,
String collection, Query query) { @Nullable String collection, Query query) {
this.template = template; this.template = template;
this.domainType = domainType; this.domainType = domainType;
this.returnType = returnType; this.returnType = returnType;
@@ -86,10 +81,6 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
this.query = query; this.query = query;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.FindWithCollection#inCollection(java.lang.String)
*/
@Override @Override
public FindWithProjection<T> inCollection(String collection) { public FindWithProjection<T> inCollection(String collection) {
@@ -98,10 +89,6 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
return new ExecutableFindSupport<>(template, domainType, returnType, collection, query); return new ExecutableFindSupport<>(template, domainType, returnType, collection, query);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.FindWithProjection#as(Class)
*/
@Override @Override
public <T1> FindWithQuery<T1> as(Class<T1> returnType) { public <T1> FindWithQuery<T1> as(Class<T1> returnType) {
@@ -110,10 +97,6 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
return new ExecutableFindSupport<>(template, domainType, returnType, collection, query); return new ExecutableFindSupport<>(template, domainType, returnType, collection, query);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.FindWithQuery#matching(org.springframework.data.mongodb.core.query.Query)
*/
@Override @Override
public TerminatingFind<T> matching(Query query) { public TerminatingFind<T> matching(Query query) {
@@ -122,10 +105,6 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
return new ExecutableFindSupport<>(template, domainType, returnType, collection, query); return new ExecutableFindSupport<>(template, domainType, returnType, collection, query);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.TerminatingFind#oneValue()
*/
@Override @Override
public T oneValue() { public T oneValue() {
@@ -142,10 +121,6 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
return result.iterator().next(); return result.iterator().next();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.TerminatingFind#firstValue()
*/
@Override @Override
public T firstValue() { public T firstValue() {
@@ -154,55 +129,31 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
return ObjectUtils.isEmpty(result) ? null : result.iterator().next(); return ObjectUtils.isEmpty(result) ? null : result.iterator().next();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.TerminatingFind#all()
*/
@Override @Override
public List<T> all() { public List<T> all() {
return doFind(null); return doFind(null);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.TerminatingFind#stream()
*/
@Override @Override
public Stream<T> stream() { public Stream<T> stream() {
return StreamUtils.createStreamFromIterator(doStream()); return doStream();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.FindWithQuery#near(org.springframework.data.mongodb.core.query.NearQuery)
*/
@Override @Override
public TerminatingFindNear<T> near(NearQuery nearQuery) { public TerminatingFindNear<T> near(NearQuery nearQuery) {
return () -> template.geoNear(nearQuery, domainType, getCollectionName(), returnType); return () -> template.geoNear(nearQuery, domainType, getCollectionName(), returnType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.TerminatingFind#count()
*/
@Override @Override
public long count() { public long count() {
return template.count(query, domainType, getCollectionName()); return template.count(query, domainType, getCollectionName());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.TerminatingFind#exists()
*/
@Override @Override
public boolean exists() { public boolean exists() {
return template.exists(query, domainType, getCollectionName()); return template.exists(query, domainType, getCollectionName());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.FindDistinct#distinct(java.lang.String)
*/
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public TerminatingDistinct<Object> distinct(String field) { public TerminatingDistinct<Object> distinct(String field) {
@@ -227,7 +178,7 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
returnType == domainType ? (Class<T>) Object.class : returnType); returnType == domainType ? (Class<T>) Object.class : returnType);
} }
private CloseableIterator<T> doStream() { private Stream<T> doStream() {
return template.doStream(query, domainType, getCollectionName(), returnType); return template.doStream(query, domainType, getCollectionName(), returnType);
} }
@@ -257,10 +208,6 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
this.delegate = delegate; this.delegate = delegate;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.CursorPreparer#prepare(com.mongodb.clientFindIterable)
*/
@Override @Override
public FindIterable<Document> prepare(FindIterable<Document> iterable) { public FindIterable<Document> prepare(FindIterable<Document> iterable) {
@@ -295,10 +242,6 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
this.field = field; this.field = field;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.DistinctWithProjection#as(java.lang.Class)
*/
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <R> TerminatingDistinct<R> as(Class<R> resultType) { public <R> TerminatingDistinct<R> as(Class<R> resultType) {
@@ -308,10 +251,6 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
return new DistinctOperationSupport<>((ExecutableFindSupport) delegate.as(resultType), field); return new DistinctOperationSupport<>((ExecutableFindSupport) delegate.as(resultType), field);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.DistinctWithQuery#matching(org.springframework.data.mongodb.core.query.Query)
*/
@Override @Override
public TerminatingDistinct<T> matching(Query query) { public TerminatingDistinct<T> matching(Query query) {
@@ -320,10 +259,6 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation {
return new DistinctOperationSupport<>((ExecutableFindSupport<T>) delegate.matching(query), field); return new DistinctOperationSupport<>((ExecutableFindSupport<T>) delegate.matching(query), field);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableFindOperation.TerminatingDistinct#all()
*/
@Override @Override
public List<T> all() { public List<T> all() {
return delegate.doFindDistinct(field); return delegate.doFindDistinct(field);

View File

@@ -40,10 +40,6 @@ class ExecutableInsertOperationSupport implements ExecutableInsertOperation {
this.template = template; this.template = template;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.coreExecutableInsertOperation#insert(java.lan.Class)
*/
@Override @Override
public <T> ExecutableInsert<T> insert(Class<T> domainType) { public <T> ExecutableInsert<T> insert(Class<T> domainType) {
@@ -71,10 +67,6 @@ class ExecutableInsertOperationSupport implements ExecutableInsertOperation {
this.bulkMode = bulkMode; this.bulkMode = bulkMode;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableInsertOperation.TerminatingInsert#insert(java.lang.Class)
*/
@Override @Override
public T one(T object) { public T one(T object) {
@@ -83,10 +75,6 @@ class ExecutableInsertOperationSupport implements ExecutableInsertOperation {
return template.insert(object, getCollectionName()); return template.insert(object, getCollectionName());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableInsertOperation.TerminatingInsert#all(java.util.Collection)
*/
@Override @Override
public Collection<T> all(Collection<? extends T> objects) { public Collection<T> all(Collection<? extends T> objects) {
@@ -95,10 +83,6 @@ class ExecutableInsertOperationSupport implements ExecutableInsertOperation {
return template.insert(objects, getCollectionName()); return template.insert(objects, getCollectionName());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableInsertOperation.TerminatingBulkInsert#bulk(java.util.Collection)
*/
@Override @Override
public BulkWriteResult bulk(Collection<? extends T> objects) { public BulkWriteResult bulk(Collection<? extends T> objects) {
@@ -108,10 +92,6 @@ class ExecutableInsertOperationSupport implements ExecutableInsertOperation {
.insert(new ArrayList<>(objects)).execute(); .insert(new ArrayList<>(objects)).execute();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableInsertOperation.InsertWithCollection#inCollection(java.lang.String)
*/
@Override @Override
public InsertWithBulkMode<T> inCollection(String collection) { public InsertWithBulkMode<T> inCollection(String collection) {
@@ -120,10 +100,6 @@ class ExecutableInsertOperationSupport implements ExecutableInsertOperation {
return new ExecutableInsertSupport<>(template, domainType, collection, bulkMode); return new ExecutableInsertSupport<>(template, domainType, collection, bulkMode);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableInsertOperation.InsertWithBulkMode#withBulkMode(org.springframework.data.mongodb.core.BulkMode)
*/
@Override @Override
public TerminatingBulkInsert<T> withBulkMode(BulkMode bulkMode) { public TerminatingBulkInsert<T> withBulkMode(BulkMode bulkMode) {

View File

@@ -41,10 +41,6 @@ class ExecutableRemoveOperationSupport implements ExecutableRemoveOperation {
this.tempate = tempate; this.tempate = tempate;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableRemoveOperation#remove(java.lang.Class)
*/
@Override @Override
public <T> ExecutableRemove<T> remove(Class<T> domainType) { public <T> ExecutableRemove<T> remove(Class<T> domainType) {
@@ -71,10 +67,6 @@ class ExecutableRemoveOperationSupport implements ExecutableRemoveOperation {
this.collection = collection; this.collection = collection;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableRemoveOperation.RemoveWithCollection#inCollection(java.lang.String)
*/
@Override @Override
public RemoveWithQuery<T> inCollection(String collection) { public RemoveWithQuery<T> inCollection(String collection) {
@@ -83,10 +75,6 @@ class ExecutableRemoveOperationSupport implements ExecutableRemoveOperation {
return new ExecutableRemoveSupport<>(template, domainType, query, collection); return new ExecutableRemoveSupport<>(template, domainType, query, collection);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableRemoveOperation.RemoveWithQuery#matching(org.springframework.data.mongodb.core.query.Query)
*/
@Override @Override
public TerminatingRemove<T> matching(Query query) { public TerminatingRemove<T> matching(Query query) {
@@ -95,28 +83,16 @@ class ExecutableRemoveOperationSupport implements ExecutableRemoveOperation {
return new ExecutableRemoveSupport<>(template, domainType, query, collection); return new ExecutableRemoveSupport<>(template, domainType, query, collection);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableRemoveOperation.TerminatingRemove#all()
*/
@Override @Override
public DeleteResult all() { public DeleteResult all() {
return template.doRemove(getCollectionName(), query, domainType, true); return template.doRemove(getCollectionName(), query, domainType, true);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableRemoveOperation.TerminatingRemove#one()
*/
@Override @Override
public DeleteResult one() { public DeleteResult one() {
return template.doRemove(getCollectionName(), query, domainType, false); return template.doRemove(getCollectionName(), query, domainType, false);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableRemoveOperation.TerminatingRemove#findAndRemove()
*/
@Override @Override
public List<T> findAndRemove() { public List<T> findAndRemove() {

View File

@@ -40,10 +40,6 @@ class ExecutableUpdateOperationSupport implements ExecutableUpdateOperation {
this.template = template; this.template = template;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableUpdateOperation#update(java.lang.Class)
*/
@Override @Override
public <T> ExecutableUpdate<T> update(Class<T> domainType) { public <T> ExecutableUpdate<T> update(Class<T> domainType) {
@@ -85,10 +81,6 @@ class ExecutableUpdateOperationSupport implements ExecutableUpdateOperation {
this.targetType = targetType; this.targetType = targetType;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableUpdateOperation.UpdateWithUpdate#apply(org.springframework.data.mongodb.core.query.UpdateDefinition)
*/
@Override @Override
public TerminatingUpdate<T> apply(UpdateDefinition update) { public TerminatingUpdate<T> apply(UpdateDefinition update) {
@@ -98,10 +90,6 @@ class ExecutableUpdateOperationSupport implements ExecutableUpdateOperation {
findAndReplaceOptions, replacement, targetType); findAndReplaceOptions, replacement, targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableUpdateOperation.UpdateWithCollection#inCollection(java.lang.String)
*/
@Override @Override
public UpdateWithQuery<T> inCollection(String collection) { public UpdateWithQuery<T> inCollection(String collection) {
@@ -111,10 +99,6 @@ class ExecutableUpdateOperationSupport implements ExecutableUpdateOperation {
findAndReplaceOptions, replacement, targetType); findAndReplaceOptions, replacement, targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableUpdateOperation.FindAndModifyWithOptions#withOptions(org.springframework.data.mongodb.core.FindAndModifyOptions)
*/
@Override @Override
public TerminatingFindAndModify<T> withOptions(FindAndModifyOptions options) { public TerminatingFindAndModify<T> withOptions(FindAndModifyOptions options) {
@@ -124,10 +108,6 @@ class ExecutableUpdateOperationSupport implements ExecutableUpdateOperation {
findAndReplaceOptions, replacement, targetType); findAndReplaceOptions, replacement, targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableUpdateOperation.UpdateWithUpdate#replaceWith(Object)
*/
@Override @Override
public FindAndReplaceWithProjection<T> replaceWith(T replacement) { public FindAndReplaceWithProjection<T> replaceWith(T replacement) {
@@ -137,10 +117,6 @@ class ExecutableUpdateOperationSupport implements ExecutableUpdateOperation {
findAndReplaceOptions, replacement, targetType); findAndReplaceOptions, replacement, targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableUpdateOperation.FindAndReplaceWithOptions#withOptions(org.springframework.data.mongodb.core.FindAndReplaceOptions)
*/
@Override @Override
public FindAndReplaceWithProjection<T> withOptions(FindAndReplaceOptions options) { public FindAndReplaceWithProjection<T> withOptions(FindAndReplaceOptions options) {
@@ -150,10 +126,6 @@ class ExecutableUpdateOperationSupport implements ExecutableUpdateOperation {
options, replacement, targetType); options, replacement, targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.UpdateWithQuery#matching(org.springframework.data.mongodb.core.query.Query)
*/
@Override @Override
public UpdateWithUpdate<T> matching(Query query) { public UpdateWithUpdate<T> matching(Query query) {
@@ -163,10 +135,6 @@ class ExecutableUpdateOperationSupport implements ExecutableUpdateOperation {
findAndReplaceOptions, replacement, targetType); findAndReplaceOptions, replacement, targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.FindAndReplaceWithProjection#as(java.lang.Class)
*/
@Override @Override
public <R> FindAndReplaceWithOptions<R> as(Class<R> resultType) { public <R> FindAndReplaceWithOptions<R> as(Class<R> resultType) {
@@ -176,37 +144,21 @@ class ExecutableUpdateOperationSupport implements ExecutableUpdateOperation {
findAndReplaceOptions, replacement, resultType); findAndReplaceOptions, replacement, resultType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableUpdateOperation.TerminatingUpdate#all()
*/
@Override @Override
public UpdateResult all() { public UpdateResult all() {
return doUpdate(true, false); return doUpdate(true, false);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableUpdateOperation.TerminatingUpdate#first()
*/
@Override @Override
public UpdateResult first() { public UpdateResult first() {
return doUpdate(false, false); return doUpdate(false, false);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableUpdateOperation.TerminatingUpdate#upsert()
*/
@Override @Override
public UpdateResult upsert() { public UpdateResult upsert() {
return doUpdate(true, true); return doUpdate(true, true);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableUpdateOperation.TerminatingFindAndModify#findAndModifyValue()
*/
@Override @Override
public @Nullable T findAndModifyValue() { public @Nullable T findAndModifyValue() {
@@ -215,10 +167,6 @@ class ExecutableUpdateOperationSupport implements ExecutableUpdateOperation {
getCollectionName()); getCollectionName());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ExecutableUpdateOperation.TerminatingFindAndReplace#findAndReplaceValue()
*/
@Override @Override
public @Nullable T findAndReplaceValue() { public @Nullable T findAndReplaceValue() {

View File

@@ -112,55 +112,31 @@ public class MappedDocument {
this.delegate = delegate; this.delegate = delegate;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.query.UpdateDefinition#getUpdateObject()
*/
@Override @Override
public Document getUpdateObject() { public Document getUpdateObject() {
return delegate.getUpdateObject(); return delegate.getUpdateObject();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.query.UpdateDefinition#modifies(java.lang.String)
*/
@Override @Override
public boolean modifies(String key) { public boolean modifies(String key) {
return delegate.modifies(key); return delegate.modifies(key);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.query.UpdateDefinition#inc(java.lang.String)
*/
@Override @Override
public void inc(String version) { public void inc(String version) {
delegate.inc(version); delegate.inc(version);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.query.UpdateDefinition#isIsolated()
*/
@Override @Override
public Boolean isIsolated() { public Boolean isIsolated() {
return delegate.isIsolated(); return delegate.isIsolated();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.query.UpdateDefinition#getArrayFilters()
*/
@Override @Override
public List<ArrayFilter> getArrayFilters() { public List<ArrayFilter> getArrayFilters() {
return delegate.getArrayFilters(); return delegate.getArrayFilters();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.query.UpdateDefinition#hasArrayFilters()
*/
@Override @Override
public boolean hasArrayFilters() { public boolean hasArrayFilters() {
return delegate.hasArrayFilters(); return delegate.hasArrayFilters();

View File

@@ -24,7 +24,6 @@ import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.bson.Document; import org.bson.Document;
import org.springframework.data.mapping.PersistentProperty; import org.springframework.data.mapping.PersistentProperty;
import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.data.mongodb.core.convert.MongoConverter;
@@ -45,6 +44,7 @@ import org.springframework.data.util.ClassTypeInformation;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@@ -62,6 +62,7 @@ class MappingMongoJsonSchemaCreator implements MongoJsonSchemaCreator {
private final MongoConverter converter; private final MongoConverter converter;
private final MappingContext<MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext; private final MappingContext<MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext;
private final Predicate<JsonSchemaPropertyContext> filter; private final Predicate<JsonSchemaPropertyContext> filter;
private final LinkedMultiValueMap<String, Class<?>> mergeProperties;
/** /**
* Create a new instance of {@link MappingMongoJsonSchemaCreator}. * Create a new instance of {@link MappingMongoJsonSchemaCreator}.
@@ -72,29 +73,48 @@ class MappingMongoJsonSchemaCreator implements MongoJsonSchemaCreator {
MappingMongoJsonSchemaCreator(MongoConverter converter) { MappingMongoJsonSchemaCreator(MongoConverter converter) {
this(converter, (MappingContext<MongoPersistentEntity<?>, MongoPersistentProperty>) converter.getMappingContext(), this(converter, (MappingContext<MongoPersistentEntity<?>, MongoPersistentProperty>) converter.getMappingContext(),
(property) -> true); (property) -> true, new LinkedMultiValueMap<>());
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
MappingMongoJsonSchemaCreator(MongoConverter converter, MappingMongoJsonSchemaCreator(MongoConverter converter,
MappingContext<MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext, MappingContext<MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext,
Predicate<JsonSchemaPropertyContext> filter) { Predicate<JsonSchemaPropertyContext> filter, LinkedMultiValueMap<String, Class<?>> mergeProperties) {
Assert.notNull(converter, "Converter must not be null!"); Assert.notNull(converter, "Converter must not be null!");
this.converter = converter; this.converter = converter;
this.mappingContext = mappingContext; this.mappingContext = mappingContext;
this.filter = filter; this.filter = filter;
this.mergeProperties = mergeProperties;
} }
@Override @Override
public MongoJsonSchemaCreator filter(Predicate<JsonSchemaPropertyContext> filter) { public MongoJsonSchemaCreator filter(Predicate<JsonSchemaPropertyContext> filter) {
return new MappingMongoJsonSchemaCreator(converter, mappingContext, filter); return new MappingMongoJsonSchemaCreator(converter, mappingContext, filter, mergeProperties);
} }
/* @Override
* (non-Javadoc) public PropertySpecifier property(String path) {
* org.springframework.data.mongodb.core.MongoJsonSchemaCreator#createSchemaFor(java.lang.Class) return types -> withTypesFor(path, types);
}
/**
* Specify additional types to be considered wehen rendering the schema for the given path.
*
* @param path path the path using {@literal dot '.'} notation.
* @param types must not be {@literal null}.
* @return new instance of {@link MongoJsonSchemaCreator}.
* @since 3.4
*/ */
public MongoJsonSchemaCreator withTypesFor(String path, Class<?>... types) {
LinkedMultiValueMap<String, Class<?>> clone = mergeProperties.clone();
for (Class<?> type : types) {
clone.add(path, type);
}
return new MappingMongoJsonSchemaCreator(converter, mappingContext, filter, clone);
}
@Override @Override
public MongoJsonSchema createSchemaFor(Class<?> type) { public MongoJsonSchema createSchemaFor(Class<?> type) {
@@ -135,9 +155,12 @@ class MappingMongoJsonSchemaCreator implements MongoJsonSchemaCreator {
List<MongoPersistentProperty> currentPath = new ArrayList<>(path); List<MongoPersistentProperty> currentPath = new ArrayList<>(path);
if (!filter.test(new PropertyContext( String stringPath = currentPath.stream().map(PersistentProperty::getName).collect(Collectors.joining("."));
currentPath.stream().map(PersistentProperty::getName).collect(Collectors.joining(".")), nested))) { stringPath = StringUtils.hasText(stringPath) ? (stringPath + "." + nested.getName()) : nested.getName();
continue; if (!filter.test(new PropertyContext(stringPath, nested))) {
if (!mergeProperties.containsKey(stringPath)) {
continue;
}
} }
if (path.contains(nested)) { // cycle guard if (path.contains(nested)) { // cycle guard
@@ -155,14 +178,34 @@ class MappingMongoJsonSchemaCreator implements MongoJsonSchemaCreator {
private JsonSchemaProperty computeSchemaForProperty(List<MongoPersistentProperty> path) { private JsonSchemaProperty computeSchemaForProperty(List<MongoPersistentProperty> path) {
String stringPath = path.stream().map(MongoPersistentProperty::getName).collect(Collectors.joining("."));
MongoPersistentProperty property = CollectionUtils.lastElement(path); MongoPersistentProperty property = CollectionUtils.lastElement(path);
boolean required = isRequiredProperty(property); boolean required = isRequiredProperty(property);
Class<?> rawTargetType = computeTargetType(property); // target type before conversion Class<?> rawTargetType = computeTargetType(property); // target type before conversion
Class<?> targetType = converter.getTypeMapper().getWriteTargetTypeFor(rawTargetType); // conversion target type Class<?> targetType = converter.getTypeMapper().getWriteTargetTypeFor(rawTargetType); // conversion target type
if (!isCollection(property) && property.isEntity() && ObjectUtils.nullSafeEquals(rawTargetType, targetType)) { if (!isCollection(property) && ObjectUtils.nullSafeEquals(rawTargetType, targetType)) {
return createObjectSchemaPropertyForEntity(path, property, required); if (property.isEntity() || mergeProperties.containsKey(stringPath)) {
List<JsonSchemaProperty> targetProperties = new ArrayList<>();
if (property.isEntity()) {
targetProperties.add(createObjectSchemaPropertyForEntity(path, property, required));
}
if (mergeProperties.containsKey(stringPath)) {
for (Class<?> theType : mergeProperties.get(stringPath)) {
ObjectJsonSchemaProperty target = JsonSchemaProperty.object(property.getName());
List<JsonSchemaProperty> nestedProperties = computePropertiesForEntity(path,
mappingContext.getRequiredPersistentEntity(theType));
targetProperties.add(createPotentiallyRequiredSchemaProperty(
target.properties(nestedProperties.toArray(new JsonSchemaProperty[0])), required));
}
}
return targetProperties.size() == 1 ? targetProperties.iterator().next()
: JsonSchemaProperty.merged(targetProperties);
}
} }
String fieldName = computePropertyFieldName(property); String fieldName = computePropertyFieldName(property);

View File

@@ -46,25 +46,16 @@ public class MongoAdmin implements MongoAdminOperations {
this.mongoClient = client; this.mongoClient = client;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.core.MongoAdminOperations#dropDatabase(java.lang.String)
*/
@ManagedOperation @ManagedOperation
public void dropDatabase(String databaseName) { public void dropDatabase(String databaseName) {
getDB(databaseName).drop(); getDB(databaseName).drop();
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.core.MongoAdminOperations#createDatabase(java.lang.String)
*/
@ManagedOperation @ManagedOperation
public void createDatabase(String databaseName) { public void createDatabase(String databaseName) {
getDB(databaseName); getDB(databaseName);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.core.MongoAdminOperations#getDatabaseStats(java.lang.String)
*/
@ManagedOperation @ManagedOperation
public String getDatabaseStats(String databaseName) { public String getDatabaseStats(String databaseName) {
return getDB(databaseName).runCommand(new Document("dbStats", 1).append("scale", 1024)).toJson(); return getDB(databaseName).runCommand(new Document("dbStats", 1).append("scale", 1024)).toJson();

View File

@@ -119,27 +119,15 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
this.exceptionTranslator = exceptionTranslator == null ? DEFAULT_EXCEPTION_TRANSLATOR : exceptionTranslator; this.exceptionTranslator = exceptionTranslator == null ? DEFAULT_EXCEPTION_TRANSLATOR : exceptionTranslator;
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.FactoryBean#getObjectType()
*/
public Class<? extends MongoClient> getObjectType() { public Class<? extends MongoClient> getObjectType() {
return MongoClient.class; return MongoClient.class;
} }
/*
* (non-Javadoc)
* @see org.springframework.dao.support.PersistenceExceptionTranslator#translateExceptionIfPossible(java.lang.RuntimeException)
*/
@Nullable @Nullable
public DataAccessException translateExceptionIfPossible(RuntimeException ex) { public DataAccessException translateExceptionIfPossible(RuntimeException ex) {
return exceptionTranslator.translateExceptionIfPossible(ex); return exceptionTranslator.translateExceptionIfPossible(ex);
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.config.AbstractFactoryBean#createInstance()
*/
@Override @Override
protected MongoClient createInstance() throws Exception { protected MongoClient createInstance() throws Exception {
return createMongoClient(computeClientSetting()); return createMongoClient(computeClientSetting());
@@ -336,10 +324,6 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
return !fromConnectionStringIsDefault ? fromConnectionString : defaultValue; return !fromConnectionStringIsDefault ? fromConnectionString : defaultValue;
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.config.AbstractFactoryBean#destroyInstance(java.lang.Object)
*/
@Override @Override
protected void destroyInstance(@Nullable MongoClient instance) throws Exception { protected void destroyInstance(@Nullable MongoClient instance) throws Exception {
@@ -353,6 +337,11 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
} }
private String getOrDefault(Object value, String defaultValue) { private String getOrDefault(Object value, String defaultValue) {
return !StringUtils.isEmpty(value) ? value.toString() : defaultValue;
if(value == null) {
return defaultValue;
}
String sValue = value.toString();
return StringUtils.hasText(sValue) ? sValue : defaultValue;
} }
} }

View File

@@ -84,18 +84,10 @@ public abstract class MongoDatabaseFactorySupport<C> implements MongoDatabaseFac
this.writeConcern = writeConcern; this.writeConcern = writeConcern;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.MongoDbFactory#getMongoDatabase()
*/
public MongoDatabase getMongoDatabase() throws DataAccessException { public MongoDatabase getMongoDatabase() throws DataAccessException {
return getMongoDatabase(getDefaultDatabaseName()); return getMongoDatabase(getDefaultDatabaseName());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.MongoDbFactory#getMongoDatabase(java.lang.String)
*/
@Override @Override
public MongoDatabase getMongoDatabase(String dbName) throws DataAccessException { public MongoDatabase getMongoDatabase(String dbName) throws DataAccessException {
@@ -118,28 +110,16 @@ public abstract class MongoDatabaseFactorySupport<C> implements MongoDatabaseFac
*/ */
protected abstract MongoDatabase doGetMongoDatabase(String dbName); protected abstract MongoDatabase doGetMongoDatabase(String dbName);
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.DisposableBean#destroy()
*/
public void destroy() throws Exception { public void destroy() throws Exception {
if (mongoInstanceCreated) { if (mongoInstanceCreated) {
closeClient(); closeClient();
} }
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.MongoDbFactory#getExceptionTranslator()
*/
public PersistenceExceptionTranslator getExceptionTranslator() { public PersistenceExceptionTranslator getExceptionTranslator() {
return this.exceptionTranslator; return this.exceptionTranslator;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.MongoDbFactory#withSession(com.mongodb.session.Session)
*/
public MongoDatabaseFactory withSession(ClientSession session) { public MongoDatabaseFactory withSession(ClientSession session) {
return new MongoDatabaseFactorySupport.ClientSessionBoundMongoDbFactory(session, this); return new MongoDatabaseFactorySupport.ClientSessionBoundMongoDbFactory(session, this);
} }
@@ -180,55 +160,31 @@ public abstract class MongoDatabaseFactorySupport<C> implements MongoDatabaseFac
this.delegate = delegate; this.delegate = delegate;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.MongoDbFactory#getMongoDatabase()
*/
@Override @Override
public MongoDatabase getMongoDatabase() throws DataAccessException { public MongoDatabase getMongoDatabase() throws DataAccessException {
return proxyMongoDatabase(delegate.getMongoDatabase()); return proxyMongoDatabase(delegate.getMongoDatabase());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.MongoDbFactory#getMongoDatabase(java.lang.String)
*/
@Override @Override
public MongoDatabase getMongoDatabase(String dbName) throws DataAccessException { public MongoDatabase getMongoDatabase(String dbName) throws DataAccessException {
return proxyMongoDatabase(delegate.getMongoDatabase(dbName)); return proxyMongoDatabase(delegate.getMongoDatabase(dbName));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.MongoDbFactory#getExceptionTranslator()
*/
@Override @Override
public PersistenceExceptionTranslator getExceptionTranslator() { public PersistenceExceptionTranslator getExceptionTranslator() {
return delegate.getExceptionTranslator(); return delegate.getExceptionTranslator();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.MongoDbFactory#getSession(com.mongodb.ClientSessionOptions)
*/
@Override @Override
public ClientSession getSession(ClientSessionOptions options) { public ClientSession getSession(ClientSessionOptions options) {
return delegate.getSession(options); return delegate.getSession(options);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.MongoDbFactory#withSession(com.mongodb.session.ClientSession)
*/
@Override @Override
public MongoDatabaseFactory withSession(ClientSession session) { public MongoDatabaseFactory withSession(ClientSession session) {
return delegate.withSession(session); return delegate.withSession(session);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.MongoDbFactory#isTransactionActive()
*/
@Override @Override
public boolean isTransactionActive() { public boolean isTransactionActive() {
return session != null && session.hasActiveTransaction(); return session != null && session.hasActiveTransaction();

View File

@@ -1,50 +0,0 @@
/*
* Copyright 2018-2022 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.mongodb.core;
import org.springframework.dao.support.PersistenceExceptionTranslator;
/**
* Common base class for usage with both {@link com.mongodb.client.MongoClients} defining common properties such as
* database name and exception translator.
* <br />
* Not intended to be used directly.
*
* @author Christoph Strobl
* @author Mark Paluch
* @param <C> Client type.
* @since 2.1
* @see SimpleMongoClientDatabaseFactory
* @deprecated since 3.0, use {@link MongoDatabaseFactorySupport} instead.
*/
@Deprecated
public abstract class MongoDbFactorySupport<C> extends MongoDatabaseFactorySupport<C> {
/**
* Create a new {@link MongoDbFactorySupport} object given {@code mongoClient}, {@code databaseName},
* {@code mongoInstanceCreated} and {@link PersistenceExceptionTranslator}.
*
* @param mongoClient must not be {@literal null}.
* @param databaseName must not be {@literal null} or empty.
* @param mongoInstanceCreated {@literal true} if the client instance was created by a subclass of
* {@link MongoDbFactorySupport} to close the client on {@link #destroy()}.
* @param exceptionTranslator must not be {@literal null}.
*/
protected MongoDbFactorySupport(C mongoClient, String databaseName, boolean mongoInstanceCreated,
PersistenceExceptionTranslator exceptionTranslator) {
super(mongoClient, databaseName, mongoInstanceCreated, exceptionTranslator);
}
}

View File

@@ -88,10 +88,6 @@ public class MongoEncryptionSettingsFactoryBean implements FactoryBean<AutoEncry
this.schemaMap = schemaMap; this.schemaMap = schemaMap;
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.FactoryBean#getObject()
*/
@Override @Override
public AutoEncryptionSettings getObject() { public AutoEncryptionSettings getObject() {
@@ -109,10 +105,6 @@ public class MongoEncryptionSettingsFactoryBean implements FactoryBean<AutoEncry
return source != null ? source : Collections.emptyMap(); return source != null ? source : Collections.emptyMap();
} }
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.FactoryBean#getObjectType()
*/
@Override @Override
public Class<?> getObjectType() { public Class<?> getObjectType() {
return AutoEncryptionSettings.class; return AutoEncryptionSettings.class;

View File

@@ -68,10 +68,6 @@ public class MongoExceptionTranslator implements PersistenceExceptionTranslator
private static final Set<String> DATA_INTEGRITY_EXCEPTIONS = new HashSet<>( private static final Set<String> DATA_INTEGRITY_EXCEPTIONS = new HashSet<>(
Arrays.asList("WriteConcernException", "MongoWriteException", "MongoBulkWriteException")); Arrays.asList("WriteConcernException", "MongoWriteException", "MongoBulkWriteException"));
/*
* (non-Javadoc)
* @see org.springframework.dao.support.PersistenceExceptionTranslator#translateExceptionIfPossible(java.lang.RuntimeException)
*/
@Nullable @Nullable
public DataAccessException translateExceptionIfPossible(RuntimeException ex) { public DataAccessException translateExceptionIfPossible(RuntimeException ex) {

View File

@@ -15,6 +15,7 @@
*/ */
package org.springframework.data.mongodb.core; package org.springframework.data.mongodb.core;
import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.function.Predicate; import java.util.function.Predicate;
@@ -62,7 +63,6 @@ import org.springframework.util.Assert;
* {@link org.springframework.data.annotation.Id _id} properties using types that can be converted into * {@link org.springframework.data.annotation.Id _id} properties using types that can be converted into
* {@link org.bson.types.ObjectId} like {@link String} will be mapped to {@code type : 'object'} unless there is more * {@link org.bson.types.ObjectId} like {@link String} will be mapped to {@code type : 'object'} unless there is more
* specific information available via the {@link org.springframework.data.mongodb.core.mapping.MongoId} annotation. * specific information available via the {@link org.springframework.data.mongodb.core.mapping.MongoId} annotation.
* {@link Encrypted} properties will contain {@literal encrypt} information. * {@link Encrypted} properties will contain {@literal encrypt} information.
* *
* @author Christoph Strobl * @author Christoph Strobl
@@ -78,6 +78,20 @@ public interface MongoJsonSchemaCreator {
*/ */
MongoJsonSchema createSchemaFor(Class<?> type); MongoJsonSchema createSchemaFor(Class<?> type);
/**
* Create a merged {@link MongoJsonSchema} out of the individual schemas of the given types by merging their
* properties into one large {@link MongoJsonSchema schema}.
*
* @param types must not be {@literal null} nor contain {@literal null}.
* @return new instance of {@link MongoJsonSchema}.
* @since 3.4
*/
default MongoJsonSchema mergedSchemaFor(Class<?>... types) {
MongoJsonSchema[] schemas = Arrays.stream(types).map(this::createSchemaFor).toArray(MongoJsonSchema[]::new);
return MongoJsonSchema.merge(schemas);
}
/** /**
* Filter matching {@link JsonSchemaProperty properties}. * Filter matching {@link JsonSchemaProperty properties}.
* *
@@ -87,30 +101,39 @@ public interface MongoJsonSchemaCreator {
*/ */
MongoJsonSchemaCreator filter(Predicate<JsonSchemaPropertyContext> filter); MongoJsonSchemaCreator filter(Predicate<JsonSchemaPropertyContext> filter);
/**
* Entry point to specify additional behavior for a given path.
*
* @param path the path using {@literal dot '.'} notation.
* @return new instance of {@link PropertySpecifier}.
* @since 3.4
*/
PropertySpecifier property(String path);
/** /**
* The context in which a specific {@link #getProperty()} is encountered during schema creation. * The context in which a specific {@link #getProperty()} is encountered during schema creation.
* *
* @since 3.3 * @since 3.3
*/ */
interface JsonSchemaPropertyContext { interface JsonSchemaPropertyContext {
/** /**
* The path to a given field/property in dot notation. * The path to a given field/property in dot notation.
* *
* @return never {@literal null}. * @return never {@literal null}.
*/ */
String getPath(); String getPath();
/** /**
* The current property. * The current property.
* *
* @return never {@literal null}. * @return never {@literal null}.
*/ */
MongoPersistentProperty getProperty(); MongoPersistentProperty getProperty();
/** /**
* Obtain the {@link MongoPersistentEntity} for a given property. * Obtain the {@link MongoPersistentEntity} for a given property.
* *
* @param property must not be {@literal null}. * @param property must not be {@literal null}.
* @param <T> * @param <T>
* @return {@literal null} if the property is not an entity. It is nevertheless recommend to check * @return {@literal null} if the property is not an entity. It is nevertheless recommend to check
@@ -209,4 +232,19 @@ public interface MongoJsonSchemaCreator {
return create(converter); return create(converter);
} }
/**
* @author Christoph Strobl
* @since 3.4
*/
interface PropertySpecifier {
/**
* Set additional type parameters for polymorphic ones.
*
* @param types must not be {@literal null}.
* @return the source
*/
MongoJsonSchemaCreator withTypes(Class<?>... types);
}
} }

View File

@@ -20,6 +20,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Stream;
import org.bson.Document; import org.bson.Document;
import org.springframework.data.geo.GeoResults; import org.springframework.data.geo.GeoResults;
@@ -32,8 +33,6 @@ import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.index.IndexOperations; import org.springframework.data.mongodb.core.index.IndexOperations;
import org.springframework.data.mongodb.core.mapreduce.GroupBy;
import org.springframework.data.mongodb.core.mapreduce.GroupByResults;
import org.springframework.data.mongodb.core.mapreduce.MapReduceOptions; import org.springframework.data.mongodb.core.mapreduce.MapReduceOptions;
import org.springframework.data.mongodb.core.mapreduce.MapReduceResults; import org.springframework.data.mongodb.core.mapreduce.MapReduceResults;
import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.mongodb.core.query.BasicQuery;
@@ -42,7 +41,6 @@ import org.springframework.data.mongodb.core.query.NearQuery;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update; import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.mongodb.core.query.UpdateDefinition; import org.springframework.data.mongodb.core.query.UpdateDefinition;
import org.springframework.data.util.CloseableIterator;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
@@ -57,8 +55,7 @@ import com.mongodb.client.result.UpdateResult;
/** /**
* Interface that specifies a basic set of MongoDB operations. Implemented by {@link MongoTemplate}. Not often used but * Interface that specifies a basic set of MongoDB operations. Implemented by {@link MongoTemplate}. Not often used but
* a useful option for extensibility and testability (as it can be easily mocked, stubbed, or be the target of a JDK * a useful option for extensibility and testability (as it can be easily mocked, stubbed, or be the target of a JDK
* proxy). * proxy). <br />
* <br />
* <strong>NOTE:</strong> Some operations cannot be executed within a MongoDB transaction. Please refer to the MongoDB * <strong>NOTE:</strong> Some operations cannot be executed within a MongoDB transaction. Please refer to the MongoDB
* specific documentation to learn more about <a href="https://docs.mongodb.com/manual/core/transactions/">Multi * specific documentation to learn more about <a href="https://docs.mongodb.com/manual/core/transactions/">Multi
* Document Transactions</a>. * Document Transactions</a>.
@@ -84,7 +81,7 @@ public interface MongoOperations extends FluentMongoOperations {
String getCollectionName(Class<?> entityClass); String getCollectionName(Class<?> entityClass);
/** /**
* Execute the a MongoDB command expressed as a JSON string. Parsing is delegated to {@link Document#parse(String)} to * Execute a MongoDB command expressed as a JSON string. Parsing is delegated to {@link Document#parse(String)} to
* obtain the {@link Document} holding the actual command. Any errors that result from executing this command will be * obtain the {@link Document} holding the actual command. Any errors that result from executing this command will be
* converted into Spring's DAO exception hierarchy. * converted into Spring's DAO exception hierarchy.
* *
@@ -124,8 +121,7 @@ public interface MongoOperations extends FluentMongoOperations {
void executeQuery(Query query, String collectionName, DocumentCallbackHandler dch); void executeQuery(Query query, String collectionName, DocumentCallbackHandler dch);
/** /**
* Executes a {@link DbCallback} translating any exceptions as necessary. * Executes a {@link DbCallback} translating any exceptions as necessary. <br />
* <br />
* Allows for returning a result object, that is a domain object or a collection of domain objects. * Allows for returning a result object, that is a domain object or a collection of domain objects.
* *
* @param action callback object that specifies the MongoDB actions to perform on the passed in DB instance. Must not * @param action callback object that specifies the MongoDB actions to perform on the passed in DB instance. Must not
@@ -137,8 +133,7 @@ public interface MongoOperations extends FluentMongoOperations {
<T> T execute(DbCallback<T> action); <T> T execute(DbCallback<T> action);
/** /**
* Executes the given {@link CollectionCallback} on the entity collection of the specified class. * Executes the given {@link CollectionCallback} on the entity collection of the specified class. <br />
* <br />
* Allows for returning a result object, that is a domain object or a collection of domain objects. * Allows for returning a result object, that is a domain object or a collection of domain objects.
* *
* @param entityClass class that determines the collection to use. Must not be {@literal null}. * @param entityClass class that determines the collection to use. Must not be {@literal null}.
@@ -150,8 +145,7 @@ public interface MongoOperations extends FluentMongoOperations {
<T> T execute(Class<?> entityClass, CollectionCallback<T> action); <T> T execute(Class<?> entityClass, CollectionCallback<T> action);
/** /**
* Executes the given {@link CollectionCallback} on the collection of the given name. * Executes the given {@link CollectionCallback} on the collection of the given name. <br />
* <br />
* Allows for returning a result object, that is a domain object or a collection of domain objects. * Allows for returning a result object, that is a domain object or a collection of domain objects.
* *
* @param collectionName the name of the collection that specifies which {@link MongoCollection} instance will be * @param collectionName the name of the collection that specifies which {@link MongoCollection} instance will be
@@ -175,8 +169,7 @@ public interface MongoOperations extends FluentMongoOperations {
/** /**
* Obtain a {@link ClientSession session} bound instance of {@link SessionScoped} binding the {@link ClientSession} * Obtain a {@link ClientSession session} bound instance of {@link SessionScoped} binding the {@link ClientSession}
* provided by the given {@link Supplier} to each and every command issued against MongoDB. * provided by the given {@link Supplier} to each and every command issued against MongoDB. <br />
* <br />
* <strong>Note:</strong> It is up to the caller to manage the {@link ClientSession} lifecycle. Use the * <strong>Note:</strong> It is up to the caller to manage the {@link ClientSession} lifecycle. Use the
* {@link SessionScoped#execute(SessionCallback, Consumer)} hook to potentially close the {@link ClientSession}. * {@link SessionScoped#execute(SessionCallback, Consumer)} hook to potentially close the {@link ClientSession}.
* *
@@ -211,8 +204,7 @@ public interface MongoOperations extends FluentMongoOperations {
} }
/** /**
* Obtain a {@link ClientSession} bound instance of {@link MongoOperations}. * Obtain a {@link ClientSession} bound instance of {@link MongoOperations}. <br />
* <br />
* <strong>Note:</strong> It is up to the caller to manage the {@link ClientSession} lifecycle. * <strong>Note:</strong> It is up to the caller to manage the {@link ClientSession} lifecycle.
* *
* @param session must not be {@literal null}. * @param session must not be {@literal null}.
@@ -225,34 +217,34 @@ public interface MongoOperations extends FluentMongoOperations {
* Executes the given {@link Query} on the entity collection of the specified {@code entityType} backed by a Mongo DB * Executes the given {@link Query} on the entity collection of the specified {@code entityType} backed by a Mongo DB
* {@link com.mongodb.client.FindIterable}. * {@link com.mongodb.client.FindIterable}.
* <p> * <p>
* Returns a {@link CloseableIterator} that wraps the a Mongo DB {@link com.mongodb.client.FindIterable} that needs to * Returns a {@link String} that wraps the Mongo DB {@link com.mongodb.client.FindIterable} that needs to be closed.
* be closed.
* *
* @param query the query class that specifies the criteria used to find a record and also an optional fields * @param query the query class that specifies the criteria used to find a record and also an optional fields
* specification. Must not be {@literal null}. * specification. Must not be {@literal null}.
* @param entityType must not be {@literal null}. * @param entityType must not be {@literal null}.
* @param <T> element return type * @param <T> element return type
* @return will never be {@literal null}. * @return the result {@link Stream}, containing mapped objects, needing to be closed once fully processed (e.g.
* through a try-with-resources clause).
* @since 1.7 * @since 1.7
*/ */
<T> CloseableIterator<T> stream(Query query, Class<T> entityType); <T> Stream<T> stream(Query query, Class<T> entityType);
/** /**
* Executes the given {@link Query} on the entity collection of the specified {@code entityType} and collection backed * Executes the given {@link Query} on the entity collection of the specified {@code entityType} and collection backed
* by a Mongo DB {@link com.mongodb.client.FindIterable}. * by a Mongo DB {@link com.mongodb.client.FindIterable}.
* <p> * <p>
* Returns a {@link CloseableIterator} that wraps the a Mongo DB {@link com.mongodb.client.FindIterable} that needs to * Returns a {@link Stream} that wraps the Mongo DB {@link com.mongodb.client.FindIterable} that needs to be closed.
* be closed.
* *
* @param query the query class that specifies the criteria used to find a record and also an optional fields * @param query the query class that specifies the criteria used to find a record and also an optional fields
* specification. Must not be {@literal null}. * specification. Must not be {@literal null}.
* @param entityType must not be {@literal null}. * @param entityType must not be {@literal null}.
* @param collectionName must not be {@literal null} or empty. * @param collectionName must not be {@literal null} or empty.
* @param <T> element return type * @param <T> element return type
* @return will never be {@literal null}. * @return the result {@link Stream}, containing mapped objects, needing to be closed once fully processed (e.g.
* through a try-with-resources clause).
* @since 1.10 * @since 1.10
*/ */
<T> CloseableIterator<T> stream(Query query, Class<T> entityType, String collectionName); <T> Stream<T> stream(Query query, Class<T> entityType, String collectionName);
/** /**
* Create an uncapped collection with a name based on the provided entity class. * Create an uncapped collection with a name based on the provided entity class.
@@ -299,8 +291,7 @@ public interface MongoOperations extends FluentMongoOperations {
* Get a {@link MongoCollection} by its name. The returned collection may not exists yet (except in local memory) and * Get a {@link MongoCollection} by its name. The returned collection may not exists yet (except in local memory) and
* is created on first interaction with the server. Collections can be explicitly created via * is created on first interaction with the server. Collections can be explicitly created via
* {@link #createCollection(Class)}. Please make sure to check if the collection {@link #collectionExists(Class) * {@link #createCollection(Class)}. Please make sure to check if the collection {@link #collectionExists(Class)
* exists} first. * exists} first. <br />
* <br />
* Translate any exceptions as necessary. * Translate any exceptions as necessary.
* *
* @param collectionName name of the collection. Must not be {@literal null}. * @param collectionName name of the collection. Must not be {@literal null}.
@@ -309,8 +300,7 @@ public interface MongoOperations extends FluentMongoOperations {
MongoCollection<Document> getCollection(String collectionName); MongoCollection<Document> getCollection(String collectionName);
/** /**
* Check to see if a collection with a name indicated by the entity class exists. * Check to see if a collection with a name indicated by the entity class exists. <br />
* <br />
* Translate any exceptions as necessary. * Translate any exceptions as necessary.
* *
* @param entityClass class that determines the name of the collection. Must not be {@literal null}. * @param entityClass class that determines the name of the collection. Must not be {@literal null}.
@@ -319,8 +309,7 @@ public interface MongoOperations extends FluentMongoOperations {
<T> boolean collectionExists(Class<T> entityClass); <T> boolean collectionExists(Class<T> entityClass);
/** /**
* Check to see if a collection with a given name exists. * Check to see if a collection with a given name exists. <br />
* <br />
* Translate any exceptions as necessary. * Translate any exceptions as necessary.
* *
* @param collectionName name of the collection. Must not be {@literal null}. * @param collectionName name of the collection. Must not be {@literal null}.
@@ -329,8 +318,7 @@ public interface MongoOperations extends FluentMongoOperations {
boolean collectionExists(String collectionName); boolean collectionExists(String collectionName);
/** /**
* Drop the collection with the name indicated by the entity class. * Drop the collection with the name indicated by the entity class. <br />
* <br />
* Translate any exceptions as necessary. * Translate any exceptions as necessary.
* *
* @param entityClass class that determines the collection to drop/delete. Must not be {@literal null}. * @param entityClass class that determines the collection to drop/delete. Must not be {@literal null}.
@@ -338,8 +326,7 @@ public interface MongoOperations extends FluentMongoOperations {
<T> void dropCollection(Class<T> entityClass); <T> void dropCollection(Class<T> entityClass);
/** /**
* Drop the collection with the given name. * Drop the collection with the given name. <br />
* <br />
* Translate any exceptions as necessary. * Translate any exceptions as necessary.
* *
* @param collectionName name of the collection to drop/delete. * @param collectionName name of the collection to drop/delete.
@@ -402,11 +389,9 @@ public interface MongoOperations extends FluentMongoOperations {
BulkOperations bulkOps(BulkMode mode, @Nullable Class<?> entityType, String collectionName); BulkOperations bulkOps(BulkMode mode, @Nullable Class<?> entityType, String collectionName);
/** /**
* Query for a list of objects of type T from the collection used by the entity class. * Query for a list of objects of type T from the collection used by the entity class. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* If your collection does not contain a homogeneous collection of types, this operation will not be an efficient way * If your collection does not contain a homogeneous collection of types, this operation will not be an efficient way
* to map objects since the test for class type is done in the client and not on the server. * to map objects since the test for class type is done in the client and not on the server.
* *
@@ -416,11 +401,9 @@ public interface MongoOperations extends FluentMongoOperations {
<T> List<T> findAll(Class<T> entityClass); <T> List<T> findAll(Class<T> entityClass);
/** /**
* Query for a list of objects of type T from the specified collection. * Query for a list of objects of type T from the specified collection. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* If your collection does not contain a homogeneous collection of types, this operation will not be an efficient way * If your collection does not contain a homogeneous collection of types, this operation will not be an efficient way
* to map objects since the test for class type is done in the client and not on the server. * to map objects since the test for class type is done in the client and not on the server.
* *
@@ -430,43 +413,6 @@ public interface MongoOperations extends FluentMongoOperations {
*/ */
<T> List<T> findAll(Class<T> entityClass, String collectionName); <T> List<T> findAll(Class<T> entityClass, String collectionName);
/**
* Execute a group operation over the entire collection. The group operation entity class should match the 'shape' of
* the returned object that takes int account the initial document structure as well as any finalize functions.
*
* @param inputCollectionName the collection where the group operation will read from
* @param groupBy the conditions under which the group operation will be performed, e.g. keys, initial document,
* reduce function.
* @param entityClass The parametrized type of the returned list
* @return The results of the group operation
* @deprecated since 2.2. The {@code group} command has been removed in MongoDB Server 4.2.0. <br />
* Please use {@link #aggregate(TypedAggregation, String, Class) } with a
* {@link org.springframework.data.mongodb.core.aggregation.GroupOperation} instead.
*/
@Deprecated
<T> GroupByResults<T> group(String inputCollectionName, GroupBy groupBy, Class<T> entityClass);
/**
* Execute a group operation restricting the rows to those which match the provided Criteria. The group operation
* entity class should match the 'shape' of the returned object that takes int account the initial document structure
* as well as any finalize functions.
*
* @param criteria The criteria that restricts the row that are considered for grouping. If not specified all rows are
* considered.
* @param inputCollectionName the collection where the group operation will read from
* @param groupBy the conditions under which the group operation will be performed, e.g. keys, initial document,
* reduce function.
* @param entityClass The parametrized type of the returned list
* @return The results of the group operation
* @deprecated since 2.2. The {@code group} command has been removed in MongoDB Server 4.2.0. <br />
* Please use {@link #aggregate(TypedAggregation, String, Class) } with a
* {@link org.springframework.data.mongodb.core.aggregation.GroupOperation} and
* {@link org.springframework.data.mongodb.core.aggregation.MatchOperation} instead.
*/
@Deprecated
<T> GroupByResults<T> group(@Nullable Criteria criteria, String inputCollectionName, GroupBy groupBy,
Class<T> entityClass);
/** /**
* Execute an aggregation operation. The raw results will be mapped to the given entity class. The name of the * Execute an aggregation operation. The raw results will be mapped to the given entity class. The name of the
* inputCollection is derived from the inputType of the aggregation. * inputCollection is derived from the inputType of the aggregation.
@@ -521,9 +467,9 @@ public interface MongoOperations extends FluentMongoOperations {
/** /**
* Execute an aggregation operation backed by a Mongo DB {@link com.mongodb.client.AggregateIterable}. * Execute an aggregation operation backed by a Mongo DB {@link com.mongodb.client.AggregateIterable}.
* <p> * <p>
* Returns a {@link CloseableIterator} that wraps the a Mongo DB {@link com.mongodb.client.AggregateIterable} that * Returns a {@link Stream} that wraps the Mongo DB {@link com.mongodb.client.AggregateIterable} that needs to be
* needs to be closed. The raw results will be mapped to the given entity class. The name of the inputCollection is * closed. The raw results will be mapped to the given entity class. The name of the inputCollection is derived from
* derived from the inputType of the aggregation. * the inputType of the aggregation.
* <p> * <p>
* Aggregation streaming can't be used with {@link AggregationOptions#isExplain() aggregation explain}. Enabling * Aggregation streaming can't be used with {@link AggregationOptions#isExplain() aggregation explain}. Enabling
* explanation mode will throw an {@link IllegalArgumentException}. * explanation mode will throw an {@link IllegalArgumentException}.
@@ -532,35 +478,37 @@ public interface MongoOperations extends FluentMongoOperations {
* {@literal null}. * {@literal null}.
* @param collectionName The name of the input collection to use for the aggreation. * @param collectionName The name of the input collection to use for the aggreation.
* @param outputType The parametrized type of the returned list, must not be {@literal null}. * @param outputType The parametrized type of the returned list, must not be {@literal null}.
* @return The results of the aggregation operation. * @return the result {@link Stream}, containing mapped objects, needing to be closed once fully processed (e.g.
* through a try-with-resources clause).
* @since 2.0 * @since 2.0
*/ */
<O> CloseableIterator<O> aggregateStream(TypedAggregation<?> aggregation, String collectionName, Class<O> outputType); <O> Stream<O> aggregateStream(TypedAggregation<?> aggregation, String collectionName, Class<O> outputType);
/** /**
* Execute an aggregation operation backed by a Mongo DB {@link com.mongodb.client.AggregateIterable}. * Execute an aggregation operation backed by a Mongo DB {@link com.mongodb.client.AggregateIterable}.
* <br /> * <p>
* Returns a {@link CloseableIterator} that wraps the a Mongo DB {@link com.mongodb.client.AggregateIterable} that * Returns a {@link Stream} that wraps the Mongo DB {@link com.mongodb.client.AggregateIterable} that needs to be
* needs to be closed. The raw results will be mapped to the given entity class and are returned as stream. The name * closed. The raw results will be mapped to the given entity class and are returned as stream. The name of the
* of the inputCollection is derived from the inputType of the aggregation. * inputCollection is derived from the inputType of the aggregation.
* <br /> * <p>
* Aggregation streaming can't be used with {@link AggregationOptions#isExplain() aggregation explain}. Enabling * Aggregation streaming can't be used with {@link AggregationOptions#isExplain() aggregation explain}. Enabling
* explanation mode will throw an {@link IllegalArgumentException}. * explanation mode will throw an {@link IllegalArgumentException}.
* *
* @param aggregation The {@link TypedAggregation} specification holding the aggregation operations, must not be * @param aggregation The {@link TypedAggregation} specification holding the aggregation operations, must not be
* {@literal null}. * {@literal null}.
* @param outputType The parametrized type of the returned list, must not be {@literal null}. * @param outputType The parametrized type of the returned list, must not be {@literal null}.
* @return The results of the aggregation operation. * @return the result {@link Stream}, containing mapped objects, needing to be closed once fully processed (e.g.
* through a try-with-resources clause).
* @since 2.0 * @since 2.0
*/ */
<O> CloseableIterator<O> aggregateStream(TypedAggregation<?> aggregation, Class<O> outputType); <O> Stream<O> aggregateStream(TypedAggregation<?> aggregation, Class<O> outputType);
/** /**
* Execute an aggregation operation backed by a Mongo DB {@link com.mongodb.client.AggregateIterable}. * Execute an aggregation operation backed by a Mongo DB {@link com.mongodb.client.AggregateIterable}.
* <br /> * <p>
* Returns a {@link CloseableIterator} that wraps the a Mongo DB {@link com.mongodb.client.AggregateIterable} that * Returns a {@link Stream} that wraps the Mongo DB {@link com.mongodb.client.AggregateIterable} that needs to be
* needs to be closed. The raw results will be mapped to the given entity class. * closed. The raw results will be mapped to the given entity class.
* <br /> * <p>
* Aggregation streaming can't be used with {@link AggregationOptions#isExplain() aggregation explain}. Enabling * Aggregation streaming can't be used with {@link AggregationOptions#isExplain() aggregation explain}. Enabling
* explanation mode will throw an {@link IllegalArgumentException}. * explanation mode will throw an {@link IllegalArgumentException}.
* *
@@ -569,17 +517,18 @@ public interface MongoOperations extends FluentMongoOperations {
* @param inputType the inputType where the aggregation operation will read from, must not be {@literal null} or * @param inputType the inputType where the aggregation operation will read from, must not be {@literal null} or
* empty. * empty.
* @param outputType The parametrized type of the returned list, must not be {@literal null}. * @param outputType The parametrized type of the returned list, must not be {@literal null}.
* @return The results of the aggregation operation. * @return the result {@link Stream}, containing mapped objects, needing to be closed once fully processed (e.g.
* through a try-with-resources clause).
* @since 2.0 * @since 2.0
*/ */
<O> CloseableIterator<O> aggregateStream(Aggregation aggregation, Class<?> inputType, Class<O> outputType); <O> Stream<O> aggregateStream(Aggregation aggregation, Class<?> inputType, Class<O> outputType);
/** /**
* Execute an aggregation operation backed by a Mongo DB {@link com.mongodb.client.AggregateIterable}. * Execute an aggregation operation backed by a Mongo DB {@link com.mongodb.client.AggregateIterable}.
* <br /> * <p>
* Returns a {@link CloseableIterator} that wraps the a Mongo DB {@link com.mongodb.client.AggregateIterable} that * Returns a {@link Stream} that wraps the Mongo DB {@link com.mongodb.client.AggregateIterable} that needs to be
* needs to be closed. The raw results will be mapped to the given entity class. * closed. The raw results will be mapped to the given entity class.
* <br /> * <p>
* Aggregation streaming can't be used with {@link AggregationOptions#isExplain() aggregation explain}. Enabling * Aggregation streaming can't be used with {@link AggregationOptions#isExplain() aggregation explain}. Enabling
* explanation mode will throw an {@link IllegalArgumentException}. * explanation mode will throw an {@link IllegalArgumentException}.
* *
@@ -588,10 +537,11 @@ public interface MongoOperations extends FluentMongoOperations {
* @param collectionName the collection where the aggregation operation will read from, must not be {@literal null} or * @param collectionName the collection where the aggregation operation will read from, must not be {@literal null} or
* empty. * empty.
* @param outputType The parametrized type of the returned list, must not be {@literal null}. * @param outputType The parametrized type of the returned list, must not be {@literal null}.
* @return The results of the aggregation operation. * @return the result {@link Stream}, containing mapped objects, needing to be closed once fully processed (e.g.
* through a try-with-resources clause).
* @since 2.0 * @since 2.0
*/ */
<O> CloseableIterator<O> aggregateStream(Aggregation aggregation, String collectionName, Class<O> outputType); <O> Stream<O> aggregateStream(Aggregation aggregation, String collectionName, Class<O> outputType);
/** /**
* Execute a map-reduce operation. The map-reduce operation will be formed with an output type of INLINE * Execute a map-reduce operation. The map-reduce operation will be formed with an output type of INLINE
@@ -601,7 +551,9 @@ public interface MongoOperations extends FluentMongoOperations {
* @param reduceFunction The JavaScript reduce function * @param reduceFunction The JavaScript reduce function
* @param entityClass The parametrized type of the returned list. Must not be {@literal null}. * @param entityClass The parametrized type of the returned list. Must not be {@literal null}.
* @return The results of the map reduce operation * @return The results of the map reduce operation
* @deprecated since 3.4 in favor of {@link #aggregate(TypedAggregation, Class)}.
*/ */
@Deprecated
<T> MapReduceResults<T> mapReduce(String inputCollectionName, String mapFunction, String reduceFunction, <T> MapReduceResults<T> mapReduce(String inputCollectionName, String mapFunction, String reduceFunction,
Class<T> entityClass); Class<T> entityClass);
@@ -614,7 +566,9 @@ public interface MongoOperations extends FluentMongoOperations {
* @param mapReduceOptions Options that specify detailed map-reduce behavior. * @param mapReduceOptions Options that specify detailed map-reduce behavior.
* @param entityClass The parametrized type of the returned list. Must not be {@literal null}. * @param entityClass The parametrized type of the returned list. Must not be {@literal null}.
* @return The results of the map reduce operation * @return The results of the map reduce operation
* @deprecated since 3.4 in favor of {@link #aggregate(TypedAggregation, Class)}.
*/ */
@Deprecated
<T> MapReduceResults<T> mapReduce(String inputCollectionName, String mapFunction, String reduceFunction, <T> MapReduceResults<T> mapReduce(String inputCollectionName, String mapFunction, String reduceFunction,
@Nullable MapReduceOptions mapReduceOptions, Class<T> entityClass); @Nullable MapReduceOptions mapReduceOptions, Class<T> entityClass);
@@ -628,7 +582,9 @@ public interface MongoOperations extends FluentMongoOperations {
* @param reduceFunction The JavaScript reduce function * @param reduceFunction The JavaScript reduce function
* @param entityClass The parametrized type of the returned list. Must not be {@literal null}. * @param entityClass The parametrized type of the returned list. Must not be {@literal null}.
* @return The results of the map reduce operation * @return The results of the map reduce operation
* @deprecated since 3.4 in favor of {@link #aggregate(TypedAggregation, Class)}.
*/ */
@Deprecated
<T> MapReduceResults<T> mapReduce(Query query, String inputCollectionName, String mapFunction, String reduceFunction, <T> MapReduceResults<T> mapReduce(Query query, String inputCollectionName, String mapFunction, String reduceFunction,
Class<T> entityClass); Class<T> entityClass);
@@ -642,7 +598,9 @@ public interface MongoOperations extends FluentMongoOperations {
* @param mapReduceOptions Options that specify detailed map-reduce behavior * @param mapReduceOptions Options that specify detailed map-reduce behavior
* @param entityClass The parametrized type of the returned list. Must not be {@literal null}. * @param entityClass The parametrized type of the returned list. Must not be {@literal null}.
* @return The results of the map reduce operation * @return The results of the map reduce operation
* @deprecated since 3.4 in favor of {@link #aggregate(TypedAggregation, Class)}.
*/ */
@Deprecated
<T> MapReduceResults<T> mapReduce(Query query, String inputCollectionName, String mapFunction, String reduceFunction, <T> MapReduceResults<T> mapReduce(Query query, String inputCollectionName, String mapFunction, String reduceFunction,
@Nullable MapReduceOptions mapReduceOptions, Class<T> entityClass); @Nullable MapReduceOptions mapReduceOptions, Class<T> entityClass);
@@ -701,11 +659,9 @@ public interface MongoOperations extends FluentMongoOperations {
/** /**
* Map the results of an ad-hoc query on the collection for the entity class to a single instance of an object of the * Map the results of an ad-hoc query on the collection for the entity class to a single instance of an object of the
* specified type. * specified type. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -719,11 +675,9 @@ public interface MongoOperations extends FluentMongoOperations {
/** /**
* Map the results of an ad-hoc query on the specified collection to a single instance of an object of the specified * Map the results of an ad-hoc query on the specified collection to a single instance of an object of the specified
* type. * type. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -767,11 +721,9 @@ public interface MongoOperations extends FluentMongoOperations {
boolean exists(Query query, @Nullable Class<?> entityClass, String collectionName); boolean exists(Query query, @Nullable Class<?> entityClass, String collectionName);
/** /**
* Map the results of an ad-hoc query on the collection for the entity class to a List of the specified type. * Map the results of an ad-hoc query on the collection for the entity class to a List of the specified type. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -783,11 +735,9 @@ public interface MongoOperations extends FluentMongoOperations {
<T> List<T> find(Query query, Class<T> entityClass); <T> List<T> find(Query query, Class<T> entityClass);
/** /**
* Map the results of an ad-hoc query on the specified collection to a List of the specified type. * Map the results of an ad-hoc query on the specified collection to a List of the specified type. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -1119,10 +1069,8 @@ public interface MongoOperations extends FluentMongoOperations {
/** /**
* Map the results of an ad-hoc query on the collection for the entity type to a single instance of an object of the * Map the results of an ad-hoc query on the collection for the entity type to a single instance of an object of the
* specified type. The first document that matches the query is returned and also removed from the collection in the * specified type. The first document that matches the query is returned and also removed from the collection in the
* database. * database. <br />
* <br /> * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}.
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -1139,8 +1087,7 @@ public interface MongoOperations extends FluentMongoOperations {
* type. The first document that matches the query is returned and also removed from the collection in the database. * type. The first document that matches the query is returned and also removed from the collection in the database.
* <br /> * <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -1159,18 +1106,17 @@ public interface MongoOperations extends FluentMongoOperations {
* <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct * <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct
* influence on the resulting number of documents found as those values are passed on to the server and potentially * influence on the resulting number of documents found as those values are passed on to the server and potentially
* limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to * limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to
* count all matches. * count all matches. <br />
* <br /> * This method may choose to use {@link #estimatedCount(Class)} for empty queries instead of running an
* This method uses an
* {@link com.mongodb.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions) * {@link com.mongodb.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions)
* aggregation execution} even for empty {@link Query queries} which may have an impact on performance, but guarantees * aggregation execution} which may have an impact on performance.
* shard, session and transaction compliance. In case an inaccurate count satisfies the applications needs use
* {@link #estimatedCount(Class)} for empty queries instead.
* *
* @param query the {@link Query} class that specifies the criteria used to find documents. Must not be * @param query the {@link Query} class that specifies the criteria used to find documents. Must not be
* {@literal null}. * {@literal null}.
* @param entityClass class that determines the collection to use. Must not be {@literal null}. * @param entityClass class that determines the collection to use. Must not be {@literal null}.
* @return the count of matching documents. * @return the count of matching documents.
* @see #exactCount(Query, Class)
* @see #estimatedCount(Class)
*/ */
long count(Query query, Class<?> entityClass); long count(Query query, Class<?> entityClass);
@@ -1181,25 +1127,44 @@ public interface MongoOperations extends FluentMongoOperations {
* <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct * <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct
* influence on the resulting number of documents found as those values are passed on to the server and potentially * influence on the resulting number of documents found as those values are passed on to the server and potentially
* limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to * limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to
* count all matches. * count all matches. <br />
* <br /> * This method may choose to use {@link #estimatedCount(Class)} for empty queries instead of running an
* This method uses an
* {@link com.mongodb.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions) * {@link com.mongodb.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions)
* aggregation execution} even for empty {@link Query queries} which may have an impact on performance, but guarantees * aggregation execution} which may have an impact on performance.
* shard, session and transaction compliance. In case an inaccurate count satisfies the applications needs use
* {@link #estimatedCount(String)} for empty queries instead.
* *
* @param query the {@link Query} class that specifies the criteria used to find documents. * @param query the {@link Query} class that specifies the criteria used to find documents.
* @param collectionName must not be {@literal null} or empty. * @param collectionName must not be {@literal null} or empty.
* @return the count of matching documents. * @return the count of matching documents.
* @see #count(Query, Class, String) * @see #count(Query, Class, String)
* @see #exactCount(Query, String)
* @see #estimatedCount(String)
*/ */
long count(Query query, String collectionName); long count(Query query, String collectionName);
/**
* Returns the number of documents for the given {@link Query} by querying the given collection using the given entity
* class to map the given {@link Query}. <br />
* <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct
* influence on the resulting number of documents found as those values are passed on to the server and potentially
* limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to
* count all matches. <br />
* This method may choose to use {@link #estimatedCount(Class)} for empty queries instead of running an
* {@link com.mongodb.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions)
* aggregation execution} which may have an impact on performance.
*
* @param query the {@link Query} class that specifies the criteria used to find documents. Must not be
* {@literal null}.
* @param entityClass the parametrized type. Can be {@literal null}.
* @param collectionName must not be {@literal null} or empty.
* @return the count of matching documents.
* @see #count(Query, Class, String)
* @see #estimatedCount(String)
*/
long count(Query query, @Nullable Class<?> entityClass, String collectionName);
/** /**
* Estimate the number of documents, in the collection {@link #getCollectionName(Class) identified by the given type}, * Estimate the number of documents, in the collection {@link #getCollectionName(Class) identified by the given type},
* based on collection statistics. * based on collection statistics. <br />
* <br />
* Please make sure to read the MongoDB reference documentation about limitations on eg. sharded cluster or inside * Please make sure to read the MongoDB reference documentation about limitations on eg. sharded cluster or inside
* transactions. * transactions.
* *
@@ -1214,8 +1179,7 @@ public interface MongoOperations extends FluentMongoOperations {
} }
/** /**
* Estimate the number of documents in the given collection based on collection statistics. * Estimate the number of documents in the given collection based on collection statistics. <br />
* <br />
* Please make sure to read the MongoDB reference documentation about limitations on eg. sharded cluster or inside * Please make sure to read the MongoDB reference documentation about limitations on eg. sharded cluster or inside
* transactions. * transactions.
* *
@@ -1225,14 +1189,60 @@ public interface MongoOperations extends FluentMongoOperations {
*/ */
long estimatedCount(String collectionName); long estimatedCount(String collectionName);
/**
* Returns the number of documents for the given {@link Query} by querying the collection of the given entity class.
* <br />
* <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct
* influence on the resulting number of documents found as those values are passed on to the server and potentially
* limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to
* count all matches. <br />
* This method uses an
* {@link com.mongodb.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions)
* aggregation execution} even for empty {@link Query queries} which may have an impact on performance, but guarantees
* shard, session and transaction compliance. In case an inaccurate count satisfies the applications needs use
* {@link #estimatedCount(Class)} for empty queries instead.
*
* @param query the {@link Query} class that specifies the criteria used to find documents. Must not be
* {@literal null}.
* @param entityClass class that determines the collection to use. Must not be {@literal null}.
* @return the count of matching documents.
* @since 3.4
*/
default long exactCount(Query query, Class<?> entityClass) {
return exactCount(query, entityClass, getCollectionName(entityClass));
}
/**
* Returns the number of documents for the given {@link Query} querying the given collection. The given {@link Query}
* must solely consist of document field references as we lack type information to map potential property references
* onto document fields. Use {@link #count(Query, Class, String)} to get full type specific support. <br />
* <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct
* influence on the resulting number of documents found as those values are passed on to the server and potentially
* limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to
* count all matches. <br />
* This method uses an
* {@link com.mongodb.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions)
* aggregation execution} even for empty {@link Query queries} which may have an impact on performance, but guarantees
* shard, session and transaction compliance. In case an inaccurate count satisfies the applications needs use
* {@link #estimatedCount(String)} for empty queries instead.
*
* @param query the {@link Query} class that specifies the criteria used to find documents.
* @param collectionName must not be {@literal null} or empty.
* @return the count of matching documents.
* @see #count(Query, Class, String)
* @since 3.4
*/
default long exactCount(Query query, String collectionName) {
return exactCount(query, null, collectionName);
}
/** /**
* Returns the number of documents for the given {@link Query} by querying the given collection using the given entity * Returns the number of documents for the given {@link Query} by querying the given collection using the given entity
* class to map the given {@link Query}. <br /> * class to map the given {@link Query}. <br />
* <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct * <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct
* influence on the resulting number of documents found as those values are passed on to the server and potentially * influence on the resulting number of documents found as those values are passed on to the server and potentially
* limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to * limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to
* count all matches. * count all matches. <br />
* <br />
* This method uses an * This method uses an
* {@link com.mongodb.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions) * {@link com.mongodb.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions)
* aggregation execution} even for empty {@link Query queries} which may have an impact on performance, but guarantees * aggregation execution} even for empty {@link Query queries} which may have an impact on performance, but guarantees
@@ -1244,20 +1254,18 @@ public interface MongoOperations extends FluentMongoOperations {
* @param entityClass the parametrized type. Can be {@literal null}. * @param entityClass the parametrized type. Can be {@literal null}.
* @param collectionName must not be {@literal null} or empty. * @param collectionName must not be {@literal null} or empty.
* @return the count of matching documents. * @return the count of matching documents.
* @since 3.4
*/ */
long count(Query query, @Nullable Class<?> entityClass, String collectionName); long exactCount(Query query, @Nullable Class<?> entityClass, String collectionName);
/** /**
* Insert the object into the collection for the entity type of the object to save. * Insert the object into the collection for the entity type of the object to save. <br />
* <br /> * The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. <br />
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}.
* <br />
* If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a * If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your * String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See * property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See
* <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation" > Spring's * <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation" > Spring's
* Type Conversion"</a> for more details. * Type Conversion"</a> for more details. <br />
* <br />
* Insert is used to initially store the object into the database. To update an existing object use the save method. * Insert is used to initially store the object into the database. To update an existing object use the save method.
* <br /> * <br />
* The {@code objectToSave} must not be collection-like. * The {@code objectToSave} must not be collection-like.
@@ -1269,11 +1277,9 @@ public interface MongoOperations extends FluentMongoOperations {
<T> T insert(T objectToSave); <T> T insert(T objectToSave);
/** /**
* Insert the object into the specified collection. * Insert the object into the specified collection. <br />
* <br />
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* Insert is used to initially store the object into the database. To update an existing object use the save method. * Insert is used to initially store the object into the database. To update an existing object use the save method.
* <br /> * <br />
* The {@code objectToSave} must not be collection-like. * The {@code objectToSave} must not be collection-like.
@@ -1314,17 +1320,14 @@ public interface MongoOperations extends FluentMongoOperations {
/** /**
* Save the object to the collection for the entity type of the object to save. This will perform an insert if the * Save the object to the collection for the entity type of the object to save. This will perform an insert if the
* object is not already present, that is an 'upsert'. * object is not already present, that is an 'upsert'. <br />
* <br />
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a * If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your * String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See * property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See
* <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation" > Spring's * <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation" > Spring's
* Type Conversion"</a> for more details. * Type Conversion"</a> for more details. <br />
* <br />
* The {@code objectToSave} must not be collection-like. * The {@code objectToSave} must not be collection-like.
* *
* @param objectToSave the object to store in the collection. Must not be {@literal null}. * @param objectToSave the object to store in the collection. Must not be {@literal null}.
@@ -1335,16 +1338,14 @@ public interface MongoOperations extends FluentMongoOperations {
/** /**
* Save the object to the specified collection. This will perform an insert if the object is not already present, that * Save the object to the specified collection. This will perform an insert if the object is not already present, that
* is an 'upsert'. * is an 'upsert'. <br />
* <br />
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a * If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your * String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. * property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See
* See <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation">Spring's Type Conversion</a> for more details. * <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation">Spring's Type
* <br /> * Conversion</a> for more details. <br />
* The {@code objectToSave} must not be collection-like. * The {@code objectToSave} must not be collection-like.
* *
* @param objectToSave the object to store in the collection. Must not be {@literal null}. * @param objectToSave the object to store in the collection. Must not be {@literal null}.

View File

@@ -16,18 +16,19 @@
package org.springframework.data.mongodb.core; package org.springframework.data.mongodb.core;
import org.bson.Document; import org.bson.Document;
import org.springframework.data.mapping.SimplePropertyHandler;
import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
import org.springframework.data.projection.ProjectionFactory; import org.springframework.data.mongodb.core.mapping.PersistentPropertyTranslator;
import org.springframework.data.projection.ProjectionInformation; import org.springframework.data.projection.EntityProjection;
import org.springframework.util.ClassUtils; import org.springframework.data.util.Predicates;
/** /**
* Common operations performed on properties of an entity like extracting fields information for projection creation. * Common operations performed on properties of an entity like extracting fields information for projection creation.
* *
* @author Christoph Strobl * @author Christoph Strobl
* @author Mark Paluch
* @since 2.1 * @since 2.1
*/ */
class PropertyOperations { class PropertyOperations {
@@ -40,37 +41,37 @@ class PropertyOperations {
/** /**
* For cases where {@code fields} is {@link Document#isEmpty() empty} include only fields that are required for * For cases where {@code fields} is {@link Document#isEmpty() empty} include only fields that are required for
* creating the projection (target) type if the {@code targetType} is a {@literal DTO projection} or a * creating the projection (target) type if the {@code EntityProjection} is a {@literal DTO projection} or a
* {@literal closed interface projection}. * {@literal closed interface projection}.
* *
* @param projectionFactory must not be {@literal null}. * @param projection must not be {@literal null}.
* @param fields must not be {@literal null}. * @param fields must not be {@literal null}.
* @param domainType must not be {@literal null}.
* @param targetType must not be {@literal null}.
* @return {@link Document} with fields to be included. * @return {@link Document} with fields to be included.
*/ */
Document computeFieldsForProjection(ProjectionFactory projectionFactory, Document fields, Class<?> domainType, Document computeMappedFieldsForProjection(EntityProjection<?, ?> projection,
Class<?> targetType) { Document fields) {
if (!fields.isEmpty() || ClassUtils.isAssignable(domainType, targetType)) { if (!projection.isClosedProjection()) {
return fields; return fields;
} }
Document projectedFields = new Document(); Document projectedFields = new Document();
if (targetType.isInterface()) { if (projection.getMappedType().getType().isInterface()) {
projection.forEach(it -> {
ProjectionInformation projectionInformation = projectionFactory.getProjectionInformation(targetType); projectedFields.put(it.getPropertyPath().getSegment(), 1);
});
if (projectionInformation.isClosed()) {
projectionInformation.getInputProperties().forEach(it -> projectedFields.append(it.getName(), 1));
}
} else { } else {
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(targetType); // DTO projections use merged metadata between domain type and result type
if (entity != null) { PersistentPropertyTranslator translator = PersistentPropertyTranslator.create(
entity.doWithProperties( mappingContext.getRequiredPersistentEntity(projection.getDomainType()),
(SimplePropertyHandler) persistentProperty -> projectedFields.append(persistentProperty.getName(), 1)); Predicates.negate(MongoPersistentProperty::hasExplicitFieldName));
MongoPersistentEntity<?> persistentEntity = mappingContext
.getRequiredPersistentEntity(projection.getMappedType());
for (MongoPersistentProperty property : persistentEntity) {
projectedFields.put(translator.translate(property).getFieldName(), 1);
} }
} }

View File

@@ -28,6 +28,7 @@ import java.util.stream.Collectors;
import org.bson.BsonValue; import org.bson.BsonValue;
import org.bson.Document; import org.bson.Document;
import org.bson.codecs.Codec; import org.bson.codecs.Codec;
import org.springframework.data.mapping.PropertyPath; import org.springframework.data.mapping.PropertyPath;
import org.springframework.data.mapping.PropertyReferenceException; import org.springframework.data.mapping.PropertyReferenceException;
import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.context.MappingContext;
@@ -54,11 +55,10 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.UpdateDefinition; import org.springframework.data.mongodb.core.query.UpdateDefinition;
import org.springframework.data.mongodb.core.query.UpdateDefinition.ArrayFilter; import org.springframework.data.mongodb.core.query.UpdateDefinition.ArrayFilter;
import org.springframework.data.mongodb.util.BsonUtils; import org.springframework.data.mongodb.util.BsonUtils;
import org.springframework.data.projection.ProjectionFactory; import org.springframework.data.projection.EntityProjection;
import org.springframework.data.util.Lazy; import org.springframework.data.util.Lazy;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import com.mongodb.client.model.CountOptions; import com.mongodb.client.model.CountOptions;
@@ -288,45 +288,59 @@ class QueryOperations {
return queryMapper.getMappedObject(getQueryObject(), entity); return queryMapper.getMappedObject(getQueryObject(), entity);
} }
Document getMappedFields(@Nullable MongoPersistentEntity<?> entity, Class<?> targetType, Document getMappedFields(@Nullable MongoPersistentEntity<?> entity,
ProjectionFactory projectionFactory) { EntityProjection<?, ?> projection) {
Document fields = new Document(); Document fields = evaluateFields(entity);
for (Entry<String, Object> entry : query.getFieldsObject().entrySet()) { if (entity == null) {
return fields;
}
Document mappedFields;
if (!fields.isEmpty()) {
mappedFields = queryMapper.getMappedFields(fields, entity);
} else {
mappedFields = propertyOperations.computeMappedFieldsForProjection(projection, fields);
mappedFields = queryMapper.addMetaAttributes(mappedFields, entity);
}
if (entity.hasTextScoreProperty() && mappedFields.containsKey(entity.getTextScoreProperty().getFieldName())
&& !query.getQueryObject().containsKey("$text")) {
mappedFields.remove(entity.getTextScoreProperty().getFieldName());
}
if (mappedFields.isEmpty()) {
return BsonUtils.EMPTY_DOCUMENT;
}
return mappedFields;
}
private Document evaluateFields(@Nullable MongoPersistentEntity<?> entity) {
Document fields = query.getFieldsObject();
if (fields.isEmpty()) {
return BsonUtils.EMPTY_DOCUMENT;
}
Document evaluated = new Document();
for (Entry<String, Object> entry : fields.entrySet()) {
if (entry.getValue() instanceof MongoExpression) { if (entry.getValue() instanceof MongoExpression) {
AggregationOperationContext ctx = entity == null ? Aggregation.DEFAULT_CONTEXT AggregationOperationContext ctx = entity == null ? Aggregation.DEFAULT_CONTEXT
: new RelaxedTypeBasedAggregationOperationContext(entity.getType(), mappingContext, queryMapper); : new RelaxedTypeBasedAggregationOperationContext(entity.getType(), mappingContext, queryMapper);
fields.put(entry.getKey(), AggregationExpression.from((MongoExpression) entry.getValue()).toDocument(ctx)); evaluated.put(entry.getKey(), AggregationExpression.from((MongoExpression) entry.getValue()).toDocument(ctx));
} else { } else {
fields.put(entry.getKey(), entry.getValue()); evaluated.put(entry.getKey(), entry.getValue());
} }
} }
Document mappedFields = fields; return evaluated;
if (entity == null) {
return mappedFields;
}
Document projectedFields = propertyOperations.computeFieldsForProjection(projectionFactory, fields,
entity.getType(), targetType);
if (ObjectUtils.nullSafeEquals(fields, projectedFields)) {
mappedFields = queryMapper.getMappedFields(projectedFields, entity);
} else {
mappedFields = queryMapper.getMappedFields(projectedFields,
mappingContext.getRequiredPersistentEntity(targetType));
}
if (entity.hasTextScoreProperty() && !query.getQueryObject().containsKey("$text")) {
mappedFields.remove(entity.getTextScoreProperty().getFieldName());
}
return mappedFields;
} }
/** /**
@@ -388,8 +402,8 @@ class QueryOperations {
} }
@Override @Override
Document getMappedFields(@Nullable MongoPersistentEntity<?> entity, Class<?> targetType, Document getMappedFields(@Nullable MongoPersistentEntity<?> entity,
ProjectionFactory projectionFactory) { EntityProjection<?, ?> projection) {
return getMappedFields(entity); return getMappedFields(entity);
} }

View File

@@ -46,10 +46,6 @@ class ReactiveAggregationOperationSupport implements ReactiveAggregationOperatio
this.template = template; this.template = template;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveAggregationOperation#aggregateAndReturn(java.lang.Class)
*/
@Override @Override
public <T> ReactiveAggregation<T> aggregateAndReturn(Class<T> domainType) { public <T> ReactiveAggregation<T> aggregateAndReturn(Class<T> domainType) {
@@ -75,10 +71,6 @@ class ReactiveAggregationOperationSupport implements ReactiveAggregationOperatio
this.collection = collection; this.collection = collection;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveAggregationOperation.AggregationOperationWithCollection#inCollection(java.lang.String)
*/
@Override @Override
public AggregationOperationWithAggregation<T> inCollection(String collection) { public AggregationOperationWithAggregation<T> inCollection(String collection) {
@@ -87,10 +79,6 @@ class ReactiveAggregationOperationSupport implements ReactiveAggregationOperatio
return new ReactiveAggregationSupport<>(template, domainType, aggregation, collection); return new ReactiveAggregationSupport<>(template, domainType, aggregation, collection);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveAggregationOperation.AggregationOperationWithAggregation#by(org.springframework.data.mongodb.core.Aggregation)
*/
@Override @Override
public TerminatingAggregationOperation<T> by(Aggregation aggregation) { public TerminatingAggregationOperation<T> by(Aggregation aggregation) {
@@ -99,10 +87,6 @@ class ReactiveAggregationOperationSupport implements ReactiveAggregationOperatio
return new ReactiveAggregationSupport<>(template, domainType, aggregation, collection); return new ReactiveAggregationSupport<>(template, domainType, aggregation, collection);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveAggregationOperation.TerminatingAggregationOperation#all()
*/
@Override @Override
public Flux<T> all() { public Flux<T> all() {
return template.aggregate(aggregation, getCollectionName(aggregation), domainType); return template.aggregate(aggregation, getCollectionName(aggregation), domainType);

View File

@@ -46,10 +46,6 @@ class ReactiveChangeStreamOperationSupport implements ReactiveChangeStreamOperat
this.template = template; this.template = template;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveChangeStreamOperation#changeStream(java.lang.Class)
*/
@Override @Override
public <T> ReactiveChangeStream<T> changeStream(Class<T> domainType) { public <T> ReactiveChangeStream<T> changeStream(Class<T> domainType) {
@@ -76,10 +72,6 @@ class ReactiveChangeStreamOperationSupport implements ReactiveChangeStreamOperat
this.options = options; this.options = options;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveChangeStreamOperation.ChangeStreamWithCollection#watchCollection(java.lang.String)
*/
@Override @Override
public ChangeStreamWithFilterAndProjection<T> watchCollection(String collection) { public ChangeStreamWithFilterAndProjection<T> watchCollection(String collection) {
@@ -88,10 +80,6 @@ class ReactiveChangeStreamOperationSupport implements ReactiveChangeStreamOperat
return new ReactiveChangeStreamSupport<>(template, domainType, returnType, collection, options); return new ReactiveChangeStreamSupport<>(template, domainType, returnType, collection, options);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveChangeStreamOperation.ChangeStreamWithCollection#watchCollection(java.lang.Class)
*/
@Override @Override
public ChangeStreamWithFilterAndProjection<T> watchCollection(Class<?> entityClass) { public ChangeStreamWithFilterAndProjection<T> watchCollection(Class<?> entityClass) {
@@ -100,10 +88,6 @@ class ReactiveChangeStreamOperationSupport implements ReactiveChangeStreamOperat
return watchCollection(template.getCollectionName(entityClass)); return watchCollection(template.getCollectionName(entityClass));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveChangeStreamOperation.ResumingChangeStream#resumeAt(java.lang.Object)
*/
@Override @Override
public TerminatingChangeStream<T> resumeAt(Object token) { public TerminatingChangeStream<T> resumeAt(Object token) {
@@ -117,10 +101,6 @@ class ReactiveChangeStreamOperationSupport implements ReactiveChangeStreamOperat
}); });
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveChangeStreamOperation.ResumingChangeStream#resumeAfter(java.lang.Object)
*/
@Override @Override
public TerminatingChangeStream<T> resumeAfter(Object token) { public TerminatingChangeStream<T> resumeAfter(Object token) {
@@ -129,10 +109,6 @@ class ReactiveChangeStreamOperationSupport implements ReactiveChangeStreamOperat
return withOptions(builder -> builder.resumeAfter((BsonValue) token)); return withOptions(builder -> builder.resumeAfter((BsonValue) token));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveChangeStreamOperation.ResumingChangeStream#startAfter(java.lang.Object)
*/
@Override @Override
public TerminatingChangeStream<T> startAfter(Object token) { public TerminatingChangeStream<T> startAfter(Object token) {
@@ -141,10 +117,6 @@ class ReactiveChangeStreamOperationSupport implements ReactiveChangeStreamOperat
return withOptions(builder -> builder.startAfter((BsonValue) token)); return withOptions(builder -> builder.startAfter((BsonValue) token));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveChangeStreamOperation.ChangeStreamWithOptions#withOptions(java.util.function.Consumer)
*/
@Override @Override
public ReactiveChangeStreamSupport<T> withOptions(Consumer<ChangeStreamOptionsBuilder> optionsConsumer) { public ReactiveChangeStreamSupport<T> withOptions(Consumer<ChangeStreamOptionsBuilder> optionsConsumer) {
@@ -154,10 +126,6 @@ class ReactiveChangeStreamOperationSupport implements ReactiveChangeStreamOperat
return new ReactiveChangeStreamSupport<>(template, domainType, returnType, collection, builder.build()); return new ReactiveChangeStreamSupport<>(template, domainType, returnType, collection, builder.build());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveChangeStreamOperation.ChangeStreamWithProjection#as(java.lang.Class)
*/
@Override @Override
public <R> ChangeStreamWithFilterAndProjection<R> as(Class<R> resultType) { public <R> ChangeStreamWithFilterAndProjection<R> as(Class<R> resultType) {
@@ -166,19 +134,11 @@ class ReactiveChangeStreamOperationSupport implements ReactiveChangeStreamOperat
return new ReactiveChangeStreamSupport<>(template, domainType, resultType, collection, options); return new ReactiveChangeStreamSupport<>(template, domainType, resultType, collection, options);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveChangeStreamOperation.ChangeStreamWithFilter#filter(org.springframework.data.mongodb.core.aggregation.Aggregation)
*/
@Override @Override
public ChangeStreamWithFilterAndProjection<T> filter(Aggregation filter) { public ChangeStreamWithFilterAndProjection<T> filter(Aggregation filter) {
return withOptions(builder -> builder.filter(filter)); return withOptions(builder -> builder.filter(filter));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveChangeStreamOperation.ChangeStreamWithFilter#filter(org.springframework.data.mongodb.core.query.CriteriaDefinition)
*/
@Override @Override
public ChangeStreamWithFilterAndProjection<T> filter(CriteriaDefinition by) { public ChangeStreamWithFilterAndProjection<T> filter(CriteriaDefinition by) {
@@ -188,10 +148,6 @@ class ReactiveChangeStreamOperationSupport implements ReactiveChangeStreamOperat
return filter(aggregation); return filter(aggregation);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveChangeStreamOperation.TerminatingChangeStream#listen()
*/
@Override @Override
public Flux<ChangeStreamEvent<T>> listen() { public Flux<ChangeStreamEvent<T>> listen() {
return template.changeStream(collection, options != null ? options : ChangeStreamOptions.empty(), returnType); return template.changeStream(collection, options != null ? options : ChangeStreamOptions.empty(), returnType);

View File

@@ -44,10 +44,6 @@ class ReactiveFindOperationSupport implements ReactiveFindOperation {
this.template = template; this.template = template;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation#query(java.lang.Class)
*/
@Override @Override
public <T> ReactiveFind<T> query(Class<T> domainType) { public <T> ReactiveFind<T> query(Class<T> domainType) {
@@ -81,10 +77,6 @@ class ReactiveFindOperationSupport implements ReactiveFindOperation {
this.query = query; this.query = query;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.FindWithCollection#inCollection(java.lang.String)
*/
@Override @Override
public FindWithProjection<T> inCollection(String collection) { public FindWithProjection<T> inCollection(String collection) {
@@ -93,10 +85,6 @@ class ReactiveFindOperationSupport implements ReactiveFindOperation {
return new ReactiveFindSupport<>(template, domainType, returnType, collection, query); return new ReactiveFindSupport<>(template, domainType, returnType, collection, query);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.FindWithProjection#as(java.lang.Class)
*/
@Override @Override
public <T1> FindWithQuery<T1> as(Class<T1> returnType) { public <T1> FindWithQuery<T1> as(Class<T1> returnType) {
@@ -105,10 +93,6 @@ class ReactiveFindOperationSupport implements ReactiveFindOperation {
return new ReactiveFindSupport<>(template, domainType, returnType, collection, query); return new ReactiveFindSupport<>(template, domainType, returnType, collection, query);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.FindWithQuery#matching(org.springframework.data.mongodb.core.query.Query)
*/
@Override @Override
public TerminatingFind<T> matching(Query query) { public TerminatingFind<T> matching(Query query) {
@@ -117,10 +101,6 @@ class ReactiveFindOperationSupport implements ReactiveFindOperation {
return new ReactiveFindSupport<>(template, domainType, returnType, collection, query); return new ReactiveFindSupport<>(template, domainType, returnType, collection, query);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.TerminatingFind#first()
*/
@Override @Override
public Mono<T> first() { public Mono<T> first() {
@@ -130,10 +110,6 @@ class ReactiveFindOperationSupport implements ReactiveFindOperation {
return result.next(); return result.next();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.TerminatingFind#one()
*/
@Override @Override
public Mono<T> one() { public Mono<T> one() {
@@ -155,55 +131,31 @@ class ReactiveFindOperationSupport implements ReactiveFindOperation {
}); });
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.TerminatingFind#all()
*/
@Override @Override
public Flux<T> all() { public Flux<T> all() {
return doFind(null); return doFind(null);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.TerminatingFind#tail()
*/
@Override @Override
public Flux<T> tail() { public Flux<T> tail() {
return doFind(template.new TailingQueryFindPublisherPreparer(query, domainType)); return doFind(template.new TailingQueryFindPublisherPreparer(query, domainType));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.FindWithQuery#near(org.springframework.data.mongodb.core.query.NearQuery)
*/
@Override @Override
public TerminatingFindNear<T> near(NearQuery nearQuery) { public TerminatingFindNear<T> near(NearQuery nearQuery) {
return () -> template.geoNear(nearQuery, domainType, getCollectionName(), returnType); return () -> template.geoNear(nearQuery, domainType, getCollectionName(), returnType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.TerminatingFind#count()
*/
@Override @Override
public Mono<Long> count() { public Mono<Long> count() {
return template.count(query, domainType, getCollectionName()); return template.count(query, domainType, getCollectionName());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.TerminatingFind#exists()
*/
@Override @Override
public Mono<Boolean> exists() { public Mono<Boolean> exists() {
return template.exists(query, domainType, getCollectionName()); return template.exists(query, domainType, getCollectionName());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.FindDistinct#distinct(java.lang.String)
*/
@Override @Override
public TerminatingDistinct<Object> distinct(String field) { public TerminatingDistinct<Object> distinct(String field) {
@@ -255,10 +207,6 @@ class ReactiveFindOperationSupport implements ReactiveFindOperation {
this.field = field; this.field = field;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.DistinctWithProjection#as(java.lang.Class)
*/
@Override @Override
public <R> TerminatingDistinct<R> as(Class<R> resultType) { public <R> TerminatingDistinct<R> as(Class<R> resultType) {
@@ -267,10 +215,6 @@ class ReactiveFindOperationSupport implements ReactiveFindOperation {
return new DistinctOperationSupport<>((ReactiveFindSupport) delegate.as(resultType), field); return new DistinctOperationSupport<>((ReactiveFindSupport) delegate.as(resultType), field);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveFindOperation.DistinctWithQuery#matching(org.springframework.data.mongodb.core.query.Query)
*/
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public TerminatingDistinct<T> matching(Query query) { public TerminatingDistinct<T> matching(Query query) {
@@ -280,10 +224,6 @@ class ReactiveFindOperationSupport implements ReactiveFindOperation {
return new DistinctOperationSupport<>((ReactiveFindSupport<T>) delegate.matching(query), field); return new DistinctOperationSupport<>((ReactiveFindSupport<T>) delegate.matching(query), field);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core..ReactiveFindOperation.TerminatingDistinct#all()
*/
@Override @Override
public Flux<T> all() { public Flux<T> all() {
return delegate.doFindDistinct(field); return delegate.doFindDistinct(field);

View File

@@ -38,10 +38,6 @@ class ReactiveInsertOperationSupport implements ReactiveInsertOperation {
this.template = template; this.template = template;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveInsertOperation#insert(java.lang.Class)
*/
@Override @Override
public <T> ReactiveInsert<T> insert(Class<T> domainType) { public <T> ReactiveInsert<T> insert(Class<T> domainType) {
@@ -63,10 +59,6 @@ class ReactiveInsertOperationSupport implements ReactiveInsertOperation {
this.collection = collection; this.collection = collection;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveInsertOperation.TerminatingInsert#one(java.lang.Object)
*/
@Override @Override
public Mono<T> one(T object) { public Mono<T> one(T object) {
@@ -75,10 +67,6 @@ class ReactiveInsertOperationSupport implements ReactiveInsertOperation {
return template.insert(object, getCollectionName()); return template.insert(object, getCollectionName());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveInsertOperation.TerminatingInsert#all(java.util.Collection)
*/
@Override @Override
public Flux<T> all(Collection<? extends T> objects) { public Flux<T> all(Collection<? extends T> objects) {
@@ -87,10 +75,6 @@ class ReactiveInsertOperationSupport implements ReactiveInsertOperation {
return template.insert(objects, getCollectionName()); return template.insert(objects, getCollectionName());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveInsertOperation.InsertWithCollection#inCollection(java.lang.String)
*/
@Override @Override
public ReactiveInsert<T> inCollection(String collection) { public ReactiveInsert<T> inCollection(String collection) {

View File

@@ -1,31 +0,0 @@
/*
* Copyright 2016-2022 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.mongodb.core;
import com.mongodb.MongoClientSettings;
/**
* A factory bean for construction of a {@link MongoClientSettings} instance to be used with the async MongoDB driver.
*
* @author Mark Paluch
* @author Christoph Strobl
* @since 2.0
* @deprecated since 3.0 - Use {@link MongoClientSettingsFactoryBean} instead.
*/
@Deprecated
public class ReactiveMongoClientSettingsFactoryBean extends MongoClientSettingsFactoryBean {
}

View File

@@ -42,7 +42,6 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update; import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.mongodb.core.query.UpdateDefinition; import org.springframework.data.mongodb.core.query.UpdateDefinition;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.transaction.reactive.TransactionalOperator;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
@@ -58,8 +57,7 @@ import com.mongodb.reactivestreams.client.MongoCollection;
* <p> * <p>
* Implemented by {@link ReactiveMongoTemplate}. Not often used but a useful option for extensibility and testability * Implemented by {@link ReactiveMongoTemplate}. Not often used but a useful option for extensibility and testability
* (as it can be easily mocked, stubbed, or be the target of a JDK proxy). Command execution using * (as it can be easily mocked, stubbed, or be the target of a JDK proxy). Command execution using
* {@link ReactiveMongoOperations} is deferred until subscriber subscribes to the {@link Publisher}. * {@link ReactiveMongoOperations} is deferred until subscriber subscribes to the {@link Publisher}. <br />
* <br />
* <strong>NOTE:</strong> Some operations cannot be executed within a MongoDB transaction. Please refer to the MongoDB * <strong>NOTE:</strong> Some operations cannot be executed within a MongoDB transaction. Please refer to the MongoDB
* specific documentation to learn more about <a href="https://docs.mongodb.com/manual/core/transactions/">Multi * specific documentation to learn more about <a href="https://docs.mongodb.com/manual/core/transactions/">Multi
* Document Transactions</a>. * Document Transactions</a>.
@@ -91,7 +89,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
ReactiveIndexOperations indexOps(Class<?> entityClass); ReactiveIndexOperations indexOps(Class<?> entityClass);
/** /**
* Execute the a MongoDB command expressed as a JSON string. This will call the method JSON.parse that is part of the * Execute a MongoDB command expressed as a JSON string. This will call the method JSON.parse that is part of the
* MongoDB driver to convert the JSON string to a Document. Any errors that result from executing this command will be * MongoDB driver to convert the JSON string to a Document. Any errors that result from executing this command will be
* converted into Spring's DAO exception hierarchy. * converted into Spring's DAO exception hierarchy.
* *
@@ -120,8 +118,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
Mono<Document> executeCommand(Document command, @Nullable ReadPreference readPreference); Mono<Document> executeCommand(Document command, @Nullable ReadPreference readPreference);
/** /**
* Executes a {@link ReactiveDatabaseCallback} translating any exceptions as necessary. * Executes a {@link ReactiveDatabaseCallback} translating any exceptions as necessary. <br />
* <br />
* Allows for returning a result object, that is a domain object or a collection of domain objects. * Allows for returning a result object, that is a domain object or a collection of domain objects.
* *
* @param action callback object that specifies the MongoDB actions to perform on the passed in DB instance. Must not * @param action callback object that specifies the MongoDB actions to perform on the passed in DB instance. Must not
@@ -132,8 +129,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
<T> Flux<T> execute(ReactiveDatabaseCallback<T> action); <T> Flux<T> execute(ReactiveDatabaseCallback<T> action);
/** /**
* Executes the given {@link ReactiveCollectionCallback} on the entity collection of the specified class. * Executes the given {@link ReactiveCollectionCallback} on the entity collection of the specified class. <br />
* <br />
* Allows for returning a result object, that is a domain object or a collection of domain objects. * Allows for returning a result object, that is a domain object or a collection of domain objects.
* *
* @param entityClass class that determines the collection to use. Must not be {@literal null}. * @param entityClass class that determines the collection to use. Must not be {@literal null}.
@@ -144,8 +140,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
<T> Flux<T> execute(Class<?> entityClass, ReactiveCollectionCallback<T> action); <T> Flux<T> execute(Class<?> entityClass, ReactiveCollectionCallback<T> action);
/** /**
* Executes the given {@link ReactiveCollectionCallback} on the collection of the given name. * Executes the given {@link ReactiveCollectionCallback} on the collection of the given name. <br />
* <br />
* Allows for returning a result object, that is a domain object or a collection of domain objects. * Allows for returning a result object, that is a domain object or a collection of domain objects.
* *
* @param collectionName the name of the collection that specifies which {@link MongoCollection} instance will be * @param collectionName the name of the collection that specifies which {@link MongoCollection} instance will be
@@ -158,8 +153,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
/** /**
* Obtain a {@link ClientSession session} bound instance of {@link SessionScoped} binding the {@link ClientSession} * Obtain a {@link ClientSession session} bound instance of {@link SessionScoped} binding the {@link ClientSession}
* provided by the given {@link Supplier} to each and every command issued against MongoDB. * provided by the given {@link Supplier} to each and every command issued against MongoDB. <br />
* <br />
* <strong>Note:</strong> It is up to the caller to manage the {@link ClientSession} lifecycle. Use * <strong>Note:</strong> It is up to the caller to manage the {@link ClientSession} lifecycle. Use
* {@link ReactiveSessionScoped#execute(ReactiveSessionCallback, Consumer)} to provide a hook for processing the * {@link ReactiveSessionScoped#execute(ReactiveSessionCallback, Consumer)} to provide a hook for processing the
* {@link ClientSession} when done. * {@link ClientSession} when done.
@@ -177,8 +171,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
/** /**
* Obtain a {@link ClientSession session} bound instance of {@link SessionScoped} binding a new {@link ClientSession} * Obtain a {@link ClientSession session} bound instance of {@link SessionScoped} binding a new {@link ClientSession}
* with given {@literal sessionOptions} to each and every command issued against MongoDB. * with given {@literal sessionOptions} to each and every command issued against MongoDB. <br />
* <br />
* <strong>Note:</strong> It is up to the caller to manage the {@link ClientSession} lifecycle. Use * <strong>Note:</strong> It is up to the caller to manage the {@link ClientSession} lifecycle. Use
* {@link ReactiveSessionScoped#execute(ReactiveSessionCallback, Consumer)} to provide a hook for processing the * {@link ReactiveSessionScoped#execute(ReactiveSessionCallback, Consumer)} to provide a hook for processing the
* {@link ClientSession} when done. * {@link ClientSession} when done.
@@ -204,48 +197,14 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
ReactiveSessionScoped withSession(Publisher<ClientSession> sessionProvider); ReactiveSessionScoped withSession(Publisher<ClientSession> sessionProvider);
/** /**
* Obtain a {@link ClientSession} bound instance of {@link ReactiveMongoOperations}. * Obtain a {@link ClientSession} bound instance of {@link ReactiveMongoOperations}. <br />
* <br />
* <strong>Note:</strong> It is up to the caller to manage the {@link ClientSession} lifecycle. * <strong>Note:</strong> It is up to the caller to manage the {@link ClientSession} lifecycle.
* *
* @param session must not be {@literal null}.
* @return {@link ClientSession} bound instance of {@link ReactiveMongoOperations}. * @return {@link ClientSession} bound instance of {@link ReactiveMongoOperations}.
* @since 2.1 * @since 2.1
*/ */
ReactiveMongoOperations withSession(ClientSession session); ReactiveMongoOperations withSession(ClientSession session);
/**
* Initiate a new {@link ClientSession} and obtain a {@link ClientSession session} bound instance of
* {@link ReactiveSessionScoped}. Starts the transaction and adds the {@link ClientSession} to each and every command
* issued against MongoDB.
* <br />
* Each {@link ReactiveSessionScoped#execute(ReactiveSessionCallback) execution} initiates a new managed transaction
* that is {@link ClientSession#commitTransaction() committed} on success. Transactions are
* {@link ClientSession#abortTransaction() rolled back} upon errors.
*
* @return new instance of {@link ReactiveSessionScoped}. Never {@literal null}.
* @deprecated since 2.2. Use {@code @Transactional} or {@link TransactionalOperator}.
*/
@Deprecated
ReactiveSessionScoped inTransaction();
/**
* Obtain a {@link ClientSession session} bound instance of {@link ReactiveSessionScoped}, start the transaction and
* bind the {@link ClientSession} provided by the given {@link Publisher} to each and every command issued against
* MongoDB.
* <br />
* Each {@link ReactiveSessionScoped#execute(ReactiveSessionCallback) execution} initiates a new managed transaction
* that is {@link ClientSession#commitTransaction() committed} on success. Transactions are
* {@link ClientSession#abortTransaction() rolled back} upon errors.
*
* @param sessionProvider must not be {@literal null}.
* @return new instance of {@link ReactiveSessionScoped}. Never {@literal null}.
* @since 2.1
* @deprecated since 2.2. Use {@code @Transactional} or {@link TransactionalOperator}.
*/
@Deprecated
ReactiveSessionScoped inTransaction(Publisher<ClientSession> sessionProvider);
/** /**
* Create an uncapped collection with a name based on the provided entity class. * Create an uncapped collection with a name based on the provided entity class.
* *
@@ -292,8 +251,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
* Get a {@link MongoCollection} by name. The returned collection may not exists yet (except in local memory) and is * Get a {@link MongoCollection} by name. The returned collection may not exists yet (except in local memory) and is
* created on first interaction with the server. Collections can be explicitly created via * created on first interaction with the server. Collections can be explicitly created via
* {@link #createCollection(Class)}. Please make sure to check if the collection {@link #collectionExists(Class) * {@link #createCollection(Class)}. Please make sure to check if the collection {@link #collectionExists(Class)
* exists} first. * exists} first. <br />
* <br />
* Translate any exceptions as necessary. * Translate any exceptions as necessary.
* *
* @param collectionName name of the collection. * @param collectionName name of the collection.
@@ -302,8 +260,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
Mono<MongoCollection<Document>> getCollection(String collectionName); Mono<MongoCollection<Document>> getCollection(String collectionName);
/** /**
* Check to see if a collection with a name indicated by the entity class exists. * Check to see if a collection with a name indicated by the entity class exists. <br />
* <br />
* Translate any exceptions as necessary. * Translate any exceptions as necessary.
* *
* @param entityClass class that determines the name of the collection. Must not be {@literal null}. * @param entityClass class that determines the name of the collection. Must not be {@literal null}.
@@ -312,8 +269,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
<T> Mono<Boolean> collectionExists(Class<T> entityClass); <T> Mono<Boolean> collectionExists(Class<T> entityClass);
/** /**
* Check to see if a collection with a given name exists. * Check to see if a collection with a given name exists. <br />
* <br />
* Translate any exceptions as necessary. * Translate any exceptions as necessary.
* *
* @param collectionName name of the collection. Must not be {@literal null}. * @param collectionName name of the collection. Must not be {@literal null}.
@@ -322,8 +278,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
Mono<Boolean> collectionExists(String collectionName); Mono<Boolean> collectionExists(String collectionName);
/** /**
* Drop the collection with the name indicated by the entity class. * Drop the collection with the name indicated by the entity class. <br />
* <br />
* Translate any exceptions as necessary. * Translate any exceptions as necessary.
* *
* @param entityClass class that determines the collection to drop/delete. Must not be {@literal null}. * @param entityClass class that determines the collection to drop/delete. Must not be {@literal null}.
@@ -331,8 +286,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
<T> Mono<Void> dropCollection(Class<T> entityClass); <T> Mono<Void> dropCollection(Class<T> entityClass);
/** /**
* Drop the collection with the given name. * Drop the collection with the given name. <br />
* <br />
* Translate any exceptions as necessary. * Translate any exceptions as necessary.
* *
* @param collectionName name of the collection to drop/delete. * @param collectionName name of the collection to drop/delete.
@@ -340,11 +294,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
Mono<Void> dropCollection(String collectionName); Mono<Void> dropCollection(String collectionName);
/** /**
* Query for a {@link Flux} of objects of type T from the collection used by the entity class. * Query for a {@link Flux} of objects of type T from the collection used by the entity class. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* If your collection does not contain a homogeneous collection of types, this operation will not be an efficient way * If your collection does not contain a homogeneous collection of types, this operation will not be an efficient way
* to map objects since the test for class type is done in the client and not on the server. * to map objects since the test for class type is done in the client and not on the server.
* *
@@ -354,11 +306,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
<T> Flux<T> findAll(Class<T> entityClass); <T> Flux<T> findAll(Class<T> entityClass);
/** /**
* Query for a {@link Flux} of objects of type T from the specified collection. * Query for a {@link Flux} of objects of type T from the specified collection. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* If your collection does not contain a homogeneous collection of types, this operation will not be an efficient way * If your collection does not contain a homogeneous collection of types, this operation will not be an efficient way
* to map objects since the test for class type is done in the client and not on the server. * to map objects since the test for class type is done in the client and not on the server.
* *
@@ -370,11 +320,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
/** /**
* Map the results of an ad-hoc query on the collection for the entity class to a single instance of an object of the * Map the results of an ad-hoc query on the collection for the entity class to a single instance of an object of the
* specified type. * specified type. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -387,11 +335,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
/** /**
* Map the results of an ad-hoc query on the specified collection to a single instance of an object of the specified * Map the results of an ad-hoc query on the specified collection to a single instance of an object of the specified
* type. * type. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -437,8 +383,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
* Map the results of an ad-hoc query on the collection for the entity class to a {@link Flux} of the specified type. * Map the results of an ad-hoc query on the collection for the entity class to a {@link Flux} of the specified type.
* <br /> * <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -450,11 +395,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
<T> Flux<T> find(Query query, Class<T> entityClass); <T> Flux<T> find(Query query, Class<T> entityClass);
/** /**
* Map the results of an ad-hoc query on the specified collection to a {@link Flux} of the specified type. * Map the results of an ad-hoc query on the specified collection to a {@link Flux} of the specified type. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -565,11 +508,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
<O> Flux<O> aggregate(TypedAggregation<?> aggregation, String collectionName, Class<O> outputType); <O> Flux<O> aggregate(TypedAggregation<?> aggregation, String collectionName, Class<O> outputType);
/** /**
* Execute an aggregation operation. * Execute an aggregation operation. <br />
* <br />
* The raw results will be mapped to the given entity class and are returned as stream. The name of the * The raw results will be mapped to the given entity class and are returned as stream. The name of the
* inputCollection is derived from the {@link TypedAggregation#getInputType() aggregation input type}. * inputCollection is derived from the {@link TypedAggregation#getInputType() aggregation input type}. <br />
* <br />
* Aggregation streaming cannot be used with {@link AggregationOptions#isExplain() aggregation explain} nor with * Aggregation streaming cannot be used with {@link AggregationOptions#isExplain() aggregation explain} nor with
* {@link AggregationOptions#getCursorBatchSize()}. Enabling explanation mode or setting batch size cause * {@link AggregationOptions#getCursorBatchSize()}. Enabling explanation mode or setting batch size cause
* {@link IllegalArgumentException}. * {@link IllegalArgumentException}.
@@ -583,11 +524,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
<O> Flux<O> aggregate(TypedAggregation<?> aggregation, Class<O> outputType); <O> Flux<O> aggregate(TypedAggregation<?> aggregation, Class<O> outputType);
/** /**
* Execute an aggregation operation. * Execute an aggregation operation. <br />
* <br />
* The raw results will be mapped to the given {@code ouputType}. The name of the inputCollection is derived from the * The raw results will be mapped to the given {@code ouputType}. The name of the inputCollection is derived from the
* {@code inputType}. * {@code inputType}. <br />
* <br />
* Aggregation streaming cannot be used with {@link AggregationOptions#isExplain() aggregation explain} nor with * Aggregation streaming cannot be used with {@link AggregationOptions#isExplain() aggregation explain} nor with
* {@link AggregationOptions#getCursorBatchSize()}. Enabling explanation mode or setting batch size cause * {@link AggregationOptions#getCursorBatchSize()}. Enabling explanation mode or setting batch size cause
* {@link IllegalArgumentException}. * {@link IllegalArgumentException}.
@@ -603,10 +542,8 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
<O> Flux<O> aggregate(Aggregation aggregation, Class<?> inputType, Class<O> outputType); <O> Flux<O> aggregate(Aggregation aggregation, Class<?> inputType, Class<O> outputType);
/** /**
* Execute an aggregation operation. * Execute an aggregation operation. <br />
* <br /> * The raw results will be mapped to the given entity class. <br />
* The raw results will be mapped to the given entity class.
* <br />
* Aggregation streaming cannot be used with {@link AggregationOptions#isExplain() aggregation explain} nor with * Aggregation streaming cannot be used with {@link AggregationOptions#isExplain() aggregation explain} nor with
* {@link AggregationOptions#getCursorBatchSize()}. Enabling explanation mode or setting batch size cause * {@link AggregationOptions#getCursorBatchSize()}. Enabling explanation mode or setting batch size cause
* {@link IllegalArgumentException}. * {@link IllegalArgumentException}.
@@ -901,10 +838,8 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
/** /**
* Map the results of an ad-hoc query on the collection for the entity type to a single instance of an object of the * Map the results of an ad-hoc query on the collection for the entity type to a single instance of an object of the
* specified type. The first document that matches the query is returned and also removed from the collection in the * specified type. The first document that matches the query is returned and also removed from the collection in the
* database. * database. <br />
* <br /> * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}.
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -920,8 +855,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
* type. The first document that matches the query is returned and also removed from the collection in the database. * type. The first document that matches the query is returned and also removed from the collection in the database.
* <br /> * <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -939,18 +873,17 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
* <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct * <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct
* influence on the resulting number of documents found as those values are passed on to the server and potentially * influence on the resulting number of documents found as those values are passed on to the server and potentially
* limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to * limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to
* count all matches. * count all matches. <br />
* <br /> * This method may choose to use {@link #estimatedCount(Class)} for empty queries instead of running an
* This method uses an
* {@link com.mongodb.reactivestreams.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions) * {@link com.mongodb.reactivestreams.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions)
* aggregation execution} even for empty {@link Query queries} which may have an impact on performance, but guarantees * aggregation execution} which may have an impact on performance.
* shard, session and transaction compliance. In case an inaccurate count satisfies the applications needs use
* {@link #estimatedCount(Class)} for empty queries instead.
* *
* @param query the {@link Query} class that specifies the criteria used to find documents. Must not be * @param query the {@link Query} class that specifies the criteria used to find documents. Must not be
* {@literal null}. * {@literal null}.
* @param entityClass class that determines the collection to use. Must not be {@literal null}. * @param entityClass class that determines the collection to use. Must not be {@literal null}.
* @return the count of matching documents. * @return the count of matching documents.
* @see #exactCount(Query, Class)
* @see #estimatedCount(Class)
*/ */
Mono<Long> count(Query query, Class<?> entityClass); Mono<Long> count(Query query, Class<?> entityClass);
@@ -961,18 +894,17 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
* <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct * <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct
* influence on the resulting number of documents found as those values are passed on to the server and potentially * influence on the resulting number of documents found as those values are passed on to the server and potentially
* limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to * limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to
* count all matches. * count all matches. <br />
* <br /> * This method may choose to use {@link #estimatedCount(Class)} for empty queries instead of running an
* This method uses an
* {@link com.mongodb.reactivestreams.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions) * {@link com.mongodb.reactivestreams.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions)
* aggregation execution} even for empty {@link Query queries} which may have an impact on performance, but guarantees * aggregation execution} which may have an impact on performance.
* shard, session and transaction compliance. In case an inaccurate count satisfies the applications needs use
* {@link #estimatedCount(String)} for empty queries instead.
* *
* @param query the {@link Query} class that specifies the criteria used to find documents. * @param query the {@link Query} class that specifies the criteria used to find documents.
* @param collectionName must not be {@literal null} or empty. * @param collectionName must not be {@literal null} or empty.
* @return the count of matching documents. * @return the count of matching documents.
* @see #count(Query, Class, String) * @see #count(Query, Class, String)
* @see #estimatedCount(String)
* @see #exactCount(Query, String)
*/ */
Mono<Long> count(Query query, String collectionName); Mono<Long> count(Query query, String collectionName);
@@ -982,26 +914,24 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
* <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct * <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct
* influence on the resulting number of documents found as those values are passed on to the server and potentially * influence on the resulting number of documents found as those values are passed on to the server and potentially
* limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to * limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to
* count all matches. * count all matches. <br />
* <br /> * This method may choose to use {@link #estimatedCount(Class)} for empty queries instead of running an
* This method uses an
* {@link com.mongodb.reactivestreams.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions) * {@link com.mongodb.reactivestreams.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions)
* aggregation execution} even for empty {@link Query queries} which may have an impact on performance, but guarantees * aggregation execution} which may have an impact on performance.
* shard, session and transaction compliance. In case an inaccurate count satisfies the applications needs use
* {@link #estimatedCount(String)} for empty queries instead.
* *
* @param query the {@link Query} class that specifies the criteria used to find documents. Must not be * @param query the {@link Query} class that specifies the criteria used to find documents. Must not be
* {@literal null}. * {@literal null}.
* @param entityClass the parametrized type. Can be {@literal null}. * @param entityClass the parametrized type. Can be {@literal null}.
* @param collectionName must not be {@literal null} or empty. * @param collectionName must not be {@literal null} or empty.
* @return the count of matching documents. * @return the count of matching documents.
* @see #estimatedCount(String)
* @see #exactCount(Query, Class, String)
*/ */
Mono<Long> count(Query query, @Nullable Class<?> entityClass, String collectionName); Mono<Long> count(Query query, @Nullable Class<?> entityClass, String collectionName);
/** /**
* Estimate the number of documents, in the collection {@link #getCollectionName(Class) identified by the given type}, * Estimate the number of documents, in the collection {@link #getCollectionName(Class) identified by the given type},
* based on collection statistics. * based on collection statistics. <br />
* <br />
* Please make sure to read the MongoDB reference documentation about limitations on eg. sharded cluster or inside * Please make sure to read the MongoDB reference documentation about limitations on eg. sharded cluster or inside
* transactions. * transactions.
* *
@@ -1016,8 +946,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
} }
/** /**
* Estimate the number of documents in the given collection based on collection statistics. * Estimate the number of documents in the given collection based on collection statistics. <br />
* <br />
* Please make sure to read the MongoDB reference documentation about limitations on eg. sharded cluster or inside * Please make sure to read the MongoDB reference documentation about limitations on eg. sharded cluster or inside
* transactions. * transactions.
* *
@@ -1028,16 +957,82 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
Mono<Long> estimatedCount(String collectionName); Mono<Long> estimatedCount(String collectionName);
/** /**
* Insert the object into the collection for the entity type of the object to save. * Returns the number of documents for the given {@link Query} by querying the collection of the given entity class.
* <br />
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}.
* <br /> * <br />
* <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct
* influence on the resulting number of documents found as those values are passed on to the server and potentially
* limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to
* count all matches. <br />
* This method uses an
* {@link com.mongodb.reactivestreams.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions)
* aggregation execution} even for empty {@link Query queries} which may have an impact on performance, but guarantees
* shard, session and transaction compliance. In case an inaccurate count satisfies the applications needs use
* {@link #estimatedCount(Class)} for empty queries instead.
*
* @param query the {@link Query} class that specifies the criteria used to find documents. Must not be
* {@literal null}.
* @param entityClass class that determines the collection to use. Must not be {@literal null}.
* @return the count of matching documents.
* @since 3.4
*/
default Mono<Long> exactCount(Query query, Class<?> entityClass) {
return exactCount(query, entityClass, getCollectionName(entityClass));
}
/**
* Returns the number of documents for the given {@link Query} querying the given collection. The given {@link Query}
* must solely consist of document field references as we lack type information to map potential property references
* onto document fields. Use {@link #count(Query, Class, String)} to get full type specific support. <br />
* <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct
* influence on the resulting number of documents found as those values are passed on to the server and potentially
* limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to
* count all matches. <br />
* This method uses an
* {@link com.mongodb.reactivestreams.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions)
* aggregation execution} even for empty {@link Query queries} which may have an impact on performance, but guarantees
* shard, session and transaction compliance. In case an inaccurate count satisfies the applications needs use
* {@link #estimatedCount(String)} for empty queries instead.
*
* @param query the {@link Query} class that specifies the criteria used to find documents.
* @param collectionName must not be {@literal null} or empty.
* @return the count of matching documents.
* @see #count(Query, Class, String)
* @since 3.4
*/
default Mono<Long> exactCount(Query query, String collectionName) {
return exactCount(query, null, collectionName);
}
/**
* Returns the number of documents for the given {@link Query} by querying the given collection using the given entity
* class to map the given {@link Query}. <br />
* <strong>NOTE:</strong> Query {@link Query#getSkip() offset} and {@link Query#getLimit() limit} can have direct
* influence on the resulting number of documents found as those values are passed on to the server and potentially
* limit the range and order within which the server performs the count operation. Use an {@literal unpaged} query to
* count all matches. <br />
* This method uses an
* {@link com.mongodb.reactivestreams.client.MongoCollection#countDocuments(org.bson.conversions.Bson, com.mongodb.client.model.CountOptions)
* aggregation execution} even for empty {@link Query queries} which may have an impact on performance, but guarantees
* shard, session and transaction compliance. In case an inaccurate count satisfies the applications needs use
* {@link #estimatedCount(String)} for empty queries instead.
*
* @param query the {@link Query} class that specifies the criteria used to find documents. Must not be
* {@literal null}.
* @param entityClass the parametrized type. Can be {@literal null}.
* @param collectionName must not be {@literal null} or empty.
* @return the count of matching documents.
* @since 3.4
*/
Mono<Long> exactCount(Query query, @Nullable Class<?> entityClass, String collectionName);
/**
* Insert the object into the collection for the entity type of the object to save. <br />
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. <br />
* If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a * If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your * String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See * property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See
* <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation" > Spring's * <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation" > Spring's
* Type Conversion"</a> for more details. * Type Conversion"</a> for more details. <br />
* <br />
* Insert is used to initially store the object into the database. To update an existing object use the save method. * Insert is used to initially store the object into the database. To update an existing object use the save method.
* <br /> * <br />
* The {@code objectToSave} must not be collection-like. * The {@code objectToSave} must not be collection-like.
@@ -1049,11 +1044,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
<T> Mono<T> insert(T objectToSave); <T> Mono<T> insert(T objectToSave);
/** /**
* Insert the object into the specified collection. * Insert the object into the specified collection. <br />
* <br />
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* Insert is used to initially store the object into the database. To update an existing object use the save method. * Insert is used to initially store the object into the database. To update an existing object use the save method.
* <br /> * <br />
* The {@code objectToSave} must not be collection-like. * The {@code objectToSave} must not be collection-like.
@@ -1093,16 +1086,13 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
<T> Flux<T> insertAll(Collection<? extends T> objectsToSave); <T> Flux<T> insertAll(Collection<? extends T> objectsToSave);
/** /**
* Insert the object into the collection for the entity type of the object to save. * Insert the object into the collection for the entity type of the object to save. <br />
* <br /> * The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. <br />
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}.
* <br />
* If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a * If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your * String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See * property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See
* <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation" > Spring's * <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation" > Spring's
* Type Conversion"</a> for more details. * Type Conversion"</a> for more details. <br />
* <br />
* Insert is used to initially store the object into the database. To update an existing object use the save method. * Insert is used to initially store the object into the database. To update an existing object use the save method.
* *
* @param objectToSave the object to store in the collection. Must not be {@literal null}. * @param objectToSave the object to store in the collection. Must not be {@literal null}.
@@ -1139,17 +1129,14 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
/** /**
* Save the object to the collection for the entity type of the object to save. This will perform an insert if the * Save the object to the collection for the entity type of the object to save. This will perform an insert if the
* object is not already present, that is an 'upsert'. * object is not already present, that is an 'upsert'. <br />
* <br />
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a * If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your * String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See * property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See
* <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation" > Spring's * <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation" > Spring's
* Type Conversion"</a> for more details. * Type Conversion"</a> for more details. <br />
* <br />
* The {@code objectToSave} must not be collection-like. * The {@code objectToSave} must not be collection-like.
* *
* @param objectToSave the object to store in the collection. Must not be {@literal null}. * @param objectToSave the object to store in the collection. Must not be {@literal null}.
@@ -1160,15 +1147,14 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
/** /**
* Save the object to the specified collection. This will perform an insert if the object is not already present, that * Save the object to the specified collection. This will perform an insert if the object is not already present, that
* is an 'upsert'. * is an 'upsert'. <br />
* <br />
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a * If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your * String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. * property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See
* See <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation">Spring's Type Conversion</a> for more details. * <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation">Spring's Type
* Conversion</a> for more details.
* *
* @param objectToSave the object to store in the collection. Must not be {@literal null}. * @param objectToSave the object to store in the collection. Must not be {@literal null}.
* @param collectionName name of the collection to store the object in. Must not be {@literal null}. * @param collectionName name of the collection to store the object in. Must not be {@literal null}.
@@ -1179,15 +1165,14 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
/** /**
* Save the object to the collection for the entity type of the object to save. This will perform an insert if the * Save the object to the collection for the entity type of the object to save. This will perform an insert if the
* object is not already present, that is an 'upsert'. * object is not already present, that is an 'upsert'. <br />
* <br />
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a * If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your * String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. * property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See
* See <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation"> Spring's Type Conversion</a> for more details. * <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation"> Spring's Type
* Conversion</a> for more details.
* *
* @param objectToSave the object to store in the collection. Must not be {@literal null}. * @param objectToSave the object to store in the collection. Must not be {@literal null}.
* @return the saved object. * @return the saved object.
@@ -1196,15 +1181,14 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
/** /**
* Save the object to the specified collection. This will perform an insert if the object is not already present, that * Save the object to the specified collection. This will perform an insert if the object is not already present, that
* is an 'upsert'. * is an 'upsert'. <br />
* <br />
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a * If your object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your * String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. * property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See
* See <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation">Spring's Type Conversion</a> for more details. * <a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation">Spring's Type
* Conversion</a> for more details.
* *
* @param objectToSave the object to store in the collReactiveMongoOperationsection. Must not be {@literal null}. * @param objectToSave the object to store in the collReactiveMongoOperationsection. Must not be {@literal null}.
* @param collectionName name of the collection to store the object in. Must not be {@literal null}. * @param collectionName name of the collection to store the object in. Must not be {@literal null}.
@@ -1477,11 +1461,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
* Map the results of an ad-hoc query on the collection for the entity class to a stream of objects of the specified * Map the results of an ad-hoc query on the collection for the entity class to a stream of objects of the specified
* type. The stream uses a {@link com.mongodb.CursorType#TailableAwait tailable} cursor that may be an infinite * type. The stream uses a {@link com.mongodb.CursorType#TailableAwait tailable} cursor that may be an infinite
* stream. The stream will not be completed unless the {@link org.reactivestreams.Subscription} is * stream. The stream will not be completed unless the {@link org.reactivestreams.Subscription} is
* {@link Subscription#cancel() canceled}. * {@link Subscription#cancel() canceled}. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -1496,11 +1478,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
* Map the results of an ad-hoc query on the collection for the entity class to a stream of objects of the specified * Map the results of an ad-hoc query on the collection for the entity class to a stream of objects of the specified
* type. The stream uses a {@link com.mongodb.CursorType#TailableAwait tailable} cursor that may be an infinite * type. The stream uses a {@link com.mongodb.CursorType#TailableAwait tailable} cursor that may be an infinite
* stream. The stream will not be completed unless the {@link org.reactivestreams.Subscription} is * stream. The stream will not be completed unless the {@link org.reactivestreams.Subscription} is
* {@link Subscription#cancel() canceled}. * {@link Subscription#cancel() canceled}. <br />
* <br />
* The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless * The object is converted from the MongoDB native representation using an instance of {@see MongoConverter}. Unless
* configured otherwise, an instance of {@link MappingMongoConverter} will be used. * configured otherwise, an instance of {@link MappingMongoConverter} will be used. <br />
* <br />
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
* feature rich {@link Query}. * feature rich {@link Query}.
* *
@@ -1516,11 +1496,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
* Subscribe to a MongoDB <a href="https://docs.mongodb.com/manual/changeStreams/">Change Stream</a> for all events in * Subscribe to a MongoDB <a href="https://docs.mongodb.com/manual/changeStreams/">Change Stream</a> for all events in
* the configured default database via the reactive infrastructure. Use the optional provided {@link Aggregation} to * the configured default database via the reactive infrastructure. Use the optional provided {@link Aggregation} to
* filter events. The stream will not be completed unless the {@link org.reactivestreams.Subscription} is * filter events. The stream will not be completed unless the {@link org.reactivestreams.Subscription} is
* {@link Subscription#cancel() canceled}. * {@link Subscription#cancel() canceled}. <br />
* <br />
* The {@link ChangeStreamEvent#getBody()} is mapped to the {@literal resultType} while the * The {@link ChangeStreamEvent#getBody()} is mapped to the {@literal resultType} while the
* {@link ChangeStreamEvent#getRaw()} contains the unmodified payload. * {@link ChangeStreamEvent#getRaw()} contains the unmodified payload. <br />
* <br />
* Use {@link ChangeStreamOptions} to set arguments like {@link ChangeStreamOptions#getResumeToken() the resumseToken} * Use {@link ChangeStreamOptions} to set arguments like {@link ChangeStreamOptions#getResumeToken() the resumseToken}
* for resuming change streams. * for resuming change streams.
* *
@@ -1540,11 +1518,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
* Subscribe to a MongoDB <a href="https://docs.mongodb.com/manual/changeStreams/">Change Stream</a> for all events in * Subscribe to a MongoDB <a href="https://docs.mongodb.com/manual/changeStreams/">Change Stream</a> for all events in
* the given collection via the reactive infrastructure. Use the optional provided {@link Aggregation} to filter * the given collection via the reactive infrastructure. Use the optional provided {@link Aggregation} to filter
* events. The stream will not be completed unless the {@link org.reactivestreams.Subscription} is * events. The stream will not be completed unless the {@link org.reactivestreams.Subscription} is
* {@link Subscription#cancel() canceled}. * {@link Subscription#cancel() canceled}. <br />
* <br />
* The {@link ChangeStreamEvent#getBody()} is mapped to the {@literal resultType} while the * The {@link ChangeStreamEvent#getBody()} is mapped to the {@literal resultType} while the
* {@link ChangeStreamEvent#getRaw()} contains the unmodified payload. * {@link ChangeStreamEvent#getRaw()} contains the unmodified payload. <br />
* <br />
* Use {@link ChangeStreamOptions} to set arguments like {@link ChangeStreamOptions#getResumeToken() the resumseToken} * Use {@link ChangeStreamOptions} to set arguments like {@link ChangeStreamOptions#getResumeToken() the resumseToken}
* for resuming change streams. * for resuming change streams.
* *
@@ -1565,11 +1541,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
/** /**
* Subscribe to a MongoDB <a href="https://docs.mongodb.com/manual/changeStreams/">Change Stream</a> via the reactive * Subscribe to a MongoDB <a href="https://docs.mongodb.com/manual/changeStreams/">Change Stream</a> via the reactive
* infrastructure. Use the optional provided {@link Aggregation} to filter events. The stream will not be completed * infrastructure. Use the optional provided {@link Aggregation} to filter events. The stream will not be completed
* unless the {@link org.reactivestreams.Subscription} is {@link Subscription#cancel() canceled}. * unless the {@link org.reactivestreams.Subscription} is {@link Subscription#cancel() canceled}. <br />
* <br />
* The {@link ChangeStreamEvent#getBody()} is mapped to the {@literal resultType} while the * The {@link ChangeStreamEvent#getBody()} is mapped to the {@literal resultType} while the
* {@link ChangeStreamEvent#getRaw()} contains the unmodified payload. * {@link ChangeStreamEvent#getRaw()} contains the unmodified payload. <br />
* <br />
* Use {@link ChangeStreamOptions} to set arguments like {@link ChangeStreamOptions#getResumeToken() the resumseToken} * Use {@link ChangeStreamOptions} to set arguments like {@link ChangeStreamOptions#getResumeToken() the resumseToken}
* for resuming change streams. * for resuming change streams.
* *
@@ -1599,7 +1573,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
* @param options additional options like output collection. Must not be {@literal null}. * @param options additional options like output collection. Must not be {@literal null}.
* @return a {@link Flux} emitting the result document sequence. Never {@literal null}. * @return a {@link Flux} emitting the result document sequence. Never {@literal null}.
* @since 2.1 * @since 2.1
* @deprecated since 3.4 in favor of {@link #aggregate(TypedAggregation, Class)}.
*/ */
@Deprecated
<T> Flux<T> mapReduce(Query filterQuery, Class<?> domainType, Class<T> resultType, String mapFunction, <T> Flux<T> mapReduce(Query filterQuery, Class<?> domainType, Class<T> resultType, String mapFunction,
String reduceFunction, MapReduceOptions options); String reduceFunction, MapReduceOptions options);
@@ -1617,7 +1593,9 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations {
* @param options additional options like output collection. Must not be {@literal null}. * @param options additional options like output collection. Must not be {@literal null}.
* @return a {@link Flux} emitting the result document sequence. Never {@literal null}. * @return a {@link Flux} emitting the result document sequence. Never {@literal null}.
* @since 2.1 * @since 2.1
* @deprecated since 3.4 in favor of {@link #aggregate(TypedAggregation, Class)}.
*/ */
@Deprecated
<T> Flux<T> mapReduce(Query filterQuery, Class<?> domainType, String inputCollectionName, Class<T> resultType, <T> Flux<T> mapReduce(Query filterQuery, Class<?> domainType, String inputCollectionName, Class<T> resultType,
String mapFunction, String reduceFunction, MapReduceOptions options); String mapFunction, String reduceFunction, MapReduceOptions options);

View File

@@ -41,10 +41,6 @@ class ReactiveRemoveOperationSupport implements ReactiveRemoveOperation {
this.tempate = tempate; this.tempate = tempate;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveRemoveOperation#remove(java.lang.Class)
*/
@Override @Override
public <T> ReactiveRemove<T> remove(Class<T> domainType) { public <T> ReactiveRemove<T> remove(Class<T> domainType) {
@@ -68,10 +64,6 @@ class ReactiveRemoveOperationSupport implements ReactiveRemoveOperation {
this.collection = collection; this.collection = collection;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveRemoveOperation.RemoveWithCollection#inCollection(String)
*/
@Override @Override
public RemoveWithQuery<T> inCollection(String collection) { public RemoveWithQuery<T> inCollection(String collection) {
@@ -80,10 +72,6 @@ class ReactiveRemoveOperationSupport implements ReactiveRemoveOperation {
return new ReactiveRemoveSupport<>(template, domainType, query, collection); return new ReactiveRemoveSupport<>(template, domainType, query, collection);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveRemoveOperation.RemoveWithQuery#matching(org.springframework.data.mongodb.core.Query)
*/
@Override @Override
public TerminatingRemove<T> matching(Query query) { public TerminatingRemove<T> matching(Query query) {
@@ -92,10 +80,6 @@ class ReactiveRemoveOperationSupport implements ReactiveRemoveOperation {
return new ReactiveRemoveSupport<>(template, domainType, query, collection); return new ReactiveRemoveSupport<>(template, domainType, query, collection);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveRemoveOperation.TerminatingRemove#all()
*/
@Override @Override
public Mono<DeleteResult> all() { public Mono<DeleteResult> all() {
@@ -104,10 +88,6 @@ class ReactiveRemoveOperationSupport implements ReactiveRemoveOperation {
return template.doRemove(collectionName, query, domainType); return template.doRemove(collectionName, query, domainType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveRemoveOperation.TerminatingRemove#findAndRemove()
*/
@Override @Override
public Flux<T> findAndRemove() { public Flux<T> findAndRemove() {

View File

@@ -42,10 +42,6 @@ class ReactiveUpdateOperationSupport implements ReactiveUpdateOperation {
this.template = template; this.template = template;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation#update(java.lang.Class)
*/
@Override @Override
public <T> ReactiveUpdate<T> update(Class<T> domainType) { public <T> ReactiveUpdate<T> update(Class<T> domainType) {
@@ -83,10 +79,6 @@ class ReactiveUpdateOperationSupport implements ReactiveUpdateOperation {
this.targetType = targetType; this.targetType = targetType;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.UpdateWithUpdate#apply(org.springframework.data.mongodb.core.query.UpdateDefinition)
*/
@Override @Override
public TerminatingUpdate<T> apply(org.springframework.data.mongodb.core.query.UpdateDefinition update) { public TerminatingUpdate<T> apply(org.springframework.data.mongodb.core.query.UpdateDefinition update) {
@@ -96,10 +88,6 @@ class ReactiveUpdateOperationSupport implements ReactiveUpdateOperation {
findAndReplaceOptions, replacement, targetType); findAndReplaceOptions, replacement, targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.UpdateWithCollection#inCollection(java.lang.String)
*/
@Override @Override
public UpdateWithQuery<T> inCollection(String collection) { public UpdateWithQuery<T> inCollection(String collection) {
@@ -109,28 +97,16 @@ class ReactiveUpdateOperationSupport implements ReactiveUpdateOperation {
findAndReplaceOptions, replacement, targetType); findAndReplaceOptions, replacement, targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.TerminatingUpdate#first()
*/
@Override @Override
public Mono<UpdateResult> first() { public Mono<UpdateResult> first() {
return doUpdate(false, false); return doUpdate(false, false);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.TerminatingUpdate#upsert()
*/
@Override @Override
public Mono<UpdateResult> upsert() { public Mono<UpdateResult> upsert() {
return doUpdate(true, true); return doUpdate(true, true);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.TerminatingFindAndModify#findAndModify()
*/
@Override @Override
public Mono<T> findAndModify() { public Mono<T> findAndModify() {
@@ -141,10 +117,6 @@ class ReactiveUpdateOperationSupport implements ReactiveUpdateOperation {
collectionName); collectionName);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.TerminatingFindAndReplace#findAndReplace()
*/
@Override @Override
public Mono<T> findAndReplace() { public Mono<T> findAndReplace() {
return template.findAndReplace(query, replacement, return template.findAndReplace(query, replacement,
@@ -152,10 +124,6 @@ class ReactiveUpdateOperationSupport implements ReactiveUpdateOperation {
getCollectionName(), targetType); getCollectionName(), targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.UpdateWithQuery#matching(org.springframework.data.mongodb.core.Query)
*/
@Override @Override
public UpdateWithUpdate<T> matching(Query query) { public UpdateWithUpdate<T> matching(Query query) {
@@ -165,19 +133,11 @@ class ReactiveUpdateOperationSupport implements ReactiveUpdateOperation {
findAndReplaceOptions, replacement, targetType); findAndReplaceOptions, replacement, targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.TerminatingUpdate#all()
*/
@Override @Override
public Mono<UpdateResult> all() { public Mono<UpdateResult> all() {
return doUpdate(true, false); return doUpdate(true, false);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.FindAndModifyWithOptions#withOptions(org.springframework.data.mongodb.core.FindAndModifyOptions)
*/
@Override @Override
public TerminatingFindAndModify<T> withOptions(FindAndModifyOptions options) { public TerminatingFindAndModify<T> withOptions(FindAndModifyOptions options) {
@@ -187,10 +147,6 @@ class ReactiveUpdateOperationSupport implements ReactiveUpdateOperation {
findAndReplaceOptions, replacement, targetType); findAndReplaceOptions, replacement, targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.UpdateWithUpdate#replaceWith(java.lang.Object)
*/
@Override @Override
public FindAndReplaceWithProjection<T> replaceWith(T replacement) { public FindAndReplaceWithProjection<T> replaceWith(T replacement) {
@@ -200,10 +156,6 @@ class ReactiveUpdateOperationSupport implements ReactiveUpdateOperation {
findAndReplaceOptions, replacement, targetType); findAndReplaceOptions, replacement, targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.FindAndReplaceWithOptions#withOptions(org.springframework.data.mongodb.core.FindAndReplaceOptions)
*/
@Override @Override
public FindAndReplaceWithProjection<T> withOptions(FindAndReplaceOptions options) { public FindAndReplaceWithProjection<T> withOptions(FindAndReplaceOptions options) {
@@ -213,10 +165,6 @@ class ReactiveUpdateOperationSupport implements ReactiveUpdateOperation {
replacement, targetType); replacement, targetType);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveUpdateOperation.FindAndReplaceWithProjection#as(java.lang.Class)
*/
@Override @Override
public <R> FindAndReplaceWithOptions<R> as(Class<R> resultType) { public <R> FindAndReplaceWithOptions<R> as(Class<R> resultType) {

View File

@@ -75,28 +75,16 @@ public class SimpleMongoClientDatabaseFactory extends MongoDatabaseFactorySuppor
super(mongoClient, databaseName, mongoInstanceCreated, new MongoExceptionTranslator()); super(mongoClient, databaseName, mongoInstanceCreated, new MongoExceptionTranslator());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.MongoDbFactory#getSession(com.mongodb.ClientSessionOptions)
*/
@Override @Override
public ClientSession getSession(ClientSessionOptions options) { public ClientSession getSession(ClientSessionOptions options) {
return getMongoClient().startSession(options); return getMongoClient().startSession(options);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.MongoDbFactoryBase#closeClient()
*/
@Override @Override
protected void closeClient() { protected void closeClient() {
getMongoClient().close(); getMongoClient().close();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.MongoDbFactoryBase#doGetMongoDatabase(java.lang.String)
*/
@Override @Override
protected MongoDatabase doGetMongoDatabase(String dbName) { protected MongoDatabase doGetMongoDatabase(String dbName) {
return getMongoClient().getDatabase(dbName); return getMongoClient().getDatabase(dbName);

View File

@@ -1,74 +0,0 @@
/*
* Copyright 2018-2022 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.mongodb.core;
import com.mongodb.ConnectionString;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
/**
* Factory to create {@link MongoDatabase} instances from a {@link MongoClient} instance.
*
* @author Christoph Strobl
* @since 2.1
* @deprecated since 3.0, use {@link SimpleMongoClientDatabaseFactory} instead.
*/
@Deprecated
public class SimpleMongoClientDbFactory extends SimpleMongoClientDatabaseFactory {
/**
* Creates a new {@link SimpleMongoClientDbFactory} instance for the given {@code connectionString}.
*
* @param connectionString connection coordinates for a database connection. Must contain a database name and must not
* be {@literal null} or empty.
* @see <a href="https://docs.mongodb.com/manual/reference/connection-string/">MongoDB Connection String reference</a>
*/
public SimpleMongoClientDbFactory(String connectionString) {
this(new ConnectionString(connectionString));
}
/**
* Creates a new {@link SimpleMongoClientDbFactory} instance from the given {@link MongoClient}.
*
* @param connectionString connection coordinates for a database connection. Must contain also a database name and not
* be {@literal null}.
*/
public SimpleMongoClientDbFactory(ConnectionString connectionString) {
this(MongoClients.create(connectionString), connectionString.getDatabase(), true);
}
/**
* Creates a new {@link SimpleMongoClientDbFactory} instance from the given {@link MongoClient}.
*
* @param mongoClient must not be {@literal null}.
* @param databaseName must not be {@literal null} or empty.
*/
public SimpleMongoClientDbFactory(MongoClient mongoClient, String databaseName) {
this(mongoClient, databaseName, false);
}
/**
* Creates a new {@link SimpleMongoClientDbFactory} instance from the given {@link MongoClient}.
*
* @param mongoClient must not be {@literal null}.
* @param databaseName must not be {@literal null} or empty.
* @param mongoInstanceCreated
*/
private SimpleMongoClientDbFactory(MongoClient mongoClient, String databaseName, boolean mongoInstanceCreated) {
super(mongoClient, databaseName, mongoInstanceCreated);
}
}

View File

@@ -97,18 +97,10 @@ public class SimpleReactiveMongoDatabaseFactory implements DisposableBean, React
this.writeConcern = writeConcern; this.writeConcern = writeConcern;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDbFactory#getMongoDatabase()
*/
public Mono<MongoDatabase> getMongoDatabase() throws DataAccessException { public Mono<MongoDatabase> getMongoDatabase() throws DataAccessException {
return getMongoDatabase(databaseName); return getMongoDatabase(databaseName);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDbFactory#getMongoDatabase(java.lang.String)
*/
public Mono<MongoDatabase> getMongoDatabase(String dbName) throws DataAccessException { public Mono<MongoDatabase> getMongoDatabase(String dbName) throws DataAccessException {
Assert.hasText(dbName, "Database name must not be empty."); Assert.hasText(dbName, "Database name must not be empty.");
@@ -133,36 +125,20 @@ public class SimpleReactiveMongoDatabaseFactory implements DisposableBean, React
} }
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDbFactory#getExceptionTranslator()
*/
public PersistenceExceptionTranslator getExceptionTranslator() { public PersistenceExceptionTranslator getExceptionTranslator() {
return this.exceptionTranslator; return this.exceptionTranslator;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDatabaseFactory#getCodecRegistry()
*/
@Override @Override
public CodecRegistry getCodecRegistry() { public CodecRegistry getCodecRegistry() {
return this.mongo.getDatabase(databaseName).getCodecRegistry(); return this.mongo.getDatabase(databaseName).getCodecRegistry();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDbFactory#getSession(com.mongodb.ClientSessionOptions)
*/
@Override @Override
public Mono<ClientSession> getSession(ClientSessionOptions options) { public Mono<ClientSession> getSession(ClientSessionOptions options) {
return Mono.from(mongo.startSession(options)); return Mono.from(mongo.startSession(options));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDbFactory#withSession(com.mongodb.session.ClientSession)
*/
@Override @Override
public ReactiveMongoDatabaseFactory withSession(ClientSession session) { public ReactiveMongoDatabaseFactory withSession(ClientSession session) {
return new ClientSessionBoundMongoDbFactory(session, this); return new ClientSessionBoundMongoDbFactory(session, this);
@@ -186,64 +162,36 @@ public class SimpleReactiveMongoDatabaseFactory implements DisposableBean, React
this.delegate = delegate; this.delegate = delegate;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDatabaseFactory#getMongoDatabase()
*/
@Override @Override
public Mono<MongoDatabase> getMongoDatabase() throws DataAccessException { public Mono<MongoDatabase> getMongoDatabase() throws DataAccessException {
return delegate.getMongoDatabase().map(this::decorateDatabase); return delegate.getMongoDatabase().map(this::decorateDatabase);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDatabaseFactory#getMongoDatabase(java.lang.String)
*/
@Override @Override
public Mono<MongoDatabase> getMongoDatabase(String dbName) throws DataAccessException { public Mono<MongoDatabase> getMongoDatabase(String dbName) throws DataAccessException {
return delegate.getMongoDatabase(dbName).map(this::decorateDatabase); return delegate.getMongoDatabase(dbName).map(this::decorateDatabase);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDatabaseFactory#getExceptionTranslator()
*/
@Override @Override
public PersistenceExceptionTranslator getExceptionTranslator() { public PersistenceExceptionTranslator getExceptionTranslator() {
return delegate.getExceptionTranslator(); return delegate.getExceptionTranslator();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDatabaseFactory#getCodecRegistry()
*/
@Override @Override
public CodecRegistry getCodecRegistry() { public CodecRegistry getCodecRegistry() {
return delegate.getCodecRegistry(); return delegate.getCodecRegistry();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDatabaseFactory#getSession(com.mongodb.ClientSessionOptions)
*/
@Override @Override
public Mono<ClientSession> getSession(ClientSessionOptions options) { public Mono<ClientSession> getSession(ClientSessionOptions options) {
return delegate.getSession(options); return delegate.getSession(options);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDatabaseFactory#withSession(com.mongodb.session.ClientSession)
*/
@Override @Override
public ReactiveMongoDatabaseFactory withSession(ClientSession session) { public ReactiveMongoDatabaseFactory withSession(ClientSession session) {
return delegate.withSession(session); return delegate.withSession(session);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.ReactiveMongoDatabaseFactory#isTransactionActive()
*/
@Override @Override
public boolean isTransactionActive() { public boolean isTransactionActive() {
return session != null && session.hasActiveTransaction(); return session != null && session.hasActiveTransaction();

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright 2016-2022. the original author or authors. * Copyright 2016-2022 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -44,9 +44,6 @@ abstract class AbstractAggregationExpression implements AggregationExpression {
this.value = value; this.value = value;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationExpression#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
return toDocument(this.value, context); return toDocument(this.value, context);

View File

@@ -334,9 +334,6 @@ public class AccumulatorOperators {
return new Sum(append(value)); return new Sum(append(value));
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AccumulatorOperators.AbstractAggregationExpression#toDocument(java.lang.Object, org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public Document toDocument(Object value, AggregationOperationContext context) { public Document toDocument(Object value, AggregationOperationContext context) {
@@ -417,9 +414,6 @@ public class AccumulatorOperators {
return new Avg(append(expression)); return new Avg(append(expression));
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AccumulatorOperators.AbstractAggregationExpression#toDocument(java.lang.Object, org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public Document toDocument(Object value, AggregationOperationContext context) { public Document toDocument(Object value, AggregationOperationContext context) {
@@ -500,9 +494,6 @@ public class AccumulatorOperators {
return new Max(append(expression)); return new Max(append(expression));
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AccumulatorOperators.AbstractAggregationExpression#toDocument(java.lang.Object, org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public Document toDocument(Object value, AggregationOperationContext context) { public Document toDocument(Object value, AggregationOperationContext context) {
@@ -583,9 +574,6 @@ public class AccumulatorOperators {
return new Min(append(expression)); return new Min(append(expression));
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AccumulatorOperators.AbstractAggregationExpression#toDocument(java.lang.Object, org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public Document toDocument(Object value, AggregationOperationContext context) { public Document toDocument(Object value, AggregationOperationContext context) {
@@ -666,9 +654,6 @@ public class AccumulatorOperators {
return new StdDevPop(append(expression)); return new StdDevPop(append(expression));
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AccumulatorOperators.AbstractAggregationExpression#toDocument(java.lang.Object, org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public Document toDocument(Object value, AggregationOperationContext context) { public Document toDocument(Object value, AggregationOperationContext context) {
@@ -749,9 +734,6 @@ public class AccumulatorOperators {
return new StdDevSamp(append(expression)); return new StdDevSamp(append(expression));
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AccumulatorOperators.AbstractAggregationExpression#toDocument(java.lang.Object, org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public Document toDocument(Object value, AggregationOperationContext context) { public Document toDocument(Object value, AggregationOperationContext context) {

View File

@@ -99,10 +99,6 @@ public class AddFieldsOperation extends DocumentEnhancingOperation {
return new AddFieldsOperationBuilder(getValueMap()); return new AddFieldsOperationBuilder(getValueMap());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.DocumentEnhancingOperation#mongoOperator()
*/
@Override @Override
protected String mongoOperator() { protected String mongoOperator() {
return "$addFields"; return "$addFields";

View File

@@ -226,8 +226,7 @@ public class Aggregation {
} }
/** /**
* Obtain an {@link AddFieldsOperationBuilder builder} instance to create a new {@link AddFieldsOperation}. * Obtain an {@link AddFieldsOperationBuilder builder} instance to create a new {@link AddFieldsOperation}. <br />
* <br />
* Starting in version 4.2, MongoDB adds a new aggregation pipeline stage {@link AggregationUpdate#set $set} that is * Starting in version 4.2, MongoDB adds a new aggregation pipeline stage {@link AggregationUpdate#set $set} that is
* an alias for {@code $addFields}. * an alias for {@code $addFields}.
* *
@@ -435,18 +434,6 @@ public class Aggregation {
return new SortByCountOperation(groupAndSortExpression); return new SortByCountOperation(groupAndSortExpression);
} }
/**
* Creates a new {@link SkipOperation} skipping the given number of elements.
*
* @param elementsToSkip must not be less than zero.
* @return new instance of {@link SkipOperation}.
* @deprecated prepare to get this one removed in favor of {@link #skip(long)}.
*/
@Deprecated
public static SkipOperation skip(int elementsToSkip) {
return new SkipOperation(elementsToSkip);
}
/** /**
* Creates a new {@link SkipOperation} skipping the given number of elements. * Creates a new {@link SkipOperation} skipping the given number of elements.
* *
@@ -725,8 +712,7 @@ public class Aggregation {
} }
/** /**
* Converts this {@link Aggregation} specification to a {@link Document}. * Converts this {@link Aggregation} specification to a {@link Document}. <br />
* <br />
* MongoDB requires as of 3.6 cursor-based aggregation. Use {@link #toPipeline(AggregationOperationContext)} to render * MongoDB requires as of 3.6 cursor-based aggregation. Use {@link #toPipeline(AggregationOperationContext)} to render
* an aggregation pipeline. * an aggregation pipeline.
* *
@@ -741,10 +727,6 @@ public class Aggregation {
return options.applyAndReturnPotentiallyChangedCommand(command); return options.applyAndReturnPotentiallyChangedCommand(command);
} }
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override @Override
public String toString() { public String toString() {
return SerializationUtils.serializeToJsonSafely(toDocument("__collection__", DEFAULT_CONTEXT)); return SerializationUtils.serializeToJsonSafely(toDocument("__collection__", DEFAULT_CONTEXT));
@@ -788,10 +770,6 @@ public class Aggregation {
return false; return false;
} }
/*
* (non-Javadoc)
* @see java.lang.Enum#toString()
*/
@Override @Override
public String toString() { public String toString() {
return PREFIX.concat(name()); return PREFIX.concat(name());

View File

@@ -1,108 +0,0 @@
/*
* Copyright 2015-2022 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.mongodb.core.aggregation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.bson.Document;
import org.springframework.util.Assert;
/**
* An enum of supported {@link AggregationExpression}s in aggregation pipeline stages.
*
* @author Thomas Darimont
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.7
* @deprecated since 1.10. Please use {@link ArithmeticOperators} and {@link ComparisonOperators} instead.
*/
@Deprecated
public enum AggregationFunctionExpressions {
SIZE, CMP, EQ, GT, GTE, LT, LTE, NE, SUBTRACT, ADD, MULTIPLY;
/**
* Returns an {@link AggregationExpression} build from the current {@link Enum} name and the given parameters.
*
* @param parameters must not be {@literal null}
* @return new instance of {@link AggregationExpression}.
*/
public AggregationExpression of(Object... parameters) {
Assert.notNull(parameters, "Parameters must not be null!");
return new FunctionExpression(name().toLowerCase(), parameters);
}
/**
* An {@link AggregationExpression} representing a function call.
*
* @author Thomas Darimont
* @author Oliver Gierke
* @since 1.7
*/
static class FunctionExpression implements AggregationExpression {
private final String name;
private final List<Object> values;
/**
* Creates a new {@link FunctionExpression} for the given name and values.
*
* @param name must not be {@literal null} or empty.
* @param values must not be {@literal null}.
*/
public FunctionExpression(String name, Object[] values) {
Assert.hasText(name, "Name must not be null!");
Assert.notNull(values, "Values must not be null!");
this.name = name;
this.values = Arrays.asList(values);
}
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.Expression#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override
public Document toDocument(AggregationOperationContext context) {
List<Object> args = new ArrayList<Object>(values.size());
for (Object value : values) {
args.add(unpack(value, context));
}
return new Document("$" + name, args);
}
private static Object unpack(Object value, AggregationOperationContext context) {
if (value instanceof AggregationExpression) {
return ((AggregationExpression) value).toDocument(context);
}
if (value instanceof Field) {
return context.getReference((Field) value).toString();
}
return value;
}
}
}

View File

@@ -80,28 +80,16 @@ class AggregationOperationRenderer {
*/ */
private static class NoOpAggregationOperationContext implements AggregationOperationContext { private static class NoOpAggregationOperationContext implements AggregationOperationContext {
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperationContext#getMappedObject(org.bson.Document, java.lang.Class)
*/
@Override @Override
public Document getMappedObject(Document document, @Nullable Class<?> type) { public Document getMappedObject(Document document, @Nullable Class<?> type) {
return document; return document;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperationContext#getReference(org.springframework.data.mongodb.core.aggregation.ExposedFields.AvailableField)
*/
@Override @Override
public FieldReference getReference(Field field) { public FieldReference getReference(Field field) {
return new DirectFieldReference(new ExposedField(field, true)); return new DirectFieldReference(new ExposedField(field, true));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperationContext#getReference(java.lang.String)
*/
@Override @Override
public FieldReference getReference(String name) { public FieldReference getReference(String name) {
return new DirectFieldReference(new ExposedField(new AggregationField(name), true)); return new DirectFieldReference(new ExposedField(new AggregationField(name), true));

View File

@@ -339,9 +339,6 @@ public class AggregationOptions {
return !maxTime.isZero() && !maxTime.isNegative(); return !maxTime.isZero() && !maxTime.isNegative();
} }
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override @Override
public String toString() { public String toString() {
return toDocument().toJson(); return toDocument().toJson();

View File

@@ -77,10 +77,6 @@ public class AggregationResults<T> implements Iterable<T> {
return mappedResults.size() == 1 ? mappedResults.get(0) : null; return mappedResults.size() == 1 ? mappedResults.get(0) : null;
} }
/*
* (non-Javadoc)
* @see java.lang.Iterable#iterator()
*/
public Iterator<T> iterator() { public Iterator<T> iterator() {
return mappedResults.iterator(); return mappedResults.iterator();
} }

View File

@@ -64,9 +64,6 @@ public class AggregationSpELExpression implements AggregationExpression {
return new AggregationSpELExpression(expressionString, parameters); return new AggregationSpELExpression(expressionString, parameters);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationExpression#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
return (Document) TRANSFORMER.transform(rawExpression, context, parameters); return (Document) TRANSFORMER.transform(rawExpression, context, parameters);

View File

@@ -242,48 +242,26 @@ public class AggregationUpdate extends Aggregation implements UpdateDefinition {
return this; return this;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.query.UpdateDefinition#isIsolated()
*/
@Override @Override
public Boolean isIsolated() { public Boolean isIsolated() {
return isolated; return isolated;
} }
/*
* Returns a update document containing the update pipeline.
* The resulting document needs to be unwrapped to be used with update operations.
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.query.UpdateDefinition#getUpdateObject()
*/
@Override @Override
public Document getUpdateObject() { public Document getUpdateObject() {
return new Document("", toPipeline(Aggregation.DEFAULT_CONTEXT)); return new Document("", toPipeline(Aggregation.DEFAULT_CONTEXT));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.query.UpdateDefinition#modifies(java.lang.String)
*/
@Override @Override
public boolean modifies(String key) { public boolean modifies(String key) {
return keysTouched.contains(key); return keysTouched.contains(key);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.query.UpdateDefinition#inc(java.lang.String)
*/
@Override @Override
public void inc(String key) { public void inc(String key) {
set(new SetOperation(key, ArithmeticOperators.valueOf(key).add(1))); set(new SetOperation(key, ArithmeticOperators.valueOf(key).add(1)));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.query.UpdateDefinition#getArrayFilters()
*/
@Override @Override
public List<ArrayFilter> getArrayFilters() { public List<ArrayFilter> getArrayFilters() {
return Collections.emptyList(); return Collections.emptyList();

View File

@@ -800,6 +800,26 @@ public class ArithmeticOperators {
return usesFieldRef() ? Cosh.coshOf(fieldReference, unit) : Cosh.coshOf(expression, unit); return usesFieldRef() ? Cosh.coshOf(fieldReference, unit) : Cosh.coshOf(expression, unit);
} }
/**
* Creates new {@link AggregationExpression} that calculates the inverse cosine of a numeric value.
*
* @return new instance of {@link ACos}.
* @since 3.4
*/
public ACos acos() {
return usesFieldRef() ? ACos.acosOf(fieldReference) : ACos.acosOf(expression);
}
/**
* Creates new {@link AggregationExpression} that calculates the inverse hyperbolic cosine of a numeric value.
*
* @return new instance of {@link ACosh}.
* @since 3.4
*/
public ACosh acosh() {
return usesFieldRef() ? ACosh.acoshOf(fieldReference) : ACosh.acoshOf(expression);
}
/** /**
* Creates new {@link AggregationExpression} that calculates the tangent of a numeric value given in * Creates new {@link AggregationExpression} that calculates the tangent of a numeric value given in
* {@link AngularUnit#RADIANS radians}. * {@link AngularUnit#RADIANS radians}.
@@ -2462,7 +2482,6 @@ public class ArithmeticOperators {
} }
} }
/** /**
* An {@link AggregationExpression expression} that calculates the cosine of a value that is measured in radians. * An {@link AggregationExpression expression} that calculates the cosine of a value that is measured in radians.
* *
@@ -2665,6 +2684,108 @@ public class ArithmeticOperators {
} }
} }
/**
* An {@link AggregationExpression expression} that calculates the inverse cosine of a value.
*
* @author Divya Srivastava
* @since 3.4
*/
public static class ACos extends AbstractAggregationExpression {
private ACos(Object value) {
super(value);
}
/**
* Creates a new {@link AggregationExpression} that calculates the inverse cosine of a value.
*
* @param fieldReference the name of the {@link Field field} that resolves to a numeric value.
* @return new instance of {@link ACos}.
*/
public static ACos acosOf(String fieldReference) {
Assert.notNull(fieldReference, "FieldReference must not be null!");
return new ACos(Fields.field(fieldReference));
}
/**
* Creates a new {@link AggregationExpression} that calculates the inverse cosine of a value.
* <br />
*
* @param expression the {@link AggregationExpression expression} that resolves to a numeric value.
* @return new instance of {@link ACos}.
*/
public static ACos acosOf(AggregationExpression expression) {
return new ACos(expression);
}
/**
* Creates a new {@link AggregationExpression} that calculates the inverse cosine of a value.
*
* @param value anything ({@link Field field}, {@link AggregationExpression expression}, ...) that resolves to a
* numeric value.
* @return new instance of {@link ACos}.
*/
public static ACos acosOf(Number value) {
return new ACos(value);
}
@Override
protected String getMongoMethod() {
return "$acos";
}
}
/**
* An {@link AggregationExpression expression} that calculates the inverse hyperbolic cosine of a value.
*
* @author Divya Srivastava
* @since 3.4
*/
public static class ACosh extends AbstractAggregationExpression {
private ACosh(Object value) {
super(value);
}
/**
* Creates a new {@link AggregationExpression} that calculates the inverse hyperbolic cosine of a value.
*
* @param fieldReference the name of the {@link Field field} that resolves to a numeric value.
* @return new instance of {@link ACosh}.
*/
public static ACosh acoshOf(String fieldReference) {
return new ACosh(Fields.field(fieldReference));
}
/**
* Creates a new {@link AggregationExpression} that calculates the inverse hyperbolic cosine of a value.
* <br />
*
* @param expression the {@link AggregationExpression expression} that resolves to a numeric value.
* @return new instance of {@link ACosh}.
*/
public static ACosh acoshOf(AggregationExpression expression) {
return new ACosh(expression);
}
/**
* Creates a new {@link AggregationExpression} that calculates the inverse hyperbolic cosine of a value.
*
* @param value anything ({@link Field field}, {@link AggregationExpression expression}, ...) that resolves to a
* numeric value.
* @return new instance of {@link ACosh}.
*/
public static ACosh acoshOf(Object value) {
return new ACosh(value);
}
@Override
protected String getMongoMethod() {
return "$acosh";
}
}
/** /**
* An {@link AggregationExpression expression} that calculates the tangent of a value that is measured in radians. * An {@link AggregationExpression expression} that calculates the tangent of a value that is measured in radians.
* *
@@ -2854,7 +2975,6 @@ public class ArithmeticOperators {
return new ATan2((Collections.singletonList(expression))); return new ATan2((Collections.singletonList(expression)));
} }
/** /**
* Creates a new {@link AggregationExpression} that calculates the inverse tangent of of y / x, where y and x are * Creates a new {@link AggregationExpression} that calculates the inverse tangent of of y / x, where y and x are
* the first and second values passed to the expression respectively. * the first and second values passed to the expression respectively.

View File

@@ -35,6 +35,7 @@ import org.springframework.util.Assert;
* @author Christoph Strobl * @author Christoph Strobl
* @author Mark Paluch * @author Mark Paluch
* @author Shashank Sharma * @author Shashank Sharma
* @author Divya Srivastava
* @since 1.0 * @since 1.0
*/ */
public class ArrayOperators { public class ArrayOperators {
@@ -362,6 +363,38 @@ public class ArrayOperators {
return usesExpression() ? ArrayToObject.arrayValueOfToObject(expression) : ArrayToObject.arrayToObject(values); return usesExpression() ? ArrayToObject.arrayValueOfToObject(expression) : ArrayToObject.arrayToObject(values);
} }
/**
* Creates new {@link AggregationExpression} that return the first element in the associated array.
* <strong>NOTE:</strong> Requires MongoDB 4.4 or later.
*
* @return new instance of {@link First}.
* @since 3.4
*/
public First first() {
if (usesFieldRef()) {
return First.firstOf(fieldReference);
}
return usesExpression() ? First.firstOf(expression) : First.first(values);
}
/**
* Creates new {@link AggregationExpression} that return the last element in the given array.
* <strong>NOTE:</strong> Requires MongoDB 4.4 or later.
*
* @return new instance of {@link Last}.
* @since 3.4
*/
public Last last() {
if (usesFieldRef()) {
return Last.lastOf(fieldReference);
}
return usesExpression() ? Last.lastOf(expression) : Last.last(values);
}
/** /**
* @author Christoph Strobl * @author Christoph Strobl
@@ -612,10 +645,6 @@ public class ArrayOperators {
return new FilterExpressionBuilder().filter(values); return new FilterExpressionBuilder().filter(values);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationExpression#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(final AggregationOperationContext context) { public Document toDocument(final AggregationOperationContext context) {
return toFilter(ExposedFields.from(as), context); return toFilter(ExposedFields.from(as), context);
@@ -736,10 +765,6 @@ public class ArrayOperators {
return new FilterExpressionBuilder(); return new FilterExpressionBuilder();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.InputBuilder#filter(java.util.List)
*/
@Override @Override
public AsBuilder filter(List<?> array) { public AsBuilder filter(List<?> array) {
@@ -748,10 +773,6 @@ public class ArrayOperators {
return this; return this;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.InputBuilder#filter(org.springframework.data.mongodb.core.aggregation.Field)
*/
@Override @Override
public AsBuilder filter(Field field) { public AsBuilder filter(Field field) {
@@ -760,10 +781,6 @@ public class ArrayOperators {
return this; return this;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.AsBuilder#as(java.lang.String)
*/
@Override @Override
public ConditionBuilder as(String variableName) { public ConditionBuilder as(String variableName) {
@@ -772,10 +789,6 @@ public class ArrayOperators {
return this; return this;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.ConditionBuilder#by(org.springframework.data.mongodb.core.aggregation.AggregationExpression)
*/
@Override @Override
public Filter by(AggregationExpression condition) { public Filter by(AggregationExpression condition) {
@@ -784,10 +797,6 @@ public class ArrayOperators {
return filter; return filter;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.ConditionBuilder#by(java.lang.String)
*/
@Override @Override
public Filter by(String expression) { public Filter by(String expression) {
@@ -796,10 +805,6 @@ public class ArrayOperators {
return filter; return filter;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.ConditionBuilder#by(org.bson.Document)
*/
@Override @Override
public Filter by(Document expression) { public Filter by(Document expression) {
@@ -1244,9 +1249,6 @@ public class ArrayOperators {
this.reduceExpressions = reduceExpressions; this.reduceExpressions = reduceExpressions;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationExpression#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
@@ -1433,9 +1435,6 @@ public class ArrayOperators {
}; };
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationExpression#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
return new Document(propertyName, aggregationExpression.toDocument(context)); return new Document(propertyName, aggregationExpression.toDocument(context));
@@ -1803,13 +1802,117 @@ public class ArrayOperators {
return new ArrayToObject(expression); return new ArrayToObject(expression);
} }
@Override
protected String getMongoMethod() {
return "$arrayToObject";
}
}
/**
* {@link AggregationExpression} for {@code $first} that returns the first element in an array. <br />
* <strong>NOTE:</strong> Requires MongoDB 4.4 or later.
*
* @author Divya Srivastava
* @author Christoph Strobl
* @since 3.4
*/
public static class First extends AbstractAggregationExpression {
private First(Object value) {
super(value);
}
/**
* Returns the first element in the given array.
*
* @param array must not be {@literal null}.
* @return new instance of {@link First}.
*/
public static First first(Object array) {
return new First(array);
}
/**
* Returns the first element in the array pointed to by the given {@link Field field reference}.
*
* @param fieldReference must not be {@literal null}.
* @return new instance of {@link First}.
*/
public static First firstOf(String fieldReference) {
return new First(Fields.field(fieldReference));
}
/**
* Returns the first element of the array computed by the given {@link AggregationExpression expression}.
*
* @param expression must not be {@literal null}.
* @return new instance of {@link First}.
*/
public static First firstOf(AggregationExpression expression) {
return new First(expression);
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AbstractAggregationExpression#getMongoMethod() * @see org.springframework.data.mongodb.core.aggregation.AbstractAggregationExpression#getMongoMethod()
*/ */
@Override @Override
protected String getMongoMethod() { protected String getMongoMethod() {
return "$arrayToObject"; return "$first";
}
}
/**
* {@link AggregationExpression} for {@code $last} that returns the last element in an array. <br />
* <strong>NOTE:</strong> Requires MongoDB 4.4 or later.
*
* @author Divya Srivastava
* @author Christoph Strobl
* @since 3.4
*/
public static class Last extends AbstractAggregationExpression {
private Last(Object value) {
super(value);
}
/**
* Returns the last element in the given array.
*
* @param array must not be {@literal null}.
* @return new instance of {@link Last}.
*/
public static Last last(Object array) {
return new Last(array);
}
/**
* Returns the last element in the array pointed to by the given {@link Field field reference}.
*
* @param fieldReference must not be {@literal null}.
* @return new instance of {@link Last}.
*/
public static Last lastOf(String fieldReference) {
return new Last(Fields.field(fieldReference));
}
/**
* Returns the last element of the array computed buy the given {@link AggregationExpression expression}.
*
* @param expression must not be {@literal null}.
* @return new instance of {@link Last}.
*/
public static Last lastOf(AggregationExpression expression) {
return new Last(expression);
}
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AbstractAggregationExpression#getMongoMethod()
*/
@Override
protected String getMongoMethod() {
return "$last";
} }
} }
} }

View File

@@ -88,9 +88,6 @@ public class BucketAutoOperation extends BucketOperationSupport<BucketAutoOperat
this.granularity = granularity; this.granularity = granularity;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
@@ -107,10 +104,6 @@ public class BucketAutoOperation extends BucketOperationSupport<BucketAutoOperat
return new Document(getOperator(), options); return new Document(getOperator(), options);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#getOperator()
*/
@Override @Override
public String getOperator() { public String getOperator() {
return "$bucketAuto"; return "$bucketAuto";
@@ -144,33 +137,21 @@ public class BucketAutoOperation extends BucketOperationSupport<BucketAutoOperat
return new BucketAutoOperation(this, buckets, granularity.getMongoRepresentation()); return new BucketAutoOperation(this, buckets, granularity.getMongoRepresentation());
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport#newBucketOperation(org.springframework.data.mongodb.core.aggregation.BucketOperationSupport.Outputs)
*/
@Override @Override
protected BucketAutoOperation newBucketOperation(Outputs outputs) { protected BucketAutoOperation newBucketOperation(Outputs outputs) {
return new BucketAutoOperation(this, outputs); return new BucketAutoOperation(this, outputs);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport#andOutputExpression(java.lang.String, java.lang.Object[])
*/
@Override @Override
public ExpressionBucketAutoOperationBuilder andOutputExpression(String expression, Object... params) { public ExpressionBucketAutoOperationBuilder andOutputExpression(String expression, Object... params) {
return new ExpressionBucketAutoOperationBuilder(expression, this, params); return new ExpressionBucketAutoOperationBuilder(expression, this, params);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport#andOutput(org.springframework.data.mongodb.core.aggregation.AggregationExpression)
*/
@Override @Override
public BucketAutoOperationOutputBuilder andOutput(AggregationExpression expression) { public BucketAutoOperationOutputBuilder andOutput(AggregationExpression expression) {
return new BucketAutoOperationOutputBuilder(expression, this); return new BucketAutoOperationOutputBuilder(expression, this);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport#andOutput(java.lang.String)
*/
@Override @Override
public BucketAutoOperationOutputBuilder andOutput(String fieldName) { public BucketAutoOperationOutputBuilder andOutput(String fieldName) {
return new BucketAutoOperationOutputBuilder(Fields.field(fieldName), this); return new BucketAutoOperationOutputBuilder(Fields.field(fieldName), this);
@@ -192,9 +173,6 @@ public class BucketAutoOperation extends BucketOperationSupport<BucketAutoOperat
super(value, operation); super(value, operation);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport.OutputBuilder#apply(org.springframework.data.mongodb.core.aggregation.BucketOperationSupport.OperationOutput)
*/
@Override @Override
protected BucketAutoOperationOutputBuilder apply(OperationOutput operationOutput) { protected BucketAutoOperationOutputBuilder apply(OperationOutput operationOutput) {
return new BucketAutoOperationOutputBuilder(operationOutput, this.operation); return new BucketAutoOperationOutputBuilder(operationOutput, this.operation);
@@ -223,9 +201,6 @@ public class BucketAutoOperation extends BucketOperationSupport<BucketAutoOperat
super(expression, operation, parameters); super(expression, operation, parameters);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport.OutputBuilder#apply(org.springframework.data.mongodb.core.aggregation.BucketOperationSupport.OperationOutput)
*/
@Override @Override
protected BucketAutoOperationOutputBuilder apply(OperationOutput operationOutput) { protected BucketAutoOperationOutputBuilder apply(OperationOutput operationOutput) {
return new BucketAutoOperationOutputBuilder(operationOutput, this.operation); return new BucketAutoOperationOutputBuilder(operationOutput, this.operation);
@@ -270,9 +245,6 @@ public class BucketAutoOperation extends BucketOperationSupport<BucketAutoOperat
this.granularity = granularity; this.granularity = granularity;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.GranularitytoMongoGranularity()
*/
@Override @Override
public String getMongoRepresentation() { public String getMongoRepresentation() {
return granularity; return granularity;

View File

@@ -84,9 +84,6 @@ public class BucketOperation extends BucketOperationSupport<BucketOperation, Buc
this.defaultBucket = defaultBucket; this.defaultBucket = defaultBucket;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
@@ -103,10 +100,6 @@ public class BucketOperation extends BucketOperationSupport<BucketOperation, Buc
return new Document(getOperator(), options); return new Document(getOperator(), options);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#getOperator()
*/
@Override @Override
public String getOperator() { public String getOperator() {
return "$bucket"; return "$bucket";
@@ -143,33 +136,21 @@ public class BucketOperation extends BucketOperationSupport<BucketOperation, Buc
return new BucketOperation(this, newBoundaries, defaultBucket); return new BucketOperation(this, newBoundaries, defaultBucket);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport#newBucketOperation(org.springframework.data.mongodb.core.aggregation.BucketOperationSupport.Outputs)
*/
@Override @Override
protected BucketOperation newBucketOperation(Outputs outputs) { protected BucketOperation newBucketOperation(Outputs outputs) {
return new BucketOperation(this, outputs); return new BucketOperation(this, outputs);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport#andOutputExpression(java.lang.String, java.lang.Object[])
*/
@Override @Override
public ExpressionBucketOperationBuilder andOutputExpression(String expression, Object... params) { public ExpressionBucketOperationBuilder andOutputExpression(String expression, Object... params) {
return new ExpressionBucketOperationBuilder(expression, this, params); return new ExpressionBucketOperationBuilder(expression, this, params);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport#andOutput(org.springframework.data.mongodb.core.aggregation.AggregationExpression)
*/
@Override @Override
public BucketOperationOutputBuilder andOutput(AggregationExpression expression) { public BucketOperationOutputBuilder andOutput(AggregationExpression expression) {
return new BucketOperationOutputBuilder(expression, this); return new BucketOperationOutputBuilder(expression, this);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport#andOutput(java.lang.String)
*/
@Override @Override
public BucketOperationOutputBuilder andOutput(String fieldName) { public BucketOperationOutputBuilder andOutput(String fieldName) {
return new BucketOperationOutputBuilder(Fields.field(fieldName), this); return new BucketOperationOutputBuilder(Fields.field(fieldName), this);
@@ -191,9 +172,6 @@ public class BucketOperation extends BucketOperationSupport<BucketOperation, Buc
super(value, operation); super(value, operation);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport.OutputBuilder#apply(org.springframework.data.mongodb.core.aggregation.BucketOperationSupport.OperationOutput)
*/
@Override @Override
protected BucketOperationOutputBuilder apply(OperationOutput operationOutput) { protected BucketOperationOutputBuilder apply(OperationOutput operationOutput) {
return new BucketOperationOutputBuilder(operationOutput, this.operation); return new BucketOperationOutputBuilder(operationOutput, this.operation);
@@ -221,9 +199,6 @@ public class BucketOperation extends BucketOperationSupport<BucketOperation, Buc
super(expression, operation, parameters); super(expression, operation, parameters);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport.OutputBuilder#apply(org.springframework.data.mongodb.core.aggregation.BucketOperationSupport.OperationOutput)
*/
@Override @Override
protected BucketOperationOutputBuilder apply(OperationOutput operationOutput) { protected BucketOperationOutputBuilder apply(OperationOutput operationOutput) {
return new BucketOperationOutputBuilder(operationOutput, this.operation); return new BucketOperationOutputBuilder(operationOutput, this.operation);

View File

@@ -141,9 +141,6 @@ public abstract class BucketOperationSupport<T extends BucketOperationSupport<T,
}); });
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
@@ -159,9 +156,6 @@ public abstract class BucketOperationSupport<T extends BucketOperationSupport<T,
return document; return document;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.FieldsExposingAggregationOperation#getFields()
*/
@Override @Override
public ExposedFields getFields() { public ExposedFields getFields() {
return outputs.asExposedFields(); return outputs.asExposedFields();
@@ -454,9 +448,6 @@ public abstract class BucketOperationSupport<T extends BucketOperationSupport<T,
return outputs.isEmpty(); return outputs.isEmpty();
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationExpression#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
@@ -540,10 +531,6 @@ public abstract class BucketOperationSupport<T extends BucketOperationSupport<T,
this.values = operationOutput.values; this.values = operationOutput.values;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ProjectionOperation.Projection#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
@@ -636,9 +623,6 @@ public abstract class BucketOperationSupport<T extends BucketOperationSupport<T,
this.params = parameters.clone(); this.params = parameters.clone();
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport.Output#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
return (Document) TRANSFORMER.transform(expression, context, params); return (Document) TRANSFORMER.transform(expression, context, params);
@@ -665,9 +649,6 @@ public abstract class BucketOperationSupport<T extends BucketOperationSupport<T,
this.expression = expression; this.expression = expression;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.BucketOperationSupport.Output#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
return expression.toDocument(context); return expression.toDocument(context);

View File

@@ -275,10 +275,6 @@ public class ConditionalOperators {
return new IfNullOperatorBuilder().ifNull(expression); return new IfNullOperatorBuilder().ifNull(expression);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationExpression#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
@@ -408,9 +404,6 @@ public class ConditionalOperators {
return new IfNullOperatorBuilder(); return new IfNullOperatorBuilder();
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.IfNull.IfNullBuilder#ifNull(java.lang.String)
*/
public ThenBuilder ifNull(String fieldReference) { public ThenBuilder ifNull(String fieldReference) {
Assert.hasText(fieldReference, "FieldReference name must not be null or empty!"); Assert.hasText(fieldReference, "FieldReference name must not be null or empty!");
@@ -418,9 +411,6 @@ public class ConditionalOperators {
return this; return this;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.IfNull.IfNullBuilder#ifNull(org.springframework.data.mongodb.core.aggregation.AggregationExpression)
*/
@Override @Override
public ThenBuilder ifNull(AggregationExpression expression) { public ThenBuilder ifNull(AggregationExpression expression) {
@@ -439,25 +429,16 @@ public class ConditionalOperators {
return ifNull(expression); return ifNull(expression);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.IfNull.ThenBuilder#then(java.lang.Object)
*/
public IfNull then(Object value) { public IfNull then(Object value) {
return new IfNull(conditions, value); return new IfNull(conditions, value);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.IfNull.ThenBuilder#thenValueOf(java.lang.String)
*/
public IfNull thenValueOf(String fieldReference) { public IfNull thenValueOf(String fieldReference) {
Assert.notNull(fieldReference, "FieldReference must not be null!"); Assert.notNull(fieldReference, "FieldReference must not be null!");
return new IfNull(conditions, Fields.field(fieldReference)); return new IfNull(conditions, Fields.field(fieldReference));
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.IfNull.ThenBuilder#thenValueOf(org.springframework.data.mongodb.core.aggregation.AggregationExpression)
*/
public IfNull thenValueOf(AggregationExpression expression) { public IfNull thenValueOf(AggregationExpression expression) {
Assert.notNull(expression, "Expression must not be null!"); Assert.notNull(expression, "Expression must not be null!");
@@ -543,9 +524,6 @@ public class ConditionalOperators {
}; };
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationExpression#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
@@ -633,10 +611,6 @@ public class ConditionalOperators {
this.otherwiseValue = otherwiseValue; this.otherwiseValue = otherwiseValue;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationExpression#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
@@ -915,9 +889,6 @@ public class ConditionalOperators {
return new ConditionalExpressionBuilder(); return new ConditionalExpressionBuilder();
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.WhenBuilder#when(org.bson.Document)
*/
@Override @Override
public ConditionalExpressionBuilder when(Document booleanExpression) { public ConditionalExpressionBuilder when(Document booleanExpression) {
@@ -927,9 +898,6 @@ public class ConditionalOperators {
return this; return this;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.WhenBuilder#when(org.springframework.data.mongodb.core.query.CriteriaDefinition)
*/
@Override @Override
public ThenBuilder when(CriteriaDefinition criteria) { public ThenBuilder when(CriteriaDefinition criteria) {
@@ -938,9 +906,6 @@ public class ConditionalOperators {
return this; return this;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.WhenBuilder#when(org.springframework.data.mongodb.core.aggregation.AggregationExpression)
*/
@Override @Override
public ThenBuilder when(AggregationExpression expression) { public ThenBuilder when(AggregationExpression expression) {
@@ -949,9 +914,6 @@ public class ConditionalOperators {
return this; return this;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.WhenBuilder#when(java.lang.String)
*/
@Override @Override
public ThenBuilder when(String booleanField) { public ThenBuilder when(String booleanField) {
@@ -960,9 +922,6 @@ public class ConditionalOperators {
return this; return this;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.ThenBuilder#then(java.lang.Object)
*/
@Override @Override
public OtherwiseBuilder then(Object thenValue) { public OtherwiseBuilder then(Object thenValue) {
@@ -971,9 +930,6 @@ public class ConditionalOperators {
return this; return this;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.ThenBuilder#thenValueOf(java.lang.String)
*/
@Override @Override
public OtherwiseBuilder thenValueOf(String fieldReference) { public OtherwiseBuilder thenValueOf(String fieldReference) {
@@ -982,9 +938,6 @@ public class ConditionalOperators {
return this; return this;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.ThenBuilder#thenValueOf(org.springframework.data.mongodb.core.aggregation.AggregationExpression)
*/
@Override @Override
public OtherwiseBuilder thenValueOf(AggregationExpression expression) { public OtherwiseBuilder thenValueOf(AggregationExpression expression) {
@@ -993,9 +946,6 @@ public class ConditionalOperators {
return this; return this;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.OtherwiseBuilder#otherwise(java.lang.Object)
*/
@Override @Override
public Cond otherwise(Object otherwiseValue) { public Cond otherwise(Object otherwiseValue) {
@@ -1003,9 +953,6 @@ public class ConditionalOperators {
return new Cond(condition, thenValue, otherwiseValue); return new Cond(condition, thenValue, otherwiseValue);
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.OtherwiseBuilder#otherwiseValueOf(java.lang.String)
*/
@Override @Override
public Cond otherwiseValueOf(String fieldReference) { public Cond otherwiseValueOf(String fieldReference) {
@@ -1013,9 +960,6 @@ public class ConditionalOperators {
return new Cond(condition, thenValue, Fields.field(fieldReference)); return new Cond(condition, thenValue, Fields.field(fieldReference));
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.OtherwiseBuilder#otherwiseValueOf(org.springframework.data.mongodb.core.aggregation.AggregationExpression)
*/
@Override @Override
public Cond otherwiseValueOf(AggregationExpression expression) { public Cond otherwiseValueOf(AggregationExpression expression) {

View File

@@ -43,9 +43,6 @@ public class CountOperation implements FieldsExposingAggregationOperation {
this.fieldName = fieldName; this.fieldName = fieldName;
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
return new Document(getOperator(), fieldName); return new Document(getOperator(), fieldName);
@@ -56,9 +53,6 @@ public class CountOperation implements FieldsExposingAggregationOperation {
return "$count"; return "$count";
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.FieldsExposingAggregationOperation#getFields()
*/
@Override @Override
public ExposedFields getFields() { public ExposedFields getFields() {
return ExposedFields.from(new ExposedField(fieldName, true)); return ExposedFields.from(new ExposedField(fieldName, true));

View File

@@ -91,8 +91,7 @@ public class DateOperators {
} }
/** /**
* Take the given value as date. * Take the given value as date. <br />
* <br />
* This can be one of: * This can be one of:
* <ul> * <ul>
* <li>{@link java.util.Date}</li> * <li>{@link java.util.Date}</li>
@@ -190,7 +189,7 @@ public class DateOperators {
* representing an Olson Timezone Identifier or UTC Offset. * representing an Olson Timezone Identifier or UTC Offset.
* *
* @param value the plain timezone {@link String}, a {@link Field} holding the timezone or an * @param value the plain timezone {@link String}, a {@link Field} holding the timezone or an
* {@link AggregationExpression} resulting in the timezone. * {@link AggregationExpression} resulting in the timezone.
* @return new instance of {@link Timezone}. * @return new instance of {@link Timezone}.
*/ */
public static Timezone valueOf(Object value) { public static Timezone valueOf(Object value) {
@@ -333,8 +332,7 @@ public class DateOperators {
} }
/** /**
* Creates new {@link DateOperatorFactory} for given {@code value} that resolves to a Date. * Creates new {@link DateOperatorFactory} for given {@code value} that resolves to a Date. <br />
* <br />
* <ul> * <ul>
* <li>{@link java.util.Date}</li> * <li>{@link java.util.Date}</li>
* <li>{@link java.util.Calendar}</li> * <li>{@link java.util.Calendar}</li>
@@ -2088,20 +2086,6 @@ public class DateOperators {
return second(expression); return second(expression);
} }
/**
* Set the {@literal millisecond} to the given value which must resolve to a value in range {@code 0 - 999}. Can be
* a simple value, {@link Field field reference} or {@link AggregationExpression expression}.
*
* @param millisecond must not be {@literal null}.
* @return new instance.
* @throws IllegalArgumentException if given {@literal millisecond} is {@literal null}
* @deprecated since 3.2, use {@link #millisecond(Object)} instead.
*/
@Deprecated
default T milliseconds(Object millisecond) {
return millisecond(millisecond);
}
/** /**
* Set the {@literal millisecond} to the given value which must resolve to a value in range {@code 0 - 999}. Can be * Set the {@literal millisecond} to the given value which must resolve to a value in range {@code 0 - 999}. Can be
* a simple value, {@link Field field reference} or {@link AggregationExpression expression}. * a simple value, {@link Field field reference} or {@link AggregationExpression expression}.
@@ -2113,19 +2097,6 @@ public class DateOperators {
*/ */
T millisecond(Object millisecond); T millisecond(Object millisecond);
/**
* Set the {@literal millisecond} to the value resolved by following the given {@link Field field reference}.
*
* @param fieldReference must not be {@literal null}.
* @return new instance.
* @throws IllegalArgumentException if given {@literal fieldReference} is {@literal null}.
* @deprecated since 3.2,use {@link #millisecondOf(String)} instead.
*/
@Deprecated
default T millisecondsOf(String fieldReference) {
return millisecondOf(fieldReference);
}
/** /**
* Set the {@literal millisecond} to the value resolved by following the given {@link Field field reference}. * Set the {@literal millisecond} to the value resolved by following the given {@link Field field reference}.
* *
@@ -2135,20 +2106,7 @@ public class DateOperators {
* @since 3.2 * @since 3.2
*/ */
default T millisecondOf(String fieldReference) { default T millisecondOf(String fieldReference) {
return milliseconds(Fields.field(fieldReference)); return millisecond(Fields.field(fieldReference));
}
/**
* Set the {@literal millisecond} to the result of the given {@link AggregationExpression expression}.
*
* @param expression must not be {@literal null}.
* @return new instance.
* @throws IllegalArgumentException if given {@literal expression} is {@literal null}.
* @deprecated since 3.2, use {@link #millisecondOf(AggregationExpression)} instead.
*/
@Deprecated
default T millisecondsOf(AggregationExpression expression) {
return millisecondOf(expression);
} }
/** /**
@@ -2160,7 +2118,7 @@ public class DateOperators {
* @since 3.2 * @since 3.2
*/ */
default T millisecondOf(AggregationExpression expression) { default T millisecondOf(AggregationExpression expression) {
return milliseconds(expression); return millisecond(expression);
} }
} }
@@ -2171,7 +2129,7 @@ public class DateOperators {
* @author Matt Morrissette * @author Matt Morrissette
* @author Christoph Strobl * @author Christoph Strobl
* @see <a href= * @see <a href=
* "https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromParts/">https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromParts/</a> * "https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromParts/">https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromParts/</a>
* @since 2.1 * @since 2.1
*/ */
public static class DateFromParts extends TimezonedDateAggregationExpression implements DateParts<DateFromParts> { public static class DateFromParts extends TimezonedDateAggregationExpression implements DateParts<DateFromParts> {
@@ -2346,7 +2304,7 @@ public class DateOperators {
* @author Matt Morrissette * @author Matt Morrissette
* @author Christoph Strobl * @author Christoph Strobl
* @see <a href= * @see <a href=
* "https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromParts/">https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromParts/</a> * "https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromParts/">https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromParts/</a>
* @since 2.1 * @since 2.1
*/ */
public static class IsoDateFromParts extends TimezonedDateAggregationExpression public static class IsoDateFromParts extends TimezonedDateAggregationExpression
@@ -2522,7 +2480,7 @@ public class DateOperators {
* @author Matt Morrissette * @author Matt Morrissette
* @author Christoph Strobl * @author Christoph Strobl
* @see <a href= * @see <a href=
* "https://docs.mongodb.com/manual/reference/operator/aggregation/dateToParts/">https://docs.mongodb.com/manual/reference/operator/aggregation/dateToParts/</a> * "https://docs.mongodb.com/manual/reference/operator/aggregation/dateToParts/">https://docs.mongodb.com/manual/reference/operator/aggregation/dateToParts/</a>
* @since 2.1 * @since 2.1
*/ */
public static class DateToParts extends TimezonedDateAggregationExpression { public static class DateToParts extends TimezonedDateAggregationExpression {
@@ -2603,7 +2561,7 @@ public class DateOperators {
* @author Matt Morrissette * @author Matt Morrissette
* @author Christoph Strobl * @author Christoph Strobl
* @see <a href= * @see <a href=
* "https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromString/">https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromString/</a> * "https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromString/">https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromString/</a>
* @since 2.1 * @since 2.1
*/ */
public static class DateFromString extends TimezonedDateAggregationExpression { public static class DateFromString extends TimezonedDateAggregationExpression {

View File

@@ -46,10 +46,6 @@ abstract class DocumentEnhancingOperation implements InheritsFieldsAggregationOp
} }
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
@@ -71,10 +67,6 @@ abstract class DocumentEnhancingOperation implements InheritsFieldsAggregationOp
*/ */
protected abstract String mongoOperator(); protected abstract String mongoOperator();
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#getOperator()
*/
@Override @Override
public String getOperator() { public String getOperator() {
return mongoOperator(); return mongoOperator();
@@ -87,10 +79,6 @@ abstract class DocumentEnhancingOperation implements InheritsFieldsAggregationOp
return this.valueMap; return this.valueMap;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.FieldsExposingAggregationOperation#getFields()
*/
@Override @Override
public ExposedFields getFields() { public ExposedFields getFields() {
return exposedFields; return exposedFields;

View File

@@ -209,10 +209,6 @@ public final class ExposedFields implements Iterable<ExposedField> {
return originalFields.size() + syntheticFields.size(); return originalFields.size() + syntheticFields.size();
} }
/*
* (non-Javadoc)
* @see java.lang.Iterable#iterator()
*/
@Override @Override
public Iterator<ExposedField> iterator() { public Iterator<ExposedField> iterator() {
@@ -260,28 +256,16 @@ public final class ExposedFields implements Iterable<ExposedField> {
this.synthetic = synthetic; this.synthetic = synthetic;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.Field#getKey()
*/
@Override @Override
public String getName() { public String getName() {
return field.getName(); return field.getName();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.Field#getTarget()
*/
@Override @Override
public String getTarget() { public String getTarget() {
return field.getTarget(); return field.getTarget();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.Field#isAliased()
*/
@Override @Override
public boolean isAliased() { public boolean isAliased() {
return field.isAliased(); return field.isAliased();
@@ -304,19 +288,11 @@ public final class ExposedFields implements Iterable<ExposedField> {
return getName().equals(name) || getTarget().equals(name); return getName().equals(name) || getTarget().equals(name);
} }
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override @Override
public String toString() { public String toString() {
return String.format("AggregationField: %s, synthetic: %s", field, synthetic); return String.format("AggregationField: %s, synthetic: %s", field, synthetic);
} }
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
@@ -333,10 +309,6 @@ public final class ExposedFields implements Iterable<ExposedField> {
return this.field.equals(that.field) && this.synthetic == that.synthetic; return this.field.equals(that.field) && this.synthetic == that.synthetic;
} }
/*
* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override @Override
public int hashCode() { public int hashCode() {
@@ -394,28 +366,16 @@ public final class ExposedFields implements Iterable<ExposedField> {
this.field = field; this.field = field;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference#getRaw()
*/
public String getRaw() { public String getRaw() {
String target = field.getTarget(); String target = field.getTarget();
return field.synthetic ? target : String.format("%s.%s", Fields.UNDERSCORE_ID, target); return field.synthetic ? target : String.format("%s.%s", Fields.UNDERSCORE_ID, target);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference#getReferenceValue()
*/
public Object getReferenceValue() { public Object getReferenceValue() {
return field.synthetic && !field.isAliased() ? 1 : toString(); return field.synthetic && !field.isAliased() ? 1 : toString();
} }
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override @Override
public String toString() { public String toString() {
@@ -426,10 +386,6 @@ public final class ExposedFields implements Iterable<ExposedField> {
return String.format("$%s", getRaw()); return String.format("$%s", getRaw());
} }
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
@@ -446,10 +402,6 @@ public final class ExposedFields implements Iterable<ExposedField> {
return this.field.equals(that.field); return this.field.equals(that.field);
} }
/*
* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override @Override
public int hashCode() { public int hashCode() {
return field.hashCode(); return field.hashCode();
@@ -475,19 +427,11 @@ public final class ExposedFields implements Iterable<ExposedField> {
delegate = field; delegate = field;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference#getRaw()
*/
@Override @Override
public String getRaw() { public String getRaw() {
return delegate.getRaw(); return delegate.getRaw();
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference#getReferenceValue()
*/
@Override @Override
public Object getReferenceValue() { public Object getReferenceValue() {
return delegate.getReferenceValue(); return delegate.getReferenceValue();

View File

@@ -54,19 +54,11 @@ class ExposedFieldsAggregationOperationContext implements AggregationOperationCo
this.rootContext = rootContext; this.rootContext = rootContext;
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperationContext#getMappedObject(org.bson.Document, java.lang.Class)
*/
@Override @Override
public Document getMappedObject(Document document, @Nullable Class<?> type) { public Document getMappedObject(Document document, @Nullable Class<?> type) {
return rootContext.getMappedObject(document, type); return rootContext.getMappedObject(document, type);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperationContext#getReference(org.springframework.data.mongodb.core.aggregation.ExposedFields.AvailableField)
*/
@Override @Override
public FieldReference getReference(Field field) { public FieldReference getReference(Field field) {
@@ -77,19 +69,11 @@ class ExposedFieldsAggregationOperationContext implements AggregationOperationCo
return getReference(field, field.getTarget()); return getReference(field, field.getTarget());
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperationContext#getReference(java.lang.String)
*/
@Override @Override
public FieldReference getReference(String name) { public FieldReference getReference(String name) {
return getReference(null, name); return getReference(null, name);
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperationContext#getFields(java.lang.Class)
*/
@Override @Override
public Fields getFields(Class<?> type) { public Fields getFields(Class<?> type) {
return rootContext.getFields(type); return rootContext.getFields(type);

View File

@@ -78,26 +78,16 @@ public class FacetOperation implements FieldsExposingAggregationOperation {
return new FacetOperationBuilder(facets, Arrays.asList(operations)); return new FacetOperationBuilder(facets, Arrays.asList(operations));
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override @Override
public Document toDocument(AggregationOperationContext context) { public Document toDocument(AggregationOperationContext context) {
return new Document(getOperator(), facets.toDocument(context)); return new Document(getOperator(), facets.toDocument(context));
} }
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#getOperator()
*/
@Override @Override
public String getOperator() { public String getOperator() {
return "$facet"; return "$facet";
} }
/* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.FieldsExposingAggregationOperation#getFields()
*/
@Override @Override
public ExposedFields getFields() { public ExposedFields getFields() {
return facets.asExposedFields(); return facets.asExposedFields();

Some files were not shown because too many files have changed in this diff Show More