in storage/db/query.go [60:132]
func (p part) merge(p2 part) (part, error) {
if p2.operator < p.operator {
// Sort the parts so we only need half the table below.
p, p2 = p2, p
}
switch p.operator {
case equals:
switch p2.operator {
case equals:
if p.value == p2.value {
return p, nil
}
return part{}, io.EOF
case lt:
if p.value < p2.value {
return p, nil
}
return part{}, io.EOF
case gt:
if p.value > p2.value {
return p, nil
}
return part{}, io.EOF
case ltgt:
if p.value < p2.value && p.value > p2.value2 {
return p, nil
}
return part{}, io.EOF
}
case ltgt:
switch p2.operator {
case ltgt:
if p2.value < p.value {
p.value = p2.value
}
if p2.value2 > p.value2 {
p.value2 = p2.value2
}
case lt:
if p2.value < p.value {
p.value = p2.value
}
case gt:
if p2.value > p.value2 {
p.value2 = p2.value
}
}
case lt:
switch p2.operator {
case lt:
if p2.value < p.value {
return p2, nil
}
return p, nil
case gt:
p = part{p.key, ltgt, p.value, p2.value}
}
case gt:
// p2.operator == gt
if p2.value > p.value {
return p2, nil
}
return p, nil
}
// p.operator == ltgt
if p.value <= p.value2 || p.value == "" {
return part{}, io.EOF
}
if p.value2 == "" {
return part{p.key, lt, p.value, ""}, nil
}
return p, nil
}