Avoid creation of targets when relevat values are empty or when using relaxed matching
This commit is contained in:
parent
2d39875f96
commit
28691378ce
|
@ -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<TagTarget>();
|
||||
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<FieldValue *> &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<FieldValue *> &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<FieldValue *> &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()) {
|
||||
|
|
Loading…
Reference in New Issue