@@ -141,14 +141,21 @@ pub fn decode_oplog(
141
141
SnapshotOp :: Map {
142
142
key,
143
143
value_idx_plus_one,
144
- } => Op :: new (
145
- id,
146
- InnerContent :: Map ( InnerMapSet {
147
- key : ( & * keys[ key] ) . into ( ) ,
148
- value : value_idx_plus_one - 1 ,
149
- } ) ,
150
- container_idx,
151
- ) ,
144
+ } => {
145
+ let value = if value_idx_plus_one == 0 {
146
+ None
147
+ } else {
148
+ Some ( value_idx_plus_one - 1 )
149
+ } ;
150
+ Op :: new (
151
+ id,
152
+ InnerContent :: Map ( InnerMapSet {
153
+ key : ( & * keys[ key] ) . into ( ) ,
154
+ value,
155
+ } ) ,
156
+ container_idx,
157
+ )
158
+ }
152
159
_ => unreachable ! ( ) ,
153
160
}
154
161
}
@@ -323,9 +330,9 @@ struct EncodedSnapshotOp {
323
330
is_del : bool ,
324
331
// Text: 0
325
332
// List: 0 | value index
326
- // Map: value index
333
+ // Map: 0 (deleted) | value index + 1
327
334
#[ columnar( strategy = "DeltaRle" ) ]
328
- value : usize ,
335
+ value : isize ,
329
336
}
330
337
331
338
enum SnapshotOp {
@@ -365,9 +372,10 @@ impl EncodedSnapshotOp {
365
372
}
366
373
367
374
pub fn get_map ( & self ) -> SnapshotOp {
375
+ let value_idx_plus_one = if self . value < 0 { 0 } else { self . value as u32 } ;
368
376
SnapshotOp :: Map {
369
377
key : self . prop ,
370
- value_idx_plus_one : self . value as u32 ,
378
+ value_idx_plus_one,
371
379
}
372
380
}
373
381
@@ -381,7 +389,7 @@ impl EncodedSnapshotOp {
381
389
prop : pos,
382
390
len : 0 ,
383
391
is_del : false ,
384
- value : start as usize ,
392
+ value : start as isize ,
385
393
} ,
386
394
SnapshotOp :: TextOrListDelete { pos, len } => Self {
387
395
container,
@@ -393,13 +401,16 @@ impl EncodedSnapshotOp {
393
401
SnapshotOp :: Map {
394
402
key,
395
403
value_idx_plus_one : value,
396
- } => Self {
397
- container,
398
- prop : key,
399
- len : 0 ,
400
- is_del : false ,
401
- value : value as usize ,
402
- } ,
404
+ } => {
405
+ let value = if value == 0 { -1 } else { value as isize } ;
406
+ Self {
407
+ container,
408
+ prop : key,
409
+ len : 0 ,
410
+ is_del : false ,
411
+ value,
412
+ }
413
+ }
403
414
SnapshotOp :: TextInsert { pos, len } => Self {
404
415
container,
405
416
prop : pos,
@@ -665,17 +676,16 @@ fn encode_oplog(oplog: &OpLog, state_ref: Option<PreEncodedState>) -> FinalPhase
665
676
} ,
666
677
InnerContent :: Map ( map) => {
667
678
let key = record_key ( & map. key ) ;
668
- let value = oplog. arena . get_value ( map. value as usize ) ;
669
- // FIXME: delete in map
679
+ let value = map. value . and_then ( |v| oplog. arena . get_value ( v as usize ) ) ;
670
680
let value = if let Some ( value) = value {
671
- record_value ( & value) + 1
681
+ ( record_value ( & value) + 1 ) as u32
672
682
} else {
673
683
0
674
684
} ;
675
685
encoded_ops. push ( EncodedSnapshotOp :: from (
676
686
SnapshotOp :: Map {
677
687
key,
678
- value_idx_plus_one : value as u32 ,
688
+ value_idx_plus_one : value,
679
689
} ,
680
690
op. container . to_index ( ) ,
681
691
) ) ;
0 commit comments