--- a/src/RecfileCommand.h Sat Apr 06 18:25:14 2019 +0200
+++ b/src/RecfileCommand.h Sun Apr 07 01:10:31 2019 +0200
@@ -21,8 +21,11 @@
#include <string>
#include <sstream>
#include <vector>
+#include <set>
#include <relpipe/writer/typedefs.h>
+#include <relpipe/writer/RelationalWriter.h>
+#include <relpipe/writer/AttributeMetadata.h>
namespace relpipe {
namespace in {
@@ -44,25 +47,77 @@
class RecfileHandler {
private:
RelationalWriter* writer;
+ string_t currentRelationName;
+ std::vector<string_t> currentRecord;
+ std::vector<std::vector<string_t>> currentRecords;
+ size_t prefetchCount = 1;
+ bool headerWritten = false;
+
+ void writeHeader() {
+ if (headerWritten) return;
+
+ std::vector<AttributeMetadata> attributeMetadata;
+
+ // TODO: writer->startRelation(currentRelationName, attributeMetadata, true);
+
+ headerWritten = true;
+ }
+
+ void writeRecords() {
+ for (int i = 0; i < currentRecords.size(); i++) {
+ std::vector<string_t> record = currentRecords[i];
+ std::wcerr << L"record: " << std::endl;
+ for (int j = 0; j < record.size(); j += 2) {
+ std::wcerr << L" '" << record[j] << L"': '" << record[j + 1] << L"'" << std::endl;
+ // TODO: writer->writeAttribute()
+ }
+ }
+ currentRecords.clear();
+ }
void metadata(const string_t& name, const string_t& value) {
std::wcerr << L"metadata(" << name << L", " << value << L");" << std::endl; // TODO: remove debug
+
+ if (name == L"rec") {
+ currentRelationName = value;
+ currentRecord.clear();
+ currentRecords.clear();
+ headerWritten = false;
+ } else if (name == L"type") {
+ // TODO: save type hint
+ } else {
+ // ignore – other recfile metadata like keys or auto-increments
+ }
}
void data(const string_t& name, const string_t& value) {
std::wcerr << L"data(" << name << L", " << value << L");" << std::endl; // TODO: remove debug
+ currentRecord.push_back(name);
+ currentRecord.push_back(value);
}
void comment(const string_t& value) {
- std::wcerr << L"comment(" << value << L");" << std::endl; // TODO: remove debug
+ // ignore comments
}
void separator() {
std::wcerr << L"separator()" << std::endl; // TODO: remove debug
+ if (currentRecord.size()) {
+ currentRecords.push_back(currentRecord);
+ currentRecord.clear();
+ }
+
+ if (prefetchCount > 0 && currentRecords.size() >= prefetchCount) {
+ writeHeader();
+ writeRecords();
+ }
}
void end() {
- std::wcerr << L"end()" << std::endl; // TODO: remove debug
+ std::wcerr << L"end();" << std::endl; // TODO: remove debug
+ if (currentRecord.size()) currentRecords.push_back(currentRecord);
+ writeHeader();
+ writeRecords();
}
public:
@@ -74,8 +129,6 @@
}
void logicalLine(RecfileLineType type, const string_t& name = L"", const string_t& value = L"") {
- // TODO: writer->startRelation()
- // TODO: writer->writeAttribute()
switch (type) {
case RecfileLineType::METADATA: return metadata(name, value);
case RecfileLineType::DATA: return data(name, value);