# Init a multi-level compaction, because multi level write amp is lower
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=1
L2
  a.SET.3-c.SET.4 size=1
L3
  c.SET.3-d.SET.2 size=1
----
L1
  000001:[a#1,1-b#2,1]
L2
  000002:[a#3,1-c#4,1]
L3
  000003:[c#3,1-d#2,1]
init-multi-level(1,2,3)
Original WriteAmp 2.00; ML WriteAmp 1.50
Original OverlappingRatio 1.00; ML OverlappingRatio 0.50

# Verify that the input level size should not affect the decision to conduct a multi
# level compaction.
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=10
L2
  a.SET.3-c.SET.4 size=1
L3
  c.SET.3-d.SET.2 size=1
----
L1
  000001:[a#1,1-b#2,1]
L2
  000002:[a#3,1-c#4,1]
L3
  000003:[c#3,1-d#2,1]
init-multi-level(1,2,3)
Original WriteAmp 1.10; ML WriteAmp 1.09
Original OverlappingRatio 0.10; ML OverlappingRatio 0.09

# Don't init a multi-level compaction because write amp from multi level compaction is larger
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=1
L2
  a.SET.3-c.SET.4 size=1
L3
  c.SET.3-d.SET.2 size=3
----
L1
  000001:[a#1,1-b#2,1]
L2
  000002:[a#3,1-c#4,1]

# Init a multi-level compaction, but note that the second files in L2 and L3 do not get
# chosen, as they don't overlap with the original compaction.
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=6
L2
  a.SET.3-c.SET.4 size=5
  e.SET.1-h.SET.4 size=4
L3
  c.SET.3-d.SET.2 size=6
  e.SET.2-h.SET.4 size=4
----
L1
  000001:[a#1,1-b#2,1]
L2
  000002:[a#3,1-c#4,1]
L3
  000004:[c#3,1-d#2,1]
init-multi-level(1,2,3)
Original WriteAmp 1.83; ML WriteAmp 1.55
Original OverlappingRatio 0.83; ML OverlappingRatio 0.55

# Init a multi-level compaction without an overlapping file in the lowest level.
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=6
L2 max-size=5
  a.SET.3-c.SET.4 size=5
L3
  e.SET.3-f.SET.2 size=100
----
L1
  000001:[a#1,1-b#2,1]
L2
  000002:[a#3,1-c#4,1]
init-multi-level(1,2,3)
Original WriteAmp 1.83; ML WriteAmp 1.00
Original OverlappingRatio 0.83; ML OverlappingRatio 0.00

# Init a multi-level compaction with no file in the lowest level.
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=6
L2
  a.SET.3-c.SET.4 size=5
----
L1
  000001:[a#1,1-b#2,1]
L2
  000002:[a#3,1-c#4,1]
init-multi-level(1,2,3)
Original WriteAmp 1.83; ML WriteAmp 1.00
Original OverlappingRatio 0.83; ML OverlappingRatio 0.00


# Don't init a multi-level compaction, as the single level compaction results in a move (
# write amp is 1) while the multi level compaction results in a Write Amp greater than 1
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=6
L2
  e.SET.3-f.SET.2 size=100
L3
  a.SET.3-c.SET.4 size=5
----
L1
  000001:[a#1,1-b#2,1]

# Init a multi-level compaction, without an overlapping file in the (tie goes to the ML compaction!)
# intermediate and output levels
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=6
L2
  e.SET.3-f.SET.2 size=1
L3
  e.SET.4-f.SET.5 size=5
----
L1
  000001:[a#1,1-b#2,1]
init-multi-level(1,2,3)
Original WriteAmp 1.00; ML WriteAmp 1.00
Original OverlappingRatio 0.00; ML OverlappingRatio 0.00


# Init a multi-level compaction which expands the intermediate level with a file that only
# overlaps with the lowest level. (I.e. it gets included during second setupInputs call)
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=3
L2
  a.SET.2-b.SET.3 size=5
  c.SET.2-d.SET.3 size=3
L3
  a.SET.3-c.SET.4 size=3
----
L1
  000001:[a#1,1-b#2,1]
L2
  000002:[a#2,1-b#3,1]
  000003:[c#2,1-d#3,1]
L3
  000004:[a#3,1-c#4,1]
init-multi-level(1,2,3)
Original WriteAmp 2.67; ML WriteAmp 1.27
Original OverlappingRatio 1.67; ML OverlappingRatio 0.27

# Init a multi-level compaction which DOES NOT expand the input level with a file that
# only overlaps with the lowest level, even if it doesn't expand the output level keyspan.
# TODO(msbutler): include this file in the compaction
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=1
  c.SET.2-d.SET.3 size=10
L2
  a.SET.2-b.SET.3 size=1
L3
  a.SET.3-c.SET.4 size=1
----
L1
  000001:[a#1,1-b#2,1]
L2
  000003:[a#2,1-b#3,1]
L3
  000004:[a#3,1-c#4,1]
init-multi-level(1,2,3)
Original WriteAmp 2.00; ML WriteAmp 1.50
Original OverlappingRatio 1.00; ML OverlappingRatio 0.50

# Verify an expansion of the output level in the initial setupInputs will init a multi-level
# compaction. i.e. without the initial expansion, the multil level compaction would not have
# occurred.
setup-inputs a a
L1
  a.SET.5-b.SET.6 size=1
L2
  a.SET.3-c.SET.4 size=1
  c.SET.3-d.SET.2 size=1
L3
  c.SET.4-d.SET.4 size=3
----
L1
  000001:[a#5,1-b#6,1]
L2
  000002:[a#3,1-c#4,1]
  000003:[c#3,1-d#2,1]
L3
  000004:[c#4,1-d#4,1]
init-multi-level(1,2,3)
Original WriteAmp 3.00; ML WriteAmp 2.00
Original OverlappingRatio 2.00; ML OverlappingRatio 1.00

setup-inputs a a
L1
  a.SET.5-b.SET.6 size=1
L2
  a.SET.3-c.SET.4 size=1
L3
  c.SET.4-d.SET.4 size=3
----
L1
  000001:[a#5,1-b#6,1]
L2
  000002:[a#3,1-c#4,1]


# Verify the second setupInputs call does not add an intermediate file if doing so would expand the
# output level (i.e. the pc.grow logic).
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=1
L2
  a.SET.2-b.SET.3 size=1
  d.SET.2-f.SET.2 size=1
L3
  b.SET.1-d.SET.1 size=1
  e.SET.4-f.SET.5 size=1
----
L1
  000001:[a#1,1-b#2,1]
L2
  000002:[a#2,1-b#3,1]
L3
  000004:[b#1,1-d#1,1]
init-multi-level(1,2,3)
Original WriteAmp 2.00; ML WriteAmp 1.50
Original OverlappingRatio 1.00; ML OverlappingRatio 0.50

# Verify the max number of input levels equals 2.
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=6
L2
  a.SET.3-c.SET.4 size=5
L3
  c.SET.3-d.SET.2 size=2
L4
  c.SET.4-d.SET.3 size=1
----
L1
  000001:[a#1,1-b#2,1]
L2
  000002:[a#3,1-c#4,1]
L3
  000003:[c#3,1-d#2,1]
init-multi-level(1,2,3)
Original WriteAmp 1.83; ML WriteAmp 1.18
Original OverlappingRatio 0.83; ML OverlappingRatio 0.18

# Don't init multi-level compaction if the max size limit exceeded by initial setupInputs.
setup-inputs avail-bytes=10 a a
L1
  a.SET.1-b.SET.2 size=6
L2
  a.SET.5-b.SET.6 size=5
L3
  a.SET.3-d.SET.4 size=3
----
L1
  000001:[a#1,1-b#2,1]
L2
  000002:[a#5,1-b#6,1]

# During second setupInputs call, allow output level expansion even if max size
# limit is exceeded, but not conduct intermediate level expansion.
#
# TODO(msbutler): If second setup inputs exceeds maxSize limits, should the first compaction get
# returned?
setup-inputs avail-bytes=20 a a
L1
  a.SET.1-b.SET.2 size=4
L2
  a.SET.5-b.SET.6 size=5
  c.SET.4-e.SET.3 size=8
L3
  a.SET.3-d.SET.4 size=2
  d.SET.2-e.SET.2 size=2
----
L1
  000001:[a#1,1-b#2,1]
L2
  000002:[a#5,1-b#6,1]
L3
  000004:[a#3,1-d#4,1]
  000005:[d#2,1-e#2,1]
init-multi-level(1,2,3)
Original WriteAmp 2.25; ML WriteAmp 1.44
Original OverlappingRatio 1.25; ML OverlappingRatio 0.44

# Don't init a multi-level compaction if the start level is L5.
setup-inputs a a
L5
  a.SET.1-b.SET.2 size=6
L6
  a.SET.3-c.SET.4 size=5
----
L5
  000001:[a#1,1-b#2,1]
L6
  000002:[a#3,1-c#4,1]

# Don't init a multi-level compaction if the start level is L0.
setup-inputs a a
L0
  a.SET.1-b.SET.2 size=6
L1
  a.SET.3-c.SET.4 size=5
----
L0
  000001:[a#1,1-b#2,1]
L1
  000002:[a#3,1-c#4,1]

# Verify a multi level compaction will not init on a compacting file.
setup-inputs a a
L1
  a.SET.1-b.SET.2 size=1
L2
  a.SET.3-c.SET.4 size=1
L3
  c.SET.3-d.SET.2 size=1 compacting
----
L1
  000001:[a#1,1-b#2,1]
L2
  000002:[a#3,1-c#4,1]