mirror of https://github.com/tidwall/tile38.git
Allow for WHERE for on geofence detection
This commit is contained in:
parent
757db4d509
commit
cc9320e246
|
@ -191,8 +191,10 @@ func (c *Collection) Set(
|
|||
oldFieldValues = c.fieldValues.get(oldItem.fieldValuesSlot)
|
||||
newFieldValues = oldFieldValues
|
||||
newItem.fieldValuesSlot = oldItem.fieldValuesSlot
|
||||
if len(oldFieldValues) > 0 {
|
||||
oldFieldValues = append([]float64{}, oldFieldValues...)
|
||||
}
|
||||
}
|
||||
|
||||
if fields == nil {
|
||||
if len(values) > 0 {
|
||||
newFieldValues = values
|
||||
|
|
|
@ -105,9 +105,18 @@ func fenceMatch(
|
|||
}
|
||||
detect = "roam"
|
||||
} else {
|
||||
var nocross bool
|
||||
// not using roaming
|
||||
match1 := fenceMatchObject(fence, details.oldObj)
|
||||
if match1 {
|
||||
match1, _, _ = sw.testObject(details.id, details.oldObj, details.oldFields)
|
||||
nocross = !match1
|
||||
}
|
||||
match2 := fenceMatchObject(fence, details.obj)
|
||||
if match2 {
|
||||
match2, _, _ = sw.testObject(details.id, details.obj, details.fields)
|
||||
nocross = !match2
|
||||
}
|
||||
if match1 && match2 {
|
||||
detect = "inside"
|
||||
} else if match1 && !match2 {
|
||||
|
@ -121,7 +130,7 @@ func fenceMatch(
|
|||
if details.command != "fset" {
|
||||
// Maybe the old object and new object create a line that crosses the fence.
|
||||
// Must detect for that possibility.
|
||||
if details.oldObj != nil {
|
||||
if !nocross && details.oldObj != nil {
|
||||
ls := geojson.NewLineString(geometry.NewLine(
|
||||
[]geometry.Point{
|
||||
details.oldObj.Center(),
|
||||
|
@ -176,6 +185,7 @@ func fenceMatch(
|
|||
o: details.obj,
|
||||
fields: details.fields,
|
||||
noLock: true,
|
||||
noTest: true,
|
||||
distance: distance,
|
||||
distOutput: fence.distance,
|
||||
})
|
||||
|
|
|
@ -68,6 +68,7 @@ type ScanWriterParams struct {
|
|||
distance float64
|
||||
distOutput bool // query or fence requested distance output
|
||||
noLock bool
|
||||
noTest bool
|
||||
ignoreGlobMatch bool
|
||||
clip geojson.Object
|
||||
skipTesting bool
|
||||
|
@ -373,10 +374,15 @@ func (sw *scanWriter) writeObject(opts ScanWriterParams) bool {
|
|||
sw.mu.Lock()
|
||||
defer sw.mu.Unlock()
|
||||
}
|
||||
ok, keepGoing, _ := sw.testObject(opts.id, opts.o, opts.fields)
|
||||
|
||||
keepGoing := true
|
||||
if !opts.noTest {
|
||||
var ok bool
|
||||
ok, keepGoing, _ = sw.testObject(opts.id, opts.o, opts.fields)
|
||||
if !ok {
|
||||
return keepGoing
|
||||
}
|
||||
}
|
||||
sw.count++
|
||||
if sw.output == outputCount {
|
||||
return sw.count < sw.limit
|
||||
|
|
Loading…
Reference in New Issue