0
0

Merge pull request #531 from mschoch/losefloat

remove use of float64 to represent int things
This commit is contained in:
Marty Schoch 2017-02-09 20:25:20 -05:00 committed by GitHub
commit 97a428f5b0
11 changed files with 67 additions and 81 deletions

View File

@ -1114,7 +1114,7 @@ func TestTermVectorArrayPositions(t *testing.T) {
t.Fatalf("expected at least one location array position") t.Fatalf("expected at least one location array position")
} }
if results.Hits[0].Locations["Messages"]["second"][0].ArrayPositions[0] != 1 { if results.Hits[0].Locations["Messages"]["second"][0].ArrayPositions[0] != 1 {
t.Fatalf("expected array position 1, got %f", results.Hits[0].Locations["Messages"]["second"][0].ArrayPositions[0]) t.Fatalf("expected array position 1, got %d", results.Hits[0].Locations["Messages"]["second"][0].ArrayPositions[0])
} }
// repeat search for this document in Messages field // repeat search for this document in Messages field
@ -1136,7 +1136,7 @@ func TestTermVectorArrayPositions(t *testing.T) {
t.Fatalf("expected at least one location array position") t.Fatalf("expected at least one location array position")
} }
if results.Hits[0].Locations["Messages"]["third"][0].ArrayPositions[0] != 2 { if results.Hits[0].Locations["Messages"]["third"][0].ArrayPositions[0] != 2 {
t.Fatalf("expected array position 2, got %f", results.Hits[0].Locations["Messages"]["third"][0].ArrayPositions[0]) t.Fatalf("expected array position 2, got %d", results.Hits[0].Locations["Messages"]["third"][0].ArrayPositions[0])
} }
err = index.Close() err = index.Close()

View File

