diff -r 5d1c556ff7db -r da114916734b src/InferTypesHandler.h --- a/src/InferTypesHandler.h Fri May 21 20:16:03 2021 +0200 +++ b/src/InferTypesHandler.h Sun May 23 13:59:09 2021 +0200 @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -35,6 +36,9 @@ #include #include "Configuration.h" +#include "Mode.h" +#include "DataMode.h" +#include "MetadataMode.h" namespace relpipe { namespace tr { @@ -49,8 +53,16 @@ private: shared_ptr relationalWriter; Configuration configuration; + std::shared_ptr currentMode; - integer_t currentAttributeIndex = 0; + vector toWriterMetadata(vector attributes) { + // 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())}); + } + return writerMetadata; + } public: @@ -58,24 +70,27 @@ } void startRelation(string_t name, vector attributes) override { - // 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())}); + // TODO: move this logic to relpipe-lib-infertypes and share with certain modules like relpipe-in-csv + for (RelationConfiguration rc : configuration.relationConfigurations) { + if (std::regex_match(name, rc.relationPattern)) { + if (rc.mode == MODE::METADATA || rc.mode == MODE::AUTO && MetadataMode::willInfer(attributes)) currentMode.reset(new MetadataMode(relationalWriter)); + else if (rc.mode == MODE::DATA) currentMode.reset(new DataMode(relationalWriter)); + else throw std::logic_error("Unsupported mode: " + std::to_string((int) rc.mode)); + break; + } } - relationalWriter->startRelation(name, writerMetadata, true); + if (currentMode) currentMode->startRelation(name, attributes); + else relationalWriter->startRelation(name, toWriterMetadata(attributes), true); } void attribute(const string_t& value) override { - relationalWriter->writeAttribute(value); - - currentAttributeIndex++; - //currentAttributeIndex = currentAttributeIndex % currentRules.size(); + if (currentMode) currentMode->attribute(value); + else relationalWriter->writeAttribute(value); } void endOfPipe() { - + currentMode.reset(); } };