Added compound element filter allowing additive inclusion filters

This commit is contained in:
Bartek Kryza
2022-03-31 21:50:25 +02:00
parent f33f1ef236
commit a42598357b
5 changed files with 70 additions and 6 deletions

View File

@@ -1,5 +1,5 @@
/**
* src/common/model/diagram_filter.h
* src/common/model/diagram_filter.cc
*
* Copyright (c) 2021-2022 Bartek Kryza <bkryza@gmail.com>
*
@@ -61,6 +61,34 @@ bool filter_visitor::is_exclusive() const
filter_t filter_visitor::type() const { return type_; }
anyof_filter::anyof_filter(
filter_t type, std::vector<std::unique_ptr<filter_visitor>> filters)
: filter_visitor{type}
, filters_{std::move(filters)}
{
}
std::optional<bool> anyof_filter::match(
const diagram &d, const common::model::element &e) const
{
std::optional<bool> res{};
for (const auto &filter : filters_) {
auto m = filter->match(d, e);
if (m.has_value()) {
if (m.value() == true) {
res = true;
break;
}
else {
res = false;
}
}
}
return res;
}
namespace_filter::namespace_filter(
filter_t type, std::vector<namespace_> namespaces)
: filter_visitor{type}
@@ -301,12 +329,18 @@ void diagram_filter::init_filters(const config::diagram &c)
filter_t::kInclusive, c.include().relationships));
inclusive_.emplace_back(std::make_unique<access_filter>(
filter_t::kInclusive, c.include().access));
inclusive_.emplace_back(std::make_unique<element_filter>(
// Include any of these matches even if one them does not match
std::vector<std::unique_ptr<filter_visitor>> element_filters;
element_filters.emplace_back(std::make_unique<element_filter>(
filter_t::kInclusive, c.include().elements));
inclusive_.emplace_back(std::make_unique<subclass_filter>(
element_filters.emplace_back(std::make_unique<subclass_filter>(
filter_t::kInclusive, c.include().subclasses));
inclusive_.emplace_back(std::make_unique<context_filter>(
element_filters.emplace_back(std::make_unique<context_filter>(
filter_t::kInclusive, c.include().context));
inclusive_.emplace_back(std::make_unique<anyof_filter>(
filter_t::kInclusive, std::move(element_filters)));
}
// Process exclusive filters

View File

@@ -1,5 +1,5 @@
/**
* src/common/model/entity_filter.h
* src/common/model/diagram_filter.h
*
* Copyright (c) 2021-2022 Bartek Kryza <bkryza@gmail.com>
*
@@ -55,6 +55,17 @@ private:
filter_t type_;
};
struct anyof_filter : public filter_visitor {
anyof_filter(
filter_t type, std::vector<std::unique_ptr<filter_visitor>> filters);
std::optional<bool> match(
const diagram &d, const common::model::element &e) const override;
private:
std::vector<std::unique_ptr<filter_visitor>> filters_;
};
struct namespace_filter : public filter_visitor {
namespace_filter(filter_t type, std::vector<namespace_> namespaces);