0
0

add support for toggling Store/Index Dynamic in IndexMapping

This commit is contained in:
Marty Schoch 2016-03-08 07:58:29 -05:00
parent d7292ed891
commit 57919a77f5
4 changed files with 50 additions and 17 deletions

View File

@ -363,11 +363,11 @@ func (dm *DocumentMapping) processProperty(property interface{}, path []string,
parsedDateTime, err := dateTimeParser.ParseDateTime(propertyValueString) parsedDateTime, err := dateTimeParser.ParseDateTime(propertyValueString)
if err != nil { if err != nil {
// index as text // index as text
fieldMapping := newTextFieldMappingDynamic() fieldMapping := newTextFieldMappingDynamic(context.im)
fieldMapping.processString(propertyValueString, pathString, path, indexes, context) fieldMapping.processString(propertyValueString, pathString, path, indexes, context)
} else { } else {
// index as datetime // index as datetime
fieldMapping := newDateTimeFieldMappingDynamic() fieldMapping := newDateTimeFieldMappingDynamic(context.im)
fieldMapping.processTime(parsedDateTime, pathString, path, indexes, context) fieldMapping.processTime(parsedDateTime, pathString, path, indexes, context)
} }
} }
@ -387,7 +387,7 @@ func (dm *DocumentMapping) processProperty(property interface{}, path []string,
} }
} else if dm.Dynamic { } else if dm.Dynamic {
// automatic indexing behavior // automatic indexing behavior
fieldMapping := newNumericFieldMappingDynamic() fieldMapping := newNumericFieldMappingDynamic(context.im)
fieldMapping.processFloat64(propertyValFloat, pathString, path, indexes, context) fieldMapping.processFloat64(propertyValFloat, pathString, path, indexes, context)
} }
case reflect.Bool: case reflect.Bool:
@ -399,7 +399,7 @@ func (dm *DocumentMapping) processProperty(property interface{}, path []string,
} }
} else if dm.Dynamic { } else if dm.Dynamic {
// automatic indexing behavior // automatic indexing behavior
fieldMapping := newBooleanFieldMappingDynamic() fieldMapping := newBooleanFieldMappingDynamic(context.im)
fieldMapping.processBoolean(propertyValBool, pathString, path, indexes, context) fieldMapping.processBoolean(propertyValBool, pathString, path, indexes, context)
} }
case reflect.Struct: case reflect.Struct:
@ -412,7 +412,7 @@ func (dm *DocumentMapping) processProperty(property interface{}, path []string,
fieldMapping.processTime(property, pathString, path, indexes, context) fieldMapping.processTime(property, pathString, path, indexes, context)
} }
} else if dm.Dynamic { } else if dm.Dynamic {
fieldMapping := newDateTimeFieldMappingDynamic() fieldMapping := newDateTimeFieldMappingDynamic(context.im)
fieldMapping.processTime(property, pathString, path, indexes, context) fieldMapping.processTime(property, pathString, path, indexes, context)
} }
default: default:

View File

@ -61,10 +61,10 @@ func NewTextFieldMapping() *FieldMapping {
} }
} }
func newTextFieldMappingDynamic() *FieldMapping { func newTextFieldMappingDynamic(im *IndexMapping) *FieldMapping {
rv := NewTextFieldMapping() rv := NewTextFieldMapping()
rv.Store = StoreDynamic rv.Store = im.StoreDynamic
rv.Index = IndexDynamic rv.Index = im.IndexDynamic
return rv return rv
} }
@ -78,10 +78,10 @@ func NewNumericFieldMapping() *FieldMapping {
} }
} }
func newNumericFieldMappingDynamic() *FieldMapping { func newNumericFieldMappingDynamic(im *IndexMapping) *FieldMapping {
rv := NewNumericFieldMapping() rv := NewNumericFieldMapping()
rv.Store = StoreDynamic rv.Store = im.StoreDynamic
rv.Index = IndexDynamic rv.Index = im.IndexDynamic
return rv return rv
} }
@ -95,10 +95,10 @@ func NewDateTimeFieldMapping() *FieldMapping {
} }
} }
func newDateTimeFieldMappingDynamic() *FieldMapping { func newDateTimeFieldMappingDynamic(im *IndexMapping) *FieldMapping {
rv := NewDateTimeFieldMapping() rv := NewDateTimeFieldMapping()
rv.Store = StoreDynamic rv.Store = im.StoreDynamic
rv.Index = IndexDynamic rv.Index = im.IndexDynamic
return rv return rv
} }
@ -112,10 +112,10 @@ func NewBooleanFieldMapping() *FieldMapping {
} }
} }
func newBooleanFieldMappingDynamic() *FieldMapping { func newBooleanFieldMappingDynamic(im *IndexMapping) *FieldMapping {
rv := NewBooleanFieldMapping() rv := NewBooleanFieldMapping()
rv.Store = StoreDynamic rv.Store = im.StoreDynamic
rv.Index = IndexDynamic rv.Index = im.IndexDynamic
return rv return rv
} }

