src/SedHandler.h
branchv_0
changeset 26 576d4965434f
parent 25 0cfbaf5c57a6
--- 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<AttributeMetadata> attributes) override {
+
+		std::vector<RewriteRule*> 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<writer::AttributeMetadata> 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);