diff -r 87d22d525a3e -r c69670b7b4ef src/GrepHandler.h --- a/src/GrepHandler.h Sat Oct 24 00:08:19 2020 +0200 +++ b/src/GrepHandler.h Tue May 11 18:30:50 2021 +0200 @@ -34,6 +34,8 @@ #include +#include "Configuration.h" + namespace relpipe { namespace tr { namespace grep { @@ -46,29 +48,17 @@ class GrepHandler : public RelationalReaderStringHandler { private: shared_ptr relationalWriter; - - wregex relationNameRegEx; - wregex attributeNameRegEx; - wregex searchRegEx; + Configuration configuration; + RelationConfiguration* currentFilter = nullptr; vector currentSearchableAttributes; vector currentRecord; integer_t currentAttributeIndex = 0; boolean_t includeCurrentRecord = false; - boolean_t filterCurrentRelation = false; public: - GrepHandler(ostream& output, const vector& arguments) { - relationalWriter.reset(writer::Factory::create(output)); - - if (arguments.size() == 3) { - relationNameRegEx = wregex(arguments[0]); - attributeNameRegEx = wregex(arguments[1]); - searchRegEx = wregex(arguments[2]); - } else { - throw cli::RelpipeCLIException(L"Usage: relpipe-tr-grep ", cli::CLI::EXIT_CODE_UNKNOWN_COMMAND); - } + GrepHandler(shared_ptr relationalWriter, Configuration configuration) : relationalWriter(relationalWriter), configuration(configuration) { } void startRelation(string_t name, vector attributes) override { @@ -81,10 +71,17 @@ currentRecord.resize(attributes.size()); currentSearchableAttributes.resize(attributes.size(), false); - filterCurrentRelation = regex_match(name, relationNameRegEx); - if (filterCurrentRelation) { + currentFilter = nullptr; + for (int i = 0; i < configuration.relationConfigurations.size(); i++) { + if (regex_match(name, configuration.relationConfigurations[i].relationPattern)) { + currentFilter = &configuration.relationConfigurations[i]; + break; + } + } + + if (currentFilter) { for (int i = 0; i < currentSearchableAttributes.size(); i++) { - currentSearchableAttributes[i] = regex_match(attributes[i].getAttributeName(), attributeNameRegEx); + currentSearchableAttributes[i] = regex_match(attributes[i].getAttributeName(), currentFilter->attributePattern); } } @@ -92,11 +89,11 @@ } void attribute(const string_t& value) override { - if (filterCurrentRelation) { + if (currentFilter) { currentRecord[currentAttributeIndex] = value; if (currentSearchableAttributes[currentAttributeIndex]) { - includeCurrentRecord |= regex_search(value, searchRegEx); + includeCurrentRecord |= regex_search(value, currentFilter->valuePattern); } currentAttributeIndex++;