[Filter] Restore exact, case-insensitive set code search (#7332, #7333)

This commit is contained in:
Lukas Brübach 2026-09-20 23:12:27 +02:00
parent 6823d54c1e
commit 276873f0bd
2 changed files with 112 additions and 17 deletions

View file

@ -65,7 +65,7 @@ RegexMatcherString <- ('\\/' / !'/' .)+
FlexStringValue <- CompactStringSet / String / [(] StringList [)]
CompactStringSet <- StringListString ([,+] StringListString)+
SetExpression <- NumericOperator ws? String
SetExpression <- <NumericOperator> ws? String
NumericExpression <- NumericOperator ws? NumericValue
NumericOperator <- [=:] / <[><!][=]?>
@ -114,16 +114,8 @@ static void setupParserRules()
};
}
auto matcher = std::any_cast<NumberMatcher>(sv[0]);
return [=](const CardData &x) -> bool {
const auto &sets = x->getSets().values();
auto matchesSet = [&](const PrintingInfo &printing) {
return printing.getSet()->getEnabled() && matcher(printing.getSet()->getReleaseDate().toJulianDay());
};
return std::any_of(sets.begin(), sets.end(), [&](const auto &printings) {
return std::any_of(printings.begin(), printings.end(), matchesSet);
});
};
auto matcher = std::any_cast<Filter>(sv[0]);
return matcher;
};
search["Rarity"] = [](const peg::SemanticValues &sv) -> QString {
switch (tolower(std::string(sv.sv())[0])) {
@ -300,17 +292,57 @@ static void setupParserRules()
return [=](int s) { return comparer(s, arg); };
};
search["SetExpression"] = [](const peg::SemanticValues &sv) -> NumberMatcher {
search["SetExpression"] = [](const peg::SemanticValues &sv) -> Filter {
const auto comparer = std::any_cast<NumberComparer>(sv[0]);
const auto setCode = std::any_cast<QString>(sv[1]);
const auto operatorText = QString::fromStdString(std::string(sv.token(0)));
auto printingsOf = [](const CardData &x) {
QList<PrintingInfo> printings;
for (const auto &printingsPerSet : x->getSets()) {
printings.append(printingsPerSet);
}
return printings;
};
auto isExactSet = [setCode](const PrintingInfo &printing) {
return printing.getSet()->getEnabled() &&
printing.getSet()->getShortName().compare(setCode, Qt::CaseInsensitive) == 0;
};
if (operatorText == ":" || operatorText == "=") {
return [=](const CardData &x) {
const auto printings = printingsOf(x);
return std::any_of(printings.begin(), printings.end(), isExactSet);
};
}
if (operatorText == "!" || operatorText == "!=") {
return [=](const CardData &x) {
const auto printings = printingsOf(x);
return std::none_of(printings.begin(), printings.end(), isExactSet);
};
}
const auto allSets = CardDatabaseManager::getInstance()->getSetList();
for (auto &set : allSets) {
if (set->getShortName() == setCode) {
const int releaseDate = set->getReleaseDate().toJulianDay();
return [=](int s) { return comparer(s, releaseDate); };
int releaseDate = 0;
bool setFound = false;
for (const auto &set : allSets) {
if (set->getShortName().compare(setCode, Qt::CaseInsensitive) == 0) {
releaseDate = set->getReleaseDate().toJulianDay();
setFound = true;
break;
}
}
return [](int) { return false; };
if (!setFound) {
return [](const CardData &) { return false; };
}
auto matchesReleaseDate = [comparer, releaseDate](const PrintingInfo &printing) {
return printing.getSet()->getEnabled() &&
comparer(printing.getSet()->getReleaseDate().toJulianDay(), releaseDate);
};
return [=](const CardData &x) {
const auto printings = printingsOf(x);
return std::any_of(printings.begin(), printings.end(), matchesReleaseDate);
};
};
search["NormalMatcher"] = [](const peg::SemanticValues &sv) -> StringMatcher {