Spaces:
Running
Running
| // _ _ | |
| // __ _____ __ ___ ___ __ _| |_ ___ | |
| // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
| // \ V V / __/ (_| |\ V /| | (_| | || __/ | |
| // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
| // | |
| // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
| // | |
| // CONTACT: [email protected] | |
| // | |
| package batch_request_endpoints | |
| import ( | |
| "fmt" | |
| "testing" | |
| "github.com/go-openapi/strfmt" | |
| "github.com/stretchr/testify/require" | |
| "github.com/weaviate/weaviate/client/batch" | |
| "github.com/weaviate/weaviate/entities/models" | |
| "github.com/weaviate/weaviate/test/helper" | |
| ) | |
| func batchDeleteJourney(t *testing.T) { | |
| maxObjects := 20 | |
| var sources []*models.Object | |
| equalThisName := "equal-this-name" | |
| getBatchDelete := func(className string, path []string, valueText string, dryRun bool) *batch.BatchObjectsDeleteParams { | |
| output := "verbose" | |
| params := batch.NewBatchObjectsDeleteParams().WithBody(&models.BatchDelete{ | |
| Match: &models.BatchDeleteMatch{ | |
| Class: className, | |
| Where: &models.WhereFilter{ | |
| Operator: "Equal", | |
| Path: path, | |
| ValueText: &valueText, | |
| }, | |
| }, | |
| DryRun: &dryRun, | |
| Output: &output, | |
| }) | |
| return params | |
| } | |
| sourceUUIDs := make([]strfmt.UUID, maxObjects) | |
| targetUUIDs := make([]strfmt.UUID, maxObjects) | |
| t.Run("create some data", func(t *testing.T) { | |
| sources = make([]*models.Object, maxObjects) | |
| for i := range sources { | |
| uuid := mustNewUUID() | |
| sources[i] = &models.Object{ | |
| Class: "BulkTestSource", | |
| ID: uuid, | |
| Properties: map[string]interface{}{ | |
| "name": equalThisName, | |
| }, | |
| } | |
| sourceUUIDs[i] = uuid | |
| } | |
| targets := make([]*models.Object, maxObjects) | |
| for i := range targets { | |
| uuid := mustNewUUID() | |
| targets[i] = &models.Object{ | |
| Class: "BulkTestTarget", | |
| ID: uuid, | |
| Properties: map[string]interface{}{ | |
| "intProp": i, | |
| }, | |
| } | |
| targetUUIDs[i] = uuid | |
| } | |
| }) | |
| t.Run("import all batch objects", func(t *testing.T) { | |
| params := batch.NewBatchObjectsCreateParams().WithBody( | |
| batch.BatchObjectsCreateBody{ | |
| Objects: sources, | |
| }, | |
| ) | |
| res, err := helper.Client(t).Batch.BatchObjectsCreate(params, nil) | |
| require.Nil(t, err) | |
| for _, elem := range res.Payload { | |
| require.Nil(t, elem.Result.Errors) | |
| } | |
| }) | |
| t.Run("import all batch refs", func(t *testing.T) { | |
| batchRefs := make([]*models.BatchReference, len(sources)) | |
| for i := range batchRefs { | |
| batchRefs[i] = &models.BatchReference{ | |
| From: strfmt.URI(fmt.Sprintf("weaviate://localhost/%s/%s/fromSource", "BulkTestTarget", targetUUIDs[i])), | |
| To: strfmt.URI(fmt.Sprintf("weaviate://localhost/%s", sourceUUIDs[i])), | |
| } | |
| } | |
| params := batch.NewBatchReferencesCreateParams().WithBody(batchRefs) | |
| res, err := helper.Client(t).Batch.BatchReferencesCreate(params, nil) | |
| require.Nil(t, err) | |
| for _, elem := range res.Payload { | |
| require.Nil(t, elem.Result.Errors) | |
| } | |
| }) | |
| t.Run("verify using GraphQL", func(t *testing.T) { | |
| // verify objects | |
| result := AssertGraphQL(t, helper.RootAuth, ` | |
| { Get { BulkTestSource(where:{operator:Equal path:["name"] valueText:"equal-this-name"}) { name } } } | |
| `) | |
| items := result.Get("Get", "BulkTestSource").AsSlice() | |
| require.Len(t, items, maxObjects) | |
| // verify refs | |
| result = AssertGraphQL(t, helper.RootAuth, ` | |
| { | |
| Get { | |
| BulkTestTarget | |
| ( | |
| where: { | |
| path: ["fromSource", "BulkTestSource", "name"] | |
| operator: Equal | |
| valueText: "equal-this-name" | |
| } | |
| ) | |
| { | |
| fromSource { | |
| ... on BulkTestSource { | |
| _additional { | |
| id | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| `) | |
| items = result.Get("Get", "BulkTestTarget").AsSlice() | |
| for _, item := range items { | |
| fromSource := item.(map[string]interface{})["fromSource"] | |
| require.NotNil(t, fromSource) | |
| } | |
| require.Len(t, items, maxObjects) | |
| }) | |
| t.Run("perform batch delete by refs dry run", func(t *testing.T) { | |
| params := getBatchDelete("BulkTestTarget", []string{"fromSource", "BulkTestSource", "name"}, equalThisName, true) | |
| res, err := helper.Client(t).Batch.BatchObjectsDelete(params, nil) | |
| require.Nil(t, err) | |
| response := res.Payload | |
| require.NotNil(t, response) | |
| require.NotNil(t, response.Match) | |
| require.NotNil(t, response.Results) | |
| require.Equal(t, int64(maxObjects), response.Results.Matches) | |
| require.Equal(t, int64(0), response.Results.Successful) | |
| require.Equal(t, int64(0), response.Results.Failed) | |
| require.Equal(t, maxObjects, len(response.Results.Objects)) | |
| for _, elem := range response.Results.Objects { | |
| require.Nil(t, elem.Errors) | |
| } | |
| }) | |
| t.Run("[deprecated string] perform batch delete by refs dry run", func(t *testing.T) { | |
| params := getBatchDelete("BulkTestTarget", []string{"fromSource", "BulkTestSource", "name"}, equalThisName, true) | |
| params.Body.Match.Where.ValueText = nil | |
| params.Body.Match.Where.ValueString = &equalThisName | |
| res, err := helper.Client(t).Batch.BatchObjectsDelete(params, nil) | |
| require.Nil(t, err) | |
| response := res.Payload | |
| require.NotNil(t, response) | |
| require.NotNil(t, response.Match) | |
| require.NotNil(t, response.Results) | |
| require.Equal(t, int64(maxObjects), response.Results.Matches) | |
| require.Equal(t, int64(0), response.Results.Successful) | |
| require.Equal(t, int64(0), response.Results.Failed) | |
| require.Equal(t, maxObjects, len(response.Results.Objects)) | |
| for _, elem := range response.Results.Objects { | |
| require.Nil(t, elem.Errors) | |
| } | |
| }) | |
| t.Run("verify that batch delete by refs dry run didn't delete data", func(t *testing.T) { | |
| result := AssertGraphQL(t, helper.RootAuth, ` | |
| { | |
| Get { | |
| BulkTestTarget | |
| ( | |
| where: { | |
| path: ["fromSource", "BulkTestSource", "name"] | |
| operator: Equal | |
| valueText: "equal-this-name" | |
| } | |
| ) | |
| { | |
| fromSource { | |
| ... on BulkTestSource { | |
| _additional { | |
| id | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| `) | |
| items := result.Get("Get", "BulkTestTarget").AsSlice() | |
| require.Len(t, items, maxObjects) | |
| }) | |
| t.Run("perform batch delete by prop dry run", func(t *testing.T) { | |
| params := getBatchDelete("BulkTestSource", []string{"name"}, equalThisName, true) | |
| res, err := helper.Client(t).Batch.BatchObjectsDelete(params, nil) | |
| require.Nil(t, err) | |
| response := res.Payload | |
| require.NotNil(t, response) | |
| require.NotNil(t, response.Match) | |
| require.NotNil(t, response.Results) | |
| require.Equal(t, int64(maxObjects), response.Results.Matches) | |
| require.Equal(t, int64(0), response.Results.Successful) | |
| require.Equal(t, int64(0), response.Results.Failed) | |
| require.Equal(t, maxObjects, len(response.Results.Objects)) | |
| for _, elem := range response.Results.Objects { | |
| require.Nil(t, elem.Errors) | |
| } | |
| }) | |
| t.Run("verify that batch delete by prop dry run didn't delete data", func(t *testing.T) { | |
| result := AssertGraphQL(t, helper.RootAuth, ` | |
| { Get { BulkTestSource(where:{operator:Equal path:["name"] valueText:"equal-this-name"}) { name } } } | |
| `) | |
| items := result.Get("Get", "BulkTestSource").AsSlice() | |
| require.Len(t, items, maxObjects) | |
| }) | |
| t.Run("perform batch delete by ref", func(t *testing.T) { | |
| params := getBatchDelete("BulkTestTarget", []string{"fromSource", "BulkTestSource", "name"}, equalThisName, false) | |
| res, err := helper.Client(t).Batch.BatchObjectsDelete(params, nil) | |
| require.Nil(t, err) | |
| response := res.Payload | |
| require.NotNil(t, response) | |
| require.NotNil(t, response.Match) | |
| require.NotNil(t, response.Results) | |
| require.Equal(t, int64(maxObjects), response.Results.Matches) | |
| require.Equal(t, int64(maxObjects), response.Results.Successful) | |
| require.Equal(t, int64(0), response.Results.Failed) | |
| require.Equal(t, maxObjects, len(response.Results.Objects)) | |
| for _, elem := range response.Results.Objects { | |
| require.Nil(t, elem.Errors) | |
| } | |
| }) | |
| t.Run("verify that batch delete by ref deleted everything", func(t *testing.T) { | |
| result := AssertGraphQL(t, helper.RootAuth, ` | |
| { | |
| Get { | |
| BulkTestTarget | |
| ( | |
| where: { | |
| path: ["fromSource", "BulkTestSource", "name"] | |
| operator: Equal | |
| valueText: "equal-this-name" | |
| } | |
| ) | |
| { | |
| fromSource { | |
| ... on BulkTestSource { | |
| _additional { | |
| id | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| `) | |
| items := result.Get("Get", "BulkTestTarget").AsSlice() | |
| require.Len(t, items, 0) | |
| }) | |
| t.Run("perform batch delete by prop", func(t *testing.T) { | |
| params := getBatchDelete("BulkTestSource", []string{"name"}, equalThisName, false) | |
| res, err := helper.Client(t).Batch.BatchObjectsDelete(params, nil) | |
| require.Nil(t, err) | |
| response := res.Payload | |
| require.NotNil(t, response) | |
| require.NotNil(t, response.Match) | |
| require.NotNil(t, response.Results) | |
| require.Equal(t, int64(maxObjects), response.Results.Matches) | |
| require.Equal(t, int64(maxObjects), response.Results.Successful) | |
| require.Equal(t, int64(0), response.Results.Failed) | |
| require.Equal(t, maxObjects, len(response.Results.Objects)) | |
| for _, elem := range response.Results.Objects { | |
| require.Nil(t, elem.Errors) | |
| } | |
| }) | |
| t.Run("verify that batch delete by prop deleted everything", func(t *testing.T) { | |
| result := AssertGraphQL(t, helper.RootAuth, ` | |
| { Get { BulkTestSource(where:{operator:Equal path:["name"] valueText:"equal-this-name"}) { name } } } | |
| `) | |
| items := result.Get("Get", "BulkTestSource").AsSlice() | |
| require.Len(t, items, 0) | |
| }) | |
| } | |