Skip to content

Commit 7d74adc

Browse files
committed
add compressor support
1 parent 5bee191 commit 7d74adc

File tree

6 files changed

+77
-33
lines changed

6 files changed

+77
-33
lines changed

build.sbt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ libraryDependencies += "com.github.pathikrit" %% "better-files" % "3.8.0" % Test
5151

5252
libraryDependencies += "org.mongodb.scala" %% "mongo-scala-driver" % "4.0.2"
5353

54+
libraryDependencies += "org.xerial.snappy" % "snappy-java" % "1.1.7.3" % Provided
55+
56+
libraryDependencies += "com.github.luben" % "zstd-jni" % "1.4.4-9" % Provided
57+
5458
libraryDependencies += "com.typesafe" % "config" % "1.4.0"
5559

5660
libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging" % "3.9.2"

src/main/scala/com/sfxcode/nosql/mongo/bson/convert/JsonDateTimeConverter.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ object JsonDateTimeConverter {
1919
}
2020

2121
class JsonDateTimeConverter(dateFormat: DateFormat = JsonDateTimeConverter.DateFormat)
22-
extends Converter[java.lang.Long]
23-
with LazyLogging {
22+
extends Converter[java.lang.Long]
23+
with LazyLogging {
2424
override def convert(value: java.lang.Long, writer: StrictJsonWriter): Unit =
2525
try {
2626
val s = dateFormat.format(value)

src/main/scala/com/sfxcode/nosql/mongo/database/MongoConfig.scala

Lines changed: 54 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,26 @@ package com.sfxcode.nosql.mongo.database
22

33
import java.util.concurrent.TimeUnit
44

5+
import com.mongodb.MongoCompressor
56
import com.mongodb.MongoCredential.createCredential
67
import com.sfxcode.nosql.mongo.database.MongoConfig._
78
import com.typesafe.config.{ Config, ConfigFactory }
89
import org.mongodb.scala.connection._
910
import org.mongodb.scala.{ MongoClientSettings, MongoCredential, ServerAddress }
1011

1112
import scala.collection.JavaConverters._
12-
13-
case class MongoConfig(
14-
database: String,
15-
host: String = DefaultHost,
16-
port: Int = DefaultPort,
17-
applicationName: String = DefaultApplicationName,
18-
userName: Option[String] = None,
19-
password: Option[String] = None,
20-
authDatabase: String = DefaultAuthenticationDatabaseName,
21-
poolOptions: MongoPoolOptions = MongoPoolOptions(),
22-
customClientSettings: Option[MongoClientSettings] = None) {
13+
import scala.collection.mutable.ArrayBuffer
14+
15+
case class MongoConfig(database: String,
16+
host: String = DefaultHost,
17+
port: Int = DefaultPort,
18+
applicationName: String = DefaultApplicationName,
19+
userName: Option[String] = None,
20+
password: Option[String] = None,
21+
authDatabase: String = DefaultAuthenticationDatabaseName,
22+
poolOptions: MongoPoolOptions = MongoPoolOptions(),
23+
compressors: List[String] = List(),
24+
customClientSettings: Option[MongoClientSettings] = None) {
2325

2426
val clientSettings: MongoClientSettings = {
2527
if (customClientSettings.isDefined) {
@@ -36,12 +38,25 @@ case class MongoConfig(
3638
.maintenanceInitialDelay(poolOptions.maintenanceInitialDelay, TimeUnit.SECONDS)
3739
.build()
3840

41+
val compressorList = new ArrayBuffer[MongoCompressor]()
42+
compressors.foreach(compression => {
43+
if (ComressionSnappy.equalsIgnoreCase(compression)) {
44+
compressorList.+=(MongoCompressor.createSnappyCompressor())
45+
} else if (ComressionZlib.equalsIgnoreCase(compression)) {
46+
compressorList.+=(MongoCompressor.createZlibCompressor())
47+
} else if (ComressionZstd.equalsIgnoreCase(compression)) {
48+
compressorList.+=(MongoCompressor.createZstdCompressor())
49+
}
50+
})
51+
3952
val builder = MongoClientSettings
4053
.builder()
4154
.applicationName(applicationName)
4255
.applyToConnectionPoolSettings(
43-
(b: com.mongodb.connection.ConnectionPoolSettings.Builder) => b.applySettings(connectionPoolSettings))
56+
(b: com.mongodb.connection.ConnectionPoolSettings.Builder) => b.applySettings(connectionPoolSettings)
57+
)
4458
.applyToClusterSettings((b: com.mongodb.connection.ClusterSettings.Builder) => b.applySettings(clusterSettings))
59+
.compressorList(compressorList.asJava)
4560

4661
if (userName.isDefined && password.isDefined) {
4762
val credential: MongoCredential = createCredential(userName.get, authDatabase, password.get.toCharArray)
@@ -55,17 +70,21 @@ case class MongoConfig(
5570
}
5671

5772
object MongoConfig {
58-
val DefaultHost = "127.0.0.1"
59-
val DefaultPort = 27017
73+
val DefaultHost = "127.0.0.1"
74+
val DefaultPort = 27017
6075
val DefaultAuthenticationDatabaseName = "admin"
61-
val DefaultApplicationName = "simple-mongo-app"
76+
val DefaultApplicationName = "simple-mongo-app"
6277

63-
val DefaultPoolMaxConnectionIdleTime = 60
64-
val DefaultPoolMaxSize = 50
65-
val DefaultPoolMinSize = 0
66-
val DefaultPoolMaxWaitQueueSize = 500
78+
val DefaultPoolMaxConnectionIdleTime = 60
79+
val DefaultPoolMaxSize = 50
80+
val DefaultPoolMinSize = 0
81+
val DefaultPoolMaxWaitQueueSize = 500
6782
val DefaultPoolMaintenanceInitialDelay = 0
6883

84+
val ComressionSnappy = "snappy"
85+
val ComressionZlib = "zlib"
86+
val ComressionZstd = "zstd"
87+
6988
val DefaultConfigPathPrefix = "mongo"
7089

7190
def fromPath(configPath: String = DefaultConfigPathPrefix): MongoConfig = {
@@ -89,28 +108,35 @@ object MongoConfig {
89108
default
90109
}
91110

92-
def portConfig: Int =
111+
val port: Int =
93112
if (conf.hasPath("%s.port".format(configPath))) {
94113
conf.getInt("%s.port".format(configPath))
95114
} else {
96115
DefaultPort
97116
}
98117

99-
val host = stringConfig("host", DefaultHost).get
100-
val port = portConfig
101-
val database = stringConfig("database").get
102-
val userName = stringConfig("userName")
103-
val password = stringConfig("password")
104-
val authDatabase = stringConfig("authDatabase", DefaultAuthenticationDatabaseName).get
118+
val compressors: List[String] =
119+
if (conf.hasPath("%s.compressors".format(configPath))) {
120+
conf.getStringList("%s.compressors".format(configPath)).asScala.toList
121+
} else {
122+
List()
123+
}
124+
125+
val host = stringConfig("host", DefaultHost).get
126+
val database = stringConfig("database").get
127+
val userName = stringConfig("userName")
128+
val password = stringConfig("password")
129+
val authDatabase = stringConfig("authDatabase", DefaultAuthenticationDatabaseName).get
105130
val applicationName = stringConfig("applicationName", DefaultApplicationName).get
106131

107132
val poolOptions = MongoPoolOptions(
108133
poolOptionsConfig("maxConnectionIdleTime", DefaultPoolMaxConnectionIdleTime),
109134
poolOptionsConfig("maxSize", DefaultPoolMaxSize),
110135
poolOptionsConfig("minSize", DefaultPoolMinSize),
111-
poolOptionsConfig("maintenanceInitialDelay", DefaultPoolMaintenanceInitialDelay))
136+
poolOptionsConfig("maintenanceInitialDelay", DefaultPoolMaintenanceInitialDelay)
137+
)
112138

113-
MongoConfig(database, host, port, applicationName, userName, password, authDatabase, poolOptions)
139+
MongoConfig(database, host, port, applicationName, userName, password, authDatabase, poolOptions, compressors)
114140
}
115141

116142
}

src/test/resources/application.conf

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
test.mongo.database = "test"
22

3+
unit.test.mongo {
4+
database = "config_path_test"
5+
host = "localhost"
6+
port = 27017
7+
applicationName = "simple-mongo-config-test"
8+
pool {
9+
minSize = 5
10+
maxSize = 10
11+
}
12+
compressors = ["snappy"]
13+
}
14+
315
config.test.mongo {
416
database = "config_path_test"
517
host = "localhost"
@@ -9,6 +21,7 @@ config.test.mongo {
921
minSize = 5
1022
maxSize = 100
1123
}
24+
compressors = ["snappy", "unknown"]
1225
}
1326

1427
config.test.auth.mongo {

src/test/scala/com/sfxcode/nosql/mongo/TestDatabase.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ object TestDatabase extends ObservableImplicits {
1717

1818
private val personRegistry = fromProviders(classOf[Person], classOf[Friend])
1919

20-
private val lineRegistry = fromProviders(classOf[Line], classOf[Position])
20+
private val lineRegistry = fromProviders(classOf[Line], classOf[Position])
2121
private val codecTestRegistry = fromProviders(classOf[CodecTest])
2222

2323
val provider =
24-
DatabaseProvider("simple_mongo_test", fromRegistries(bookRegistry, personRegistry, lineRegistry, codecTestRegistry))
24+
DatabaseProvider.fromPath("unit.test.mongo",
25+
fromRegistries(bookRegistry, personRegistry, lineRegistry, codecTestRegistry))
2526

2627
object BookDAO extends MongoDAO[Book](provider, "books")
2728

version.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version in ThisBuild := "1.8.7"
1+
version in ThisBuild := "1.8.8"

0 commit comments

Comments
 (0)