Skip to content

Commit e567be7

Browse files
author
QuadStingray
committed
feat: Compact Method for complete user scope
1 parent 52abbe3 commit e567be7

File tree

4 files changed

+30
-13
lines changed

4 files changed

+30
-13
lines changed

src/main/scala/dev/mongocamp/driver/mongodb/MongoDAO.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import org.mongodb.scala.model.Projections
1212
import org.mongodb.scala.{BulkWriteResult, Document, MongoCollection, Observable, SingleObservable}
1313

1414
import java.nio.charset.Charset
15+
import java.util.Date
1516
import scala.collection.mutable.ArrayBuffer
1617
import scala.reflect.ClassTag
1718

@@ -35,7 +36,10 @@ abstract class MongoDAO[A](provider: DatabaseProvider, collectionName: String)(i
3536
}
3637

3738
def compact: Observable[Option[CompactResult]] = {
38-
provider.runCommand(Map("compact" -> collectionName)).map(document => CompactResult(document))
39+
val startDate = new Date()
40+
provider
41+
.runCommand(Map("compact" -> collectionName))
42+
.map(document => CompactResult(s"$databaseName${DatabaseProvider.CollectionSeparator}$collectionName", document, startDate))
3943
}
4044

4145
/** @param sampleSize

src/main/scala/dev/mongocamp/driver/mongodb/database/CompactResult.scala

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@ package dev.mongocamp.driver.mongodb.database
22
import dev.mongocamp.driver.mongodb._
33
import org.mongodb.scala.bson.Document
44

5-
case class CompactResult(bytesFreed: Long)
5+
import java.util.Date
6+
7+
case class CompactResult(collectionName: String, bytesFreed: Long, duration: Long)
68

79
object CompactResult {
8-
def apply(document: Document): Option[CompactResult] = {
10+
def apply(collectionName: String, document: Document, startDate: Date): Option[CompactResult] = {
911
if (document.getLongValue("ok") == 1) {
1012
Some(
1113
CompactResult(
12-
document.getLongValue("bytesFreed")
14+
collectionName,
15+
document.getLongValue("bytesFreed"),
16+
new Date().getTime - startDate.getTime
1317
)
1418
)
1519
}

src/main/scala/dev/mongocamp/driver/mongodb/database/DatabaseProvider.scala

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,16 @@ class DatabaseProvider(val config: MongoConfig, val registry: CodecRegistry) ext
4242

4343
def dropDatabase(databaseName: String = DefaultDatabaseName): SingleObservable[Void] = database(databaseName).drop()
4444

45-
def compact(databaseName: String = DefaultDatabaseName, maxWaitPerCollection: Int = DefaultMaxWait): CompactResult = {
46-
CompactResult(
47-
collectionNames(databaseName)
48-
.map(
49-
collectionName => dao(collectionName).compact.result(maxWaitPerCollection).getOrElse(CompactResult(0)))
50-
.map(_.bytesFreed)
51-
.sum
45+
def compactDatabase(databaseName: String = DefaultDatabaseName, maxWaitPerCollection: Int = DefaultMaxWait): List[CompactResult] = {
46+
collectionNames(databaseName).flatMap(collectionName => dao(collectionName).compact.result(maxWaitPerCollection))
47+
}
48+
49+
def compact(maxWaitPerCollection: Int = DefaultMaxWait): List[CompactResult] = {
50+
databaseNames.flatMap(database =>
51+
try collectionNames(database).flatMap(collectionName => dao(collectionName).compact.result(maxWaitPerCollection))
52+
catch {
53+
case e: MongoCommandException => List()
54+
}
5255
)
5356
}
5457

src/test/scala/dev/mongocamp/driver/mongodb/CompactSpec.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,14 @@ class CompactSpec extends Specification with BeforeAll {
2828
count.get.bytesFreed must beGreaterThanOrEqualTo(0L)
2929
}
3030
"compact complete database" in {
31-
val count: CompactResult = TestDatabase.provider.compact()
32-
count.bytesFreed must beGreaterThanOrEqualTo(0L)
31+
val count: List[CompactResult] = TestDatabase.provider.compactDatabase()
32+
count.size must beGreaterThanOrEqualTo(1)
33+
count.head.bytesFreed must beGreaterThanOrEqualTo(0L)
34+
}
35+
"compact all databases in scope" in {
36+
val count: List[CompactResult] = TestDatabase.provider.compact()
37+
count.size must beGreaterThanOrEqualTo(1)
38+
count.head.bytesFreed must beGreaterThanOrEqualTo(0L)
3339
}
3440
}
3541

0 commit comments

Comments
 (0)