Skip to content

Commit 32f1029

Browse files
author
QuadStingray
committed
feat: Implicit for LuceneQuery to BsonDocument
1 parent e56e5d4 commit 32f1029

7 files changed

Lines changed: 42 additions & 25 deletions

File tree

src/main/scala/dev/mongocamp/driver/DocumentIncludes.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package dev.mongocamp.driver
33
import dev.mongocamp.driver.mongodb.Converter
44
import dev.mongocamp.driver.mongodb.bson.BsonConverter
55
import dev.mongocamp.driver.mongodb.database.DatabaseProvider
6+
import dev.mongocamp.driver.mongodb.lucene.LuceneQueryConverter
7+
import org.apache.lucene.search.Query
68
import org.bson.types.ObjectId
79
import org.mongodb.scala.Document
810
import org.mongodb.scala.bson.conversions.Bson
@@ -12,6 +14,8 @@ import scala.language.implicitConversions
1214
trait DocumentIncludes {
1315
implicit def mapToBson(value: Map[_, _]): Bson = Converter.toDocument(value)
1416

17+
implicit def luceneQueryBson(query: Query): Bson = LuceneQueryConverter.toDocument(query)
18+
1519
implicit def documentFromJavaMap(map: java.util.Map[String, Any]): Document =
1620
documentFromScalaMap(map.asScala.toMap)
1721

src/main/scala/dev/mongocamp/driver/MongoImplicits.scala

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,15 @@ trait MongoImplicits extends ObservableIncludes with ObservableImplicits {
1111

1212
implicit def observableToResult[T](obs: Observable[T]): T = obs.result()
1313

14-
implicit def findObservableToResultList[T](obs: FindObservable[T]): List[T] =
15-
obs.resultList()
14+
implicit def findObservableToResultList[T](obs: FindObservable[T]): List[T] = obs.resultList()
1615

1716
implicit def findObservableToResultOption[T](obs: FindObservable[T]): Option[T] = obs.resultOption()
1817

1918
// gridfs
2019

21-
implicit def gridFSFindObservableToFiles(observable: GridFSFindObservable): List[GridFSFile] =
22-
observable.resultList()
20+
implicit def gridFSFindObservableToFiles(observable: GridFSFindObservable): List[GridFSFile] = observable.resultList()
2321

24-
implicit def gridFSFileToObjectId(file: GridFSFile): ObjectId =
25-
file.getObjectId
22+
implicit def gridFSFileToObjectId(file: GridFSFile): ObjectId = file.getObjectId
2623

2724
implicit def gridFSFileToBSonIdValue(file: GridFSFile): BsonValue = file.getId
2825

src/main/scala/dev/mongocamp/driver/mongodb/lucene/LuceneQueryConverter.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import scala.jdk.CollectionConverters._
1616

1717
object LuceneQueryConverter extends LazyLogging {
1818

19-
def getMongoDbSearch(query: Query): Bson = {
19+
def toDocument(query: Query): Bson = {
2020
getMongoDbSearchMap(query, false)
2121
}
2222

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ package object mongodb extends ObservableIncludes with DocumentIncludes {
1313

1414
implicit class DocumentExtensions[A <: Document](val document: A) extends AnyVal {
1515

16-
def asPlainMap: Map[String, Any] =
17-
BsonConverter.asMap(document)
16+
def asPlainMap: Map[String, Any] = BsonConverter.asMap(document)
1817

1918
def asPlainJson: String = {
2019
val builder = JsonWriterSettings.builder
@@ -27,11 +26,12 @@ package object mongodb extends ObservableIncludes with DocumentIncludes {
2726

2827
def getValue(key: String): Any = getValueOption(key).orNull
2928

30-
def getStringValue(key: String): String =
29+
def getStringValue(key: String): String = {
3130
getValue(key) match {
3231
case n: Any => n.toString
3332
case _ => ""
3433
}
34+
}
3535

3636
def getLongValue(key: String): Long = {
3737
val value = getValue(key)
@@ -44,12 +44,13 @@ package object mongodb extends ObservableIncludes with DocumentIncludes {
4444

4545
def getIntValue(key: String): Int = getLongValue(key).intValue()
4646

47-
def getDoubleValue(key: String): Double =
47+
def getDoubleValue(key: String): Double = {
4848
getValue(key) match {
4949
case n: Number => n.doubleValue()
5050
case s: String => s.toDouble
5151
case _ => 0
5252
}
53+
}
5354

5455
def getDateValue(key: String): Date = {
5556
val value = getValue(key)

src/test/scala/dev/mongocamp/driver/mongodb/lucene/LuceneSearchSpec.scala

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,23 @@ class LuceneSearchSpec extends PersonSpecification {
1111

1212
"search with extended query" in {
1313
val luceneQuery = LuceneQueryConverter.parse("(favoriteFruit:\"apple\" AND age:\"25\") OR name:*Cecile* AND -active:false AND 123", "id")
14-
val search = PersonDAO.find(LuceneQueryConverter.getMongoDbSearch(luceneQuery), sortByBalance).resultList()
14+
val search = PersonDAO.find(LuceneQueryConverter.toDocument(luceneQuery), sortByBalance).resultList()
15+
search must haveSize(1)
16+
search.head.age mustEqual 25
17+
search.head.name mustEqual "Terra Salinas"
18+
}
19+
20+
"search with extended query use implicit" in {
21+
val luceneQuery = LuceneQueryConverter.parse("(favoriteFruit:\"apple\" AND age:\"25\") OR name:*Cecile* AND -active:false AND 123", "id")
22+
val search = PersonDAO.find(luceneQuery, sortByBalance).resultList()
1523
search must haveSize(1)
1624
search.head.age mustEqual 25
1725
search.head.name mustEqual "Terra Salinas"
1826
}
1927

2028
"between filter for number value" in {
2129
val luceneQuery = LuceneQueryConverter.parse("[1010 TO 1052.3]", "balance")
22-
val search = PersonDAO.find(LuceneQueryConverter.getMongoDbSearch(luceneQuery), sortByBalance).resultList()
30+
val search = PersonDAO.find(LuceneQueryConverter.toDocument(luceneQuery), sortByBalance).resultList()
2331
search must haveSize(3)
2432
search.head.age mustEqual 28
2533
search.head.name mustEqual "Mason Donaldson"
@@ -28,7 +36,7 @@ class LuceneSearchSpec extends PersonSpecification {
2836

2937
"between filter for number value not" in {
3038
val luceneQuery = LuceneQueryConverter.parse("-[1010 TO 1052.3]", "balance")
31-
val search = PersonDAO.find(LuceneQueryConverter.getMongoDbSearch(luceneQuery), sortByBalance).resultList()
39+
val search = PersonDAO.find(LuceneQueryConverter.toDocument(luceneQuery), sortByBalance).resultList()
3240
search must haveSize(197)
3341
search.head.age mustEqual 29
3442
search.head.balance mustEqual 3996.0
@@ -37,7 +45,7 @@ class LuceneSearchSpec extends PersonSpecification {
3745

3846
"between filter for date value" in {
3947
val luceneQuery = LuceneQueryConverter.parse("[2014-04-20T00:00:00Z TO 2014-04-22T23:59:59Z]", "registered")
40-
val search = PersonDAO.find(LuceneQueryConverter.getMongoDbSearch(luceneQuery), sortByBalance).resultList()
48+
val search = PersonDAO.find(LuceneQueryConverter.toDocument(luceneQuery), sortByBalance).resultList()
4149
search must haveSize(10)
4250
search.head.age mustEqual 25
4351
search.head.name mustEqual "Allison Turner"
@@ -46,7 +54,7 @@ class LuceneSearchSpec extends PersonSpecification {
4654

4755
"equals Query with Date" in {
4856
val luceneQuery = LuceneQueryConverter.parse("registered:20140420T004427000+0200", "unbekannt")
49-
val search = PersonDAO.find(LuceneQueryConverter.getMongoDbSearch(luceneQuery), sortByBalance).resultList()
57+
val search = PersonDAO.find(LuceneQueryConverter.toDocument(luceneQuery), sortByBalance).resultList()
5058
search must haveSize(1)
5159
search.head.age mustEqual 31
5260
search.head.name mustEqual "Latasha Mcmillan"
@@ -55,7 +63,7 @@ class LuceneSearchSpec extends PersonSpecification {
5563

5664
"wildcard at the end" in {
5765
val luceneQuery = LuceneQueryConverter.parse("Latasha*", "name")
58-
val search = PersonDAO.find(LuceneQueryConverter.getMongoDbSearch(luceneQuery), sortByBalance).resultList()
66+
val search = PersonDAO.find(LuceneQueryConverter.toDocument(luceneQuery), sortByBalance).resultList()
5967
search must haveSize(1)
6068
search.head.age mustEqual 31
6169
search.head.name mustEqual "Latasha Mcmillan"
@@ -64,7 +72,7 @@ class LuceneSearchSpec extends PersonSpecification {
6472

6573
"wildcard at the start" in {
6674
val luceneQuery = LuceneQueryConverter.parse("*Mcmillan", "name")
67-
val search = PersonDAO.find(LuceneQueryConverter.getMongoDbSearch(luceneQuery), sortByBalance).resultList()
75+
val search = PersonDAO.find(LuceneQueryConverter.toDocument(luceneQuery), sortByBalance).resultList()
6876
search must haveSize(1)
6977
search.head.age mustEqual 31
7078
search.head.name mustEqual "Latasha Mcmillan"
@@ -73,13 +81,13 @@ class LuceneSearchSpec extends PersonSpecification {
7381

7482
"not wildcard at the start" in {
7583
val luceneQuery = LuceneQueryConverter.parse("-name:*Mcmillan", "ube")
76-
val search = PersonDAO.find(LuceneQueryConverter.getMongoDbSearch(luceneQuery), sortByBalance).resultList()
84+
val search = PersonDAO.find(LuceneQueryConverter.toDocument(luceneQuery), sortByBalance).resultList()
7785
search must haveSize(199)
7886
}
7987

8088
"wildcard at the start and end" in {
8189
val luceneQuery = LuceneQueryConverter.parse("*Mcmil*", "name")
82-
val search = PersonDAO.find(LuceneQueryConverter.getMongoDbSearch(luceneQuery), sortByBalance).resultList()
90+
val search = PersonDAO.find(LuceneQueryConverter.toDocument(luceneQuery), sortByBalance).resultList()
8391
search must haveSize(1)
8492
search.head.age mustEqual 31
8593
search.head.name mustEqual "Latasha Mcmillan"
@@ -88,13 +96,13 @@ class LuceneSearchSpec extends PersonSpecification {
8896

8997
"not wildcard at the start and end" in {
9098
val luceneQuery = LuceneQueryConverter.parse("-name:*Mcmil*", "ube")
91-
val search = PersonDAO.find(LuceneQueryConverter.getMongoDbSearch(luceneQuery), sortByBalance).resultList()
99+
val search = PersonDAO.find(LuceneQueryConverter.toDocument(luceneQuery), sortByBalance).resultList()
92100
search must haveSize(199)
93101
}
94102

95103
"wildcard in the middle" in {
96104
val luceneQuery = LuceneQueryConverter.parse("\"Latasha *millan\"", "name")
97-
val search = PersonDAO.find(LuceneQueryConverter.getMongoDbSearch(luceneQuery), sortByBalance).resultList()
105+
val search = PersonDAO.find(LuceneQueryConverter.toDocument(luceneQuery), sortByBalance).resultList()
98106
search must haveSize(1)
99107
search.head.age mustEqual 31
100108
search.head.name mustEqual "Latasha Mcmillan"
@@ -103,7 +111,7 @@ class LuceneSearchSpec extends PersonSpecification {
103111

104112
"not wildcard in the middle" in {
105113
val luceneQuery = LuceneQueryConverter.parse("-name:\"Latasha*millan\"", "ube")
106-
val search = PersonDAO.find(LuceneQueryConverter.getMongoDbSearch(luceneQuery), sortByBalance).resultList()
114+
val search = PersonDAO.find(LuceneQueryConverter.toDocument(luceneQuery), sortByBalance).resultList()
107115
search must haveSize(199)
108116
}
109117
}

src/test/scala/dev/mongocamp/driver/mongodb/pagination/PaginationAggregationSpec.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class PaginationAggregationSpec extends PersonSpecification {
3131

3232
val page = pagination.paginate(1, 10)
3333

34+
(pagination.countResult must be).equalTo(98)
35+
3436
(page.paginationInfo.allCount must be).equalTo(98)
3537

3638
(page.paginationInfo.pagesCount must be).equalTo(10)
@@ -46,7 +48,8 @@ class PaginationAggregationSpec extends PersonSpecification {
4648

4749
val page = pagination.paginate(1, 10)
4850

49-
// #agg_execute
51+
(pagination.countResult must be).equalTo(21)
52+
5053
(page.paginationInfo.allCount must be).equalTo(21)
5154

5255
(page.paginationInfo.pagesCount must be).equalTo(3)

src/test/scala/dev/mongocamp/driver/mongodb/pagination/PaginationFilterSpec.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ class PaginationFilterSpec extends PersonSpecification with MongoImplicits {
1515

1616
val page = pagination.paginate(1, 10)
1717

18-
(page.paginationInfo.allCount must be).equalTo(PersonDAO.count().result().toInt)
18+
val personCollectionCount = PersonDAO.count().result().toInt
19+
page.paginationInfo.allCount mustEqual personCollectionCount
20+
pagination.countResult mustEqual personCollectionCount
1921

2022
page.databaseObjects.size must beEqualTo(10)
2123

@@ -30,6 +32,7 @@ class PaginationFilterSpec extends PersonSpecification with MongoImplicits {
3032

3133
val pageFemale = paginationFemale.paginate(1, 10)
3234

35+
paginationFemale.countResult mustEqual 11
3336
pageFemale.paginationInfo.pagesCount mustEqual 10
3437
pageFemale.paginationInfo.allCount mustEqual 98
3538
pageFemale.paginationInfo.page mustEqual 1
@@ -41,6 +44,7 @@ class PaginationFilterSpec extends PersonSpecification with MongoImplicits {
4144
val paginationMales = MongoPaginatedFilter(PersonDAO, Map("gender" -> "male"))
4245
val pageMale = paginationMales.paginate(1, 10)
4346

47+
paginationMales.countResult mustEqual 11
4448
pageMale.paginationInfo.pagesCount mustEqual 11
4549
pageMale.paginationInfo.allCount mustEqual 102
4650
pageMale.paginationInfo.page mustEqual 1

0 commit comments

Comments
 (0)