diff --git a/solr/parser.go b/solr/parser.go index 2642011..757b140 100644 --- a/solr/parser.go +++ b/solr/parser.go @@ -269,3 +269,51 @@ func (parser *MoreLikeThisParser) Parse(resp_ *[]byte) (*SolrMltResult, error) { } return sr, nil } + +type AnyResultParser interface { + Parse(*[]byte) (*SolrAnyResult, error) +} + +type AnyParser struct { +} + +func (parser *AnyParser) Parse(resp_ *[]byte) (*SolrAnyResult, error) { + jsonbuf, err := bytes2json(resp_) + sr := &SolrAnyResult{} + if err != nil { + return sr, nil + } + var resp = new(SolrResponse) + resp.Response = jsonbuf + resp.Status = int(jsonbuf["responseHeader"].(map[string]interface{})["status"].(float64)) + + sr.Results = new(Collection) + sr.Status = resp.Status + sr.Payload = make(map[string]interface{}) + + if responseHeader, ok := resp.Response["responseHeader"].(map[string]interface{}); ok { + sr.ResponseHeader = responseHeader + } + + if resp.Status != 0 { + if err, ok := resp.Response["error"].(map[string]interface{}); ok { + sr.Error = err + } + return sr, err + } + + for k, r := range resp.Response { + switch k { + case "response": + if resp, ok := r.(map[string]interface{}); ok { + ParseDocResponse(resp, sr.Results) + } + case "responseHeader": + continue + default: + sr.Payload[k] = r + } + } + + return sr, nil +} diff --git a/solr/search.go b/solr/search.go index 10efb1d..b16010c 100644 --- a/solr/search.go +++ b/solr/search.go @@ -97,3 +97,15 @@ func (s *Search) SpellCheck(parser ResultParser) (*SolrResult, error) { } return parser.Parse(resp) } + +// This method is for making query to user-specific or any request handler endpoint +func (s *Search) Any(endpoint string, parser AnyResultParser) (*SolrAnyResult, error) { + resp, err := s.Resource(endpoint, s.QueryParams()) + if err != nil { + return nil, err + } + if parser == nil { + parser = new(AnyParser) + } + return parser.Parse(resp) +} diff --git a/solr/solr.go b/solr/solr.go index 35c9ddc..a5e3177 100644 --- a/solr/solr.go +++ b/solr/solr.go @@ -49,7 +49,7 @@ type FireworkCollection struct { // Parsed result for SearchHandler response, ie /select type FireworkSolrResult struct { - Status int // status quick access to status + Status int // status quick access to status Results FireworkCollection `json:"response"` // results parsed documents, basically response object QTime int Params map[string]string `json:"params"` @@ -62,7 +62,7 @@ type FireworkSolrResult struct { Grouped map[string]interface{} // grouped for grouping result if grouping Results will be empty Stats map[string]interface{} MoreLikeThis map[string]interface{} // MoreLikeThis using Search (select) Component - NextCursorMark string `json:"nextCursorMark"` + NextCursorMark string `json:"nextCursorMark"` } // Holding the search result @@ -99,6 +99,15 @@ type SolrMltResult struct { Error map[string]interface{} } +// Parsed result for any response that is not already handled +type SolrAnyResult struct { + Status int // status quick access to status + Results *Collection // results parsed documents, basically response object + ResponseHeader map[string]interface{} + Error map[string]interface{} + Payload map[string]interface{} +} + type SolrInterface struct { conn *Connection }