View File

@ -130,6 +130,8 @@ type IndexMapping struct {
DefaultDateTimeParser string `json:"default_datetime_parser"` DefaultDateTimeParser string `json:"default_datetime_parser"`
DefaultField string `json:"default_field"` DefaultField string `json:"default_field"`
ByteArrayConverter string `json:"byte_array_converter"` ByteArrayConverter string `json:"byte_array_converter"`
StoreDynamic bool `json:"store_dynamic"`
IndexDynamic bool `json:"index_dynamic"`
CustomAnalysis *customAnalysis `json:"analysis,omitempty"` CustomAnalysis *customAnalysis `json:"analysis,omitempty"`
cache *registry.Cache cache *registry.Cache
} }
@ -233,6 +235,8 @@ func NewIndexMapping() *IndexMapping {
DefaultDateTimeParser: defaultDateTimeParser, DefaultDateTimeParser: defaultDateTimeParser,
DefaultField: defaultField, DefaultField: defaultField,
ByteArrayConverter: defaultByteArrayConverter, ByteArrayConverter: defaultByteArrayConverter,
IndexDynamic: IndexDynamic,
StoreDynamic: StoreDynamic,
CustomAnalysis: newCustomAnalysis(), CustomAnalysis: newCustomAnalysis(),
cache: registry.NewCache(), cache: registry.NewCache(),
} }
@ -295,6 +299,8 @@ func (im *IndexMapping) UnmarshalJSON(data []byte) error {
im.ByteArrayConverter = defaultByteArrayConverter im.ByteArrayConverter = defaultByteArrayConverter
im.DefaultMapping = NewDocumentMapping() im.DefaultMapping = NewDocumentMapping()
im.TypeMapping = make(map[string]*DocumentMapping) im.TypeMapping = make(map[string]*DocumentMapping)
im.StoreDynamic = StoreDynamic
im.IndexDynamic = IndexDynamic
var invalidKeys []string var invalidKeys []string
for k, v := range tmp { for k, v := range tmp {
@ -344,6 +350,16 @@ func (im *IndexMapping) UnmarshalJSON(data []byte) error {
if err != nil { if err != nil {
return err return err
} }
case "store_dynamic":
err := json.Unmarshal(v, &im.StoreDynamic)
if err != nil {
return err
}
case "index_dynamic":
err := json.Unmarshal(v, &im.IndexDynamic)
if err != nil {
return err
}
default: default:
invalidKeys = append(invalidKeys, k) invalidKeys = append(invalidKeys, k)
} }

View File

@ -339,6 +339,7 @@ func TestMappingWithTokenizerDeps(t *testing.T) {
func TestEnablingDisablingStoringDynamicFields(t *testing.T) { func TestEnablingDisablingStoringDynamicFields(t *testing.T) {
// first verify that with system defaults, dynamic field is stored
data := map[string]interface{}{ data := map[string]interface{}{
"name": "bleve", "name": "bleve",
} }
@ -354,11 +355,13 @@ func TestEnablingDisablingStoringDynamicFields(t *testing.T) {
} }
} }
// now change system level defaults, verify dynamic field is not stored
StoreDynamic = false StoreDynamic = false
defer func() { defer func() {
StoreDynamic = true StoreDynamic = true
}() }()
mapping = NewIndexMapping()
doc = document.NewDocument("y") doc = document.NewDocument("y")
err = mapping.mapDocument(doc, data) err = mapping.mapDocument(doc, data)
if err != nil { if err != nil {
@ -369,6 +372,20 @@ func TestEnablingDisablingStoringDynamicFields(t *testing.T) {
t.Errorf("expected field 'name' to be not stored, is") t.Errorf("expected field 'name' to be not stored, is")
} }
} }
// now override the system level defaults inside the index mapping
mapping = NewIndexMapping()
mapping.StoreDynamic = true
doc = document.NewDocument("y")
err = mapping.mapDocument(doc, data)
if err != nil {
t.Fatal(err)
}
for _, field := range doc.Fields {
if field.Name() == "name" && !field.Options().IsStored() {
t.Errorf("expected field 'name' to be stored, isn't")
}
}
} }
func TestMappingBool(t *testing.T) { func TestMappingBool(t *testing.T) {