24
24
import java .util .List ;
25
25
import java .util .Stack ;
26
26
27
+ import static java .lang .Math .max ;
27
28
import static java .lang .String .format ;
28
29
import static org .bson .assertions .Assertions .notNull ;
29
30
@@ -37,8 +38,37 @@ public class BsonBinaryWriter extends AbstractBsonWriter {
37
38
38
39
private final BsonOutput bsonOutput ;
39
40
private final Stack <Integer > maxDocumentSizeStack = new Stack <>();
41
+ private static final int ARRAY_INDEXES_CACHE_SIZE = 1000 ;
42
+ private static final byte [] ARRAY_INDEXES_BUFFER ;
43
+ private static final int [] ARRAY_INDEXES_OFFSETS ;
44
+ private static final int [] ARRAY_INDEXES_LENGTHS ;
40
45
private Mark mark ;
41
46
47
+ static {
48
+ ARRAY_INDEXES_LENGTHS = new int [ARRAY_INDEXES_CACHE_SIZE ];
49
+ ARRAY_INDEXES_OFFSETS = new int [ARRAY_INDEXES_CACHE_SIZE ];
50
+ int totalSize = 0 ;
51
+ for (int i = 0 ; i < ARRAY_INDEXES_CACHE_SIZE ; i ++) {
52
+ totalSize += (int ) (Math .log10 (max (i , 1 ))
53
+ + 1 // number of digits
54
+ + 1 ); // +1 for null terminator
55
+ }
56
+ ARRAY_INDEXES_BUFFER = new byte [totalSize ];
57
+
58
+ // Fill buffer
59
+ int offset = 0 ;
60
+ for (int i = 0 ; i < ARRAY_INDEXES_CACHE_SIZE ; i ++) {
61
+ String string = Integer .toString (i );
62
+ int length = string .length ();
63
+ for (int j = 0 ; j < length ; j ++) {
64
+ ARRAY_INDEXES_BUFFER [offset ++] = (byte ) string .charAt (j );
65
+ }
66
+ ARRAY_INDEXES_BUFFER [offset ++] = 0 ;
67
+ ARRAY_INDEXES_OFFSETS [i ] = offset - (length + 1 );
68
+ ARRAY_INDEXES_LENGTHS [i ] = length + 1 ; // +1 for null terminator
69
+ }
70
+ }
71
+
42
72
/**
43
73
* Construct an instance.
44
74
*
@@ -259,7 +289,7 @@ public void doWriteNull() {
259
289
public void doWriteObjectId (final ObjectId value ) {
260
290
bsonOutput .writeByte (BsonType .OBJECT_ID .getValue ());
261
291
writeCurrentName ();
262
- bsonOutput .writeBytes (value . toByteArray () );
292
+ bsonOutput .writeObjectId (value );
263
293
}
264
294
265
295
@ Override
@@ -397,7 +427,14 @@ public void reset() {
397
427
398
428
private void writeCurrentName () {
399
429
if (getContext ().getContextType () == BsonContextType .ARRAY ) {
400
- bsonOutput .writeCString (Integer .toString (getContext ().index ++));
430
+ int index = getContext ().index ++;
431
+ if (index >= ARRAY_INDEXES_CACHE_SIZE ) {
432
+ bsonOutput .writeCString (Integer .toString (index ));
433
+ } else {
434
+ bsonOutput .writeBytes (ARRAY_INDEXES_BUFFER ,
435
+ ARRAY_INDEXES_OFFSETS [index ],
436
+ ARRAY_INDEXES_LENGTHS [index ]);
437
+ }
401
438
} else {
402
439
bsonOutput .writeCString (getName ());
403
440
}
0 commit comments