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