202 lines
4.5 KiB
Go
202 lines
4.5 KiB
Go
|
// Copyright (c) 2015 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 firestorm
|
||
|
|
||
|
import (
|
||
|
"reflect"
|
||
|
"regexp"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/blevesearch/bleve/analysis"
|
||
|
"github.com/blevesearch/bleve/analysis/tokenizers/regexp_tokenizer"
|
||
|
"github.com/blevesearch/bleve/index"
|
||
|
"github.com/blevesearch/bleve/index/store/inmem"
|
||
|
)
|
||
|
|
||
|
var testAnalyzer = &analysis.Analyzer{
|
||
|
Tokenizer: regexp_tokenizer.NewRegexpTokenizer(regexp.MustCompile(`\w+`)),
|
||
|
}
|
||
|
|
||
|
func TestDictionaryReader(t *testing.T) {
|
||
|
kv, err := inmem.New()
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
aq := index.NewAnalysisQueue(1)
|
||
|
|
||
|
f := NewFirestorm(kv, aq)
|
||
|
|
||
|
err = kv.Open()
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
kvwriter, err := f.store.Writer()
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
rows := []index.IndexRow{
|
||
|
NewFieldRow(0, IDFieldName),
|
||
|
NewFieldRow(1, "name"),
|
||
|
NewFieldRow(2, "desc"),
|
||
|
NewFieldRow(3, "prefix"),
|
||
|
}
|
||
|
|
||
|
for _, row := range rows {
|
||
|
err = kvwriter.Set(row.Key(), row.Value())
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
f.warmup(kvwriter)
|
||
|
|
||
|
rows = []index.IndexRow{
|
||
|
|
||
|
// dictionary entries
|
||
|
NewDictionaryRow(1, []byte("test"), 4),
|
||
|
|
||
|
NewDictionaryRow(2, []byte("eat"), 1),
|
||
|
NewDictionaryRow(2, []byte("more"), 1),
|
||
|
NewDictionaryRow(2, []byte("rice"), 1),
|
||
|
|
||
|
NewDictionaryRow(3, []byte("bob"), 1),
|
||
|
NewDictionaryRow(3, []byte("cat"), 1),
|
||
|
NewDictionaryRow(3, []byte("cats"), 1),
|
||
|
NewDictionaryRow(3, []byte("catting"), 1),
|
||
|
NewDictionaryRow(3, []byte("dog"), 1),
|
||
|
NewDictionaryRow(3, []byte("doggy"), 1),
|
||
|
NewDictionaryRow(3, []byte("zoo"), 1),
|
||
|
}
|
||
|
|
||
|
for _, row := range rows {
|
||
|
err = kvwriter.Set(row.Key(), row.Value())
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// now try it
|
||
|
r, err := f.Reader()
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
dict, err := r.FieldDict("name")
|
||
|
if err != nil {
|
||
|
t.Errorf("error creating reader: %v", err)
|
||
|
}
|
||
|
|
||
|
termCount := 0
|
||
|
curr, err := dict.Next()
|
||
|
for err == nil && curr != nil {
|
||
|
termCount++
|
||
|
if curr.Term != "test" {
|
||
|
t.Errorf("expected term to be 'test', got '%s'", curr.Term)
|
||
|
}
|
||
|
curr, err = dict.Next()
|
||
|
}
|
||
|
if termCount != 1 {
|
||
|
t.Errorf("expected 1 term for this field, got %d", termCount)
|
||
|
}
|
||
|
|
||
|
err = dict.Close()
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
dict, err = r.FieldDict("desc")
|
||
|
if err != nil {
|
||
|
t.Errorf("error creating reader: %v", err)
|
||
|
}
|
||
|
|
||
|
termCount = 0
|
||
|
terms := make([]string, 0)
|
||
|
curr, err = dict.Next()
|
||
|
for err == nil && curr != nil {
|
||
|
termCount++
|
||
|
terms = append(terms, curr.Term)
|
||
|
curr, err = dict.Next()
|
||
|
}
|
||
|
if termCount != 3 {
|
||
|
t.Errorf("expected 3 term for this field, got %d", termCount)
|
||
|
}
|
||
|
expectedTerms := []string{"eat", "more", "rice"}
|
||
|
if !reflect.DeepEqual(expectedTerms, terms) {
|
||
|
t.Errorf("expected %#v, got %#v", expectedTerms, terms)
|
||
|
}
|
||
|
|
||
|
err = dict.Close()
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
// test start and end range
|
||
|
dict, err = r.FieldDictRange("desc", []byte("fun"), []byte("nice"))
|
||
|
if err != nil {
|
||
|
t.Errorf("error creating reader: %v", err)
|
||
|
}
|
||
|
|
||
|
termCount = 0
|
||
|
terms = make([]string, 0)
|
||
|
curr, err = dict.Next()
|
||
|
for err == nil && curr != nil {
|
||
|
termCount++
|
||
|
terms = append(terms, curr.Term)
|
||
|
curr, err = dict.Next()
|
||
|
}
|
||
|
if termCount != 1 {
|
||
|
t.Errorf("expected 1 term for this field, got %d", termCount)
|
||
|
}
|
||
|
expectedTerms = []string{"more"}
|
||
|
if !reflect.DeepEqual(expectedTerms, terms) {
|
||
|
t.Errorf("expected %#v, got %#v", expectedTerms, terms)
|
||
|
}
|
||
|
|
||
|
err = dict.Close()
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
// test use case for prefix
|
||
|
dict, err = r.FieldDictPrefix("prefix", []byte("cat"))
|
||
|
if err != nil {
|
||
|
t.Errorf("error creating reader: %v", err)
|
||
|
}
|
||
|
|
||
|
termCount = 0
|
||
|
terms = make([]string, 0)
|
||
|
curr, err = dict.Next()
|
||
|
for err == nil && curr != nil {
|
||
|
termCount++
|
||
|
terms = append(terms, curr.Term)
|
||
|
curr, err = dict.Next()
|
||
|
}
|
||
|
if termCount != 3 {
|
||
|
t.Errorf("expected 3 term for this field, got %d", termCount)
|
||
|
}
|
||
|
expectedTerms = []string{"cat", "cats", "catting"}
|
||
|
if !reflect.DeepEqual(expectedTerms, terms) {
|
||
|
t.Errorf("expected %#v, got %#v", expectedTerms, terms)
|
||
|
}
|
||
|
|
||
|
err = dict.Close()
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
err = r.Close()
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
}
|