Spaces:
Running
Running
| // _ _ | |
| // __ _____ __ ___ ___ __ _| |_ ___ | |
| // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
| // \ V V / __/ (_| |\ V /| | (_| | || __/ | |
| // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
| // | |
| // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
| // | |
| // CONTACT: [email protected] | |
| // | |
| package clients | |
| import ( | |
| "context" | |
| "encoding/json" | |
| "fmt" | |
| "io" | |
| "net/http" | |
| "strings" | |
| "sync" | |
| "github.com/pkg/errors" | |
| ) | |
| func (v *vectorizer) MetaInfo() (map[string]interface{}, error) { | |
| type nameMetaErr struct { | |
| name string | |
| meta map[string]interface{} | |
| err error | |
| } | |
| endpoints := map[string]string{} | |
| if v.originPassage != v.originQuery { | |
| endpoints["passage"] = v.urlPassage("/meta") | |
| endpoints["query"] = v.urlQuery("/meta") | |
| } else { | |
| endpoints[""] = v.urlPassage("/meta") | |
| } | |
| var wg sync.WaitGroup | |
| ch := make(chan nameMetaErr, len(endpoints)) | |
| for serviceName, endpoint := range endpoints { | |
| wg.Add(1) | |
| go func(serviceName string, endpoint string) { | |
| defer wg.Done() | |
| meta, err := v.metaInfo(endpoint) | |
| ch <- nameMetaErr{serviceName, meta, err} | |
| }(serviceName, endpoint) | |
| } | |
| wg.Wait() | |
| close(ch) | |
| metas := map[string]interface{}{} | |
| var errs []string | |
| for nme := range ch { | |
| if nme.err != nil { | |
| prefix := "" | |
| if nme.name != "" { | |
| prefix = "[" + nme.name + "] " | |
| } | |
| errs = append(errs, fmt.Sprintf("%s%v", prefix, nme.err.Error())) | |
| } | |
| if nme.meta != nil { | |
| metas[nme.name] = nme.meta | |
| } | |
| } | |
| if len(errs) > 0 { | |
| return nil, errors.Errorf(strings.Join(errs, ", ")) | |
| } | |
| if len(metas) == 1 { | |
| for _, meta := range metas { | |
| return meta.(map[string]interface{}), nil | |
| } | |
| } | |
| return metas, nil | |
| } | |
| func (v *vectorizer) metaInfo(endpoint string) (map[string]interface{}, error) { | |
| req, err := http.NewRequestWithContext(context.Background(), "GET", endpoint, nil) | |
| if err != nil { | |
| return nil, errors.Wrap(err, "create GET meta request") | |
| } | |
| res, err := v.httpClient.Do(req) | |
| if err != nil { | |
| return nil, errors.Wrap(err, "send GET meta request") | |
| } | |
| defer res.Body.Close() | |
| if !(res.StatusCode >= http.StatusOK && res.StatusCode < http.StatusMultipleChoices) { | |
| return nil, errors.Errorf("unexpected status code '%d' of meta request", res.StatusCode) | |
| } | |
| bodyBytes, err := io.ReadAll(res.Body) | |
| if err != nil { | |
| return nil, errors.Wrap(err, "read meta response body") | |
| } | |
| var resBody map[string]interface{} | |
| if err := json.Unmarshal(bodyBytes, &resBody); err != nil { | |
| return nil, errors.Wrap(err, "unmarshal meta response body") | |
| } | |
| return resBody, nil | |
| } | |