Files
dolt/samples/go/nomdex/query_range.go
T
Mike Gray 47565f39d1 Improve code based on tool analysis feeback (#2521)
Fixes are based on Go report card output:
- `gofmt -s` eliminates some duplication in struct/slice initialization
- `golint` found some issues like: `warning: should drop = nil from declaration of var XXX; it is the zero value`
- `golint` found some issues like: `warning: receiver name XXX should be consistent with previous receiver name YYY for ZZZ`
- `golint` says not to use underscores for function/variable names
- `golint` found several issues like: `warning: if block ends with a return statement, so drop this else and outdent its block`

No functional changes are included - just source code quality improvements.
2016-09-06 16:35:25 -04:00

163 lines
3.4 KiB
Go

// Copyright 2016 Attic Labs, Inc. All rights reserved.
// Licensed under the Apache License, version 2.0:
// http://www.apache.org/licenses/LICENSE-2.0
package main
import (
"bytes"
"fmt"
"io"
"sort"
"github.com/attic-labs/noms/go/types"
)
type bound struct {
value types.Value
include bool
infinity int8
}
func (b bound) isLessThanOrEqual(o bound) (res bool) {
return b.equals(o) || b.isLessThan(o)
}
func (b bound) isLessThan(o bound) (res bool) {
if b.infinity < o.infinity {
return true
}
if b.infinity > o.infinity {
return false
}
if b.infinity == o.infinity && b.infinity != 0 {
return false
}
if b.value.Less(o.value) {
return true
}
if b.value.Equals(o.value) {
if !b.include && o.include {
return true
}
}
return false
}
func (b bound) isGreaterThanOrEqual(o bound) (res bool) {
return !b.isLessThan(o)
}
func (b bound) isGreaterThan(o bound) (res bool) {
return !b.equals(o) || !b.isLessThan(o)
}
func (b bound) equals(o bound) bool {
return b.infinity == o.infinity && b.include == o.include &&
(b.value == nil && o.value == nil || (b.value != nil && o.value != nil && b.value.Equals(o.value)))
}
func (b bound) String() string {
var s1 string
if b.value == nil {
s1 = "<nil>"
} else {
buf := bytes.Buffer{}
types.WriteEncodedValue(&buf, b.value)
s1 = buf.String()
}
return fmt.Sprintf("bound{v: %s, include: %t, infinity: %d}", s1, b.include, b.infinity)
}
func (b bound) minValue(o bound) (res bound) {
if b.isLessThan(o) {
return b
}
return o
}
func (b bound) maxValue(o bound) (res bound) {
if b.isLessThan(o) {
return o
}
return b
}
type queryRange struct {
lower bound
upper bound
}
func (r queryRange) and(o queryRange) (rangeDescs queryRangeSlice) {
if !r.intersects(o) {
return []queryRange{}
}
lower := r.lower.maxValue(o.lower)
upper := r.upper.minValue(o.upper)
return []queryRange{{lower, upper}}
}
func (r queryRange) or(o queryRange) (rSlice queryRangeSlice) {
if r.intersects(o) {
v1 := r.lower.minValue(o.lower)
v2 := r.upper.maxValue(o.upper)
return queryRangeSlice{queryRange{v1, v2}}
}
rSlice = queryRangeSlice{r, o}
sort.Sort(rSlice)
return rSlice
}
func (r queryRange) intersects(o queryRange) (res bool) {
if r.lower.isGreaterThanOrEqual(o.lower) && r.lower.isLessThanOrEqual(o.upper) {
return true
}
if r.upper.isGreaterThanOrEqual(o.lower) && r.upper.isLessThanOrEqual(o.upper) {
return true
}
if o.lower.isGreaterThanOrEqual(r.lower) && o.lower.isLessThanOrEqual(r.upper) {
return true
}
if o.upper.isGreaterThanOrEqual(r.lower) && o.upper.isLessThanOrEqual(r.upper) {
return true
}
return false
}
func (r queryRange) String() string {
return fmt.Sprintf("queryRange{lower: %s, upper: %s", r.lower, r.upper)
}
// queryRangeSlice defines the sort.Interface. This implementation sorts queryRanges by
// the lower bound in ascending order.
type queryRangeSlice []queryRange
func (rSlice queryRangeSlice) Len() int {
return len(rSlice)
}
func (rSlice queryRangeSlice) Swap(i, j int) {
rSlice[i], rSlice[j] = rSlice[j], rSlice[i]
}
func (rSlice queryRangeSlice) Less(i, j int) bool {
return !rSlice[i].lower.equals(rSlice[j].lower) && rSlice[i].lower.isLessThanOrEqual(rSlice[j].lower)
}
func (rSlice queryRangeSlice) dbgPrint(w io.Writer) {
for i, rd := range rSlice {
if i == 0 {
fmt.Fprintf(w, "\n#################\n")
}
fmt.Fprintf(w, "queryRange %d: %s\n", i, rd)
}
if len(rSlice) > 0 {
fmt.Fprintf(w, "\n")
}
}