@ -41,7 +41,7 @@ func (a *FragmentFormatter) Format(f *highlight.Fragment, orderedTermLocations h
continue continue
} }
// make sure the array positions match // make sure the array positions match
if !highlight.SameArrayPositions(f.ArrayPositions, termLocation.ArrayPositions) { if !termLocation.ArrayPositions.Equals(f.ArrayPositions) {
continue continue
} }
if termLocation.Start < curr { if termLocation.Start < curr {

View File

@ -44,7 +44,7 @@ func (a *FragmentFormatter) Format(f *highlight.Fragment, orderedTermLocations h
continue continue
} }
// make sure the array positions match // make sure the array positions match
if !highlight.SameArrayPositions(f.ArrayPositions, termLocation.ArrayPositions) { if !termLocation.ArrayPositions.Equals(f.ArrayPositions) {
continue continue
} }
if termLocation.Start < curr { if termLocation.Start < curr {

View File

@ -37,7 +37,7 @@ func (s *FragmentScorer) Score(f *highlight.Fragment) {
OUTER: OUTER:
for _, locations := range s.tlm { for _, locations := range s.tlm {
for _, location := range locations { for _, location := range locations {
if highlight.SameArrayPositions(f.ArrayPositions, location.ArrayPositions) && int(location.Start) >= f.Start && int(location.End) <= f.End { if location.ArrayPositions.Equals(f.ArrayPositions) && int(location.Start) >= f.Start && int(location.End) <= f.End {
score += 1.0 score += 1.0
// once we find a term in the fragment // once we find a term in the fragment
// don't care about additional matches // don't care about additional matches

View File

@ -87,7 +87,7 @@ func (s *Highlighter) BestFragmentsInField(dm *search.DocumentMatch, doc *docume
if ok { if ok {
termLocationsSameArrayPosition := make(highlight.TermLocations, 0) termLocationsSameArrayPosition := make(highlight.TermLocations, 0)
for _, otl := range orderedTermLocations { for _, otl := range orderedTermLocations {
if highlight.SameArrayPositions(f.ArrayPositions(), otl.ArrayPositions) { if otl.ArrayPositions.Equals(f.ArrayPositions()) {
termLocationsSameArrayPosition = append(termLocationsSameArrayPosition, otl) termLocationsSameArrayPosition = append(termLocationsSameArrayPosition, otl)
} }
} }

View File

@ -23,7 +23,7 @@ import (
type TermLocation struct { type TermLocation struct {
Term string Term string
ArrayPositions []float64 ArrayPositions search.ArrayPositions
Pos int Pos int
Start int Start int
End int End int
@ -103,15 +103,3 @@ func OrderTermLocations(tlm search.TermLocationMap) TermLocations {
sort.Sort(rv) sort.Sort(rv)
return rv return rv
} }
func SameArrayPositions(fieldArrayPositions []uint64, termLocationArrayPositions []float64) bool {
if len(fieldArrayPositions) != len(termLocationArrayPositions) {
return false
}
for i := 0; i < len(fieldArrayPositions); i++ {
if fieldArrayPositions[i] != uint64(termLocationArrayPositions[i]) {
return false
}
}
return true
}

View File

@ -64,12 +64,12 @@ func TestTermLocationOverlaps(t *testing.T) {
// with array positions // with array positions
{ {
left: &TermLocation{ left: &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
End: 5, End: 5,
}, },
right: &TermLocation{ right: &TermLocation{
ArrayPositions: []float64{1}, ArrayPositions: search.ArrayPositions{1},
Start: 7, Start: 7,
End: 11, End: 11,
}, },
@ -77,12 +77,12 @@ func TestTermLocationOverlaps(t *testing.T) {
}, },
{ {
left: &TermLocation{ left: &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
End: 5, End: 5,
}, },
right: &TermLocation{ right: &TermLocation{
ArrayPositions: []float64{1}, ArrayPositions: search.ArrayPositions{1},
Start: 3, Start: 3,
End: 11, End: 11,
}, },
@ -90,12 +90,12 @@ func TestTermLocationOverlaps(t *testing.T) {
}, },
{ {
left: &TermLocation{ left: &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
End: 5, End: 5,
}, },
right: &TermLocation{ right: &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 3, Start: 3,
End: 11, End: 11,
}, },
@ -103,12 +103,12 @@ func TestTermLocationOverlaps(t *testing.T) {
}, },
{ {
left: &TermLocation{ left: &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
End: 5, End: 5,
}, },
right: &TermLocation{ right: &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 7, Start: 7,
End: 11, End: 11,
}, },
@ -235,24 +235,24 @@ func TestTermLocationsMergeOverlapping(t *testing.T) {
{ {
input: TermLocations{ input: TermLocations{
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
End: 5, End: 5,
}, },
&TermLocation{ &TermLocation{
ArrayPositions: []float64{1}, ArrayPositions: search.ArrayPositions{1},
Start: 7, Start: 7,
End: 11, End: 11,
}, },
}, },
output: TermLocations{ output: TermLocations{
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
End: 5, End: 5,
}, },
&TermLocation{ &TermLocation{
ArrayPositions: []float64{1}, ArrayPositions: search.ArrayPositions{1},
Start: 7, Start: 7,
End: 11, End: 11,
}, },
@ -261,24 +261,24 @@ func TestTermLocationsMergeOverlapping(t *testing.T) {
{ {
input: TermLocations{ input: TermLocations{
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
End: 5, End: 5,
}, },
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 7, Start: 7,
End: 11, End: 11,
}, },
}, },
output: TermLocations{ output: TermLocations{
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
End: 5, End: 5,
}, },
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 7, Start: 7,
End: 11, End: 11,
}, },
@ -287,19 +287,19 @@ func TestTermLocationsMergeOverlapping(t *testing.T) {
{ {
input: TermLocations{ input: TermLocations{
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
End: 5, End: 5,
}, },
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 3, Start: 3,
End: 11, End: 11,
}, },
}, },
output: TermLocations{ output: TermLocations{
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
End: 11, End: 11,
}, },
@ -309,24 +309,24 @@ func TestTermLocationsMergeOverlapping(t *testing.T) {
{ {
input: TermLocations{ input: TermLocations{
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
End: 5, End: 5,
}, },
&TermLocation{ &TermLocation{
ArrayPositions: []float64{1}, ArrayPositions: search.ArrayPositions{1},
Start: 3, Start: 3,
End: 11, End: 11,
}, },
}, },
output: TermLocations{ output: TermLocations{
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
End: 5, End: 5,
}, },
&TermLocation{ &TermLocation{
ArrayPositions: []float64{1}, ArrayPositions: search.ArrayPositions{1},
Start: 3, Start: 3,
End: 11, End: 11,
}, },
@ -401,23 +401,23 @@ func TestTermLocationsOrder(t *testing.T) {
input: search.TermLocationMap{ input: search.TermLocationMap{
"term": []*search.Location{ "term": []*search.Location{
{ {
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
}, },
{ {
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 5, Start: 5,
}, },
}, },
}, },
output: TermLocations{ output: TermLocations{
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Term: "term", Term: "term",
Start: 0, Start: 0,
}, },
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Term: "term", Term: "term",
Start: 5, Start: 5,
}, },
@ -427,23 +427,23 @@ func TestTermLocationsOrder(t *testing.T) {
input: search.TermLocationMap{ input: search.TermLocationMap{
"term": []*search.Location{ "term": []*search.Location{
{ {
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 5, Start: 5,
}, },
{ {
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 0, Start: 0,
}, },
}, },
}, },
output: TermLocations{ output: TermLocations{
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Term: "term", Term: "term",
Start: 0, Start: 0,
}, },
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Term: "term", Term: "term",
Start: 5, Start: 5,
}, },
@ -453,23 +453,23 @@ func TestTermLocationsOrder(t *testing.T) {
input: search.TermLocationMap{ input: search.TermLocationMap{
"term": []*search.Location{ "term": []*search.Location{
{ {
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 5, Start: 5,
}, },
{ {
ArrayPositions: []float64{1}, ArrayPositions: search.ArrayPositions{1},
Start: 0, Start: 0,
}, },
}, },
}, },
output: TermLocations{ output: TermLocations{
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Term: "term", Term: "term",
Start: 5, Start: 5,
}, },
&TermLocation{ &TermLocation{
ArrayPositions: []float64{1}, ArrayPositions: search.ArrayPositions{1},
Term: "term", Term: "term",
Start: 0, Start: 0,
}, },
@ -479,23 +479,23 @@ func TestTermLocationsOrder(t *testing.T) {
input: search.TermLocationMap{ input: search.TermLocationMap{
"term": []*search.Location{ "term": []*search.Location{
{ {
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Start: 5, Start: 5,
}, },
{ {
ArrayPositions: []float64{0, 1}, ArrayPositions: search.ArrayPositions{0, 1},
Start: 0, Start: 0,
}, },
}, },
}, },
output: TermLocations{ output: TermLocations{
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0}, ArrayPositions: search.ArrayPositions{0},
Term: "term", Term: "term",
Start: 5, Start: 5,
}, },
&TermLocation{ &TermLocation{
ArrayPositions: []float64{0, 1}, ArrayPositions: search.ArrayPositions{0, 1},
Term: "term", Term: "term",
Start: 0, Start: 0,
}, },

View File

@ -148,7 +148,7 @@ func (s *TermQueryScorer) Score(ctx *search.SearchContext, termMatch *index.Term
for _, v := range termMatch.Vectors { for _, v := range termMatch.Vectors {
totalPositions += len(v.ArrayPositions) totalPositions += len(v.ArrayPositions)
} }
positions := make([]float64, totalPositions) positions := make(search.ArrayPositions, totalPositions)
positionsUsed := 0 positionsUsed := 0
rv.Locations = make(search.FieldTermLocationMap) rv.Locations = make(search.FieldTermLocationMap)
@ -162,14 +162,14 @@ func (s *TermQueryScorer) Score(ctx *search.SearchContext, termMatch *index.Term
loc := &locs[locsUsed] loc := &locs[locsUsed]
locsUsed++ locsUsed++
loc.Pos = float64(v.Pos) loc.Pos = v.Pos
loc.Start = float64(v.Start) loc.Start = v.Start
loc.End = float64(v.End) loc.End = v.End
if len(v.ArrayPositions) > 0 { if len(v.ArrayPositions) > 0 {
loc.ArrayPositions = positions[positionsUsed : positionsUsed+len(v.ArrayPositions)] loc.ArrayPositions = positions[positionsUsed : positionsUsed+len(v.ArrayPositions)]
for i, ap := range v.ArrayPositions { for i, ap := range v.ArrayPositions {
loc.ArrayPositions[i] = float64(ap) loc.ArrayPositions[i] = ap
} }
positionsUsed += len(v.ArrayPositions) positionsUsed += len(v.ArrayPositions)
} }

View File

@ -21,7 +21,7 @@ import (
"github.com/blevesearch/bleve/index" "github.com/blevesearch/bleve/index"
) )
type ArrayPositions []float64 type ArrayPositions []uint64
func (ap ArrayPositions) Equals(other ArrayPositions) bool { func (ap ArrayPositions) Equals(other ArrayPositions) bool {
if len(ap) != len(other) { if len(ap) != len(other) {
@ -36,9 +36,9 @@ func (ap ArrayPositions) Equals(other ArrayPositions) bool {
} }
type Location struct { type Location struct {
Pos float64 `json:"pos"` Pos uint64 `json:"pos"`
Start float64 `json:"start"` Start uint64 `json:"start"`
End float64 `json:"end"` End uint64 `json:"end"`
ArrayPositions ArrayPositions `json:"array_positions"` ArrayPositions ArrayPositions `json:"array_positions"`
} }

View File

@ -185,7 +185,7 @@ func (p phrasePath) MergeInto(in search.TermLocationMap) {
// this is the primary state being built during the traversal // this is the primary state being built during the traversal
// //
// returns slice of paths, or nil if invocation did not find any successul paths // returns slice of paths, or nil if invocation did not find any successul paths
func findPhrasePaths(prevPos float64, ap search.ArrayPositions, phraseTerms []string, tlm search.TermLocationMap, p phrasePath, remainingSlop int) []phrasePath { func findPhrasePaths(prevPos uint64, ap search.ArrayPositions, phraseTerms []string, tlm search.TermLocationMap, p phrasePath, remainingSlop int) []phrasePath {
// no more terms // no more terms
if len(phraseTerms) < 1 { if len(phraseTerms) < 1 {
@ -197,10 +197,10 @@ func findPhrasePaths(prevPos float64, ap search.ArrayPositions, phraseTerms []st
// empty term is treated as match (continue) // empty term is treated as match (continue)
if car == "" { if car == "" {
nextPos := prevPos + 1.0 nextPos := prevPos + 1
if prevPos == 0.0 { if prevPos == 0 {
// if prevPos was 0.0, don't set it to 1 (as thats not a real abs pos) // if prevPos was 0, don't set it to 1 (as thats not a real abs pos)
nextPos = 0.0 // don't advance nextPos if prevPos was 0 nextPos = 0 // don't advance nextPos if prevPos was 0
} }
return findPhrasePaths(nextPos, ap, cdr, tlm, p, remainingSlop) return findPhrasePaths(nextPos, ap, cdr, tlm, p, remainingSlop)
} }
@ -209,19 +209,19 @@ func findPhrasePaths(prevPos float64, ap search.ArrayPositions, phraseTerms []st
locations := tlm[car] locations := tlm[car]
var rv []phrasePath var rv []phrasePath
for _, loc := range locations { for _, loc := range locations {
if prevPos != 0.0 && !loc.ArrayPositions.Equals(ap) { if prevPos != 0 && !loc.ArrayPositions.Equals(ap) {
// if the array positions are wrong, can't match, try next location // if the array positions are wrong, can't match, try next location
continue continue
} }
// compute distance from previous phrase term // compute distance from previous phrase term
dist := 0 dist := 0
if prevPos != 0.0 { if prevPos != 0 {
dist = editDistance(prevPos+1.0, loc.Pos) dist = editDistance(prevPos+1, loc.Pos)
} }
// if enough slop reamining, continue recursively // if enough slop reamining, continue recursively
if prevPos == 0.0 || (remainingSlop-dist) >= 0 { if prevPos == 0 || (remainingSlop-dist) >= 0 {
// this location works, add it to the path (but not for empty term) // this location works, add it to the path (but not for empty term)
px := append(p, &phrasePart{term: car, loc: loc}) px := append(p, &phrasePart{term: car, loc: loc})
rv = append(rv, findPhrasePaths(loc.Pos, loc.ArrayPositions, cdr, tlm, px, remainingSlop-dist)...) rv = append(rv, findPhrasePaths(loc.Pos, loc.ArrayPositions, cdr, tlm, px, remainingSlop-dist)...)
@ -230,10 +230,8 @@ func findPhrasePaths(prevPos float64, ap search.ArrayPositions, phraseTerms []st
return rv return rv
} }
func editDistance(p1, p2 float64) int { func editDistance(p1, p2 uint64) int {
i1 := int(p1) dist := int(p1 - p2)
i2 := int(p2)
dist := i1 - i2
if dist < 0 { if dist < 0 {
return -dist return -dist
} }

View File

@ -68,7 +68,7 @@ func TestPhraseSearch(t *testing.T) {
Score: 1.0807601687084403, Score: 1.0807601687084403,
}, },
}, },
locations: map[string]map[string][]search.Location{"desc": map[string][]search.Location{"beer": []search.Location{search.Location{Pos: 2, Start: 6, End: 10, ArrayPositions: []float64(nil)}}, "angst": []search.Location{search.Location{Pos: 1, Start: 0, End: 5, ArrayPositions: []float64(nil)}}}}, locations: map[string]map[string][]search.Location{"desc": map[string][]search.Location{"beer": []search.Location{search.Location{Pos: 2, Start: 6, End: 10}}, "angst": []search.Location{search.Location{Pos: 1, Start: 0, End: 5}}}},
fieldterms: [][2]string{[2]string{"desc", "beer"}, [2]string{"desc", "angst"}}, fieldterms: [][2]string{[2]string{"desc", "beer"}, [2]string{"desc", "angst"}},
}, },
} }