diff -r f9b72d263838 -r bc15f5471b6a src/CutHandler.h --- a/src/CutHandler.h Sat Oct 24 00:08:19 2020 +0200 +++ b/src/CutHandler.h Tue May 11 22:03:45 2021 +0200 @@ -34,9 +34,11 @@ #include +#include "Configuration.h" + namespace relpipe { namespace tr { -namespace grep { +namespace cut { using namespace std; using namespace relpipe; @@ -46,26 +48,16 @@ class CutHandler : public RelationalReaderStringHandler { private: shared_ptr relationalWriter; - - wregex relationNameRegEx; - vector attributeNameRegExes; + Configuration configuration; + RelationConfiguration* currentFilter = nullptr; vector currentAttributeMapping; vector currentRecord; integer_t currentAttributeIndex = 0; - boolean_t filterCurrentRelation = false; public: - CutHandler(ostream& output, const vector& arguments) { - relationalWriter.reset(writer::Factory::create(output)); - - if (arguments.size() >= 2) { - relationNameRegEx = wregex(arguments[0]); - for (int i = 1; i < arguments.size(); i++) attributeNameRegExes.push_back(wregex(arguments[i])); - } else { - throw cli::RelpipeCLIException(L"Usage: relpipe-tr-cut [ ...]", cli::CLI::EXIT_CODE_UNKNOWN_COMMAND); - } + CutHandler(shared_ptr relationalWriter, Configuration configuration) : relationalWriter(relationalWriter), configuration(configuration) { } void startRelation(string_t name, vector attributes) override { @@ -78,12 +70,21 @@ vector writerMetadata; - filterCurrentRelation = regex_match(name, relationNameRegEx); - if (filterCurrentRelation) { + using E = RelationConfiguration::ENTITY; + + currentFilter = nullptr; + for (int i = 0; i < configuration.relationConfigurations.size(); i++) { + if (regex_match(name, configuration.relationConfigurations[i].relationPattern) ^ configuration.relationConfigurations[i].invertMatch[E::RELATION]) { + currentFilter = &configuration.relationConfigurations[i]; + break; + } + } + + if (currentFilter) { currentAttributeMapping.clear(); - for (wregex attributeNameRegEx : attributeNameRegExes) { + for (std::wregex attributePattern : currentFilter->attributePatterns) { for (int i = 0; i < allWriterMetadata.size(); i++) { - if (regex_match(allWriterMetadata[i].attributeName, attributeNameRegEx)) currentAttributeMapping.push_back(i); + if (regex_match(allWriterMetadata[i].attributeName, attributePattern) ^ currentFilter->invertMatch[E::ATTRIBUTE]) currentAttributeMapping.push_back(i); } } @@ -97,7 +98,7 @@ } void attribute(const string_t& value) override { - if (filterCurrentRelation) { + if (currentFilter) { currentRecord[currentAttributeIndex] = value; currentAttributeIndex++;