
# Simple case.

define
file
  a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
file
  b-c:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
  c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
----
000001:[a#2,RANGEKEYSET-b#inf,RANGEKEYSET]
000002:[b#2,RANGEKEYSET-d#inf,RANGEKEYSET]

iter
seek-ge a
seek-ge apple
seek-ge b
seek-ge banana
seek-ge c
seek-ge cantalope
seek-ge d
seek-ge dragonfruit
----
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
b-c:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
b-c:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
.
.

iter
seek-lt a
seek-lt apple
seek-lt b
seek-lt banana
seek-lt c
seek-lt cantalope
seek-lt d
seek-lt dragonfruit
prev
----
.
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
b-c:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
b-c:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
b-c:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)

iter
seek-ge a
prev
seek-lt d
next
----
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
.
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
.

iter
first
next
next
next
----
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
b-c:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
.

iter
last
prev
prev
prev
----
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
b-c:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
.

# Set some bounds

iter
seek-ge a
seek-ge b
seek-ge c
seek-ge d
seek-lt a
seek-lt b
seek-lt c
seek-lt d
----
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
b-c:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
.
.
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
b-c:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)


iter
seek-lt cc
prev
prev
prev
----
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
b-c:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
.

# Test skipping over empty/point-key-only files in both directions.

define
file
  a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
file point-key-bounds=[b#1,SET-b#1,SET]
file
  c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
  d-e:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
----
000001:[a#2,RANGEKEYSET-b#inf,RANGEKEYSET]
000002:[b#1,SET-b#1,SET]
000003:[c#2,RANGEKEYSET-e#inf,RANGEKEYSET]

iter
first
next
next
next
----
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
b-c:{} (L6: fileNum=000003)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)
d-e:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)

iter
last
prev
prev
prev
----
d-e:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)
b-c:{} (L6: fileNum=000001)
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)

# Test straddle keys between files.

define
file
  a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
file
  c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
file
  e-f:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
file
  g-h:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
----
000001:[a#2,RANGEKEYSET-b#inf,RANGEKEYSET]
000002:[c#2,RANGEKEYSET-d#inf,RANGEKEYSET]
000003:[e#2,RANGEKEYSET-f#inf,RANGEKEYSET]
000004:[g#2,RANGEKEYSET-h#inf,RANGEKEYSET]

iter
first
next
next
next
next
next
next
next
----
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
b-c:{} (L6: fileNum=000002)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
d-e:{} (L6: fileNum=000003)
e-f:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)
f-g:{} (L6: fileNum=000004)
g-h:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000004)
.

iter
last
prev
prev
prev
prev
prev
prev
prev
----
g-h:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000004)
f-g:{} (L6: fileNum=000003)
e-f:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)
d-e:{} (L6: fileNum=000002)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
b-c:{} (L6: fileNum=000001)
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
.

# The below case seeks into a file straddle, then iterates forward and back to
# it, and confirms that changing iterator directions on a straddle does the
# right thing.

iter
seek-ge bb
next
prev
next
prev
prev
----
b-c:{} (L6: fileNum=000001)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
b-c:{} (L6: fileNum=000001)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
b-c:{} (L6: fileNum=000001)
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)

# The same case as above, but with inverted directions.

iter
seek-lt dd
prev
next
prev
next
next
----
d-e:{} (L6: fileNum=000003)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
d-e:{} (L6: fileNum=000003)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
d-e:{} (L6: fileNum=000003)
e-f:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)

iter
seek-lt dd
prev
next
prev
next
next
----
d-e:{} (L6: fileNum=000003)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
d-e:{} (L6: fileNum=000003)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
d-e:{} (L6: fileNum=000003)
e-f:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)

# Seeks right at the bound should return nothing.

iter
seek-lt bb
----
b-c:{} (L6: fileNum=000002)

iter
seek-ge dd
----
d-e:{} (L6: fileNum=000002)

iter
seek-lt d
prev
next
prev
prev
prev
next
next
----
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
b-c:{} (L6: fileNum=000001)
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
b-c:{} (L6: fileNum=000001)
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
.
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
b-c:{} (L6: fileNum=000002)

# A bunch of files with point keys only should not fragment straddles.

define
file
  a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
