diff -r 0cfbaf5c57a6 -r 576d4965434f src/SedHandler.h --- a/src/SedHandler.h Sat May 15 18:18:10 2021 +0200 +++ b/src/SedHandler.h Sun May 16 17:33:35 2021 +0200 @@ -60,10 +60,23 @@ } void startRelation(string_t name, vector attributes) override { + + std::vector attributeRenamingRules; + for (RelationConfiguration& rc : configuration.relationConfigurations) { + if (std::regex_match(name, rc.relationPattern) ^ rc.invertMatch[ENTITY::RELATION]) { + for (RewriteRule& rule : rc.rules) if (rule.modify == ENTITY::ATTRIBUTE) attributeRenamingRules.push_back(&rule); + } + } + + // TODO: move to a reusable method (or use same metadata on both reader and writer side?) vector writerMetadata; for (AttributeMetadata readerMetadata : attributes) { - writerMetadata.push_back({readerMetadata.getAttributeName(), relationalWriter->toTypeId(readerMetadata.getTypeName())}); + string_t newName = readerMetadata.getAttributeName(); + for (RewriteRule* rule : attributeRenamingRules) + if (std::regex_match(readerMetadata.getAttributeName(), rule->attributePattern) ^ rule->invertMatch[ENTITY::ATTRIBUTE]) // TODO: optionally: regex_match(newName, rule->attributePattern) ? + newName = std::regex_replace(newName, rule->valuePattern, rule->replacement); + writerMetadata.push_back({newName, relationalWriter->toTypeId(readerMetadata.getTypeName())}); } @@ -72,12 +85,18 @@ if (std::regex_match(name, rc.relationPattern) ^ rc.invertMatch[ENTITY::RELATION]) { for (int i = 0; i < currentRules.size(); i++) { for (RewriteRule& rule : rc.rules) { - if (std::regex_match(attributes[i].getAttributeName(), rule.attributePattern) ^ rule.invertMatch[ENTITY::ATTRIBUTE]) currentRules[i].push_back(&rule); + if (rule.modify == ENTITY::VALUE && std::regex_match(attributes[i].getAttributeName(), rule.attributePattern) ^ rule.invertMatch[ENTITY::ATTRIBUTE]) currentRules[i].push_back(&rule); } } } } + for (RelationConfiguration& rc : configuration.relationConfigurations) { + if (std::regex_match(name, rc.relationPattern) ^ rc.invertMatch[ENTITY::RELATION]) { + for (RewriteRule rule : rc.rules) if (rule.modify == ENTITY::RELATION) name = std::regex_replace(name, rule.valuePattern, rule.replacement); + } + } + relationalWriter->startRelation(name, writerMetadata, true); } @@ -85,7 +104,8 @@ string_t newValue = value; for (RewriteRule* rule : currentRules[currentAttributeIndex]) { - if (rule) newValue = std::regex_replace(value, rule->valuePattern, rule->replacement); + if (rule && !rule->invertMatch[ENTITY::VALUE]) newValue = std::regex_replace(newValue, rule->valuePattern, rule->replacement); + else if (rule && !std::regex_match(value, rule->valuePattern)) newValue = rule->replacement; } relationalWriter->writeAttribute(newValue);