0
0

enhanced jsonpointer shredder to be functional

This commit is contained in:
Marty Schoch 2014-07-11 14:26:25 -04:00
parent 1fac31ac9c
commit e8c078c7cc

View File

@ -9,7 +9,11 @@
package shredder package shredder
import ( import (
"bytes"
"github.com/couchbaselabs/bleve/analysis"
"github.com/couchbaselabs/bleve/document" "github.com/couchbaselabs/bleve/document"
"github.com/dustin/go-jsonpointer" "github.com/dustin/go-jsonpointer"
) )
@ -19,12 +23,16 @@ import (
type JsonPointerShredder struct { type JsonPointerShredder struct {
fieldPaths map[string]string fieldPaths map[string]string
paths []string paths []string
analyzers map[string]*analysis.Analyzer
options map[string]document.IndexingOptions
} }
func NewJsonPointerShredder() *JsonPointerShredder { func NewJsonPointerShredder() *JsonPointerShredder {
return &JsonPointerShredder{ return &JsonPointerShredder{
fieldPaths: make(map[string]string), fieldPaths: make(map[string]string),
paths: make([]string, 0), paths: make([]string, 0),
analyzers: make(map[string]*analysis.Analyzer),
options: make(map[string]document.IndexingOptions),
} }
} }
@ -33,8 +41,10 @@ func (s *JsonPointerShredder) AddTextField(name string, path string) {
s.paths = append(s.paths, path) s.paths = append(s.paths, path)
} }
func (s *JsonPointerShredder) AddField(name string, path string) { func (s *JsonPointerShredder) AddFieldCustom(name string, path string, options document.IndexingOptions, analyzer *analysis.Analyzer) {
s.fieldPaths[name] = path s.fieldPaths[name] = path
s.analyzers[name] = analyzer
s.options[name] = options
s.paths = append(s.paths, path) s.paths = append(s.paths, path)
} }
@ -47,8 +57,22 @@ func (s *JsonPointerShredder) Shred(id string, body []byte) (*document.Document,
} }
for fieldName, fieldPath := range s.fieldPaths { for fieldName, fieldPath := range s.fieldPaths {
field := document.NewTextField(fieldName, values[fieldPath]) fieldValue := bytes.TrimSpace(values[fieldPath])
rv.AddField(field) if bytes.HasPrefix(fieldValue, []byte{'"'}) {
fieldValue = fieldValue[1:]
}
if bytes.HasSuffix(fieldValue, []byte{'"'}) {
fieldValue = fieldValue[:len(fieldValue)-1]
}
analyzer, custom := s.analyzers[fieldName]
if custom {
options := s.options[fieldName]
field := document.NewField(fieldName, fieldValue, options, analyzer)
rv.AddField(field)
} else {
field := document.NewTextField(fieldName, fieldValue)
rv.AddField(field)
}
} }
return rv, nil return rv, nil