2015-08-25 20:52:42 +02:00
|
|
|
// 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"
|
2015-10-28 16:26:01 +01:00
|
|
|
"github.com/blevesearch/bleve/index/store/gtreap"
|
2015-08-25 20:52:42 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
var testAnalyzer = &analysis.Analyzer{
|
|
|
|
Tokenizer: regexp_tokenizer.NewRegexpTokenizer(regexp.MustCompile(`\w+`)),
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDictionaryReader(t *testing.T) {
|
2015-10-28 16:26:01 +01:00
|
|
|
aq := index.NewAnalysisQueue(1)
|
|
|
|
f, err := NewFirestorm(gtreap.Name, nil, aq)
|
2015-08-25 20:52:42 +02:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2015-10-28 16:26:01 +01:00
|
|
|
err = f.Open()
|
2015-08-25 20:52:42 +02:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2015-10-28 16:26:01 +01:00
|
|
|
kvwriter, err := f.(*Firestorm).store.Writer()
|
2015-08-25 20:52:42 +02:00
|
|
|
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 {
|
2015-10-28 16:26:01 +01:00
|
|
|
wb := kvwriter.NewBatch()
|
|
|
|
wb.Set(row.Key(), row.Value())
|
|
|
|
err = kvwriter.ExecuteBatch(wb)
|
2015-08-25 20:52:42 +02:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-28 16:26:01 +01:00
|
|
|
err = kvwriter.Close()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
kvreader, err := f.(*Firestorm).store.Reader()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
f.(*Firestorm).warmup(kvreader)
|
|
|
|
|
|
|
|
err = kvreader.Close()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
kvwriter, err = f.(*Firestorm).store.Writer()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2015-08-25 20:52:42 +02:00
|
|
|
|
|
|
|
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 {
|
2015-10-28 16:26:01 +01:00
|
|
|
wb := kvwriter.NewBatch()
|
|
|
|
wb.Set(row.Key(), row.Value())
|
|
|
|
err = kvwriter.ExecuteBatch(wb)
|
2015-08-25 20:52:42 +02:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|