github.com/weaviate/weaviate@v1.24.6/test/acceptance/batch_request_endpoints/batch_delete_test.go (about)

     1  //                           _       _
     2  // __      _____  __ ___   ___  __ _| |_ ___
     3  // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
     4  //  \ V  V /  __/ (_| |\ V /| | (_| | ||  __/
     5  //   \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
     6  //
     7  //  Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
     8  //
     9  //  CONTACT: hello@weaviate.io
    10  //
    11  
    12  package batch_request_endpoints
    13  
    14  import (
    15  	"fmt"
    16  	"testing"
    17  
    18  	"github.com/go-openapi/strfmt"
    19  	"github.com/stretchr/testify/require"
    20  	"github.com/weaviate/weaviate/client/batch"
    21  	"github.com/weaviate/weaviate/entities/models"
    22  	"github.com/weaviate/weaviate/test/helper"
    23  )
    24  
    25  func batchDeleteJourney(t *testing.T) {
    26  	maxObjects := 20
    27  	var sources []*models.Object
    28  	var targets []*models.Object
    29  	equalThisName := "equal-this-name"
    30  
    31  	getBatchDelete := func(className string, path []string, valueText string, dryRun bool) *batch.BatchObjectsDeleteParams {
    32  		output := "verbose"
    33  		params := batch.NewBatchObjectsDeleteParams().WithBody(&models.BatchDelete{
    34  			Match: &models.BatchDeleteMatch{
    35  				Class: className,
    36  				Where: &models.WhereFilter{
    37  					Operator:  "Equal",
    38  					Path:      path,
    39  					ValueText: &valueText,
    40  				},
    41  			},
    42  			DryRun: &dryRun,
    43  			Output: &output,
    44  		})
    45  		return params
    46  	}
    47  
    48  	sourceUUIDs := make([]strfmt.UUID, maxObjects)
    49  	targetUUIDs := make([]strfmt.UUID, maxObjects)
    50  
    51  	t.Run("create some data", func(t *testing.T) {
    52  		sources = make([]*models.Object, maxObjects)
    53  		for i := range sources {
    54  			uuid := mustNewUUID()
    55  
    56  			sources[i] = &models.Object{
    57  				Class: "BulkTestSource",
    58  				ID:    uuid,
    59  				Properties: map[string]interface{}{
    60  					"name": equalThisName,
    61  				},
    62  			}
    63  
    64  			sourceUUIDs[i] = uuid
    65  		}
    66  
    67  		targets = make([]*models.Object, maxObjects)
    68  		for i := range targets {
    69  			uuid := mustNewUUID()
    70  
    71  			targets[i] = &models.Object{
    72  				Class: "BulkTestTarget",
    73  				ID:    uuid,
    74  				Properties: map[string]interface{}{
    75  					"intProp": i,
    76  				},
    77  			}
    78  
    79  			targetUUIDs[i] = uuid
    80  		}
    81  	})
    82  
    83  	t.Run("import all batch objects", func(t *testing.T) {
    84  		params := batch.NewBatchObjectsCreateParams().WithBody(
    85  			batch.BatchObjectsCreateBody{
    86  				Objects: sources,
    87  			},
    88  		)
    89  		res, err := helper.Client(t).Batch.BatchObjectsCreate(params, nil)
    90  		require.Nil(t, err)
    91  
    92  		for _, elem := range res.Payload {
    93  			require.Nil(t, elem.Result.Errors)
    94  		}
    95  
    96  		paramsTarget := batch.NewBatchObjectsCreateParams().WithBody(
    97  			batch.BatchObjectsCreateBody{
    98  				Objects: targets,
    99  			},
   100  		)
   101  		resTarget, errTarget := helper.Client(t).Batch.BatchObjectsCreate(paramsTarget, nil)
   102  		require.Nil(t, errTarget)
   103  
   104  		for _, elem := range resTarget.Payload {
   105  			require.Nil(t, elem.Result.Errors)
   106  		}
   107  	})
   108  
   109  	t.Run("import all batch refs", func(t *testing.T) {
   110  		batchRefs := make([]*models.BatchReference, len(sources))
   111  
   112  		for i := range batchRefs {
   113  			batchRefs[i] = &models.BatchReference{
   114  				From: strfmt.URI(fmt.Sprintf("weaviate://localhost/BulkTestTarget/%s/fromSource", targetUUIDs[i])),
   115  				To:   strfmt.URI(fmt.Sprintf("weaviate://localhost/BulkTestSource/%s", sourceUUIDs[i])),
   116  			}
   117  		}
   118  
   119  		params := batch.NewBatchReferencesCreateParams().WithBody(batchRefs)
   120  		res, err := helper.Client(t).Batch.BatchReferencesCreate(params, nil)
   121  		require.Nil(t, err)
   122  
   123  		for _, elem := range res.Payload {
   124  			require.Nil(t, elem.Result.Errors)
   125  		}
   126  	})
   127  
   128  	t.Run("verify using GraphQL", func(t *testing.T) {
   129  		// verify objects
   130  		result := AssertGraphQL(t, helper.RootAuth, `
   131  		{  Get { BulkTestSource(where:{operator:Equal path:["name"] valueText:"equal-this-name"}) { name } } }
   132  		`)
   133  		items := result.Get("Get", "BulkTestSource").AsSlice()
   134  		require.Len(t, items, maxObjects)
   135  
   136  		// verify refs
   137  		result = AssertGraphQL(t, helper.RootAuth, `
   138  		{
   139  		  Get {
   140  			BulkTestTarget
   141  			(
   142  			  where: {
   143  				path: ["fromSource", "BulkTestSource", "name"]
   144  				operator: Equal
   145  				valueText: "equal-this-name"
   146  			  }
   147  			)
   148  			{
   149  			  fromSource {
   150  				... on BulkTestSource {
   151  				  _additional {
   152  					id
   153  				  }
   154  				}
   155  			  }
   156  			}
   157  		  }
   158  		}
   159  		`)
   160  		items = result.Get("Get", "BulkTestTarget").AsSlice()
   161  		for _, item := range items {
   162  			fromSource := item.(map[string]interface{})["fromSource"]
   163  			require.NotNil(t, fromSource)
   164  		}
   165  		require.Len(t, items, maxObjects)
   166  	})
   167  
   168  	t.Run("perform batch delete by refs dry run", func(t *testing.T) {
   169  		params := getBatchDelete("BulkTestTarget", []string{"fromSource", "BulkTestSource", "name"}, equalThisName, true)
   170  		res, err := helper.Client(t).Batch.BatchObjectsDelete(params, nil)
   171  		require.Nil(t, err)
   172  
   173  		response := res.Payload
   174  		require.NotNil(t, response)
   175  		require.NotNil(t, response.Match)
   176  		require.NotNil(t, response.Results)
   177  		require.Equal(t, int64(maxObjects), response.Results.Matches)
   178  		require.Equal(t, int64(0), response.Results.Successful)
   179  		require.Equal(t, int64(0), response.Results.Failed)
   180  		require.Equal(t, maxObjects, len(response.Results.Objects))
   181  		for _, elem := range response.Results.Objects {
   182  			require.Nil(t, elem.Errors)
   183  		}
   184  	})
   185  
   186  	t.Run("[deprecated string] perform batch delete by refs dry run", func(t *testing.T) {
   187  		params := getBatchDelete("BulkTestTarget", []string{"fromSource", "BulkTestSource", "name"}, equalThisName, true)
   188  		params.Body.Match.Where.ValueText = nil
   189  		params.Body.Match.Where.ValueString = &equalThisName
   190  
   191  		res, err := helper.Client(t).Batch.BatchObjectsDelete(params, nil)
   192  		require.Nil(t, err)
   193  
   194  		response := res.Payload
   195  		require.NotNil(t, response)
   196  		require.NotNil(t, response.Match)
   197  		require.NotNil(t, response.Results)
   198  		require.Equal(t, int64(maxObjects), response.Results.Matches)
   199  		require.Equal(t, int64(0), response.Results.Successful)
   200  		require.Equal(t, int64(0), response.Results.Failed)
   201  		require.Equal(t, maxObjects, len(response.Results.Objects))
   202  		for _, elem := range response.Results.Objects {
   203  			require.Nil(t, elem.Errors)
   204  		}
   205  	})
   206  
   207  	t.Run("verify that batch delete by refs dry run didn't delete data", func(t *testing.T) {
   208  		result := AssertGraphQL(t, helper.RootAuth, `
   209  		{
   210  		  Get {
   211  			BulkTestTarget
   212  			(
   213  			  where: {
   214  				path: ["fromSource", "BulkTestSource", "name"]
   215  				operator: Equal
   216  				valueText: "equal-this-name"
   217  			  }
   218  			)
   219  			{
   220  			  fromSource {
   221  				... on BulkTestSource {
   222  				  _additional {
   223  					id
   224  				  }
   225  				}
   226  			  }
   227  			}
   228  		  }
   229  		}
   230  		`)
   231  		items := result.Get("Get", "BulkTestTarget").AsSlice()
   232  		require.Len(t, items, maxObjects)
   233  	})
   234  
   235  	t.Run("perform batch delete by prop dry run", func(t *testing.T) {
   236  		params := getBatchDelete("BulkTestSource", []string{"name"}, equalThisName, true)
   237  		res, err := helper.Client(t).Batch.BatchObjectsDelete(params, nil)
   238  		require.Nil(t, err)
   239  
   240  		response := res.Payload
   241  		require.NotNil(t, response)
   242  		require.NotNil(t, response.Match)
   243  		require.NotNil(t, response.Results)
   244  		require.Equal(t, int64(maxObjects), response.Results.Matches)
   245  		require.Equal(t, int64(0), response.Results.Successful)
   246  		require.Equal(t, int64(0), response.Results.Failed)
   247  		require.Equal(t, maxObjects, len(response.Results.Objects))
   248  		for _, elem := range response.Results.Objects {
   249  			require.Nil(t, elem.Errors)
   250  		}
   251  	})
   252  
   253  	t.Run("verify that batch delete by prop dry run didn't delete data", func(t *testing.T) {
   254  		result := AssertGraphQL(t, helper.RootAuth, `
   255  		{  Get { BulkTestSource(where:{operator:Equal path:["name"] valueText:"equal-this-name"}) { name } } }
   256  		`)
   257  		items := result.Get("Get", "BulkTestSource").AsSlice()
   258  		require.Len(t, items, maxObjects)
   259  	})
   260  
   261  	t.Run("perform batch delete by ref", func(t *testing.T) {
   262  		params := getBatchDelete("BulkTestTarget", []string{"fromSource", "BulkTestSource", "name"}, equalThisName, false)
   263  		res, err := helper.Client(t).Batch.BatchObjectsDelete(params, nil)
   264  		require.Nil(t, err)
   265  
   266  		response := res.Payload
   267  		require.NotNil(t, response)
   268  		require.NotNil(t, response.Match)
   269  		require.NotNil(t, response.Results)
   270  		require.Equal(t, int64(maxObjects), response.Results.Matches)
   271  		require.Equal(t, int64(maxObjects), response.Results.Successful)
   272  		require.Equal(t, int64(0), response.Results.Failed)
   273  		require.Equal(t, maxObjects, len(response.Results.Objects))
   274  		for _, elem := range response.Results.Objects {
   275  			require.Nil(t, elem.Errors)
   276  		}
   277  	})
   278  
   279  	t.Run("verify that batch delete by ref deleted everything", func(t *testing.T) {
   280  		result := AssertGraphQL(t, helper.RootAuth, `
   281  		{
   282  		  Get {
   283  			BulkTestTarget
   284  			(
   285  			  where: {
   286  				path: ["fromSource", "BulkTestSource", "name"]
   287  				operator: Equal
   288  				valueText: "equal-this-name"
   289  			  }
   290  			)
   291  			{
   292  			  fromSource {
   293  				... on BulkTestSource {
   294  				  _additional {
   295  					id
   296  				  }
   297  				}
   298  			  }
   299  			}
   300  		  }
   301  		}
   302  		`)
   303  		items := result.Get("Get", "BulkTestTarget").AsSlice()
   304  		require.Len(t, items, 0)
   305  	})
   306  
   307  	t.Run("perform batch delete by prop", func(t *testing.T) {
   308  		params := getBatchDelete("BulkTestSource", []string{"name"}, equalThisName, false)
   309  		res, err := helper.Client(t).Batch.BatchObjectsDelete(params, nil)
   310  		require.Nil(t, err)
   311  
   312  		response := res.Payload
   313  		require.NotNil(t, response)
   314  		require.NotNil(t, response.Match)
   315  		require.NotNil(t, response.Results)
   316  		require.Equal(t, int64(maxObjects), response.Results.Matches)
   317  		require.Equal(t, int64(maxObjects), response.Results.Successful)
   318  		require.Equal(t, int64(0), response.Results.Failed)
   319  		require.Equal(t, maxObjects, len(response.Results.Objects))
   320  		for _, elem := range response.Results.Objects {
   321  			require.Nil(t, elem.Errors)
   322  		}
   323  	})
   324  
   325  	t.Run("verify that batch delete by prop deleted everything", func(t *testing.T) {
   326  		result := AssertGraphQL(t, helper.RootAuth, `
   327  		{  Get { BulkTestSource(where:{operator:Equal path:["name"] valueText:"equal-this-name"}) { name } } }
   328  		`)
   329  		items := result.Get("Get", "BulkTestSource").AsSlice()
   330  		require.Len(t, items, 0)
   331  	})
   332  }