Skip to content
This repository has been archived by the owner on Sep 28, 2022. It is now read-only.

Disables roaring imports when trackExistence is true #239

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down Expand Up @@ -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
Expand Down
54 changes: 54 additions & 0 deletions client_it_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
15 changes: 15 additions & 0 deletions orm.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down