From 57919a77f524575272b4e6f1ffcdef5bd5486f47 Mon Sep 17 00:00:00 2001 From: Marty Schoch Date: Tue, 8 Mar 2016 07:58:29 -0500 Subject: [PATCH] add support for toggling Store/Index Dynamic in IndexMapping --- mapping_document.go | 10 +++++----- mapping_field.go | 24 ++++++++++++------------ mapping_index.go | 16 ++++++++++++++++ mapping_test.go | 17 +++++++++++++++++ 4 files changed, 50 insertions(+), 17 deletions(-) diff --git a/mapping_document.go b/mapping_document.go index f6060993..a7f42e1b 100644 --- a/mapping_document.go +++ b/mapping_document.go @@ -363,11 +363,11 @@ func (dm *DocumentMapping) processProperty(property interface{}, path []string, parsedDateTime, err := dateTimeParser.ParseDateTime(propertyValueString) if err != nil { // index as text - fieldMapping := newTextFieldMappingDynamic() + fieldMapping := newTextFieldMappingDynamic(context.im) fieldMapping.processString(propertyValueString, pathString, path, indexes, context) } else { // index as datetime - fieldMapping := newDateTimeFieldMappingDynamic() + fieldMapping := newDateTimeFieldMappingDynamic(context.im) fieldMapping.processTime(parsedDateTime, pathString, path, indexes, context) } } @@ -387,7 +387,7 @@ func (dm *DocumentMapping) processProperty(property interface{}, path []string, } } else if dm.Dynamic { // automatic indexing behavior - fieldMapping := newNumericFieldMappingDynamic() + fieldMapping := newNumericFieldMappingDynamic(context.im) fieldMapping.processFloat64(propertyValFloat, pathString, path, indexes, context) } case reflect.Bool: @@ -399,7 +399,7 @@ func (dm *DocumentMapping) processProperty(property interface{}, path []string, } } else if dm.Dynamic { // automatic indexing behavior - fieldMapping := newBooleanFieldMappingDynamic() + fieldMapping := newBooleanFieldMappingDynamic(context.im) fieldMapping.processBoolean(propertyValBool, pathString, path, indexes, context) } case reflect.Struct: @@ -412,7 +412,7 @@ func (dm *DocumentMapping) processProperty(property interface{}, path []string, fieldMapping.processTime(property, pathString, path, indexes, context) } } else if dm.Dynamic { - fieldMapping := newDateTimeFieldMappingDynamic() + fieldMapping := newDateTimeFieldMappingDynamic(context.im) fieldMapping.processTime(property, pathString, path, indexes, context) } default: diff --git a/mapping_field.go b/mapping_field.go index bd7e7c45..1a310b3a 100644 --- a/mapping_field.go +++ b/mapping_field.go @@ -61,10 +61,10 @@ func NewTextFieldMapping() *FieldMapping { } } -func newTextFieldMappingDynamic() *FieldMapping { +func newTextFieldMappingDynamic(im *IndexMapping) *FieldMapping { rv := NewTextFieldMapping() - rv.Store = StoreDynamic - rv.Index = IndexDynamic + rv.Store = im.StoreDynamic + rv.Index = im.IndexDynamic return rv } @@ -78,10 +78,10 @@ func NewNumericFieldMapping() *FieldMapping { } } -func newNumericFieldMappingDynamic() *FieldMapping { +func newNumericFieldMappingDynamic(im *IndexMapping) *FieldMapping { rv := NewNumericFieldMapping() - rv.Store = StoreDynamic - rv.Index = IndexDynamic + rv.Store = im.StoreDynamic + rv.Index = im.IndexDynamic return rv } @@ -95,10 +95,10 @@ func NewDateTimeFieldMapping() *FieldMapping { } } -func newDateTimeFieldMappingDynamic() *FieldMapping { +func newDateTimeFieldMappingDynamic(im *IndexMapping) *FieldMapping { rv := NewDateTimeFieldMapping() - rv.Store = StoreDynamic - rv.Index = IndexDynamic + rv.Store = im.StoreDynamic + rv.Index = im.IndexDynamic return rv } @@ -112,10 +112,10 @@ func NewBooleanFieldMapping() *FieldMapping { } } -func newBooleanFieldMappingDynamic() *FieldMapping { +func newBooleanFieldMappingDynamic(im *IndexMapping) *FieldMapping { rv := NewBooleanFieldMapping() - rv.Store = StoreDynamic - rv.Index = IndexDynamic + rv.Store = im.StoreDynamic + rv.Index = im.IndexDynamic return rv } diff --git a/mapping_index.go b/mapping_index.go index 55344b38..adade9ce 100644 --- a/mapping_index.go +++ b/mapping_index.go @@ -130,6 +130,8 @@ type IndexMapping struct { DefaultDateTimeParser string `json:"default_datetime_parser"` DefaultField string `json:"default_field"` ByteArrayConverter string `json:"byte_array_converter"` + StoreDynamic bool `json:"store_dynamic"` + IndexDynamic bool `json:"index_dynamic"` CustomAnalysis *customAnalysis `json:"analysis,omitempty"` cache *registry.Cache } @@ -233,6 +235,8 @@ func NewIndexMapping() *IndexMapping { DefaultDateTimeParser: defaultDateTimeParser, DefaultField: defaultField, ByteArrayConverter: defaultByteArrayConverter, + IndexDynamic: IndexDynamic, + StoreDynamic: StoreDynamic, CustomAnalysis: newCustomAnalysis(), cache: registry.NewCache(), } @@ -295,6 +299,8 @@ func (im *IndexMapping) UnmarshalJSON(data []byte) error { im.ByteArrayConverter = defaultByteArrayConverter im.DefaultMapping = NewDocumentMapping() im.TypeMapping = make(map[string]*DocumentMapping) + im.StoreDynamic = StoreDynamic + im.IndexDynamic = IndexDynamic var invalidKeys []string for k, v := range tmp { @@ -344,6 +350,16 @@ func (im *IndexMapping) UnmarshalJSON(data []byte) error { if err != nil { 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: invalidKeys = append(invalidKeys, k) } diff --git a/mapping_test.go b/mapping_test.go index 1cd9f6ba..77d9df5a 100644 --- a/mapping_test.go +++ b/mapping_test.go @@ -339,6 +339,7 @@ func TestMappingWithTokenizerDeps(t *testing.T) { func TestEnablingDisablingStoringDynamicFields(t *testing.T) { + // first verify that with system defaults, dynamic field is stored data := map[string]interface{}{ "name": "bleve", } @@ -354,11 +355,13 @@ func TestEnablingDisablingStoringDynamicFields(t *testing.T) { } } + // now change system level defaults, verify dynamic field is not stored StoreDynamic = false defer func() { StoreDynamic = true }() + mapping = NewIndexMapping() doc = document.NewDocument("y") err = mapping.mapDocument(doc, data) if err != nil { @@ -369,6 +372,20 @@ func TestEnablingDisablingStoringDynamicFields(t *testing.T) { 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) {