# This is not actually a manual compaction test, and simply uses manual
# compaction to demonstrate single delete semantics when used with
# set-with-delete.

# Define a sequence of SET=>SET=>DEL=>SET=>SINGLEDEL.
define target-file-sizes=(1, 1, 1, 1, 1)
L1
  a.SINGLEDEL.10:
L2
  a.SET.9:v3
L3
  a.DEL.8:
L4
  a.SET.7:v2
L5
  a.SET.6:v1
----
1:
  000004:[a#10,SINGLEDEL-a#10,SINGLEDEL]
2:
  000005:[a#9,SET-a#9,SET]
3:
  000006:[a#8,DEL-a#8,DEL]
4:
  000007:[a#7,SET-a#7,SET]
5:
  000008:[a#6,SET-a#6,SET]

# No data.
iter
first
----
.

# Compact away the DEL.
compact a-b L2
----
1:
  000004:[a#10,SINGLEDEL-a#10,SINGLEDEL]
3:
  000009:[a#9,SETWITHDEL-a#9,SETWITHDEL]
4:
  000007:[a#7,SET-a#7,SET]
5:
  000008:[a#6,SET-a#6,SET]

# No data.
iter
first
----
.

# Do two compactions to compact away the SINGLEDEL and 1 SET.
compact a-b L1
----
2:
  000010:[a#10,SINGLEDEL-a#10,SINGLEDEL]
3:
  000009:[a#9,SETWITHDEL-a#9,SETWITHDEL]
4:
  000007:[a#7,SET-a#7,SET]
5:
  000008:[a#6,SET-a#6,SET]

compact a-b L2
----
3:
  000011:[a#10,DEL-a#10,DEL]
4:
  000007:[a#7,SET-a#7,SET]
5:
  000008:[a#6,SET-a#6,SET]

# Deleted data is not resurrected.
iter
first
----
.

# Define a sequence of SET=>SINGLEDEL=>SET=>SINGLEDEL.
define target-file-sizes=(1, 1, 1, 1, 1)
L1
  a.SINGLEDEL.10:
L2
  a.SET.9:v3
L3
  a.SINGLEDEL.8:
L4
  a.SET.7:v2
----
1:
  000004:[a#10,SINGLEDEL-a#10,SINGLEDEL]
2:
  000005:[a#9,SET-a#9,SET]
3:
  000006:[a#8,SINGLEDEL-a#8,SINGLEDEL]
4:
  000007:[a#7,SET-a#7,SET]

# No data.
iter
first
----
.

# Compact away the older SINGLEDEL.
compact a-b L2
----
1:
  000004:[a#10,SINGLEDEL-a#10,SINGLEDEL]
3:
  000008:[a#9,SETWITHDEL-a#9,SETWITHDEL]
4:
  000007:[a#7,SET-a#7,SET]

# No data.
iter
first
----
.

# Do two compactions to compact away the newer SINGLEDEL and 1 SET.
compact a-b L1
----
2:
  000009:[a#10,SINGLEDEL-a#10,SINGLEDEL]
3:
  000008:[a#9,SETWITHDEL-a#9,SETWITHDEL]
4:
  000007:[a#7,SET-a#7,SET]

compact a-b L2
----
3:
  000010:[a#10,DEL-a#10,DEL]
4:
  000007:[a#7,SET-a#7,SET]

# Deleted data is not resurrected.
iter
first
----
.

# Define a sequence of SET=>DEL=>SET=>SINGLEDEL, such that the DEL and
# SINGLEDEL meet in a compaction. Disable multilevel compaction to exercise the proper test case.
define snapshots=(9) disable-multi-level
L1
  a.SINGLEDEL.10:
L2
  a.SET.9:v3
L3
  a.DEL.8:
L4
  a.SET.7:v2
----
1:
  000004:[a#10,SINGLEDEL-a#10,SINGLEDEL]
2:
  000005:[a#9,SET-a#9,SET]
3:
  000006:[a#8,DEL-a#8,DEL]
4:
  000007:[a#7,SET-a#7,SET]

# No data.
iter
first
----
.

# Compact L2 and L3. The snapshot prevents the DEL=>SET from being collapsed.
compact a-b L2
----
1:
  000004:[a#10,SINGLEDEL-a#10,SINGLEDEL]
3:
  000008:[a#9,SET-a#8,DEL]
4:
  000007:[a#7,SET-a#7,SET]

# No data.
iter
first
----
.

close-snapshots
----

compact a-b L1
----
2:
  000004:[a#10,SINGLEDEL-a#10,SINGLEDEL]
3:
  000008:[a#9,SET-a#8,DEL]
4:
  000007:[a#7,SET-a#7,SET]

# The DEL survives.
compact a-b L2
----
3:
  000009:[a#8,DEL-a#8,DEL]
4:
  000007:[a#7,SET-a#7,SET]

# No data
iter
first
----
.

# Define a sequence of SET=>SINGLEDEL=>SET=>SINGLEDEL, such that the two
# SINGLEDELs meet in a compaction.
# To test surface the right test case, disable multi level compaction.
define snapshots=(9) disable-multi-level
L1
  a.SINGLEDEL.10:
L2
  a.SET.9:v3
L3
  a.SINGLEDEL.8:
L4
  a.SET.7:v2
----
1:
  000004:[a#10,SINGLEDEL-a#10,SINGLEDEL]
2:
  000005:[a#9,SET-a#9,SET]
3:
  000006:[a#8,SINGLEDEL-a#8,SINGLEDEL]
4:
  000007:[a#7,SET-a#7,SET]

# No data.
iter
first
----
.

# Compact L2 and L3. The snapshot prevents the SINGLEDEL=>SET from being collapsed.
compact a-b L2
----
1:
  000004:[a#10,SINGLEDEL-a#10,SINGLEDEL]
3:
  000008:[a#9,SET-a#8,SINGLEDEL]
4:
  000007:[a#7,SET-a#7,SET]

# No data.
iter
first
----
.

close-snapshots
----

compact a-b L1
----
2:
  000004:[a#10,SINGLEDEL-a#10,SINGLEDEL]
3:
  000008:[a#9,SET-a#8,SINGLEDEL]
4:
  000007:[a#7,SET-a#7,SET]

# The SINGLEDEL survives.
compact a-b L2
----
3:
  000009:[a#8,SINGLEDEL-a#8,SINGLEDEL]
4:
  000007:[a#7,SET-a#7,SET]

# No data
iter
first
----
.