file point-key-bounds=[c#1,SET-c#1,SET]
file point-key-bounds=[d#1,SET-d#1,SET]
file
  e-f:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
file point-key-bounds=[g#1,SET-g#1,SET]
file
  h-i:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
----
000001:[a#2,RANGEKEYSET-b#inf,RANGEKEYSET]
000002:[c#1,SET-c#1,SET]
000003:[d#1,SET-d#1,SET]
000004:[e#2,RANGEKEYSET-f#inf,RANGEKEYSET]
000005:[g#1,SET-g#1,SET]
000006:[h#2,RANGEKEYSET-i#inf,RANGEKEYSET]

iter
first
next
next
next
next
next
----
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
b-e:{} (L6: fileNum=000004)
e-f:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000004)
f-h:{} (L6: fileNum=000006)
h-i:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000006)
.

iter
last
prev
prev
prev
prev
prev
----
h-i:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000006)
f-h:{} (L6: fileNum=000004)
e-f:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000004)
b-e:{} (L6: fileNum=000001)
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
.

# Test files with range keys and rangedels

define
file point-key-bounds=[a#1,SET-b#1,SET]
  a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
file point-key-bounds=[d#1,SET-d#1,SET]
  c-e:{(#3,RANGEKEYSET,@3,baz) (#3,RANGEKEYSET,@1,bar)}
  c-f:{(#2,RANGEDEL)}
file
  g-h:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
  i-j:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
  f-g:{(#2,RANGEDEL)}
----
000001:[a#2,RANGEKEYSET-b#1,SET]
000002:[c#3,RANGEKEYSET-f#inf,RANGEDEL]
000003:[f#2,RANGEDEL-j#inf,RANGEKEYSET]

iter rangedel
first
next
next
next
----
c-f:{(#2,RANGEDEL)} (L6: fileNum=000002)
f-g:{(#2,RANGEDEL)} (L6: fileNum=000003)
.
.

iter rangedel
last
prev
prev
prev
----
f-g:{(#2,RANGEDEL)} (L6: fileNum=000003)
c-f:{(#2,RANGEDEL)} (L6: fileNum=000002)
.
.

iter rangedel
seek-ge c
next
next
----
c-f:{(#2,RANGEDEL)} (L6: fileNum=000002)
f-g:{(#2,RANGEDEL)} (L6: fileNum=000003)
.

iter rangedel
seek-lt ff
prev
next
prev
prev
----
f-g:{(#2,RANGEDEL)} (L6: fileNum=000003)
c-f:{(#2,RANGEDEL)} (L6: fileNum=000002)
f-g:{(#2,RANGEDEL)} (L6: fileNum=000003)
c-f:{(#2,RANGEDEL)} (L6: fileNum=000002)
.

close-iter
----
unknown command: close-iter

# Test that a regular LevelIter ignores rangedels and emits straddle spans.

iter
first
next
next
next
next
next
----
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
b-c:{} (L6: fileNum=000002)
c-e:{(#3,RANGEKEYSET,@3,baz) (#3,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
e-g:{} (L6: fileNum=000003)
g-h:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)
i-j:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)

iter
seek-ge c
next
next
next
next
----
c-e:{(#3,RANGEKEYSET,@3,baz) (#3,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
e-g:{} (L6: fileNum=000003)
g-h:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)
i-j:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)
.

# Test seeking outside of bounds with straddles.

define
file
  c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
file
  e-f:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
file
  g-h:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
----
000001:[c#2,RANGEKEYSET-d#inf,RANGEKEYSET]
000002:[e#2,RANGEKEYSET-f#inf,RANGEKEYSET]
000003:[g#2,RANGEKEYSET-h#inf,RANGEKEYSET]

iter
seek-lt j
next
prev
prev
----
g-h:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)
.
g-h:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)
f-g:{} (L6: fileNum=000002)

iter
seek-lt j
prev
prev
next
next
----
g-h:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)
f-g:{} (L6: fileNum=000002)
e-f:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000002)
f-g:{} (L6: fileNum=000003)
g-h:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000003)

iter
seek-ge a
prev
next
next
----
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
.
c-d:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
d-e:{} (L6: fileNum=000002)

# Test straddle span generation when range key bounds are loose.
define
file range-key-bounds=[a#1,RANGEKEYSET-c#inf,RANGEKEYSET]
  a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)}
file range-key-bounds=[d#1,RANGEKEYSET-e#inf,RANGEKEYSET]
file
  g-h:{(#2,RANGEKEYSET,@3,baz) (#1,RANGEKEYSET,@1,qux)}
----
000001:[a#2,RANGEKEYSET-c#inf,RANGEKEYSET]
000002:[d#1,RANGEKEYSET-e#inf,RANGEKEYSET]
000003:[g#2,RANGEKEYSET-h#inf,RANGEKEYSET]

iter
first
next
next
next
next
----
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
c-d:{} (L6: fileNum=000002)
e-g:{} (L6: fileNum=000003)
g-h:{(#2,RANGEKEYSET,@3,baz) (#1,RANGEKEYSET,@1,qux)} (L6: fileNum=000003)
.

iter
last
prev
prev
prev
prev
----
g-h:{(#2,RANGEKEYSET,@3,baz) (#1,RANGEKEYSET,@1,qux)} (L6: fileNum=000003)
e-g:{} (L6: fileNum=000002)
c-d:{} (L6: fileNum=000001)
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
.

iter
seek-ge c1
prev
next
next
prev
prev
----
c-d:{} (L6: fileNum=000001)
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)
c-d:{} (L6: fileNum=000002)
e-g:{} (L6: fileNum=000003)
c-d:{} (L6: fileNum=000001)
a-b:{(#2,RANGEKEYSET,@3,foo) (#1,RANGEKEYSET,@1,bar)} (L6: fileNum=000001)

define
file range-key-bounds=[a#1,RANGEKEYSET-b#inf,RANGEKEYSET]
file range-key-bounds=[c#1,RANGEKEYSET-d#inf,RANGEKEYSET]
file range-key-bounds=[e#1,RANGEKEYSET-f#inf,RANGEKEYSET]
----
000001:[a#1,RANGEKEYSET-b#inf,RANGEKEYSET]
000002:[c#1,RANGEKEYSET-d#inf,RANGEKEYSET]
000003:[e#1,RANGEKEYSET-f#inf,RANGEKEYSET]

iter
seek-lt b1
prev
next
next
next
----
b-c:{} (L6: fileNum=000002)
.
b-c:{} (L6: fileNum=000002)
d-e:{} (L6: fileNum=000003)
.

iter
seek-lt z
prev
prev
----
d-e:{} (L6: fileNum=000002)
b-c:{} (L6: fileNum=000001)
.

iter
seek-ge a
next
next
----
b-c:{} (L6: fileNum=000002)
d-e:{} (L6: fileNum=000003)
.
