diff --git a/client.go b/client.go index 40cd425..c43eadc 100644 --- a/client.go +++ b/client.go @@ -405,7 +405,7 @@ func (c *Client) ImportField(field *Field, iterator RecordIterator, options ...I } else { // Check whether roaring imports is available if importOptions.wantRoaring != nil && *importOptions.wantRoaring == true { - importOptions.hasRoaring = c.hasRoaringImportSupport(field) + importOptions.hasRoaring = c.HasRoaringImport(field) } importRecordsFunction(c.importColumns)(&importOptions) } @@ -588,12 +588,8 @@ func (c *Client) translateRecordsColumnKeys(columnKeyIDMap *lru.LRU, index *Inde return nil } -func (c *Client) hasRoaringImportSupport(field *Field) bool { - if field.options.fieldType != FieldTypeSet && - field.options.fieldType != FieldTypeDefault && - field.options.fieldType != FieldTypeBool && - field.options.fieldType != FieldTypeTime { - // Roaring imports is available for only set, bool and time fields. +func (c *Client) HasRoaringImport(field *Field) bool { + if !field.HasRoaringImport() { return false } // Check whether the roaring import endpoint exists diff --git a/client_it_test.go b/client_it_test.go index 997053a..5d9f19e 100644 --- a/client_it_test.go +++ b/client_it_test.go @@ -2425,6 +2425,60 @@ func TestImportColumnsNoNodesError(t *testing.T) { } } +func TestHasRoaringImportSupport(t *testing.T) { + client := getClient() + schema := NewSchema() + index1 := schema.Index("index-roaring", OptIndexTrackExistence(false)) + + yesRoaringFields := []*Field{} + // default field + yesRoaringFields = append(yesRoaringFields, index1.Field("default")) + // set field + yesRoaringFields = append(yesRoaringFields, index1.Field("set", OptFieldTypeSet(CacheTypeDefault, 100))) + // bool field + yesRoaringFields = append(yesRoaringFields, index1.Field("bool", OptFieldTypeBool())) + // time field + yesRoaringFields = append(yesRoaringFields, index1.Field("time", OptFieldTypeTime(TimeQuantumYearMonthDayHour))) + + for _, f := range yesRoaringFields { + if !client.HasRoaringImport(f) { + t.Fatalf("%s should have roaring import support", f.Name()) + } + } + + noRoaringFields := []*Field{} + // int field + noRoaringFields = append(noRoaringFields, index1.Field("int", OptFieldTypeInt(-100, 100))) + // mutex field + noRoaringFields = append(noRoaringFields, index1.Field("mutex", OptFieldTypeMutex(CacheTypeDefault, 100))) + + index2 := schema.Index("index-no-roaring") + // trackExistence is true by default + if index2.Opts().TrackExistence() != true { + t.Fatalf("trackExistence should be true by default") + } + + // default field + noRoaringFields = append(noRoaringFields, index2.Field("default")) + // set field + noRoaringFields = append(noRoaringFields, index2.Field("set", OptFieldTypeSet(CacheTypeDefault, 100))) + // bool field + noRoaringFields = append(noRoaringFields, index2.Field("bool", OptFieldTypeBool())) + // time field + noRoaringFields = append(noRoaringFields, index2.Field("time", OptFieldTypeTime(TimeQuantumYearMonthDayHour))) + // int field + noRoaringFields = append(noRoaringFields, index2.Field("int", OptFieldTypeInt(-100, 100))) + // mutex field + noRoaringFields = append(noRoaringFields, index2.Field("mutex", OptFieldTypeMutex(CacheTypeDefault, 100))) + + for _, f := range noRoaringFields { + if client.HasRoaringImport(f) { + t.Fatalf("%s should not have roaring import support", f.Name()) + } + } + +} + func getMockServer(statusCode int, response []byte, contentLength int) *httptest.Server { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/x-protobuf") diff --git a/orm.go b/orm.go index 624f6b1..941ae4c 100644 --- a/orm.go +++ b/orm.go @@ -826,6 +826,21 @@ func (f *Field) Opts() FieldOptions { return *f.options } +func (f Field) HasRoaringImport() bool { + // Roaring imports is not available for indexes with trackExistence=true + if f.index.options.TrackExistence() { + return false + } + if f.options.fieldType != FieldTypeSet && + f.options.fieldType != FieldTypeDefault && + f.options.fieldType != FieldTypeBool && + f.options.fieldType != FieldTypeTime { + // Roaring imports is available for only set, bool and time fields. + return false + } + return true +} + func (f *Field) copy() *Field { field := newField(f.name, f.index) *field.options = *f.options