0
0

fix mapping analyzer lookup with multiple fields

closes #159
This commit is contained in:
Marty Schoch 2015-02-13 08:45:47 -05:00
parent 2f607d73f3
commit afbda14dc2
3 changed files with 75 additions and 11 deletions

View File

@ -75,16 +75,55 @@ 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
}

View File

@ -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

View File

@ -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)
}
}