diff --git a/executor_test.go b/executor_test.go index ac4759343..cb878cb15 100644 --- a/executor_test.go +++ b/executor_test.go @@ -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") + } +} diff --git a/field.go b/field.go index 84bdbec73..34352655d 100644 --- a/field.go +++ b/field.go @@ -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 diff --git a/testdata/timeRegressionSchema.json b/testdata/timeRegressionSchema.json new file mode 100644 index 000000000..bc131015d --- /dev/null +++ b/testdata/timeRegressionSchema.json @@ -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 + } + ] +} \ No newline at end of file