--- a/nbproject/configurations.xml Fri May 21 20:16:03 2021 +0200
+++ b/nbproject/configurations.xml Sun May 23 13:59:09 2021 +0200
@@ -42,6 +42,9 @@
<logicalFolder name="root" displayName="root" projectFiles="true" kind="ROOT">
<df root="." name="0">
<df name="src">
+ <in>DataMode.h</in>
+ <in>MetadataMode.h</in>
+ <in>Mode.h</in>
<in>relpipe-tr-infertypes.cpp</in>
</df>
</df>
@@ -93,6 +96,12 @@
<preBuildFirst>true</preBuildFirst>
</preBuild>
</makefileType>
+ <item path="src/DataMode.h" ex="false" tool="3" flavor2="0">
+ </item>
+ <item path="src/MetadataMode.h" ex="false" tool="3" flavor2="0">
+ </item>
+ <item path="src/Mode.h" ex="false" tool="3" flavor2="0">
+ </item>
<item path="src/relpipe-tr-infertypes.cpp" ex="false" tool="1" flavor2="0">
<ccTool flags="0">
</ccTool>
@@ -133,6 +142,12 @@
<preBuildFirst>true</preBuildFirst>
</preBuild>
</makefileType>
+ <item path="src/DataMode.h" ex="false" tool="3" flavor2="0">
+ </item>
+ <item path="src/MetadataMode.h" ex="false" tool="3" flavor2="0">
+ </item>
+ <item path="src/Mode.h" ex="false" tool="3" flavor2="0">
+ </item>
<item path="src/relpipe-tr-infertypes.cpp" ex="false" tool="1" flavor2="0">
<ccTool flags="0">
</ccTool>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/DataMode.h Sun May 23 13:59:09 2021 +0200
@@ -0,0 +1,47 @@
+/**
+ * Relational pipes
+ * Copyright © 2021 František Kučera (Frantovo.cz, GlobalCode.info)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+#include <regex>
+#include <locale>
+
+#include <relpipe/common/type/typedefs.h>
+
+#include "Mode.h"
+
+namespace relpipe {
+namespace tr {
+namespace infertypes {
+
+class DataMode : public Mode {
+private:
+public:
+
+ DataMode(shared_ptr<writer::RelationalWriter> relationalWriter) : Mode(relationalWriter) {
+ }
+
+ void startRelation(relpipe::common::type::StringX name, std::vector<relpipe::reader::handlers::AttributeMetadata> attributes) override {
+ }
+
+ void attribute(const relpipe::common::type::StringX& value) override {
+ }
+};
+
+
+}
+}
+}
--- 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 <locale>
#include <codecvt>
#include <regex>
+#include <stdexcept>
#include <relpipe/reader/typedefs.h>
#include <relpipe/reader/TypeId.h>
@@ -35,6 +36,9 @@
#include <relpipe/cli/RelpipeCLIException.h>
#include "Configuration.h"
+#include "Mode.h"
+#include "DataMode.h"
+#include "MetadataMode.h"
namespace relpipe {
namespace tr {
@@ -49,8 +53,16 @@
private:
shared_ptr<writer::RelationalWriter> relationalWriter;
Configuration configuration;
+ std::shared_ptr<Mode> currentMode;
- integer_t currentAttributeIndex = 0;
+ vector<writer::AttributeMetadata> toWriterMetadata(vector<AttributeMetadata> attributes) {
+ // 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())});
+ }
+ return writerMetadata;
+ }
public:
@@ -58,24 +70,27 @@
}
void startRelation(string_t name, vector<AttributeMetadata> attributes) override {
- // 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())});
+ // 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();
}
};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/MetadataMode.h Sun May 23 13:59:09 2021 +0200
@@ -0,0 +1,56 @@
+/**
+ * Relational pipes
+ * Copyright © 2021 František Kučera (Frantovo.cz, GlobalCode.info)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+#include <regex>
+#include <locale>
+
+#include <relpipe/common/type/typedefs.h>
+
+#include "Mode.h"
+
+namespace relpipe {
+namespace tr {
+namespace infertypes {
+
+class MetadataMode : public Mode {
+private:
+ static std::wregex pattern;
+public:
+
+ MetadataMode(shared_ptr<writer::RelationalWriter> relationalWriter) : Mode(relationalWriter) {
+ }
+
+ static bool willInfer(std::vector<relpipe::reader::handlers::AttributeMetadata> attributes) {
+ for (relpipe::reader::handlers::AttributeMetadata a : attributes) if (!std::regex_match(a.getAttributeName(), pattern)) return false;
+ return true;
+ }
+
+ void startRelation(relpipe::common::type::StringX name, std::vector<relpipe::reader::handlers::AttributeMetadata> attributes) override {
+ // TODO: share this code through relpipe-lib-infertypes (when available)
+ }
+
+ void attribute(const relpipe::common::type::StringX& value) override {
+ relationalWriter->writeAttribute(value);
+ }
+};
+
+std::wregex MetadataMode::pattern = std::wregex(L"(.*)::(.*)");
+
+}
+}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Mode.h Sun May 23 13:59:09 2021 +0200
@@ -0,0 +1,41 @@
+/**
+ * Relational pipes
+ * Copyright © 2021 František Kučera (Frantovo.cz, GlobalCode.info)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+#include <relpipe/common/type/typedefs.h>
+#include <relpipe/reader/handlers/AttributeMetadata.h>
+
+namespace relpipe {
+namespace tr {
+namespace infertypes {
+
+class Mode {
+protected:
+ shared_ptr<writer::RelationalWriter> relationalWriter;
+
+ Mode(shared_ptr<writer::RelationalWriter> relationalWriter) : relationalWriter(relationalWriter) {
+ }
+
+public:
+ virtual ~Mode() = default;
+ virtual void startRelation(const relpipe::common::type::StringX name, std::vector<relpipe::reader::handlers::AttributeMetadata> attributes) = 0;
+ virtual void attribute(const relpipe::common::type::StringX& value) = 0;
+};
+
+}
+}
+}