Skip to content

Commit 8810c0a

Browse files
committed
JAVA-2144: Optimize DBOBjectCodec via use of BsonTypeCodecMap
1 parent 28cc882 commit 8810c0a

File tree

3 files changed

+19
-10
lines changed

3 files changed

+19
-10
lines changed

driver/src/main/com/mongodb/DBObjectCodec.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.bson.BsonValue;
2828
import org.bson.BsonWriter;
2929
import org.bson.codecs.BsonTypeClassMap;
30+
import org.bson.codecs.BsonTypeCodecMap;
3031
import org.bson.codecs.Codec;
3132
import org.bson.codecs.CollectibleCodec;
3233
import org.bson.codecs.DecoderContext;
@@ -65,7 +66,7 @@ public class DBObjectCodec implements CollectibleCodec<DBObject> {
6566
private static final String ID_FIELD_NAME = "_id";
6667

6768
private final CodecRegistry codecRegistry;
68-
private final BsonTypeClassMap bsonTypeClassMap;
69+
private final BsonTypeCodecMap bsonTypeCodecMap;
6970
private final DBObjectFactory objectFactory;
7071
private final IdGenerator idGenerator = new ObjectIdGenerator();
7172

@@ -113,7 +114,7 @@ public DBObjectCodec(final CodecRegistry codecRegistry, final BsonTypeClassMap b
113114
public DBObjectCodec(final CodecRegistry codecRegistry, final BsonTypeClassMap bsonTypeClassMap, final DBObjectFactory objectFactory) {
114115
this.objectFactory = notNull("objectFactory", objectFactory);
115116
this.codecRegistry = notNull("codecRegistry", codecRegistry);
116-
this.bsonTypeClassMap = notNull("bsonTypeClassMap", bsonTypeClassMap);
117+
this.bsonTypeCodecMap = new BsonTypeCodecMap(notNull("bsonTypeClassMap", bsonTypeClassMap), codecRegistry);
117118
}
118119

119120
@Override
@@ -305,7 +306,7 @@ private Object readValue(final BsonReader reader, final DecoderContext decoderCo
305306
initialRetVal = null;
306307
break;
307308
default:
308-
initialRetVal = codecRegistry.get(bsonTypeClassMap.get(bsonType)).decode(reader, decoderContext);
309+
initialRetVal = bsonTypeCodecMap.get(bsonType).decode(reader, decoderContext);
309310
}
310311

311312
if (bsonType.isContainer() && fieldName != null) {

driver/src/test/functional/com/mongodb/DBObjectCodecTest.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.bson.BsonObjectId;
2626
import org.bson.LazyBSONCallback;
2727
import org.bson.Transformer;
28+
import org.bson.codecs.BsonValueCodecProvider;
2829
import org.bson.codecs.EncoderContext;
2930
import org.bson.codecs.ValueCodecProvider;
3031
import org.junit.Test;
@@ -86,7 +87,8 @@ public void testDBListEncoding() {
8687

8788
@Test
8889
public void shouldNotGenerateIdIfPresent() {
89-
DBObjectCodec dbObjectCodec = new DBObjectCodec(fromProviders(asList(new ValueCodecProvider(), new DBObjectCodecProvider())));
90+
DBObjectCodec dbObjectCodec = new DBObjectCodec(fromProviders(asList(new ValueCodecProvider(), new DBObjectCodecProvider(),
91+
new BsonValueCodecProvider())));
9092
DBObject document = new BasicDBObject("_id", 1);
9193
assertTrue(dbObjectCodec.documentHasId(document));
9294
document = dbObjectCodec.generateIdIfAbsentFromDocument(document);
@@ -96,7 +98,8 @@ public void shouldNotGenerateIdIfPresent() {
9698

9799
@Test
98100
public void shouldGenerateIdIfAbsent() {
99-
DBObjectCodec dbObjectCodec = new DBObjectCodec(fromProviders(asList(new ValueCodecProvider(), new DBObjectCodecProvider())));
101+
DBObjectCodec dbObjectCodec = new DBObjectCodec(fromProviders(asList(new ValueCodecProvider(), new DBObjectCodecProvider(),
102+
new BsonValueCodecProvider())));
100103
DBObject document = new BasicDBObject();
101104
assertFalse(dbObjectCodec.documentHasId(document));
102105
document = dbObjectCodec.generateIdIfAbsentFromDocument(document);
@@ -106,7 +109,8 @@ public void shouldGenerateIdIfAbsent() {
106109

107110
@Test
108111
public void shouldRespectEncodeIdFirstPropertyInEncoderContext() {
109-
DBObjectCodec dbObjectCodec = new DBObjectCodec(fromProviders(asList(new ValueCodecProvider(), new DBObjectCodecProvider())));
112+
DBObjectCodec dbObjectCodec = new DBObjectCodec(fromProviders(asList(new ValueCodecProvider(), new DBObjectCodecProvider(),
113+
new BsonValueCodecProvider())));
110114
// given
111115
DBObject doc = new BasicDBObject("x", 2).append("_id", 2);
112116

@@ -131,7 +135,8 @@ public void shouldRespectEncodeIdFirstPropertyInEncoderContext() {
131135

132136
@Test
133137
public void shouldEncodeNull() {
134-
DBObjectCodec dbObjectCodec = new DBObjectCodec(fromProviders(asList(new ValueCodecProvider(), new DBObjectCodecProvider())));
138+
DBObjectCodec dbObjectCodec = new DBObjectCodec(fromProviders(asList(new ValueCodecProvider(), new DBObjectCodecProvider(),
139+
new BsonValueCodecProvider())));
135140

136141
DBObject doc = new BasicDBObject("null", null);
137142

@@ -153,7 +158,8 @@ public void shouldEncodedNestedMapsListsAndDocuments() {
153158
zeroOneDBList.putAll(zeroOneMap);
154159
List<Integer> zeroOneList = asList(0, 1);
155160

156-
DBObjectCodec dbObjectCodec = new DBObjectCodec(fromProviders(asList(new ValueCodecProvider(), new DBObjectCodecProvider())));
161+
DBObjectCodec dbObjectCodec = new DBObjectCodec(fromProviders(asList(new ValueCodecProvider(), new DBObjectCodecProvider(),
162+
new BsonValueCodecProvider())));
157163

158164
DBObject doc = new BasicDBObject()
159165
.append("map", zeroOneMap)
@@ -184,7 +190,8 @@ public void shouldEncodeIterableMapAsMap() {
184190
IterableMap iterableMap = new IterableMap();
185191
iterableMap.put("first", 1);
186192

187-
DBObjectCodec dbObjectCodec = new DBObjectCodec(fromProviders(asList(new ValueCodecProvider(), new DBObjectCodecProvider())));
193+
DBObjectCodec dbObjectCodec = new DBObjectCodec(fromProviders(asList(new ValueCodecProvider(), new DBObjectCodecProvider(),
194+
new BsonValueCodecProvider())));
188195

189196
DBObject doc = new BasicDBObject("map", iterableMap);
190197

driver/src/test/unit/com/mongodb/DBObjectCodecSpecification.groovy

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.bson.BsonDocument
2424
import org.bson.BsonDocumentReader
2525
import org.bson.BsonDocumentWriter
2626
import org.bson.BsonSymbol
27+
import org.bson.codecs.BsonValueCodecProvider
2728
import org.bson.codecs.DecoderContext
2829
import org.bson.codecs.EncoderContext
2930
import org.bson.codecs.UuidCodec
@@ -42,7 +43,7 @@ import static org.bson.codecs.configuration.CodecRegistries.fromRegistries
4243
class DBObjectCodecSpecification extends Specification {
4344

4445
def bsonDoc = new BsonDocument()
45-
def codecRegistry = fromProviders([new ValueCodecProvider(), new DBObjectCodecProvider()])
46+
def codecRegistry = fromProviders([new ValueCodecProvider(), new DBObjectCodecProvider(), new BsonValueCodecProvider()])
4647
def dbObjectCodec = new DBObjectCodec(codecRegistry)
4748

4849
def 'should encode and decode UUID as Binary'() {

0 commit comments

Comments
 (0)