fix Clear() returning false when clearing a bit with no time views

This commit is contained in:
Jaden Weiss 2020-06-18 09:20:47 -04:00
parent 21888703e5
commit a270bff67b
No known key found for this signature in database
GPG key ID: 177F065773634B67
3 changed files with 78 additions and 6 deletions

View file

@ -5719,3 +5719,42 @@ func TestExecutor_Execute_TopNDistinct(t *testing.T) {
}
})
}
func TestTimelessClearRegression(t *testing.T) {
data, err := ioutil.ReadFile("testdata/timeRegressionSchema.json")
if err != nil {
t.Fatal(err)
}
c := test.MustRunCluster(t, 1)
defer c.Close()
api := c[0].API
schema := &pilosa.Schema{}
if err := json.NewDecoder(bytes.NewReader(data)).Decode(schema); err != nil {
t.Fatal(err)
}
if err := api.ApplySchema(context.TODO(), schema, false); err != nil {
t.Fatal(err)
}
idxName := schema.Indexes[0].Name
setQuery := `Set(511, stargazer=376)`
if _, err := api.Query(context.TODO(), &pilosa.QueryRequest{Index: idxName, Query: setQuery}); err != nil {
t.Fatal(err)
}
setQuery = `Set(512, stargazer=300, 2017-05-18T00:00)`
if _, err := api.Query(context.TODO(), &pilosa.QueryRequest{Index: idxName, Query: setQuery}); err != nil {
t.Fatal(err)
}
clearQuery := `Clear(511, stargazer=376)`
if res, err := api.Query(context.TODO(), &pilosa.QueryRequest{Index: idxName, Query: clearQuery}); err != nil {
t.Fatal(err)
} else if res.Results[0] != true {
t.Fatal("clear supposedly failed")
}
}

View file

@ -1281,15 +1281,14 @@ func (f *Field) ClearBit(rowID, colID uint64) (changed bool, err error) {
// Retrieve view. Exit if it doesn't exist.
view, present := f.viewMap[viewName]
if !present {
return changed, errors.Wrap(err, "clearing missing view")
return false, errors.Wrap(err, "clearing missing view")
}
// Clear non-time bit.
if v, err := view.clearBit(rowID, colID); err != nil {
return changed, errors.Wrap(err, "clearing on view")
return false, errors.Wrap(err, "clearing on view")
} else if v {
changed = v
changed = changed || v
}
if len(f.viewMap) == 1 { // assuming no time views
return changed, nil
@ -1304,10 +1303,12 @@ func (f *Field) ClearBit(rowID, colID uint64) (changed bool, err error) {
level--
}
if level < skipAbove {
if changed, err = view.clearBit(rowID, colID); err != nil {
cleared, err := view.clearBit(rowID, colID)
changed = changed || cleared
if err != nil {
return changed, errors.Wrapf(err, "clearing on view %s", view.name)
}
if !changed {
if !cleared {
skipAbove = level + 1
} else {
skipAbove = maxInt

32
testdata/timeRegressionSchema.json vendored Normal file
View file

@ -0,0 +1,32 @@
{
"indexes": [
{
"name": "repository",
"options": {
"keys": false,
"trackExistence": true
},
"fields": [
{
"name": "language",
"options": {
"type": "set",
"cacheType": "ranked",
"cacheSize": 50000,
"keys": false
}
},
{
"name": "stargazer",
"options": {
"type": "time",
"timeQuantum": "YMD",
"keys": false,
"noStandardView": false
}
}
],
"shardWidth": 1048576
}
]
}