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