From afbda14dc2448e2453b206373adb19591b70682c Mon Sep 17 00:00:00 2001 From: Marty Schoch Date: Fri, 13 Feb 2015 08:45:47 -0500 Subject: [PATCH] fix mapping analyzer lookup with multiple fields closes #159 --- mapping_document.go | 47 +++++++++++++++++++++++++++++++++++++++++---- mapping_index.go | 10 +++------- mapping_test.go | 29 ++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 11 deletions(-) diff --git a/mapping_document.go b/mapping_document.go index aed87eae..d0b3e2b4 100644 --- a/mapping_document.go +++ b/mapping_document.go @@ -75,15 +75,54 @@ func (dm *DocumentMapping) validate(cache *registry.Cache) error { return nil } +func (dm *DocumentMapping) analyzerNameForPath(path string) string { + pathElements := decodePath(path) + last := false + current := dm +OUTER: + for i, pathElement := range pathElements { + if i == len(pathElements)-1 { + last = true + } + for name, subDocMapping := range current.Properties { + for _, field := range subDocMapping.Fields { + if field.Name == "" && name == pathElement { + if last { + return field.Analyzer + } + current = subDocMapping + continue OUTER + } else if field.Name == pathElement { + if last { + return field.Analyzer + } + current = subDocMapping + continue OUTER + } + } + } + return "" + } + return "" +} + func (dm *DocumentMapping) documentMappingForPath(path string) *DocumentMapping { pathElements := decodePath(path) current := dm +OUTER: for _, pathElement := range pathElements { - var ok bool - current, ok = current.Properties[pathElement] - if !ok { - return nil + for name, subDocMapping := range current.Properties { + for _, field := range subDocMapping.Fields { + if field.Name == "" && name == pathElement { + current = subDocMapping + continue OUTER + } else if field.Name == pathElement { + current = subDocMapping + continue OUTER + } + } } + return nil } return current } diff --git a/mapping_index.go b/mapping_index.go index 96bfedda..edb95f49 100644 --- a/mapping_index.go +++ b/mapping_index.go @@ -384,13 +384,9 @@ func (im *IndexMapping) newWalkContext(doc *document.Document, dm *DocumentMappi func (im *IndexMapping) analyzerNameForPath(path string) string { // first we look for explicit mapping on the field for _, docMapping := range im.TypeMapping { - pathMapping := docMapping.documentMappingForPath(path) - if pathMapping != nil { - if len(pathMapping.Fields) > 0 { - if pathMapping.Fields[0].Analyzer != "" { - return pathMapping.Fields[0].Analyzer - } - } + analyzerName := docMapping.analyzerNameForPath(path) + if analyzerName != "" { + return analyzerName } } // now try the default mapping diff --git a/mapping_test.go b/mapping_test.go index 00029859..6d947768 100644 --- a/mapping_test.go +++ b/mapping_test.go @@ -215,3 +215,32 @@ func TestMappingJSONWithNull(t *testing.T) { t.Errorf("expected to find 1 find, found %d", count) } } + +func TestMappingForPath(t *testing.T) { + + enFieldMapping := NewTextFieldMapping() + enFieldMapping.Analyzer = "en" + + docMappingA := NewDocumentMapping() + docMappingA.AddFieldMappingsAt("name", enFieldMapping) + + customMapping := NewTextFieldMapping() + customMapping.Analyzer = "xyz" + customMapping.Name = "nameCustom" + + docMappingA.AddFieldMappingsAt("author", enFieldMapping, customMapping) + + mapping := NewIndexMapping() + mapping.AddDocumentMapping("a", docMappingA) + + analyzerName := mapping.analyzerNameForPath("name") + if analyzerName != enFieldMapping.Analyzer { + t.Errorf("expected '%s' got '%s'", enFieldMapping.Analyzer, analyzerName) + } + + analyzerName = mapping.analyzerNameForPath("nameCustom") + if analyzerName != customMapping.Analyzer { + t.Errorf("expected '%s' got '%s'", customMapping.Analyzer, analyzerName) + } + +}