Files
upstream-bleve/index/scorch/fuzzy_omitcount_test.go
upstream-mirror f8d3d9f0cf
Some checks failed
Coverage / coverage (push) Failing after 6s
Tests / test (1.24.x, ubuntu-latest) (push) Failing after 42s
Tests / test (1.26.x, ubuntu-latest) (push) Failing after 38s
Tests / test (1.25.x, ubuntu-latest) (push) Failing after 35s
Tests / test (1.25.x, windows-latest) (push) Has been cancelled
Tests / test (1.26.x, macos-latest) (push) Has been cancelled
Tests / test (1.26.x, windows-latest) (push) Has been cancelled
Tests / test (1.24.x, macos-latest) (push) Has been cancelled
Tests / test (1.24.x, windows-latest) (push) Has been cancelled
Tests / test (1.25.x, macos-latest) (push) Has been cancelled
snapshot of https://github.com/blevesearch/bleve.git (master, 2026-09-15; blobs > 131072B omitted)
2026-09-15 22:27:16 +05:00

99 lines
3.1 KiB
Go

// Copyright (c) 2026 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package scorch
import (
"fmt"
"testing"
"github.com/blevesearch/bleve/v2/document"
index "github.com/blevesearch/bleve_index_api"
)
// TestFieldDictFuzzyAutomatonOmitsCount verifies that the fuzzy automaton field
// dictionary is wired to the count-omitting iterator: the segment dictionary
// implements the optional interface, and the collected candidate entries have
// their (discarded) Count left at zero rather than incurring a postings read.
func TestFieldDictFuzzyAutomatonOmitsCount(t *testing.T) {
cfg := CreateConfig("TestFieldDictFuzzyAutomatonOmitsCount")
if err := InitTest(cfg); err != nil {
t.Fatal(err)
}
defer func() { _ = DestroyTest(cfg) }()
analysisQueue := index.NewAnalysisQueue(1)
idx, err := NewScorch(Name, cfg, analysisQueue)
if err != nil {
t.Fatal(err)
}
if err = idx.Open(); err != nil {
t.Fatal(err)
}
defer func() { _ = idx.Close() }()
// Each doc's "desc" field is a single token (nil analyzer => whole value is
// one term). Repeating terms across docs yields multi-doc postings lists.
b := index.NewBatch()
for d := 0; d < 300; d++ {
doc := document.NewDocument(fmt.Sprintf("%d", d))
doc.AddField(document.NewTextField("desc", nil, []byte(fmt.Sprintf("term%04d", d%100))))
b.Update(doc)
}
if err = idx.Batch(b); err != nil {
t.Fatal(err)
}
r, err := idx.Reader()
if err != nil {
t.Fatal(err)
}
defer func() { _ = r.Close() }()
is := r.(*IndexSnapshot)
// the segment dictionary must implement the count-omit optional interface,
// otherwise the wiring silently falls back to the count-reading path.
seg := is.segment[0].segment
dict, err := seg.Dictionary("desc")
if err != nil {
t.Fatal(err)
}
if _, ok := dict.(termDictionaryOmitCount); !ok {
// The omit-count wiring only activates once the zapx dependency ships
// AutomatonIteratorOmitCount; until then the code falls back to the
// count-reading path, so there is nothing to assert.
t.Skipf("segment dict %T does not implement termDictionaryOmitCount "+
"(zapx dependency predates the omit-count iterator)", dict)
}
fd, _, err := is.FieldDictFuzzyAutomaton("desc", "term0050", 2, "")
if err != nil {
t.Fatal(err)
}
n := 0
tfd, err := fd.Next()
for err == nil && tfd != nil {
n++
if tfd.Count != 0 {
t.Fatalf("expected omitted (zero) count for %q, got %d", tfd.Term, tfd.Count)
}
tfd, err = fd.Next()
}
if err != nil {
t.Fatal(err)
}
if n == 0 {
t.Fatal("expected at least one fuzzy candidate term")
}
t.Logf("collected %d candidate terms, all with omitted count", n)
}