From 28691378ce0f2ae031660a97ecbb8efaafc8049a Mon Sep 17 00:00:00 2001 From: Martchus Date: Sat, 1 Jan 2022 20:43:39 +0100 Subject: [PATCH] Avoid creation of targets when relevat values are empty or when using relaxed matching --- cli/mainfeatures.cpp | 67 ++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/cli/mainfeatures.cpp b/cli/mainfeatures.cpp index 5c87df5..94a55ca 100644 --- a/cli/mainfeatures.cpp +++ b/cli/mainfeatures.cpp @@ -487,15 +487,6 @@ void setTagInfo(const SetTagInfoArgs &args) TagCreationSettings settings; settings.flags = TagCreationFlags::None; - // determine required targets - for (const auto &fieldDenotation : fields) { - const FieldScope &scope = fieldDenotation.first; - if (!scope.isTrack() - && find(settings.requiredTargets.cbegin(), settings.requiredTargets.cend(), scope.tagTarget) == settings.requiredTargets.cend()) { - settings.requiredTargets.push_back(scope.tagTarget); - } - } - // determine targets to remove auto targetsToRemove = std::vector(); for (size_t i = 0, max = args.removeTargetArg.occurrences(); i != max; ++i) { @@ -592,6 +583,46 @@ void setTagInfo(const SetTagInfoArgs &args) tags.clear(); } + // select the relevant values for the current file index + for (auto &fieldDenotation : fields) { + FieldValues &denotedValues = fieldDenotation.second; + std::vector &relevantDenotedValues = denotedValues.relevantValues; + relevantDenotedValues.clear(); + unsigned int currentFileIndex = 0; + for (FieldValue &denotatedValue : denotedValues.allValues) { + if ((denotatedValue.fileIndex <= fileIndex) + && (relevantDenotedValues.empty() || (denotatedValue.fileIndex >= currentFileIndex))) { + if (currentFileIndex != denotatedValue.fileIndex) { + currentFileIndex = denotatedValue.fileIndex; + relevantDenotedValues.clear(); + } + relevantDenotedValues.push_back(&denotatedValue); + } + } + } + + // determine required targets + settings.requiredTargets.clear(); + for (const auto &fieldDenotation : fields) { + const FieldScope &scope = fieldDenotation.first; + if (scope.isTrack() || !scope.exactTargetMatching) { + continue; + } + const std::vector &relevantDenotedValues = fieldDenotation.second.relevantValues; + auto hasNonEmptyValues = false; + for (const auto &value : relevantDenotedValues) { + if (!value->value.empty()) { + hasNonEmptyValues = true; + break; + } + } + if (hasNonEmptyValues + && std::find(settings.requiredTargets.cbegin(), settings.requiredTargets.cend(), scope.tagTarget) + == settings.requiredTargets.cend()) { + settings.requiredTargets.emplace_back(scope.tagTarget); + } + } + // create new tags according to settings fileInfo.createAppropriateTags(settings); auto container = fileInfo.container(); @@ -614,24 +645,6 @@ void setTagInfo(const SetTagInfoArgs &args) } } - // select the relevant values for the current file index - for (auto &fieldDenotation : fields) { - FieldValues &denotedValues = fieldDenotation.second; - vector &relevantDenotedValues = denotedValues.relevantValues; - denotedValues.relevantValues.clear(); - unsigned int currentFileIndex = 0; - for (FieldValue &denotatedValue : denotedValues.allValues) { - if ((denotatedValue.fileIndex <= fileIndex) - && (relevantDenotedValues.empty() || (denotatedValue.fileIndex >= currentFileIndex))) { - if (currentFileIndex != denotatedValue.fileIndex) { - currentFileIndex = denotatedValue.fileIndex; - relevantDenotedValues.clear(); - } - relevantDenotedValues.push_back(&denotatedValue); - } - } - } - // alter tags fileInfo.tags(tags); if (tags.empty()) {