2014-04-17 22:55:53 +02:00
// Copyright (c) 2014 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.
2014-09-02 16:54:50 +02:00
2014-04-17 22:55:53 +02:00
package upside_down
import (
2015-09-28 22:50:27 +02:00
"log"
2014-08-15 15:39:41 +02:00
"reflect"
2014-07-30 18:30:38 +02:00
"regexp"
2015-09-10 14:13:52 +02:00
"strconv"
2015-09-28 22:50:27 +02:00
"sync"
2014-04-17 22:55:53 +02:00
"testing"
2014-08-15 15:39:41 +02:00
"time"
2014-04-17 22:55:53 +02:00
2014-08-28 21:38:57 +02:00
"github.com/blevesearch/bleve/analysis"
2015-09-10 14:13:52 +02:00
"github.com/blevesearch/bleve/analysis/analyzers/standard_analyzer"
2014-08-28 21:38:57 +02:00
"github.com/blevesearch/bleve/analysis/tokenizers/regexp_tokenizer"
"github.com/blevesearch/bleve/document"
"github.com/blevesearch/bleve/index"
"github.com/blevesearch/bleve/index/store/boltdb"
2015-09-10 14:13:52 +02:00
"github.com/blevesearch/bleve/index/store/null"
"github.com/blevesearch/bleve/registry"
2014-04-17 22:55:53 +02:00
)
2014-07-30 18:30:38 +02:00
var testAnalyzer = & analysis . Analyzer {
Tokenizer : regexp_tokenizer . NewRegexpTokenizer ( regexp . MustCompile ( ` \w+ ` ) ) ,
}
2014-04-17 22:55:53 +02:00
func TestIndexOpenReopen ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-04-17 22:55:53 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-04-17 22:55:53 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2014-09-04 00:17:26 +02:00
var expectedCount uint64
2014-10-31 14:40:23 +01:00
docCount , err := idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-04-17 22:55:53 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
2014-12-18 18:43:12 +01:00
// opening the database should have inserted a version
2014-04-17 22:55:53 +02:00
expectedLength := uint64 ( 1 )
2015-09-23 20:25:47 +02:00
rowCount , err := idx . ( * UpsideDownCouch ) . rowCount ( )
2015-04-07 19:26:54 +02:00
if err != nil {
t . Error ( err )
}
2014-04-17 22:55:53 +02:00
if rowCount != expectedLength {
t . Errorf ( "expected %d rows, got: %d" , expectedLength , rowCount )
}
// now close it
2015-04-07 20:52:00 +02:00
err = idx . Close ( )
if err != nil {
t . Fatal ( err )
}
2014-04-17 22:55:53 +02:00
2015-09-23 20:25:47 +02:00
idx , err = NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
2014-04-17 22:55:53 +02:00
err = idx . Open ( )
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
// now close it
2015-04-07 20:52:00 +02:00
err = idx . Close ( )
if err != nil {
t . Fatal ( err )
}
2014-04-17 22:55:53 +02:00
}
func TestIndexInsert ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-04-17 22:55:53 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-04-17 22:55:53 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-04-17 22:55:53 +02:00
2014-09-04 00:17:26 +02:00
var expectedCount uint64
2014-10-31 14:40:23 +01:00
docCount , err := idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-04-17 22:55:53 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
doc := document . NewDocument ( "1" )
2014-08-19 14:58:26 +02:00
doc . AddField ( document . NewTextField ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) ) )
2014-04-17 22:55:53 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-09-04 00:17:26 +02:00
expectedCount ++
2014-04-17 22:55:53 +02:00
2014-10-31 14:40:23 +01:00
docCount , err = idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-04-17 22:55:53 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
2014-12-18 18:43:12 +01:00
// should have 4 rows (1 for version, 1 for schema field, and 1 for single term, and 1 for the term count, and 1 for the back index entry)
2014-04-17 22:55:53 +02:00
expectedLength := uint64 ( 1 + 1 + 1 + 1 + 1 )
2015-09-23 20:25:47 +02:00
rowCount , err := idx . ( * UpsideDownCouch ) . rowCount ( )
2015-04-07 19:26:54 +02:00
if err != nil {
t . Error ( err )
}
2014-04-17 22:55:53 +02:00
if rowCount != expectedLength {
t . Errorf ( "expected %d rows, got: %d" , expectedLength , rowCount )
}
}
func TestIndexInsertThenDelete ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-04-17 22:55:53 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-04-17 22:55:53 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-04-17 22:55:53 +02:00
2014-09-04 00:17:26 +02:00
var expectedCount uint64
2014-10-31 14:40:23 +01:00
docCount , err := idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-04-17 22:55:53 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
doc := document . NewDocument ( "1" )
2014-08-19 14:58:26 +02:00
doc . AddField ( document . NewTextField ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) ) )
2014-04-17 22:55:53 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-09-04 00:17:26 +02:00
expectedCount ++
2014-04-17 22:55:53 +02:00
2014-04-22 19:57:13 +02:00
doc2 := document . NewDocument ( "2" )
2014-08-19 14:58:26 +02:00
doc2 . AddField ( document . NewTextField ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) ) )
2014-04-22 19:57:13 +02:00
err = idx . Update ( doc2 )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-09-04 00:17:26 +02:00
expectedCount ++
2014-04-22 19:57:13 +02:00
2014-10-31 14:40:23 +01:00
docCount , err = idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-04-17 22:55:53 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
err = idx . Delete ( "1" )
if err != nil {
t . Errorf ( "Error deleting entry from index: %v" , err )
}
2014-09-04 00:17:26 +02:00
expectedCount --
2014-04-17 22:55:53 +02:00
2014-10-31 14:40:23 +01:00
docCount , err = idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-04-17 22:55:53 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
2014-04-22 19:57:13 +02:00
err = idx . Delete ( "2" )
if err != nil {
t . Errorf ( "Error deleting entry from index: %v" , err )
}
2014-09-04 00:17:26 +02:00
expectedCount --
2014-04-22 19:57:13 +02:00
2014-10-31 14:40:23 +01:00
docCount , err = idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-04-22 19:57:13 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
2015-04-24 23:11:47 +02:00
// should have 2 rows (1 for version, 1 for schema field, 1 for dictionary row garbage)
expectedLength := uint64 ( 1 + 1 + 1 )
2015-09-23 20:25:47 +02:00
rowCount , err := idx . ( * UpsideDownCouch ) . rowCount ( )
2015-04-07 19:26:54 +02:00
if err != nil {
t . Error ( err )
}
2014-04-17 22:55:53 +02:00
if rowCount != expectedLength {
t . Errorf ( "expected %d rows, got: %d" , expectedLength , rowCount )
}
}
func TestIndexInsertThenUpdate ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-04-17 22:55:53 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-04-17 22:55:53 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-04-17 22:55:53 +02:00
doc := document . NewDocument ( "1" )
2014-08-19 14:58:26 +02:00
doc . AddField ( document . NewTextField ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) ) )
2014-04-17 22:55:53 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
// this update should overwrite one term, and introduce one new one
doc = document . NewDocument ( "1" )
2014-08-19 14:58:26 +02:00
doc . AddField ( document . NewTextFieldWithAnalyzer ( "name" , [ ] uint64 { } , [ ] byte ( "test fail" ) , testAnalyzer ) )
2014-04-17 22:55:53 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error deleting entry from index: %v" , err )
}
2014-12-18 18:43:12 +01:00
// should have 2 rows (1 for version, 1 for schema field, and 2 for the two term, and 2 for the term counts, and 1 for the back index entry)
2014-04-17 22:55:53 +02:00
expectedLength := uint64 ( 1 + 1 + 2 + 2 + 1 )
2015-09-23 20:25:47 +02:00
rowCount , err := idx . ( * UpsideDownCouch ) . rowCount ( )
2015-04-07 19:26:54 +02:00
if err != nil {
t . Error ( err )
}
2014-04-17 22:55:53 +02:00
if rowCount != expectedLength {
t . Errorf ( "expected %d rows, got: %d" , expectedLength , rowCount )
}
2014-12-18 18:43:12 +01:00
// now do another update that should remove one of the terms
2014-04-17 22:55:53 +02:00
doc = document . NewDocument ( "1" )
2014-08-19 14:58:26 +02:00
doc . AddField ( document . NewTextField ( "name" , [ ] uint64 { } , [ ] byte ( "fail" ) ) )
2014-04-17 22:55:53 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error deleting entry from index: %v" , err )
}
2015-04-24 23:11:47 +02:00
// should have 2 rows (1 for version, 1 for schema field, and 1 for the remaining term, and 2 for the term diciontary, and 1 for the back index entry)
expectedLength = uint64 ( 1 + 1 + 1 + 2 + 1 )
2015-09-23 20:25:47 +02:00
rowCount , err = idx . ( * UpsideDownCouch ) . rowCount ( )
2015-04-07 19:26:54 +02:00
if err != nil {
t . Error ( err )
}
2014-04-17 22:55:53 +02:00
if rowCount != expectedLength {
t . Errorf ( "expected %d rows, got: %d" , expectedLength , rowCount )
}
}
func TestIndexInsertMultiple ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-04-17 22:55:53 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-04-17 22:55:53 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2014-04-22 19:57:13 +02:00
2014-09-04 00:17:26 +02:00
var expectedCount uint64
2014-04-17 22:55:53 +02:00
doc := document . NewDocument ( "1" )
2014-08-19 14:58:26 +02:00
doc . AddField ( document . NewTextField ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) ) )
2014-04-17 22:55:53 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-04-22 19:57:13 +02:00
expectedCount ++
2014-04-17 22:55:53 +02:00
doc = document . NewDocument ( "2" )
2014-08-19 14:58:26 +02:00
doc . AddField ( document . NewTextField ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) ) )
2014-04-17 22:55:53 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-04-22 19:57:13 +02:00
expectedCount ++
2014-04-17 22:55:53 +02:00
2014-12-18 18:43:12 +01:00
// should have 4 rows (1 for version, 1 for schema field, and 2 for single term, and 1 for the term count, and 2 for the back index entries)
2014-04-17 22:55:53 +02:00
expectedLength := uint64 ( 1 + 1 + 2 + 1 + 2 )
2015-09-23 20:25:47 +02:00
rowCount , err := idx . ( * UpsideDownCouch ) . rowCount ( )
2015-04-07 19:26:54 +02:00
if err != nil {
t . Error ( err )
}
2014-04-17 22:55:53 +02:00
if rowCount != expectedLength {
t . Errorf ( "expected %d rows, got: %d" , expectedLength , rowCount )
}
2014-04-22 19:57:13 +02:00
2014-12-18 18:43:12 +01:00
// close, reopen and add one more to test that counting works correctly
2015-04-07 20:52:00 +02:00
err = idx . Close ( )
if err != nil {
t . Fatal ( err )
}
2015-09-23 20:25:47 +02:00
idx , err = NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
2014-04-22 19:57:13 +02:00
err = idx . Open ( )
if err != nil {
2015-10-05 23:49:50 +02:00
t . Fatalf ( "error opening index: %v" , err )
2014-04-22 19:57:13 +02:00
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-04-22 19:57:13 +02:00
doc = document . NewDocument ( "3" )
2014-08-19 14:58:26 +02:00
doc . AddField ( document . NewTextField ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) ) )
2014-04-22 19:57:13 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
expectedCount ++
2014-10-31 14:40:23 +01:00
docCount , err := idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-04-22 19:57:13 +02:00
if docCount != expectedCount {
t . Errorf ( "expected doc count: %d, got %d" , expectedCount , docCount )
}
2014-04-17 22:55:53 +02:00
}
2014-06-26 17:43:13 +02:00
func TestIndexInsertWithStore ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-06-26 17:43:13 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-06-26 17:43:13 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-06-26 17:43:13 +02:00
2014-09-04 00:17:26 +02:00
var expectedCount uint64
2014-10-31 14:40:23 +01:00
docCount , err := idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-06-26 17:43:13 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
doc := document . NewDocument ( "1" )
2014-09-03 19:02:10 +02:00
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) , document . IndexField | document . StoreField ) )
2014-06-26 17:43:13 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-09-04 00:17:26 +02:00
expectedCount ++
2014-06-26 17:43:13 +02:00
2014-10-31 14:40:23 +01:00
docCount , err = idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-06-26 17:43:13 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
2014-12-18 18:43:12 +01:00
// should have 6 rows (1 for version, 1 for schema field, and 1 for single term, and 1 for the stored field and 1 for the term count, and 1 for the back index entry)
2014-06-26 17:43:13 +02:00
expectedLength := uint64 ( 1 + 1 + 1 + 1 + 1 + 1 )
2015-09-23 20:25:47 +02:00
rowCount , err := idx . ( * UpsideDownCouch ) . rowCount ( )
2015-04-07 19:26:54 +02:00
if err != nil {
t . Error ( err )
}
2014-06-26 17:43:13 +02:00
if rowCount != expectedLength {
t . Errorf ( "expected %d rows, got: %d" , expectedLength , rowCount )
}
2014-10-31 14:40:23 +01:00
indexReader , err := idx . Reader ( )
if err != nil {
t . Error ( err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := indexReader . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-09-12 23:21:35 +02:00
storedDoc , err := indexReader . Document ( "1" )
2014-06-26 17:43:13 +02:00
if err != nil {
t . Error ( err )
}
if len ( storedDoc . Fields ) != 1 {
t . Errorf ( "expected 1 stored field, got %d" , len ( storedDoc . Fields ) )
}
2014-08-06 19:52:20 +02:00
textField , ok := storedDoc . Fields [ 0 ] . ( * document . TextField )
if ! ok {
t . Errorf ( "expected text field" )
}
if string ( textField . Value ( ) ) != "test" {
t . Errorf ( "expected field content 'test', got '%s'" , string ( textField . Value ( ) ) )
2014-06-26 17:43:13 +02:00
}
}
2014-08-15 15:39:41 +02:00
func TestIndexInternalCRUD ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
2014-10-31 14:40:23 +01:00
indexReader , err := idx . Reader ( )
if err != nil {
t . Error ( err )
}
2014-09-12 23:21:35 +02:00
2014-12-18 18:43:12 +01:00
// get something that doesn't exist yet
2014-09-12 23:21:35 +02:00
val , err := indexReader . GetInternal ( [ ] byte ( "key" ) )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Error ( err )
}
if val != nil {
t . Errorf ( "expected nil, got %s" , val )
}
2015-05-21 18:29:31 +02:00
err = indexReader . Close ( )
if err != nil {
t . Fatal ( err )
}
2014-08-15 15:39:41 +02:00
// set
err = idx . SetInternal ( [ ] byte ( "key" ) , [ ] byte ( "abc" ) )
if err != nil {
t . Error ( err )
}
2015-04-08 00:05:41 +02:00
indexReader2 , err := idx . Reader ( )
2014-10-31 14:40:23 +01:00
if err != nil {
t . Error ( err )
}
2014-09-12 23:21:35 +02:00
2014-08-15 15:39:41 +02:00
// get
2015-04-08 00:05:41 +02:00
val , err = indexReader2 . GetInternal ( [ ] byte ( "key" ) )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Error ( err )
}
if string ( val ) != "abc" {
t . Errorf ( "expected %s, got '%s'" , "abc" , val )
}
2015-05-21 18:29:31 +02:00
err = indexReader2 . Close ( )
if err != nil {
t . Fatal ( err )
}
2014-08-15 15:39:41 +02:00
// delete
err = idx . DeleteInternal ( [ ] byte ( "key" ) )
if err != nil {
t . Error ( err )
}
2015-04-08 00:05:41 +02:00
indexReader3 , err := idx . Reader ( )
2014-10-31 14:40:23 +01:00
if err != nil {
t . Error ( err )
}
2014-09-12 23:21:35 +02:00
2014-08-15 15:39:41 +02:00
// get again
2015-04-08 00:05:41 +02:00
val , err = indexReader3 . GetInternal ( [ ] byte ( "key" ) )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Error ( err )
}
if val != nil {
t . Errorf ( "expected nil, got %s" , val )
}
2015-05-21 18:29:31 +02:00
err = indexReader3 . Close ( )
if err != nil {
t . Fatal ( err )
}
2014-08-15 15:39:41 +02:00
}
func TestIndexBatch ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
2014-09-04 00:17:26 +02:00
var expectedCount uint64
2014-08-15 15:39:41 +02:00
// first create 2 docs the old fashioned way
doc := document . NewDocument ( "1" )
2014-08-19 14:58:26 +02:00
doc . AddField ( document . NewTextField ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) ) )
2014-08-15 15:39:41 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-09-04 00:17:26 +02:00
expectedCount ++
2014-08-15 15:39:41 +02:00
doc = document . NewDocument ( "2" )
2014-08-19 14:58:26 +02:00
doc . AddField ( document . NewTextField ( "name" , [ ] uint64 { } , [ ] byte ( "test2" ) ) )
2014-08-15 15:39:41 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-09-04 00:17:26 +02:00
expectedCount ++
2014-08-15 15:39:41 +02:00
// now create a batch which does 3 things
// insert new doc
// update existing doc
// delete existing doc
// net document count change 0
2014-10-31 14:40:23 +01:00
batch := index . NewBatch ( )
2014-08-15 15:39:41 +02:00
doc = document . NewDocument ( "3" )
2014-08-19 14:58:26 +02:00
doc . AddField ( document . NewTextField ( "name" , [ ] uint64 { } , [ ] byte ( "test3" ) ) )
2014-10-31 14:40:23 +01:00
batch . Update ( doc )
2014-08-15 15:39:41 +02:00
doc = document . NewDocument ( "2" )
2014-08-19 14:58:26 +02:00
doc . AddField ( document . NewTextField ( "name" , [ ] uint64 { } , [ ] byte ( "test2updated" ) ) )
2014-10-31 14:40:23 +01:00
batch . Update ( doc )
batch . Delete ( "1" )
2014-08-15 15:39:41 +02:00
err = idx . Batch ( batch )
if err != nil {
t . Error ( err )
}
2014-10-31 14:40:23 +01:00
indexReader , err := idx . Reader ( )
if err != nil {
t . Error ( err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := indexReader . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-09-12 23:21:35 +02:00
docCount := indexReader . DocCount ( )
2014-08-15 15:39:41 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
2014-09-12 23:21:35 +02:00
docIDReader , err := indexReader . DocIDReader ( "" , "" )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Error ( err )
}
docIds := make ( [ ] string , 0 )
2014-09-04 01:53:59 +02:00
docID , err := docIDReader . Next ( )
for docID != "" && err == nil {
docIds = append ( docIds , docID )
docID , err = docIDReader . Next ( )
2014-08-15 15:39:41 +02:00
}
if err != nil {
t . Error ( err )
}
expectedDocIds := [ ] string { "2" , "3" }
if ! reflect . DeepEqual ( docIds , expectedDocIds ) {
t . Errorf ( "expected ids: %v, got ids: %v" , expectedDocIds , docIds )
}
}
func TestIndexInsertUpdateDeleteWithMultipleTypesStored ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
2014-09-04 00:17:26 +02:00
var expectedCount uint64
2014-10-31 14:40:23 +01:00
docCount , err := idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-08-15 15:39:41 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
doc := document . NewDocument ( "1" )
2014-09-03 19:02:10 +02:00
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) , document . IndexField | document . StoreField ) )
doc . AddField ( document . NewNumericFieldWithIndexingOptions ( "age" , [ ] uint64 { } , 35.99 , document . IndexField | document . StoreField ) )
df , err := document . NewDateTimeFieldWithIndexingOptions ( "unixEpoch" , [ ] uint64 { } , time . Unix ( 0 , 0 ) , document . IndexField | document . StoreField )
2014-08-19 16:02:33 +02:00
if err != nil {
t . Error ( err )
}
doc . AddField ( df )
2014-08-15 15:39:41 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-09-04 00:17:26 +02:00
expectedCount ++
2014-08-15 15:39:41 +02:00
2014-10-31 14:40:23 +01:00
docCount , err = idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-08-15 15:39:41 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
// should have 72 rows
// 1 for version
// 3 for schema fields
// 1 for text term
// 16 for numeric terms
// 16 for date terms
// 3 for the stored field
// 1 for the text term count
// 16 for numeric term counts
// 16 for date term counts
// 1 for the back index entry
2014-09-03 19:02:10 +02:00
expectedLength := uint64 ( 1 + 3 + 1 + ( 64 / document . DefaultPrecisionStep ) + ( 64 / document . DefaultPrecisionStep ) + 3 + 1 + ( 64 / document . DefaultPrecisionStep ) + ( 64 / document . DefaultPrecisionStep ) + 1 )
2015-09-23 20:25:47 +02:00
rowCount , err := idx . ( * UpsideDownCouch ) . rowCount ( )
2015-04-07 19:26:54 +02:00
if err != nil {
t . Error ( err )
}
2014-08-15 15:39:41 +02:00
if rowCount != expectedLength {
t . Errorf ( "expected %d rows, got: %d" , expectedLength , rowCount )
}
2014-10-31 14:40:23 +01:00
indexReader , err := idx . Reader ( )
if err != nil {
t . Error ( err )
}
2014-09-12 23:21:35 +02:00
storedDoc , err := indexReader . Document ( "1" )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Error ( err )
}
2015-05-21 18:29:31 +02:00
err = indexReader . Close ( )
if err != nil {
t . Error ( err )
}
2014-08-15 15:39:41 +02:00
if len ( storedDoc . Fields ) != 3 {
t . Errorf ( "expected 3 stored field, got %d" , len ( storedDoc . Fields ) )
}
textField , ok := storedDoc . Fields [ 0 ] . ( * document . TextField )
if ! ok {
t . Errorf ( "expected text field" )
}
if string ( textField . Value ( ) ) != "test" {
t . Errorf ( "expected field content 'test', got '%s'" , string ( textField . Value ( ) ) )
}
numField , ok := storedDoc . Fields [ 1 ] . ( * document . NumericField )
if ! ok {
t . Errorf ( "expected numeric field" )
}
numFieldNumer , err := numField . Number ( )
if err != nil {
t . Error ( err )
} else {
if numFieldNumer != 35.99 {
t . Errorf ( "expeted numeric value 35.99, got %f" , numFieldNumer )
}
}
dateField , ok := storedDoc . Fields [ 2 ] . ( * document . DateTimeField )
if ! ok {
t . Errorf ( "expected date field" )
}
dateFieldDate , err := dateField . DateTime ( )
if err != nil {
t . Error ( err )
} else {
2014-11-26 21:36:34 +01:00
if dateFieldDate != time . Unix ( 0 , 0 ) . UTC ( ) {
2014-08-15 15:39:41 +02:00
t . Errorf ( "expected date value unix epoch, got %v" , dateFieldDate )
}
}
// now update the document, but omit one of the fields
doc = document . NewDocument ( "1" )
2014-09-03 19:02:10 +02:00
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "name" , [ ] uint64 { } , [ ] byte ( "testup" ) , document . IndexField | document . StoreField ) )
doc . AddField ( document . NewNumericFieldWithIndexingOptions ( "age" , [ ] uint64 { } , 36.99 , document . IndexField | document . StoreField ) )
2014-08-15 15:39:41 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2015-04-08 00:05:41 +02:00
indexReader2 , err := idx . Reader ( )
2014-10-31 14:40:23 +01:00
if err != nil {
t . Error ( err )
}
2014-09-12 23:21:35 +02:00
2014-08-15 15:39:41 +02:00
// expected doc count shouldn't have changed
2015-04-08 00:05:41 +02:00
docCount = indexReader2 . DocCount ( )
2014-08-15 15:39:41 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
// should only get 2 fields back now though
2015-04-08 00:05:41 +02:00
storedDoc , err = indexReader2 . Document ( "1" )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Error ( err )
}
2015-05-21 18:29:31 +02:00
err = indexReader2 . Close ( )
if err != nil {
t . Error ( err )
}
2014-08-15 15:39:41 +02:00
if len ( storedDoc . Fields ) != 2 {
t . Errorf ( "expected 3 stored field, got %d" , len ( storedDoc . Fields ) )
}
textField , ok = storedDoc . Fields [ 0 ] . ( * document . TextField )
if ! ok {
t . Errorf ( "expected text field" )
}
if string ( textField . Value ( ) ) != "testup" {
t . Errorf ( "expected field content 'testup', got '%s'" , string ( textField . Value ( ) ) )
}
numField , ok = storedDoc . Fields [ 1 ] . ( * document . NumericField )
if ! ok {
t . Errorf ( "expected numeric field" )
}
numFieldNumer , err = numField . Number ( )
if err != nil {
t . Error ( err )
} else {
if numFieldNumer != 36.99 {
t . Errorf ( "expeted numeric value 36.99, got %f" , numFieldNumer )
}
}
// now delete the document
err = idx . Delete ( "1" )
expectedCount --
// expected doc count shouldn't have changed
2014-10-31 14:40:23 +01:00
docCount , err = idx . DocCount ( )
if err != nil {
t . Error ( err )
}
2014-08-15 15:39:41 +02:00
if docCount != expectedCount {
t . Errorf ( "Expected document count to be %d got %d" , expectedCount , docCount )
}
}
func TestIndexInsertFields ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
doc := document . NewDocument ( "1" )
2014-09-03 19:02:10 +02:00
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) , document . IndexField | document . StoreField ) )
doc . AddField ( document . NewNumericFieldWithIndexingOptions ( "age" , [ ] uint64 { } , 35.99 , document . IndexField | document . StoreField ) )
dateField , err := document . NewDateTimeFieldWithIndexingOptions ( "unixEpoch" , [ ] uint64 { } , time . Unix ( 0 , 0 ) , document . IndexField | document . StoreField )
2014-08-19 16:02:33 +02:00
if err != nil {
t . Error ( err )
}
doc . AddField ( dateField )
2014-08-15 15:39:41 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-10-31 14:40:23 +01:00
indexReader , err := idx . Reader ( )
if err != nil {
t . Error ( err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := indexReader . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-09-12 23:21:35 +02:00
fields , err := indexReader . Fields ( )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Error ( err )
} else {
expectedFields := [ ] string { "name" , "age" , "unixEpoch" }
if ! reflect . DeepEqual ( fields , expectedFields ) {
t . Errorf ( "expected fields: %v, got %v" , expectedFields , fields )
}
}
}
func TestIndexUpdateComposites ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
doc := document . NewDocument ( "1" )
2014-09-03 19:02:10 +02:00
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) , document . IndexField | document . StoreField ) )
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "title" , [ ] uint64 { } , [ ] byte ( "mister" ) , document . IndexField | document . StoreField ) )
doc . AddField ( document . NewCompositeFieldWithIndexingOptions ( "_all" , true , nil , nil , document . IndexField ) )
2014-08-15 15:39:41 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
// should have 72 rows
// 1 for version
// 3 for schema fields
// 4 for text term
// 2 for the stored field
// 4 for the text term count
// 1 for the back index entry
expectedLength := uint64 ( 1 + 3 + 4 + 2 + 4 + 1 )
2015-09-23 20:25:47 +02:00
rowCount , err := idx . ( * UpsideDownCouch ) . rowCount ( )
2015-04-07 19:26:54 +02:00
if err != nil {
t . Error ( err )
}
2014-08-15 15:39:41 +02:00
if rowCount != expectedLength {
t . Errorf ( "expected %d rows, got: %d" , expectedLength , rowCount )
}
// now lets update it
doc = document . NewDocument ( "1" )
2014-09-03 19:02:10 +02:00
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "name" , [ ] uint64 { } , [ ] byte ( "testupdated" ) , document . IndexField | document . StoreField ) )
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "title" , [ ] uint64 { } , [ ] byte ( "misterupdated" ) , document . IndexField | document . StoreField ) )
doc . AddField ( document . NewCompositeFieldWithIndexingOptions ( "_all" , true , nil , nil , document . IndexField ) )
2014-08-15 15:39:41 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-10-31 14:40:23 +01:00
indexReader , err := idx . Reader ( )
if err != nil {
t . Error ( err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := indexReader . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-09-12 23:21:35 +02:00
2014-08-15 15:39:41 +02:00
// make sure new values are in index
2014-09-12 23:21:35 +02:00
storedDoc , err := indexReader . Document ( "1" )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Error ( err )
}
if len ( storedDoc . Fields ) != 2 {
t . Errorf ( "expected 2 stored field, got %d" , len ( storedDoc . Fields ) )
}
textField , ok := storedDoc . Fields [ 0 ] . ( * document . TextField )
if ! ok {
t . Errorf ( "expected text field" )
}
if string ( textField . Value ( ) ) != "testupdated" {
t . Errorf ( "expected field content 'test', got '%s'" , string ( textField . Value ( ) ) )
}
2015-04-24 23:11:47 +02:00
// should have the same row count as before, plus 4 term dictionary garbage rows
expectedLength += 4
2015-09-23 20:25:47 +02:00
rowCount , err = idx . ( * UpsideDownCouch ) . rowCount ( )
2015-04-07 19:26:54 +02:00
if err != nil {
t . Error ( err )
}
2014-08-15 15:39:41 +02:00
if rowCount != expectedLength {
t . Errorf ( "expected %d rows, got: %d" , expectedLength , rowCount )
}
}
func TestIndexFieldsMisc ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
doc := document . NewDocument ( "1" )
2014-09-03 19:02:10 +02:00
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) , document . IndexField | document . StoreField ) )
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "title" , [ ] uint64 { } , [ ] byte ( "mister" ) , document . IndexField | document . StoreField ) )
2014-08-15 15:39:41 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2015-09-23 20:25:47 +02:00
fieldName1 := idx . ( * UpsideDownCouch ) . fieldCache . FieldIndexed ( 0 )
2014-08-15 15:39:41 +02:00
if fieldName1 != "name" {
t . Errorf ( "expected field named 'name', got '%s'" , fieldName1 )
}
2015-09-23 20:25:47 +02:00
fieldName2 := idx . ( * UpsideDownCouch ) . fieldCache . FieldIndexed ( 1 )
2014-08-15 15:39:41 +02:00
if fieldName2 != "title" {
t . Errorf ( "expected field named 'title', got '%s'" , fieldName2 )
}
2015-09-23 20:25:47 +02:00
fieldName3 := idx . ( * UpsideDownCouch ) . fieldCache . FieldIndexed ( 2 )
2014-08-15 15:39:41 +02:00
if fieldName3 != "" {
t . Errorf ( "expected field named '', got '%s'" , fieldName3 )
}
}
func TestIndexTermReaderCompositeFields ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
doc := document . NewDocument ( "1" )
2014-09-03 19:02:10 +02:00
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) , document . IndexField | document . StoreField | document . IncludeTermVectors ) )
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "title" , [ ] uint64 { } , [ ] byte ( "mister" ) , document . IndexField | document . StoreField | document . IncludeTermVectors ) )
doc . AddField ( document . NewCompositeFieldWithIndexingOptions ( "_all" , true , nil , nil , document . IndexField | document . IncludeTermVectors ) )
2014-08-15 15:39:41 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-10-31 14:40:23 +01:00
indexReader , err := idx . Reader ( )
if err != nil {
t . Error ( err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := indexReader . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-09-12 23:21:35 +02:00
termFieldReader , err := indexReader . TermFieldReader ( [ ] byte ( "mister" ) , "_all" )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Error ( err )
}
tfd , err := termFieldReader . Next ( )
for tfd != nil && err == nil {
if tfd . ID != "1" {
t . Errorf ( "expected to find document id 1" )
}
tfd , err = termFieldReader . Next ( )
}
if err != nil {
t . Error ( err )
}
}
func TestIndexDocumentFieldTerms ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
2015-09-02 19:12:08 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
2015-09-23 20:25:47 +02:00
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-08-15 15:39:41 +02:00
doc := document . NewDocument ( "1" )
2014-09-03 19:02:10 +02:00
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "name" , [ ] uint64 { } , [ ] byte ( "test" ) , document . IndexField | document . StoreField | document . IncludeTermVectors ) )
doc . AddField ( document . NewTextFieldWithIndexingOptions ( "title" , [ ] uint64 { } , [ ] byte ( "mister" ) , document . IndexField | document . StoreField | document . IncludeTermVectors ) )
2014-08-15 15:39:41 +02:00
err = idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
2014-10-31 14:40:23 +01:00
indexReader , err := idx . Reader ( )
if err != nil {
t . Error ( err )
}
2015-04-08 00:05:41 +02:00
defer func ( ) {
err := indexReader . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2014-09-12 23:21:35 +02:00
fieldTerms , err := indexReader . DocumentFieldTerms ( "1" )
2014-08-15 15:39:41 +02:00
if err != nil {
t . Error ( err )
}
expectedFieldTerms := index . FieldTerms {
"name" : [ ] string { "test" } ,
"title" : [ ] string { "mister" } ,
}
if ! reflect . DeepEqual ( fieldTerms , expectedFieldTerms ) {
t . Errorf ( "expected field terms: %#v, got: %#v" , expectedFieldTerms , fieldTerms )
}
}
2015-09-10 14:13:52 +02:00
func BenchmarkBatch ( b * testing . B ) {
cache := registry . NewCache ( )
analyzer , err := cache . AnalyzerNamed ( standard_analyzer . Name )
if err != nil {
b . Fatal ( err )
}
2015-09-23 20:25:47 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
idx , err := NewUpsideDownCouch ( null . Name , nil , analysisQueue )
2015-09-10 14:13:52 +02:00
if err != nil {
b . Fatal ( err )
}
err = idx . Open ( )
if err != nil {
b . Fatal ( err )
}
batch := index . NewBatch ( )
for i := 0 ; i < 100 ; i ++ {
d := document . NewDocument ( strconv . Itoa ( i ) )
f := document . NewTextFieldWithAnalyzer ( "desc" , nil , bleveWikiArticle1K , analyzer )
d . AddField ( f )
batch . Update ( d )
}
b . ResetTimer ( )
for i := 0 ; i < b . N ; i ++ {
err = idx . Batch ( batch )
if err != nil {
b . Fatal ( err )
}
}
}
2015-09-28 22:50:27 +02:00
func TestConcurrentUpdate ( t * testing . T ) {
2015-10-19 20:27:03 +02:00
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
2015-09-28 22:50:27 +02:00
analysisQueue := index . NewAnalysisQueue ( 1 )
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
// do some concurrent updates
var wg sync . WaitGroup
for i := 0 ; i < 10 ; i ++ {
wg . Add ( 1 )
go func ( i int ) {
doc := document . NewDocument ( "1" )
doc . AddField ( document . NewTextFieldWithIndexingOptions ( strconv . Itoa ( i ) , [ ] uint64 { } , [ ] byte ( strconv . Itoa ( i ) ) , document . StoreField ) )
err := idx . Update ( doc )
if err != nil {
t . Errorf ( "Error updating index: %v" , err )
}
wg . Done ( )
} ( i )
}
wg . Wait ( )
// now load the name field and see what we get
r , err := idx . Reader ( )
if err != nil {
log . Fatal ( err )
}
doc , err := r . Document ( "1" )
if err != nil {
log . Fatal ( err )
}
if len ( doc . Fields ) > 1 {
t . Errorf ( "expected single field, found %d" , len ( doc . Fields ) )
}
}
2015-10-30 23:25:38 +01:00
func TestLargeField ( t * testing . T ) {
defer func ( ) {
err := DestroyTest ( )
if err != nil {
t . Fatal ( err )
}
} ( )
analysisQueue := index . NewAnalysisQueue ( 1 )
idx , err := NewUpsideDownCouch ( boltdb . Name , boltTestConfig , analysisQueue )
if err != nil {
t . Fatal ( err )
}
err = idx . Open ( )
if err != nil {
t . Errorf ( "error opening index: %v" , err )
}
defer func ( ) {
err := idx . Close ( )
if err != nil {
t . Fatal ( err )
}
} ( )
largeFieldValue := make ( [ ] byte , 0 )
for len ( largeFieldValue ) < RowBufferSize {
largeFieldValue = append ( largeFieldValue , bleveWikiArticle1K ... )
}
t . Logf ( "large field size: %d" , len ( largeFieldValue ) )
d := document . NewDocument ( "large" )
f := document . NewTextFieldWithIndexingOptions ( "desc" , nil , largeFieldValue , document . IndexField | document . StoreField )
d . AddField ( f )
err = idx . Update ( d )
if err != nil {
t . Fatal ( err )
}
}