MCPcopy Create free account
hub / github.com/distributedio/titan / SDiff

Function SDiff

command/sets.go:278–336  ·  view source on GitHub ↗

SDiff returns the members of the set resulting from the difference between the first set and all the successive sets.

(ctx *Context, txn *db.Transaction)

Source from the content-addressed store, hash-verified

276
277// SDiff returns the members of the set resulting from the difference between the first set and all the successive sets.
278func SDiff(ctx *Context, txn *db.Transaction) (OnCommit, error) {
279 var members [][]byte
280 var setsIter []*db.SetIter
281 for i, key := range ctx.Args {
282 set, err := txn.Set([]byte(key))
283 if err != nil {
284 if err == db.ErrTypeMismatch {
285 return nil, ErrTypeMismatch
286 }
287 return nil, errors.New("ERR " + err.Error())
288 }
289 if !set.Exists() && i != 0 {
290 continue
291 }
292 siter, err := set.Iter()
293 if err != nil {
294 return nil, errors.New("ERR " + err.Error())
295 }
296 defer siter.Iter.Close()
297 setsIter = append(setsIter, siter)
298 }
299 iter := setsIter[0]
300 h := MinHeap(setsIter[1:])
301 heap.Init(&h)
302 for iter.Valid() {
303 member := iter.Value()
304 if len(h) == 0 {
305 members = append(members, member)
306 if err := iter.Iter.Next(); err != nil {
307 return nil, errors.New("ERR " + err.Error())
308 }
309 continue
310 }
311
312 min := h[0].Value()
313 switch bytes.Compare(member, min) {
314 case -1:
315 members = append(members, member)
316 if err := iter.Iter.Next(); err != nil {
317 return nil, errors.New("ERR " + err.Error())
318 }
319 case 0:
320 if err := iter.Iter.Next(); err != nil {
321 return nil, errors.New("ERR " + err.Error())
322 }
323 fallthrough
324 case 1:
325 if err := h[0].Iter.Next(); err != nil {
326 return nil, errors.New("ERR " + err.Error())
327 }
328 if h[0].Valid() {
329 heap.Fix(&h, 0)
330 } else {
331 heap.Remove(&h, 0)
332 }
333 }
334 }
335 return BytesArray(ctx.Out, members), nil

Callers

nothing calls this directly

Calls 9

MinHeapTypeAlias · 0.85
BytesArrayFunction · 0.85
IterMethod · 0.80
ValidMethod · 0.80
ValueMethod · 0.80
SetMethod · 0.65
ErrorMethod · 0.65
ExistsMethod · 0.45
CloseMethod · 0.45

Tested by

no test coverage detected