0
0

Merge pull request #141 from sacheendra/customanalyzer

adds handling of []string type attributes to custom analyzer
This commit is contained in:
Marty Schoch 2015-01-07 14:19:15 -05:00
commit 07453af0e4

View File

@ -20,20 +20,24 @@ const Name = "custom"
func AnalyzerConstructor(config map[string]interface{}, cache *registry.Cache) (*analysis.Analyzer, error) { func AnalyzerConstructor(config map[string]interface{}, cache *registry.Cache) (*analysis.Analyzer, error) {
var err error
var charFilters []analysis.CharFilter var charFilters []analysis.CharFilter
charFilterNames, ok := config["char_filters"].([]interface{}) charFiltersNames, ok := config["char_filters"].([]string)
if ok { if ok {
charFilters = make([]analysis.CharFilter, len(charFilterNames)) charFilters, err = getCharFilters(charFiltersNames, cache)
for i, charFilterName := range charFilterNames { if err != nil {
charFilterNameString, ok := charFilterName.(string) return nil, err
if ok { }
charFilter, err := cache.CharFilterNamed(charFilterNameString) } else {
if err != nil { charFiltersNamesInterfaceSlice, ok := config["char_filters"].([]interface{})
return nil, err if ok {
} charFiltersNames, err := convertInterfaceSliceToStringSlice(charFiltersNamesInterfaceSlice, "char filter")
charFilters[i] = charFilter if err != nil {
} else { return nil, err
return nil, fmt.Errorf("char filter name must be a string") }
charFilters, err = getCharFilters(charFiltersNames, cache)
if err != nil {
return nil, err
} }
} }
} }
@ -49,19 +53,22 @@ func AnalyzerConstructor(config map[string]interface{}, cache *registry.Cache) (
} }
var tokenFilters []analysis.TokenFilter var tokenFilters []analysis.TokenFilter
tokenFilterNames, ok := config["token_filters"].([]interface{}) tokenFiltersNames, ok := config["token_filters"].([]string)
if ok { if ok {
tokenFilters = make([]analysis.TokenFilter, len(tokenFilterNames)) tokenFilters, err = getTokenFilters(tokenFiltersNames, cache)
for i, tokenFilterName := range tokenFilterNames { if err != nil {
tokenFilterNameString, ok := tokenFilterName.(string) return nil, err
if ok { }
tokenFilter, err := cache.TokenFilterNamed(tokenFilterNameString) } else {
if err != nil { tokenFiltersNamesInterfaceSlice, ok := config["token_filters"].([]interface{})
return nil, err if ok {
} tokenFiltersNames, err := convertInterfaceSliceToStringSlice(tokenFiltersNamesInterfaceSlice, "token filter")
tokenFilters[i] = tokenFilter if err != nil {
} else { return nil, err
return nil, fmt.Errorf("token filter name must be a string") }
tokenFilters, err = getTokenFilters(tokenFiltersNames, cache)
if err != nil {
return nil, err
} }
} }
} }
@ -81,3 +88,43 @@ func AnalyzerConstructor(config map[string]interface{}, cache *registry.Cache) (
func init() { func init() {
registry.RegisterAnalyzer(Name, AnalyzerConstructor) registry.RegisterAnalyzer(Name, AnalyzerConstructor)
} }
func getCharFilters(charFilterNames []string, cache *registry.Cache) ([]analysis.CharFilter, error) {
charFilters := make([]analysis.CharFilter, len(charFilterNames))
for i, charFilterName := range charFilterNames {
charFilter, err := cache.CharFilterNamed(charFilterName)
if err != nil {
return nil, err
}
charFilters[i] = charFilter
}
return charFilters, nil
}
func getTokenFilters(tokenFilterNames []string, cache *registry.Cache) ([]analysis.TokenFilter, error) {
tokenFilters := make([]analysis.TokenFilter, len(tokenFilterNames))
for i, tokenFilterName := range tokenFilterNames {
tokenFilter, err := cache.TokenFilterNamed(tokenFilterName)
if err != nil {
return nil, err
}
tokenFilters[i] = tokenFilter
}
return tokenFilters, nil
}
func convertInterfaceSliceToStringSlice(interfaceSlice []interface{}, objType string) ([]string, error) {
stringSlice := make([]string, len(interfaceSlice))
for i, interfaceObj := range interfaceSlice {
stringObj, ok := interfaceObj.(string)
if ok {
stringSlice[i] = stringObj
} else {
return nil, fmt.Errorf(objType + " name must be a string")
}
}
return stringSlice, nil
}