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 }