This is an automated email from the ASF dual-hosted git repository. hanahmily pushed a commit to branch index in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git
commit f405da318a01f91390b5b4fcb542e71dbaca9121 Merge: dbc21e88 66574f0d Author: Gao Hongtao <[email protected]> AuthorDate: Wed Nov 13 10:26:16 2024 +0800 Merge remote-tracking branch 'origin/index' into index api/proto/banyandb/database/v1/schema.proto | 2 + banyand/internal/storage/index.go | 52 ++++----- banyand/internal/storage/index_test.go | 2 +- banyand/internal/storage/storage.go | 2 +- banyand/measure/query.go | 168 +++++++++++++++++++++++++--- banyand/measure/write.go | 35 ++++-- docs/api-reference.md | 1 + pkg/index/index.go | 10 +- pkg/index/inverted/inverted.go | 5 +- pkg/index/inverted/inverted_series.go | 31 +++-- pkg/partition/index.go | 25 +++-- pkg/query/model/model.go | 20 ++++ 12 files changed, 277 insertions(+), 76 deletions(-) diff --cc banyand/internal/storage/index.go index ef963983,fc5083c3..ba3bd443 --- a/banyand/internal/storage/index.go +++ b/banyand/internal/storage/index.go @@@ -243,12 -245,12 +245,12 @@@ func (s *seriesIndex) Search(ctx contex } query, err := s.store.BuildQuery(seriesMatchers, opts.Query) if err != nil { - return nil, nil, err + return nil, nil, nil, err } - iter, err := s.store.Iterator(ctx, fieldKey, rangeOpts, + iter, err := s.store.SeriesSort(ctx, fieldKey, rangeOpts, opts.Order.Sort, opts.PreloadSize, query, opts.Projection) if err != nil { - return nil, nil, err + return nil, nil, nil, err } defer func() { err = multierr.Append(err, iter.Close()) diff --cc banyand/measure/write.go index bb6165d3,13d5aec0..6f5a9659 --- a/banyand/measure/write.go +++ b/banyand/measure/write.go @@@ -156,27 -156,33 +156,35 @@@ func (w *writeCallback) handle(dst map[ t.Name, t.Type, tagValue) - if r, ok := tfr[t.Name]; ok { + r, ok := tfr[t.Name] + if ok || stm.schema.NonTimeSeries { + fieldKey := index.FieldKey{} + switch { + case ok: + fieldKey.IndexRuleID = r.GetMetadata().GetId() + fieldKey.Analyzer = r.Analyzer + case stm.schema.NonTimeSeries: + fieldKey.TagName = t.Name + default: + logger.Panicf("metadata crashed, tag family rule %s not found", t.Name) + } + toIndex := ok || !stm.schema.NonTimeSeries if encodeTagValue.value != nil { fields = append(fields, index.Field{ - Key: index.FieldKey{ - IndexRuleID: r.GetMetadata().GetId(), - Analyzer: r.Analyzer, - }, - Key: fieldKey, - Term: encodeTagValue.value, - Store: true, - Index: toIndex, ++ Key: fieldKey, + Term: encodeTagValue.value, + Store: true, ++ Index: toIndex, + NoSort: r.GetNoSort(), }) } else { for _, val := range encodeTagValue.valueArr { fields = append(fields, index.Field{ - Key: index.FieldKey{ - IndexRuleID: r.GetMetadata().GetId(), - Analyzer: r.Analyzer, - }, - Key: fieldKey, - Term: val, - Store: true, - Index: toIndex, ++ Key: fieldKey, + Term: val, + Store: true, ++ Index: toIndex, + NoSort: r.GetNoSort(), }) } } diff --cc pkg/index/index.go index fdcb2c92,0b225581..11e6e379 --- a/pkg/index/index.go +++ b/pkg/index/index.go @@@ -208,15 -217,11 +213,16 @@@ func (s Series) String() string return fmt.Sprintf("%s:%d", s.EntityValues, s.ID) } +// SortedField returns the value of the sorted field. +func (s Series) SortedField() []byte { + return s.EntityValues +} + // SeriesDocument represents a series document in an index. type SeriesDocument struct { - Fields map[string][]byte - Key Series + Fields map[string][]byte + Timestamp int64 + Key Series } // SeriesStore is an abstract of a series repository. diff --cc pkg/index/inverted/inverted_series.go index dcb8b3ed,dd02dd02..1f245c67 --- a/pkg/index/inverted/inverted_series.go +++ b/pkg/index/inverted/inverted_series.go @@@ -192,16 -152,19 +203,18 @@@ func parseResult(dmi search.DocumentMat docIDMap[id] = struct{}{} } case entityField: - fmt.Printf("entityField: %v\n", vv) doc.Key.EntityValues = value + case timestampField: + ts, errTime := bluge.DecodeDateTime(value) + if errTime != nil { + return nil, err + } + doc.Timestamp = ts.UnixNano() default: - if _, ok := doc.Fields[field]; ok { - doc.Fields[field] = bytes.Clone(value) + if _, ok := doc.Fields[fields[i]]; ok { + doc.Fields[fields[i]] = bytes.Clone(value) } } - return true - }) - if err != nil { - return nil, errors.WithMessagef(err, "visit stored fields, hit: %d", hitNumber) } if doc.Key.ID > 0 { result = append(result, doc)
