Skip to content

Commit 5e6be68

Browse files
committed
removed fallback map codecs that use key-value pair list encoding
1 parent b77e116 commit 5e6be68

File tree

3 files changed

+5
-49
lines changed

3 files changed

+5
-49
lines changed

commons-core/src/main/scala/com/avsystem/commons/serialization/GenCodec.scala

+1-43
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ trait GenCodec[T] {
3131
def write(output: Output, value: T): Unit
3232
}
3333

34-
object GenCodec extends FallbackMapCodecs with TupleGenCodecs {
34+
object GenCodec extends RecursiveAutoCodecs with TupleGenCodecs {
3535
/**
3636
* Macro that automatically materializes a [[GenCodec]] for some type `T`, which must be one of:
3737
* <ul>
@@ -405,48 +405,6 @@ object GenCodec extends FallbackMapCodecs with TupleGenCodecs {
405405
implicit lazy val NothingAutoCodec: GenCodec.Auto[Nothing] = GenCodec.Auto[Nothing](NothingCodec)
406406
}
407407

408-
/**
409-
* Contains readers for maps where there is no DBKeyCodec for key type. In such case, we assume reading from a list
410-
* of key-value pairs instead of JSON object.
411-
*/
412-
trait FallbackMapCodecs extends RecursiveAutoCodecs { this: GenCodec.type =>
413-
private def readKVPair[K: GenCodec, V: GenCodec](input: ObjectInput): (K, V) = {
414-
val key = read[K](input.nextField().assertField("k"))
415-
val value = read[V](input.nextField().assertField("v"))
416-
(key, value)
417-
}
418-
419-
private def writeKVPair[K, V](output: ObjectOutput, key: K, value: V)(implicit keyCodec: GenCodec[K], valueCodec: GenCodec[V]): Unit = {
420-
keyCodec.write(output.writeField("k"), key)
421-
valueCodec.write(output.writeField("v"), value)
422-
output.finish()
423-
}
424-
425-
private def collectPairsTo[K: GenCodec, V: GenCodec, C](li: ListInput)(implicit cbf: CanBuildFrom[Nothing, (K, V), C]): C = {
426-
val b = cbf()
427-
while (li.hasNext) {
428-
b += readKVPair[K, V](li.nextElement().readObject())
429-
}
430-
b.result()
431-
}
432-
433-
implicit def fallbackMapCodec[M[X, Y] <: BMap[X, Y], K: GenCodec, V: GenCodec](
434-
implicit cbf: CanBuildFrom[Nothing, (K, V), M[K, V]]): GenCodec[M[K, V] with BMap[K, V]] =
435-
createList[M[K, V] with BMap[K, V]](
436-
collectPairsTo[K, V, M[K, V]],
437-
(lo, map) => map.iterator.foreach({ case (k, v) => writeKVPair(lo.writeElement().writeObject(), k, v) }),
438-
allowNull = true
439-
)
440-
441-
implicit def fallbackJMapCodec[M[X, Y] <: JMap[X, Y], K: GenCodec, V: GenCodec](
442-
implicit cbf: JCanBuildFrom[(K, V), M[K, V]]): GenCodec[M[K, V] with JMap[K, V]] =
443-
createList[M[K, V] with JMap[K, V]](
444-
collectPairsTo[K, V, M[K, V]],
445-
(lo, map) => map.asScala.iterator.foreach({ case (k, v) => writeKVPair(lo.writeElement().writeObject(), k, v) }),
446-
allowNull = true
447-
)
448-
}
449-
450408
trait RecursiveAutoCodecs { this: GenCodec.type =>
451409
/**
452410
* Like `materialize`, but descends into types that `T` is made of (e.g. case class field types).

commons-core/src/test/scala/com/avsystem/commons/serialization/GenCodecTest.scala

-5
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,6 @@ class GenCodecTest extends CodecTestBase {
7474
testWriteReadAndAutoWriteRead[JHashMap[String, Int]](jHashMap, ListMap("1" -> 1, "2" -> 2, "3" -> 3))
7575
testWriteReadAndAutoWriteRead[JLinkedHashMap[String, Int]](jLinkedHashMap, ListMap("1" -> 1, "2" -> 2, "3" -> 3))
7676
testWriteReadAndAutoWriteRead[JHashMap[Int, Int]](jIntHashMap, ListMap("1" -> 1, "2" -> 2, "3" -> 3))
77-
testSameElementsWriteRead[JHashMap[Double, Int]](jDoubleHashMap,
78-
List(Map[String, Any]("k" -> 1.0, "v" -> 1), Map[String, Any]("k" -> 2.0, "v" -> 2), Map[String, Any]("k" -> 3.0, "v" -> 3))
79-
)
8077
}
8178

8279
test("NoState test") {
@@ -92,8 +89,6 @@ class GenCodecTest extends CodecTestBase {
9289
testWriteReadAndAutoWriteRead[Set[Int]](set, set.toList)
9390
testWriteReadAndAutoWriteRead[Map[String, Int]](map, map)
9491
testWriteReadAndAutoWriteRead[Map[Int, Int]](intMap, ListMap("1" -> 1, "2" -> 2, "3" -> 3))
95-
testWriteReadAndAutoWriteRead[Map[Double, Int]](doubleMap,
96-
List(Map[String, Any]("k" -> 1.0, "v" -> 1), Map[String, Any]("k" -> 2.0, "v" -> 2), Map[String, Any]("k" -> 3.0, "v" -> 3)))
9792
testWriteReadAndAutoWriteRead[IHashMap[String, Int]](hashMap, hashMap)
9893
}
9994

commons-mongo/src/main/scala/com/avsystem/commons/mongo/BsonGenCodecs.scala

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package com.avsystem.commons
22
package mongo
33

4-
import com.avsystem.commons.serialization.GenCodec
4+
import com.avsystem.commons.serialization.{GenCodec, GenKeyCodec}
55
import org.bson.types.ObjectId
66

77
trait BsonGenCodecs {
88
implicit def objectIdCodec: GenCodec[ObjectId] = BsonGenCodecs.objectIdCodec
9+
implicit def objectIdKeyCodec: GenKeyCodec[ObjectId] = BsonGenCodecs.objectIdKeyCodec
910
}
1011

1112
object BsonGenCodecs {
@@ -19,4 +20,6 @@ object BsonGenCodecs {
1920
case (otherOutput, objectId) => otherOutput.writeString(objectId.toHexString)
2021
}
2122
)
23+
implicit val objectIdKeyCodec: GenKeyCodec[ObjectId] =
24+
GenKeyCodec.create(new ObjectId(_), _.toHexString)
2225
}

0 commit comments

Comments
 (0)