From 51421818ce0ebd67d5730b479852fe9d73aefaa0 Mon Sep 17 00:00:00 2001
From: Simon Belak <simon@metabase.com>
Date: Tue, 26 Nov 2019 14:53:06 +0100
Subject: [PATCH] MongoDB: add nippy serialization for BSON.ObjectId (#11373)

---
 .../drivers/mongo/src/metabase/driver/mongo.clj    | 14 ++++++++++++--
 .../mongo/test/metabase/driver/mongo_test.clj      |  7 +++++++
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/modules/drivers/mongo/src/metabase/driver/mongo.clj b/modules/drivers/mongo/src/metabase/driver/mongo.clj
index 4172245b518..4f561f637a3 100644
--- a/modules/drivers/mongo/src/metabase/driver/mongo.clj
+++ b/modules/drivers/mongo/src/metabase/driver/mongo.clj
@@ -18,15 +18,25 @@
              [command :as cmd]
              [conversion :as conv]
              [db :as mdb]]
-            [schema.core :as s])
+            [schema.core :as s]
+            [taoensso.nippy :as nippy])
   (:import com.mongodb.DB
-           org.bson.BsonUndefined))
+           org.bson.BsonUndefined
+           org.bson.types.ObjectId))
 
 ;; JSON Encoding (etc.)
 
 ;; Encode BSON undefined like `nil`
 (json.generate/add-encoder org.bson.BsonUndefined json.generate/encode-nil)
 
+(nippy/extend-freeze ObjectId :mongodb/ObjectId
+  [^ObjectId oid data-output]
+  (.writeUTF data-output (.toHexString oid)))
+
+(nippy/extend-thaw :mongodb/ObjectId
+  [data-input]
+  (ObjectId. (.readUTF data-input)))
+
 (driver/register! :mongo)
 
 (defmethod driver/can-connect? :mongo
diff --git a/modules/drivers/mongo/test/metabase/driver/mongo_test.clj b/modules/drivers/mongo/test/metabase/driver/mongo_test.clj
index 3ce7e072649..21f4ceebf17 100644
--- a/modules/drivers/mongo/test/metabase/driver/mongo_test.clj
+++ b/modules/drivers/mongo/test/metabase/driver/mongo_test.clj
@@ -21,6 +21,7 @@
             [metabase.test.data
              [datasets :as datasets]
              [interface :as tx]]
+            [taoensso.nippy :as nippy]
             [toucan.db :as db]
             [toucan.util.test :as tt])
   (:import org.bson.types.ObjectId))
@@ -293,3 +294,9 @@
         :limit    3})
      qp.t/data
      (select-keys [:columns :rows]))))
+
+
+;; Make sure we correctly (un-)freeze BSON IDs
+(deftest ObjectId-serialization
+  (let [oid (ObjectId. "012345678901234567890123")]
+    (is (= oid (nippy/thaw (nippy/freeze oid))))))
-- 
GitLab