Skip to content

Commit a1fe183

Browse files
(DOCSP-29167): Kotlin Flow docs (#49)
# Pull Request Info Kotlin Flow docs [PR Reviewing Guidelines](https://github.com/mongodb/docs-java/blob/master/REVIEWING.md) JIRA - https://jira.mongodb.org/browse/DOCSP-29167 Staging - https://docs-mongodbcom-staging.corp.mongodb.com/kotlin/docsworker-xlarge/DOCSP-29167/fundamentals/crud/read-operations/flow ## Self-Review Checklist - [ ] Is this free of any warnings or errors in the RST? - [ ] Did you run a spell-check? - [ ] Did you run a grammar-check? - [ ] Are all the links working? --------- Co-authored-by: cbullinger <[email protected]>
1 parent 7f2eab1 commit a1fe183

15 files changed

+303
-291
lines changed

examples/src/test/kotlin/FlowTest.kt

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
2+
3+
import com.mongodb.ExplainVerbosity
4+
import com.mongodb.kotlin.client.coroutine.MongoClient
5+
import config.getConfig
6+
import kotlinx.coroutines.flow.*
7+
import kotlinx.coroutines.runBlocking
8+
import org.bson.Document
9+
import org.junit.jupiter.api.AfterAll
10+
import org.junit.jupiter.api.Assertions.*
11+
import org.junit.jupiter.api.BeforeAll
12+
import org.junit.jupiter.api.TestInstance
13+
import java.util.*
14+
import kotlin.test.*
15+
16+
17+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
18+
internal class FlowTest {
19+
20+
data class PaintOrder(
21+
val id: Int,
22+
val color: String,
23+
val qty: Int
24+
)
25+
companion object {
26+
val config = getConfig()
27+
val client = MongoClient.create(config.connectionUri)
28+
val database = client.getDatabase("paint_store")
29+
val collection = database.getCollection<PaintOrder>("paint_order")
30+
31+
@BeforeAll
32+
@JvmStatic
33+
fun beforeAll() {
34+
runBlocking {
35+
collection.insertMany(listOf(
36+
PaintOrder(1, "red", 5),
37+
PaintOrder(2, "purple", 8),
38+
PaintOrder(3, "yellow", 0),
39+
PaintOrder(4, "green", 6),
40+
PaintOrder(5, "pink", 0)
41+
))
42+
}
43+
}
44+
45+
@AfterAll
46+
@JvmStatic
47+
fun afterAll() {
48+
runBlocking {
49+
collection.drop()
50+
client.close()
51+
}
52+
}
53+
}
54+
55+
@Test
56+
fun firstOrNullTest() = runBlocking {
57+
// :snippet-start: firstOrNull
58+
val resultsFlow = collection.find()
59+
val firstResultOrNull = resultsFlow.firstOrNull()
60+
// :snippet-end:
61+
assertNotNull(firstResultOrNull)
62+
}
63+
@Test
64+
fun firstTest() = runBlocking {
65+
var isReached = false
66+
// :snippet-start: first
67+
try {
68+
val resultsFlow = collection.find()
69+
val firstResult = resultsFlow.first()
70+
isReached = true // :remove:
71+
} catch (e: NoSuchElementException) {
72+
println("No results found")
73+
}
74+
// :snippet-end:
75+
assert(isReached)
76+
}
77+
78+
@Test
79+
fun countTest() = runBlocking {
80+
// :snippet-start: count
81+
val resultsFlow = collection.find()
82+
val count = resultsFlow.count()
83+
// :snippet-end:
84+
assertEquals(5, count)
85+
}
86+
87+
@Test
88+
fun toListTest() = runBlocking {
89+
// :snippet-start: toList
90+
val resultsFlow = collection.find()
91+
val results = resultsFlow.toList()
92+
// :snippet-end:
93+
assertEquals(5, results.size)
94+
}
95+
96+
@Test
97+
fun iterateTest() = runBlocking {
98+
// :snippet-start: iterate
99+
val resultsFlow = collection.find()
100+
resultsFlow.collect { println(it) }
101+
// :snippet-end:
102+
assertEquals(5, resultsFlow.count())
103+
}
104+
105+
@Test
106+
fun explainTest() = runBlocking {
107+
// :snippet-start: explain
108+
val explanation = collection.find().explain(ExplainVerbosity.EXECUTION_STATS)
109+
val jsonSummary = explanation.getEmbedded(
110+
listOf("queryPlanner", "winningPlan"),
111+
Document::class.java
112+
).toJson()
113+
println(jsonSummary)
114+
// :snippet-end:
115+
val expected = """{"stage": "COLLSCAN", "direction": "forward"}
116+
""".trimIndent()
117+
assertEquals(expected, jsonSummary)
118+
}
119+
}
120+

examples/src/test/kotlin/TimeSeriesTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.mongodb.client.model.Filters.*
55
import com.mongodb.client.model.Projections.*
66
import com.mongodb.client.model.TimeSeriesOptions
77
import com.mongodb.kotlin.client.coroutine.MongoClient
8-
import io.github.cdimascio.dotenv.dotenv
8+
import config.getConfig
99
import kotlinx.coroutines.flow.toList
1010
import kotlinx.coroutines.runBlocking
1111
import org.bson.json.JsonWriterSettings
@@ -20,8 +20,8 @@ import kotlin.test.*
2020
internal class TimeSeriesTest {
2121

2222
companion object {
23-
val dotenv = dotenv()
24-
val mongoClient = MongoClient.create(dotenv["MONGODB_CONNECTION_URI"])
23+
val config = getConfig()
24+
val mongoClient = MongoClient.create(config.connectionUri)
2525

2626
@AfterAll
2727
@JvmStatic
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
val resultsFlow = collection.find()
2+
val count = resultsFlow.count()
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
val explanation = collection.find().explain(ExplainVerbosity.EXECUTION_STATS)
2+
val jsonSummary = explanation.getEmbedded(
3+
listOf("queryPlanner", "winningPlan"),
4+
Document::class.java
5+
).toJson()
6+
println(jsonSummary)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
try {
2+
val resultsFlow = collection.find()
3+
val firstResult = resultsFlow.first()
4+
} catch (e: NoSuchElementException) {
5+
println("No results found")
6+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
val resultsFlow = collection.find()
2+
val firstResultOrNull = resultsFlow.firstOrNull()
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
val resultsFlow = collection.find()
2+
resultsFlow.collect { println(it) }
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
val resultsFlow = collection.find()
2+
val results = resultsFlow.toList()

source/fundamentals/crud/read-operations.txt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Read Operations
55
.. default-domain:: mongodb
66

77
- :doc:`/fundamentals/crud/read-operations/retrieve`
8+
- :doc:`/fundamentals/crud/read-operations/flow`
89
- :doc:`/fundamentals/crud/read-operations/change-streams`
910
- :doc:`/fundamentals/crud/read-operations/sort`
1011
- :doc:`/fundamentals/crud/read-operations/skip`
@@ -13,20 +14,15 @@ Read Operations
1314
- :doc:`/fundamentals/crud/read-operations/geo`
1415
- :doc:`/fundamentals/crud/read-operations/text`
1516

16-
.. TODO:(DOCSP-29167) add back when refactor cursor page to flow page
17-
.. - :doc:`/fundamentals/crud/read-operations/cursor`
18-
1917
.. toctree::
2018
:caption: Read Operations
2119

2220
/fundamentals/crud/read-operations/retrieve
21+
/fundamentals/crud/read-operations/flow
2322
/fundamentals/crud/read-operations/change-streams
2423
/fundamentals/crud/read-operations/sort
2524
/fundamentals/crud/read-operations/skip
2625
/fundamentals/crud/read-operations/limit
2726
/fundamentals/crud/read-operations/project
2827
/fundamentals/crud/read-operations/geo
2928
/fundamentals/crud/read-operations/text
30-
31-
.. TODO:(DOCSP-29167) add back when refactor cursor page to flow page
32-
.. /fundamentals/crud/read-operations/cursor

0 commit comments

Comments
 (0)