From 9080685591f2f77a0a070f1f0a31d1fdb5a37972 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 12 Aug 2019 10:18:34 +0200 Subject: [PATCH] #521 - Add example for type-safe Kotlin MongoDB query DSL. Original pull request: #522. --- README.md | 2 +- mongodb/kotlin/README.md | 9 +++ .../mongodb/people/MongoDslTests.kt | 70 +++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 mongodb/kotlin/src/test/kotlin/example/springdata/mongodb/people/MongoDslTests.kt diff --git a/README.md b/README.md index 3129fa02..a9ea2d51 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ We have separate folders for the samples of individual modules: * `geo-json` - Example project showing usage of [GeoJSON](http://geojson.org) with MongoDB. * `gridfs` - Example project showing usage of gridFS with MongoDB. * `java8` - Example of how to use Spring Data MongoDB with Java 8 date time types as well as the usage of `Optional` as return type for repository methods. Note, this project requires to be build with JDK 8. -* `kotlin` - Example for using Cassandra with MongoDB. +* `kotlin` - Example for using [Kotlin](https://kotlinlang.org/) with MongoDB. * `query-by-example` - Example project showing usage of Query by Example with MongoDB. * `querydsl` - Example project showing imperative and reactive [Querydsl](https://github.com/querydsl/querydsl) support for MongoDB. * `reactive` - Example project to show reactive template and repository support. diff --git a/mongodb/kotlin/README.md b/mongodb/kotlin/README.md index 08ff9464..ff01904d 100644 --- a/mongodb/kotlin/README.md +++ b/mongodb/kotlin/README.md @@ -54,3 +54,12 @@ interface PersonRepository : CrudRepository { fun findOneByFirstname(firstname: String): Person } ``` + +## Type-Safe Kotlin Mongo Query DSL + +Using the `Criteria` extensions allows to write type-safe queries via an ideomatic API. + +```kotlin +operations.find(Query(Person::firstname isEqualTo "Tyrion")) +``` + diff --git a/mongodb/kotlin/src/test/kotlin/example/springdata/mongodb/people/MongoDslTests.kt b/mongodb/kotlin/src/test/kotlin/example/springdata/mongodb/people/MongoDslTests.kt new file mode 100644 index 00000000..2186e0b4 --- /dev/null +++ b/mongodb/kotlin/src/test/kotlin/example/springdata/mongodb/people/MongoDslTests.kt @@ -0,0 +1,70 @@ +/* + * Copyright 2019 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 example.springdata.mongodb.people; + +import org.assertj.core.api.Assertions.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.data.mongodb.core.MongoOperations +import org.springframework.data.mongodb.core.dropCollection +import org.springframework.data.mongodb.core.find +import org.springframework.data.mongodb.core.insert +import org.springframework.data.mongodb.core.query.Criteria +import org.springframework.data.mongodb.core.query.Query +import org.springframework.data.mongodb.core.query.isEqualTo +import org.springframework.data.mongodb.core.query.regex +import org.springframework.test.context.junit4.SpringRunner + +/** + * @author Christoph Strobl + */ +@RunWith(SpringRunner::class) +@SpringBootTest +class MongoDslTests { + + @Autowired + lateinit var operations: MongoOperations + + @Before + fun before() { + operations.dropCollection() + } + + @Test + fun `simple type-safe find`() { + + operations.insert().one(Person("Tyrion", "Lannister")) + operations.insert().one(Person("Cersei", "Lannister")) + + val people = operations.find(Query(Person::firstname isEqualTo "Tyrion")) + assertThat(people).hasSize(1).extracting("firstname").containsOnly("Tyrion") + } + + @Test + fun `more complex type-safe find`() { + + operations.insert().one(Person("Tyrion", "Lannister")) + operations.insert().one(Person("Cersei", "Lannister")) + + val people = operations.find(Query( // + Criteria().andOperator(Person::lastname isEqualTo "Lannister", Person::firstname regex "^Cer.*") // + )) + assertThat(people).hasSize(1).extracting("firstname").containsOnly("Cersei") + } +}