0
0
bleve/mapping_document.go

132 lines
3.6 KiB
Go

// 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.
package bleve
import (
"encoding/json"
"fmt"
"github.com/couchbaselabs/bleve/analysis"
)
type DocumentMapping struct {
Enabled *bool `json:"enabled"`
Dynamic *bool `json:"dynamic"`
Properties map[string]*DocumentMapping `json:"properties"`
Fields []*FieldMapping `json:"fields"`
DefaultAnalyzer *string `json:"default_analyzer"`
}
func (dm *DocumentMapping) GoString() string {
return fmt.Sprintf(" &bleve.DocumentMapping{Enabled:%t, Dynamic:%t, Properties:%#v, Fields:%#v}", *dm.Enabled, *dm.Dynamic, dm.Properties, dm.Fields)
}
func (dm *DocumentMapping) DocumentMappingForPath(path string) *DocumentMapping {
pathElements := decodePath(path)
current := dm
for _, pathElement := range pathElements {
var ok bool
current, ok = current.Properties[pathElement]
if !ok {
return nil
}
}
return current
}
func NewDocumentMapping() *DocumentMapping {
return &DocumentMapping{
Enabled: &tRUE,
Dynamic: &tRUE,
}
}
func NewDocumentStaticMapping() *DocumentMapping {
return &DocumentMapping{
Enabled: &tRUE,
Dynamic: &fALSE,
}
}
func NewDocumentDisabledMapping() *DocumentMapping {
return &DocumentMapping{
Enabled: &fALSE,
}
}
func (dm *DocumentMapping) AddSubDocumentMapping(property string, sdm *DocumentMapping) *DocumentMapping {
if dm.Properties == nil {
dm.Properties = make(map[string]*DocumentMapping)
}
dm.Properties[property] = sdm
return dm
}
func (dm *DocumentMapping) AddFieldMapping(fm *FieldMapping) *DocumentMapping {
if dm.Fields == nil {
dm.Fields = make([]*FieldMapping, 0)
}
dm.Fields = append(dm.Fields, fm)
return dm
}
func (dm *DocumentMapping) UnmarshalJSON(data []byte) error {
var tmp struct {
Enabled *bool `json:"enabled"`
Dynamic *bool `json:"dynamic"`
Properties map[string]*DocumentMapping `json:"properties"`
Fields []*FieldMapping `json:"fields"`
DefaultAnalyzer *string `json:"default_analyzer"`
}
err := json.Unmarshal(data, &tmp)
if err != nil {
return err
}
dm.Enabled = &tRUE
if tmp.Enabled != nil {
dm.Enabled = tmp.Enabled
}
dm.Dynamic = &tRUE
if tmp.Dynamic != nil {
dm.Dynamic = tmp.Dynamic
}
if tmp.DefaultAnalyzer != nil {
dm.DefaultAnalyzer = tmp.DefaultAnalyzer
}
if tmp.Properties != nil {
dm.Properties = make(map[string]*DocumentMapping, len(tmp.Properties))
}
for propName, propMapping := range tmp.Properties {
dm.Properties[propName] = propMapping
}
if tmp.Fields != nil {
dm.Fields = make([]*FieldMapping, len(tmp.Fields))
}
for i, field := range tmp.Fields {
dm.Fields[i] = field
}
return nil
}
func (dm *DocumentMapping) defaultAnalyzer(path []string) *analysis.Analyzer {
var rv *analysis.Analyzer
current := dm
for _, pathElement := range path {
var ok bool
current, ok = current.Properties[pathElement]
if !ok {
break
}
if current.DefaultAnalyzer != nil {
rv = Config.Analysis.Analyzers[*current.DefaultAnalyzer]
}
}
return rv
}