// Moves element position as well as relationships. func (elems *Elements) move(from, to dvid.Point3d, deleteElement bool) (moved *Element, changed bool) { for i, elem := range *elems { if from.Equals(elem.Pos) { changed = true (*elems)[i].Pos = to moved = (*elems)[i].Copy() if deleteElement { (*elems)[i] = (*elems)[len(*elems)-1] // Delete without preserving order. *elems = (*elems)[:len(*elems)-1] break } } } // Check relationships for any moved points. for i, elem := range *elems { // Move any relationship with given pt. for j, r := range elem.Rels { if from.Equals(r.To) { r.To = to (*elems)[i].Rels[j] = r changed = true } } } return }
func (d *Data) deleteElementInLabel(ctx *datastore.VersionedCtx, batch storage.Batch, pt dvid.Point3d) error { labelData := d.GetSyncedLabelblk() if labelData == nil { return nil // no synced labels } label, err := labelData.GetLabelAtPoint(ctx.VersionID(), pt) if err != nil { return err } tk := NewLabelTKey(label) elems, err := getElementsNR(ctx, tk) if err != nil { return fmt.Errorf("err getting elements for label %d: %v\n", label, err) } // Note all elements to be deleted. var delta DeltaModifyElements var toDel []int for i, elem := range elems { if pt.Equals(elem.Pos) { delta.Del = append(delta.Del, ElementPos{Label: label, Kind: elem.Kind, Pos: elem.Pos}) toDel = append(toDel, i) } } if len(toDel) == 0 { return nil } // Delete them from high index to low index due while reusing slice. for i := len(toDel) - 1; i >= 0; i-- { d := toDel[i] elems[d] = elems[len(elems)-1] elems[len(elems)-1] = ElementNR{} elems = elems[:len(elems)-1] } // Put the modified list of elements if err := putBatchElements(batch, tk, elems); err != nil { return err } // Notify any subscribers of label annotation changes. evt := datastore.SyncEvent{Data: d.DataUUID(), Event: ModifyElementsEvent} msg := datastore.SyncMessage{Event: ModifyElementsEvent, Version: ctx.VersionID(), Delta: delta} if err := datastore.NotifySubscribers(evt, msg); err != nil { return err } return nil }
// Moves element position as well as relationships. func (elems *ElementsNR) move(from, to dvid.Point3d, deleteElement bool) (moved *ElementNR, changed bool) { for i, elem := range *elems { if from.Equals(elem.Pos) { changed = true (*elems)[i].Pos = to moved = (*elems)[i].Copy() if deleteElement { (*elems)[i] = (*elems)[len(*elems)-1] // Delete without preserving order. *elems = (*elems)[:len(*elems)-1] break } } } return }
func (elems *Elements) deleteRel(pt dvid.Point3d) (changed bool) { for i, elem := range *elems { // Remove any relationship with given pt. var todel []int for j, r := range elem.Rels { if pt.Equals(r.To) { todel = append(todel, j) } } if len(todel) > 0 { (*elems)[i].Rels = elem.Rels.delete(todel) changed = true } } return }
// Deletes element position as well as relationships that reference that element. func (elems *ElementsNR) delete(pt dvid.Point3d) (deleted *ElementNR, changed bool) { // Delete any elements at point. var cut = -1 for i, elem := range *elems { if pt.Equals(elem.Pos) { cut = i break } } if cut >= 0 { deleted = (*elems)[cut].Copy() changed = true (*elems)[cut] = (*elems)[len(*elems)-1] // Delete without preserving order. *elems = (*elems)[:len(*elems)-1] } return }
// Deletes element position as well as relationships that reference that element. func (elems *Elements) delete(pt dvid.Point3d) (deleted *Element, changed bool) { // Delete any elements at point. var cut = -1 for i, elem := range *elems { if pt.Equals(elem.Pos) { cut = i break } } if cut >= 0 { deleted = (*elems)[cut].Copy() changed = true (*elems)[cut] = (*elems)[len(*elems)-1] // Delete without preserving order. *elems = (*elems)[:len(*elems)-1] } // Delete any relationships with the point. if elems.deleteRel(pt) { changed = true } return }
func TestSetMetadata(t *testing.T) { datastore.OpenTest() defer datastore.CloseTest() uuid, _ := initTestRepo() server.CreateTestInstance(t, uuid, "imagetile", "tiles", dvid.Config{}) // Store Metadata url := fmt.Sprintf("%snode/%s/tiles/metadata", server.WebAPIPath, uuid) server.TestHTTP(t, "POST", url, bytes.NewBufferString(testMetadata)) // Check instance really has it set. var metadata metadataJSON respStr := server.TestHTTP(t, "GET", url, nil) if err := json.Unmarshal(respStr, &metadata); err != nil { t.Fatalf("Couldn't parse JSON response to metadata request (%v):\n%s\n", err, respStr) } expectMin := dvid.Point3d{0, 0, 0} expectMax := dvid.Point3d{5, 5, 4} if !expectMin.Equals(metadata.MinTileCoord) { t.Errorf("Expected min tile coord %s, got %s\n", expectMin, metadata.MinTileCoord) } if !expectMax.Equals(metadata.MaxTileCoord) { t.Errorf("Expected max tile coord %s, got %s\n", expectMax, metadata.MaxTileCoord) } tileSpec, err := parseTileSpec(metadata.Levels) if err != nil { t.Errorf("Error parsing returned tile level spec:\n%v\n", metadata.Levels) } if len(tileSpec) != 4 { t.Errorf("Bad tile spec load: only %d elements != 4\n", len(tileSpec)) } if tileSpec[2].Resolution.GetMax() != 40.0 { t.Errorf("Bad tile spec at level 2: %v\n", tileSpec[2]) } if tileSpec[3].TileSize.Value(2) != 512 { t.Errorf("Bad tile spec at level 3: %v\n", tileSpec[3]) } }
// delete all reference to given element point in the slice of tags. // This is private method and assumes outer locking. func (d *Data) deleteElementInTags(ctx *datastore.VersionedCtx, batch storage.Batch, pt dvid.Point3d, tags []Tag) error { for _, tag := range tags { // Get the elements in tag. tk, err := NewTagTKey(tag) if err != nil { return err } elems, err := getElementsNR(ctx, tk) if err != nil { return err } // Note all elements to be deleted. var toDel []int for i, elem := range elems { if pt.Equals(elem.Pos) { toDel = append(toDel, i) } } if len(toDel) == 0 { continue } // Delete them from high index to low index due while reusing slice. for i := len(toDel) - 1; i >= 0; i-- { d := toDel[i] elems[d] = elems[len(elems)-1] elems[len(elems)-1] = ElementNR{} elems = elems[:len(elems)-1] } // Save the tag. if err := putBatchElements(batch, tk, elems); err != nil { return err } } return nil }
// blockSize is either defined by any synced labelblk or by the default block size. // Also checks to make sure that synced data is consistent. func (d *Data) blockSize() dvid.Point3d { if d.cachedBlockSize != nil { return *d.cachedBlockSize } var bsize dvid.Point3d d.cachedBlockSize = &bsize if lb := d.GetSyncedLabelblk(); lb != nil { bsize = lb.BlockSize().(dvid.Point3d) return bsize } if lv := d.GetSyncedLabelvol(); lv != nil { if len(bsize) != 0 && !bsize.Equals(lv.BlockSize) { dvid.Errorf("annotations %q is synced to labelblk and labelvol with different block sizes!\n", d.DataName()) } else { bsize = lv.BlockSize return bsize } } if len(bsize) != 0 { bsize = dvid.Point3d{DefaultBlockSize, DefaultBlockSize, DefaultBlockSize} } return bsize }