Skip to content

Commit 8a39da8

Browse files
committed
feat: compatibility for scala 2.12
1 parent 2ecc276 commit 8a39da8

10 files changed

Lines changed: 79 additions & 39 deletions

File tree

build.sbt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ developers := List(
4040

4141
licenses += ("Apache-2.0", url("https://www.apache.org/licenses/LICENSE-2.0.html"))
4242

43-
crossScalaVersions := Seq("2.13.13", "2.12.17")
43+
crossScalaVersions := Seq("2.13.15", "2.12.20")
4444

45-
scalaVersion := crossScalaVersions.value.head
45+
scalaVersion := crossScalaVersions.value.last
4646

4747
scalacOptions += "-deprecation"
4848

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package dev.mongocamp.driver.mongodb.schema
2+
3+
import io.circe.Decoder.Result
4+
import io.circe.{Decoder, Encoder, HCursor, Json}
5+
import jdk.internal.reflect.Reflection
6+
import org.bson.types.ObjectId
7+
import org.joda.time.DateTime
8+
import org.mongodb.scala.Document
9+
10+
import java.util.Date
11+
12+
trait CirceProductSchema {
13+
14+
def productElementNames(internalProduct: Product): Iterator[String] = {
15+
(internalProduct.getClass.getDeclaredFields ++ internalProduct.getClass.getFields).map(_.getName).iterator
16+
}
17+
18+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package dev.mongocamp.driver.mongodb.schema
2+
3+
import io.circe.Decoder.Result
4+
import io.circe.{ Decoder, Encoder, HCursor, Json }
5+
import org.bson.types.ObjectId
6+
import org.joda.time.DateTime
7+
import org.mongodb.scala.Document
8+
9+
import java.util.Date
10+
11+
trait CirceProductSchema {
12+
13+
def productElementNames(internalProduct: Product): Iterator[String] = {
14+
internalProduct.productElementNames
15+
}
16+
17+
}

src/main/scala/dev/mongocamp/driver/mongodb/jdbc/MongoJdbcDriver.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ package dev.mongocamp.driver.mongodb.jdbc
22

33
import com.vdurmont.semver4j.Semver
44
import dev.mongocamp.driver.mongodb.BuildInfo
5-
import dev.mongocamp.driver.mongodb.database.{ DatabaseProvider, MongoConfig }
6-
import org.mongodb.scala.{ ConnectionString, ServerAddress }
5+
import dev.mongocamp.driver.mongodb.database.{DatabaseProvider, MongoConfig}
6+
import org.mongodb.scala.{ConnectionString, ServerAddress}
77

8-
import java.sql.{ Connection, DriverPropertyInfo }
8+
import java.sql.{Connection, DriverPropertyInfo}
99
import java.util.Properties
1010
import java.util.logging.Logger
11-
import scala.jdk.CollectionConverters.CollectionHasAsScala
11+
import scala.jdk.CollectionConverters._
1212

1313
class MongoJdbcDriver extends java.sql.Driver {
1414
private val propertyInfoHelper = new MongodbJdbcDriverPropertyInfoHelper()

src/main/scala/dev/mongocamp/driver/mongodb/jdbc/resultSet/MongoDbResultSet.scala

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@ package dev.mongocamp.driver.mongodb.jdbc.resultSet
22

33
import dev.mongocamp.driver.mongodb.MongoDAO
44
import dev.mongocamp.driver.mongodb.bson.BsonConverter
5-
import org.mongodb.scala.bson.{BsonArray, BsonBoolean, BsonDateTime, BsonInt32, BsonInt64, BsonNull, BsonNumber, BsonObjectId, BsonString}
5+
import org.mongodb.scala.bson.{ BsonArray, BsonBoolean, BsonDateTime, BsonInt32, BsonInt64, BsonNull, BsonNumber, BsonObjectId, BsonString }
66
import org.mongodb.scala.bson.collection.immutable.Document
77

8-
import java.io.{InputStream, Reader}
9-
import java.net.{URI, URL}
10-
import java.{sql, util}
11-
import java.sql.{Blob, Clob, Date, NClob, Ref, ResultSet, ResultSetMetaData, RowId, SQLException, SQLWarning, SQLXML, Statement, Time, Timestamp}
8+
import java.io.{ InputStream, Reader }
9+
import java.net.{ URI, URL }
10+
import java.{ sql, util }
11+
import java.sql.{ Blob, Clob, Date, NClob, Ref, ResultSet, ResultSetMetaData, RowId, SQLException, SQLWarning, SQLXML, Statement, Time, Timestamp }
1212
import java.util.Calendar
1313
import dev.mongocamp.driver.mongodb._
1414
import dev.mongocamp.driver.mongodb.jdbc.MongoJdbcCloseable
1515

1616
import java.nio.charset.StandardCharsets
17+
import scala.util.Try
1718

1819
class MongoDbResultSet(collectionDao: MongoDAO[Document], data: List[Document], queryTimeOut: Int) extends ResultSet with MongoJdbcCloseable {
1920
private var currentRow: Document = _
@@ -75,9 +76,9 @@ class MongoDbResultSet(collectionDao: MongoDAO[Document], data: List[Document],
7576
checkClosed()
7677
val value = currentRow.getValue(metaData.getColumnName(columnIndex))
7778
value match {
78-
case b : BsonInt32 => b.longValue()
79-
case b : BsonInt64 => b.longValue()
80-
case _ => Option(value).flatMap(_.toString.toLongOption).getOrElse(0)
79+
case b: BsonInt32 => b.longValue()
80+
case b: BsonInt64 => b.longValue()
81+
case _ => Option(value).flatMap(v => Try(v.toString.toLong).toOption).getOrElse(0)
8182
}
8283
}
8384

@@ -632,7 +633,7 @@ class MongoDbResultSet(collectionDao: MongoDAO[Document], data: List[Document],
632633

633634
override def getRef(columnLabel: String): Ref = sqlFeatureNotSupported()
634635

635-
override def updateRef(columnIndex: Int, x: Ref): Unit = sqlFeatureNotSupported()
636+
override def updateRef(columnIndex: Int, x: Ref): Unit = sqlFeatureNotSupported()
636637

637638
override def updateRef(columnLabel: String, x: Ref): Unit = sqlFeatureNotSupported()
638639

src/main/scala/dev/mongocamp/driver/mongodb/jdbc/statement/MongoPreparedStatement.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ case class MongoPreparedStatement(connection: MongoJdbcConnection) extends Calla
7070
val collectionName = Option(queryHolder.getCollection).map(c => connection.getDatabaseProvider.dao(c))
7171
if (!sql.toLowerCase().contains("_id")){
7272
response = response.map(doc => {
73-
val newDoc = Document(doc - "_id")
73+
val newDoc = doc - "_id"
7474
newDoc
7575
})
7676
}
@@ -507,7 +507,7 @@ case class MongoPreparedStatement(connection: MongoJdbcConnection) extends Calla
507507
checkClosed()
508508
false
509509
}
510-
510+
// todo
511511
override def unwrap[T](iface: Class[T]): T = null.asInstanceOf[T]
512512

513513
override def isWrapperFor(iface: Class[_]): Boolean = false

src/main/scala/dev/mongocamp/driver/mongodb/schema/CirceSchema.scala

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import org.mongodb.scala.Document
88

99
import java.util.Date
1010

11-
trait CirceSchema {
11+
trait CirceSchema extends CirceProductSchema {
1212

1313
implicit val DateFormat: Encoder[Date] with Decoder[Date] = new Encoder[Date] with Decoder[Date] {
1414
override def apply(a: Date): Json = Encoder.encodeString.apply(a.toInstant.toString)
@@ -136,11 +136,11 @@ trait CirceSchema {
136136
.toList: _*
137137
)
138138
case product: Product =>
139-
val productElementNames = product.productElementNames.toList
140-
val fieldMap = productElementNames
139+
val productElementKeys = productElementNames(product).toList
140+
val fieldMap = productElementKeys
141141
.map(
142142
key => {
143-
val index = productElementNames.indexOf(key)
143+
val index = productElementKeys.indexOf(key)
144144
(key, product.productElement(index))
145145
}
146146
)
@@ -159,4 +159,7 @@ trait CirceSchema {
159159
}
160160
}
161161

162+
163+
164+
162165
}

src/main/scala/dev/mongocamp/driver/mongodb/schema/SchemaExplorer.scala

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,16 @@ class SchemaExplorer {
2323

2424
private def schemaAggregation(deepth: Int, sampleSize: Option[Int]): List[PipelineStage] = {
2525
val buffer = ArrayBuffer[PipelineStage]()
26-
buffer.addAll(
27-
sampleSize.map(size => PipelineStage("sample", Map("size" -> size)))
28-
)
26+
buffer ++= sampleSize.map(size => PipelineStage("sample", Map("size" -> size)))
2927

30-
buffer.addOne(PipelineStage("project", Map("_" -> processObject(deepth, 0, "$$ROOT", List()), "_id" -> 0)))
28+
buffer += PipelineStage("project", Map("_" -> processObject(deepth, 0, "$$ROOT", List()), "_id" -> 0))
3129

3230
(0 to deepth).foreach(_ => {
33-
buffer.addOne(PipelineStage("unwind", Map("path" -> "$_", "preserveNullAndEmptyArrays" -> true)))
34-
buffer.addOne(PipelineStage("replaceRoot", Map("newRoot" -> Map("$cond" -> List(Map("$eq" -> List("$_", null)), "$$ROOT", "$_")))))
31+
buffer += PipelineStage("unwind", Map("path" -> "$_", "preserveNullAndEmptyArrays" -> true))
32+
buffer += PipelineStage("replaceRoot", Map("newRoot" -> Map("$cond" -> List(Map("$eq" -> List("$_", null)), "$$ROOT", "$_"))))
3533
})
3634

37-
buffer.addAll(
35+
buffer ++=
3836
List(
3937
PipelineStage("project", Map("_" -> 0)),
4038
PipelineStage("project", Map("l" -> "$$REMOVE", "n" -> 1, "t" -> 1, "v" -> "$$REMOVE")),
@@ -49,7 +47,6 @@ class SchemaExplorer {
4947
PipelineStage("group", Map("T" -> Map("$push" -> "$$ROOT"), "_id" -> Map("n" -> "$n"), "c" -> Map("$sum" -> "$c"))),
5048
PipelineStage("project", Map("T" -> 1, "_id" -> 0, "c" -> 1, "n" -> "$_id.n")),
5149
PipelineStage("sort", Map("n" -> 1))
52-
)
5350
)
5451
buffer.toList
5552
}
@@ -79,7 +76,7 @@ class SchemaExplorer {
7976
.foreach(string => {
8077
var fieldName = string
8178
if (fieldName.startsWith(NameSeparator)) {
82-
responseArray.addOne(NameSeparator)
79+
responseArray += NameSeparator
8380
fieldName = fieldName.substring(1)
8481
}
8582
val hasEndingSeperator: Boolean = if (fieldName.endsWith(NameSeparator)) {
@@ -89,9 +86,9 @@ class SchemaExplorer {
8986
else {
9087
false
9188
}
92-
responseArray.addOne(fieldName)
89+
responseArray += fieldName
9390
if (hasEndingSeperator) {
94-
responseArray.addOne(NameSeparator)
91+
responseArray += NameSeparator
9592
}
9693
})
9794

@@ -204,7 +201,7 @@ class SchemaExplorer {
204201
fieldsToJsonSchemaDefinition(map, fieldObjectName, field.subFields.toList)
205202
}
206203
if (field.percentageOfParent == 1.0) {
207-
requiredFields.addOne(field.name)
204+
requiredFields += field.name
208205
}
209206
if (field.fieldTypes.size == 1) {
210207
val t = field.fieldTypes.head
@@ -346,7 +343,8 @@ class SchemaExplorer {
346343
private def convertToBsonPipeline(pipeline: List[PipelineStage]): Seq[Bson] = {
347344
val response: Seq[Bson] = pipeline.map(element => {
348345
val stage = if (element.stage.startsWith("$")) element.stage else "$" + element.stage
349-
Map(stage -> element.value)
346+
val bson: Bson = Map(stage -> element.value)
347+
bson
350348
})
351349
response
352350
}
@@ -402,7 +400,7 @@ class SchemaExplorer {
402400

403401
val newField = SchemaAnalysisField(name.replace(ArrayItemMark, ArrayElementText), fullName, types, fieldCount, percentage, ArrayBuffer())
404402

405-
parent.subFields.addOne(newField)
403+
parent.subFields.+=(newField)
406404
fieldsMap.put(s"$parentName$NameSeparator$name".replace("ROOT.", ""), newField)
407405
})
408406

src/main/scala/dev/mongocamp/driver/mongodb/sql/MongoSqlQueryHolder.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import java.util.concurrent.TimeUnit
3535
import scala.collection.mutable
3636
import scala.collection.mutable.ArrayBuffer
3737
import scala.jdk.CollectionConverters._
38+
import scala.util.Try
3839

3940
class MongoSqlQueryHolder {
4041
private val aggregatePipeline: ArrayBuffer[Document] = ArrayBuffer()
@@ -236,7 +237,7 @@ class MongoSqlQueryHolder {
236237
}
237238
case e: net.sf.jsqlparser.schema.Column =>
238239
val name = e.getColumnName
239-
name.toIntOption.getOrElse(name.toBooleanOption.getOrElse(name))
240+
Try(name.toInt).toOption.getOrElse(Try(name.toBoolean).toOption.getOrElse(name))
240241
case _ =>
241242
throw new IllegalArgumentException("not supported value type")
242243
}
@@ -320,7 +321,7 @@ class MongoSqlQueryHolder {
320321
private def convertSelectStatement(select: Select): Unit = {
321322
select.getSelectBody match {
322323
case plainSelect: PlainSelect =>
323-
val selectItems = Option(plainSelect.getSelectItems).map(_.asScala).getOrElse(List.empty)
324+
val selectItems = Option(plainSelect.getSelectItems).map(_.asScala).getOrElse(List.empty)
324325
val maybeDistinct = Option(plainSelect.getDistinct)
325326

326327
selectItems.foreach(sI => {
@@ -357,7 +358,7 @@ class MongoSqlQueryHolder {
357358
aggregatePipeline += Map("$group" -> groupMap)
358359
})
359360
if (maybeGroupByElement.isEmpty && keepOneDocument) {
360-
val group = mutable.Map[String, Any]()
361+
val group = mutable.Map[String, Any]()
361362
val idGroupMap = mutable.Map()
362363
selectItems.foreach { case se: SelectItem[Expression] =>
363364
val expressionName = se.getExpression.toString

src/test/scala/dev/mongocamp/driver/mongodb/schema/SchemaSpec.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ class SchemaSpec extends Specification with Before {
1919
schemaJson.contains("\"title\":\"Friends\"") must beTrue
2020
schemaJson.contains("\"People\":") must beTrue
2121
schemaJson.contains("\"title\":\"People\"") must beTrue
22-
schemaJson.contains("\"_id\":{\"pattern\":\"^([a-fA-F0-9]{2})+$\",\"type\":\"string\"}") must beTrue
22+
val idPattern1 = schemaJson.contains("\"_id\":{\"pattern\":\"^([a-fA-F0-9]{2})+$\",\"type\":\"string\"}")
23+
val idPattern2 = schemaJson.contains("\"_id\":{\"type\":\"string\",\"pattern\":\"^([a-fA-F0-9]{2})+$\"}")
24+
(idPattern1 || idPattern2) must beTrue
2325
schemaJson.contains("\"isActive\":{\"type\":\"boolean\"}") must beTrue
2426
}
2527

0 commit comments

Comments
 (0)