Spaces:
Sleeping
Sleeping
| // _ _ | |
| // __ _____ __ ___ ___ __ _| |_ ___ | |
| // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
| // \ V V / __/ (_| |\ V /| | (_| | || __/ | |
| // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
| // | |
| // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
| // | |
| // CONTACT: [email protected] | |
| // | |
| package test | |
| import ( | |
| "encoding/json" | |
| "testing" | |
| "github.com/stretchr/testify/require" | |
| "github.com/weaviate/weaviate/client/objects" | |
| "github.com/weaviate/weaviate/entities/models" | |
| "github.com/weaviate/weaviate/test/helper" | |
| ) | |
| func searchNeighbors(t *testing.T) { | |
| listParams := objects.NewObjectsListParams().WithInclude(ptString("nearestNeighbors")) | |
| res, err := helper.Client(t).Objects.ObjectsList(listParams, nil) | |
| require.Nil(t, err, "should not error") | |
| extractNeighbor := func(in *models.Object) []interface{} { | |
| // marshalling to JSON and back into an untyped map to make sure we assert | |
| // on the actual JSON structure. This way if we accidentally change the | |
| // goswagger generation so it affects both the client and the server in the | |
| // same way, this test should catch it | |
| b, err := json.Marshal(in) | |
| require.Nil(t, err) | |
| var untyped map[string]interface{} | |
| err = json.Unmarshal(b, &untyped) | |
| require.Nil(t, err) | |
| return untyped["additional"].(map[string]interface{})["nearestNeighbors"].(map[string]interface{})["neighbors"].([]interface{}) | |
| } | |
| validateNeighbors(t, extractNeighbor(res.Payload.Objects[0]), extractNeighbor(res.Payload.Objects[1])) | |
| } | |
| func featureProjection(t *testing.T) { | |
| listParams := objects.NewObjectsListParams().WithInclude(ptString("featureProjection")) | |
| res, err := helper.Client(t).Objects.ObjectsList(listParams, nil) | |
| require.Nil(t, err, "should not error") | |
| extractProjection := func(in *models.Object) []interface{} { | |
| // marshalling to JSON and back into an untyped map to make sure we assert | |
| // on the actual JSON structure. This way if we accidentally change the | |
| // goswagger generation so it affects both the client and the server in the | |
| // same way, this test should catch it | |
| b, err := json.Marshal(in) | |
| require.Nil(t, err) | |
| var untyped map[string]interface{} | |
| err = json.Unmarshal(b, &untyped) | |
| require.Nil(t, err) | |
| return untyped["additional"].(map[string]interface{})["featureProjection"].(map[string]interface{})["vector"].([]interface{}) | |
| } | |
| validateProjections(t, 2, extractProjection(res.Payload.Objects[0]), extractProjection(res.Payload.Objects[1])) | |
| } | |
| func ptString(in string) *string { | |
| return &in | |
| } | |
| func validateNeighbors(t *testing.T, neighborsGroups ...[]interface{}) { | |
| for i, group := range neighborsGroups { | |
| if len(group) == 0 { | |
| t.Fatalf("group %d: length of neighbors is 0", i) | |
| } | |
| for j, neighbor := range group { | |
| asMap := neighbor.(map[string]interface{}) | |
| if len(asMap["concept"].(string)) == 0 { | |
| t.Fatalf("group %d: element %d: concept has length 0", i, j) | |
| } | |
| } | |
| } | |
| } | |
| func validateProjections(t *testing.T, dims int, vectors ...[]interface{}) { | |
| for _, vector := range vectors { | |
| if len(vector) != dims { | |
| t.Fatalf("expected feature projection vector to have length 3, got: %d", len(vector)) | |
| } | |
| } | |
| } | |