From 617d783980943ac7cda84d94a5a43e06adeb838e Mon Sep 17 00:00:00 2001 From: Lucas Di Pentima Date: Wed, 10 Nov 2021 16:31:12 -0300 Subject: [PATCH] 17944: Only check for value aliases collision between different values. Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima --- sdk/go/arvados/vocabulary.go | 7 ++++--- sdk/go/arvados/vocabulary_test.go | 29 +++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/sdk/go/arvados/vocabulary.go b/sdk/go/arvados/vocabulary.go index 8de6970781..150091b308 100644 --- a/sdk/go/arvados/vocabulary.go +++ b/sdk/go/arvados/vocabulary.go @@ -112,13 +112,14 @@ func (v *Vocabulary) validate() error { if tagValues[lcVal] != "" { return fmt.Errorf("duplicate tag value %q for tag %q", val, key) } + // Checks for collisions between labels from different values. tagValues[lcVal] = val for _, tagLbl := range v.Tags[key].Values[val].Labels { label := strings.ToLower(tagLbl.Label) - if tagValues[label] != "" { - return fmt.Errorf("tag value label %q for pair (%q:%q) already seen as a value key or label", tagLbl.Label, key, val) + if tagValues[label] != "" && tagValues[label] != val { + return fmt.Errorf("tag value label %q for pair (%q:%q) already seen on value %q", tagLbl.Label, key, val, tagValues[label]) } - tagValues[label] = tagLbl.Label + tagValues[label] = val } } } diff --git a/sdk/go/arvados/vocabulary_test.go b/sdk/go/arvados/vocabulary_test.go index 3099495a33..5a5189de2b 100644 --- a/sdk/go/arvados/vocabulary_test.go +++ b/sdk/go/arvados/vocabulary_test.go @@ -220,7 +220,8 @@ func (s *VocabularySuite) TestNewVocabulary(c *check.C) { "labels": [{"label": "Animal"}, {"label": "Creature"}], "values": { "IDVALANIMAL1":{"labels":[{"label":"Human"}, {"label":"Homo sapiens"}]}, - "IDVALANIMAL2":{"labels":[{"label":"Elephant"}, {"label":"Loxodonta"}]} + "IDVALANIMAL2":{"labels":[{"label":"Elephant"}, {"label":"Loxodonta"}]}, + "DOG":{"labels":[{"label":"Dog"}, {"label":"Canis lupus familiaris"}, {"label":"dOg"}]} } } }}`, @@ -248,6 +249,9 @@ func (s *VocabularySuite) TestNewVocabulary(c *check.C) { "IDVALANIMAL2": { Labels: []VocabularyLabel{{Label: "Elephant"}, {Label: "Loxodonta"}}, }, + "DOG": { + Labels: []VocabularyLabel{{Label: "Dog"}, {Label: "Canis lupus familiaris"}, {Label: "dOg"}}, + }, }, }, }, @@ -405,7 +409,28 @@ func (s *VocabularySuite) TestValidationErrors(c *check.C) { }, }, }, - "tag value label.*for pair.*already seen.*", + "tag value label.*for pair.*already seen.*on value.*", + }, + { + "Collision between tag value labels (case-insensitive)", + &Vocabulary{ + StrictTags: false, + Tags: map[string]VocabularyTag{ + "IDTAGANIMALS": { + Strict: false, + Labels: []VocabularyLabel{{Label: "Animal"}, {Label: "Creature"}}, + Values: map[string]VocabularyTagValue{ + "IDVALANIMAL1": { + Labels: []VocabularyLabel{{Label: "Human"}, {Label: "Mammal"}}, + }, + "IDVALANIMAL2": { + Labels: []VocabularyLabel{{Label: "Elephant"}, {Label: "mAMMAL"}}, + }, + }, + }, + }, + }, + "tag value label.*for pair.*already seen.*on value.*", }, { "Strict tag key, with no values", -- 2.30.2