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++; |