src/SedHandler.h
branchv_0
changeset 26 576d4965434f
parent 25 0cfbaf5c57a6
equal deleted inserted replaced
25:0cfbaf5c57a6 26:576d4965434f
    58 
    58 
    59 	SedHandler(shared_ptr<writer::RelationalWriter> relationalWriter, Configuration configuration) : relationalWriter(relationalWriter), configuration(configuration) {
    59 	SedHandler(shared_ptr<writer::RelationalWriter> relationalWriter, Configuration configuration) : relationalWriter(relationalWriter), configuration(configuration) {
    60 	}
    60 	}
    61 
    61 
    62 	void startRelation(string_t name, vector<AttributeMetadata> attributes) override {
    62 	void startRelation(string_t name, vector<AttributeMetadata> attributes) override {
       
    63 
       
    64 		std::vector<RewriteRule*> attributeRenamingRules;
       
    65 		for (RelationConfiguration& rc : configuration.relationConfigurations) {
       
    66 			if (std::regex_match(name, rc.relationPattern) ^ rc.invertMatch[ENTITY::RELATION]) {
       
    67 				for (RewriteRule& rule : rc.rules) if (rule.modify == ENTITY::ATTRIBUTE) attributeRenamingRules.push_back(&rule);
       
    68 			}
       
    69 		}
       
    70 
       
    71 
    63 		// TODO: move to a reusable method (or use same metadata on both reader and writer side?)
    72 		// TODO: move to a reusable method (or use same metadata on both reader and writer side?)
    64 		vector<writer::AttributeMetadata> writerMetadata;
    73 		vector<writer::AttributeMetadata> writerMetadata;
    65 		for (AttributeMetadata readerMetadata : attributes) {
    74 		for (AttributeMetadata readerMetadata : attributes) {
    66 			writerMetadata.push_back({readerMetadata.getAttributeName(), relationalWriter->toTypeId(readerMetadata.getTypeName())});
    75 			string_t newName = readerMetadata.getAttributeName();
       
    76 			for (RewriteRule* rule : attributeRenamingRules)
       
    77 				if (std::regex_match(readerMetadata.getAttributeName(), rule->attributePattern) ^ rule->invertMatch[ENTITY::ATTRIBUTE]) // TODO: optionally: regex_match(newName, rule->attributePattern) ?
       
    78 					newName = std::regex_replace(newName, rule->valuePattern, rule->replacement);
       
    79 			writerMetadata.push_back({newName, relationalWriter->toTypeId(readerMetadata.getTypeName())});
    67 		}
    80 		}
    68 
    81 
    69 
    82 
    70 		currentRules.resize(attributes.size());
    83 		currentRules.resize(attributes.size());
    71 		for (RelationConfiguration& rc : configuration.relationConfigurations) {
    84 		for (RelationConfiguration& rc : configuration.relationConfigurations) {
    72 			if (std::regex_match(name, rc.relationPattern) ^ rc.invertMatch[ENTITY::RELATION]) {
    85 			if (std::regex_match(name, rc.relationPattern) ^ rc.invertMatch[ENTITY::RELATION]) {
    73 				for (int i = 0; i < currentRules.size(); i++) {
    86 				for (int i = 0; i < currentRules.size(); i++) {
    74 					for (RewriteRule& rule : rc.rules) {
    87 					for (RewriteRule& rule : rc.rules) {
    75 						if (std::regex_match(attributes[i].getAttributeName(), rule.attributePattern) ^ rule.invertMatch[ENTITY::ATTRIBUTE]) currentRules[i].push_back(&rule);
    88 						if (rule.modify == ENTITY::VALUE && std::regex_match(attributes[i].getAttributeName(), rule.attributePattern) ^ rule.invertMatch[ENTITY::ATTRIBUTE]) currentRules[i].push_back(&rule);
    76 					}
    89 					}
    77 				}
    90 				}
       
    91 			}
       
    92 		}
       
    93 
       
    94 		for (RelationConfiguration& rc : configuration.relationConfigurations) {
       
    95 			if (std::regex_match(name, rc.relationPattern) ^ rc.invertMatch[ENTITY::RELATION]) {
       
    96 				for (RewriteRule rule : rc.rules) if (rule.modify == ENTITY::RELATION) name = std::regex_replace(name, rule.valuePattern, rule.replacement);
    78 			}
    97 			}
    79 		}
    98 		}
    80 
    99 
    81 		relationalWriter->startRelation(name, writerMetadata, true);
   100 		relationalWriter->startRelation(name, writerMetadata, true);
    82 	}
   101 	}
    83 
   102 
    84 	void attribute(const string_t& value) override {
   103 	void attribute(const string_t& value) override {
    85 		string_t newValue = value;
   104 		string_t newValue = value;
    86 
   105 
    87 		for (RewriteRule* rule : currentRules[currentAttributeIndex]) {
   106 		for (RewriteRule* rule : currentRules[currentAttributeIndex]) {
    88 			if (rule) newValue = std::regex_replace(value, rule->valuePattern, rule->replacement);
   107 			if (rule && !rule->invertMatch[ENTITY::VALUE]) newValue = std::regex_replace(newValue, rule->valuePattern, rule->replacement);
       
   108 			else if (rule && !std::regex_match(value, rule->valuePattern)) newValue = rule->replacement;
    89 		}
   109 		}
    90 
   110 
    91 		relationalWriter->writeAttribute(newValue);
   111 		relationalWriter->writeAttribute(newValue);
    92 
   112 
    93 		currentAttributeIndex++;
   113 		currentAttributeIndex++;