src/AttributeFinder.h
branchv_0
changeset 9 b4f29fb16159
parent 8 eb1ecb37c6b7
child 24 4353cd19a6b5
--- a/src/AttributeFinder.h	Wed Jan 16 18:19:50 2019 +0100
+++ b/src/AttributeFinder.h	Wed Jan 16 19:31:37 2019 +0100
@@ -37,41 +37,14 @@
 protected:
 	fs::path currentFile;
 	string currentFileRaw;
-public:
-
-	/**
-	 * Single requested fields might generate multiple attributes in the relation.
-	 * But usually it is 1:1.
-	 * @param field requested field from the user (usually from CLI arguments)
-	 * @return attribute metadata to be used in the RelationalWriter.startRelation()
-	 */
-	virtual vector<AttributeMetadata> toMetadata(const RequestedField& field) = 0;
-
-	/**
-	 * Writing of the record for current file is starting.
-	 * Following writeField() calls are related to this file.
-	 * @param file path to the file
-	 * @param fileRaw raw file name as it was on the input
-	 */
-	virtual void startFile(const fs::path& file, const string& fileRaw) {
-		currentFile = file;
-		currentFileRaw = fileRaw;
-	}
-
-	/**
-	 * Writing of the record for current file is finished. All resources linked to this file should be released.
-	 */
-	virtual void endFile() {
-		currentFile.clear();
-		currentFileRaw.clear();
-	}
+	bool currentFileExists;
 
 	/**
 	 * Writes field attribute(s). The attribute count must match with count of AttributeMetadata returned in toMetadata().
 	 * @param writer
 	 * @param field
 	 */
-	virtual void writeField(RelationalWriter* writer, const RequestedField& field) = 0;
+	virtual void writeFieldOfExistingFile(RelationalWriter* writer, const RequestedField& field) = 0;
 
 	/**
 	 * Writes empty attribute(s) in case of non-existent file or an error. 
@@ -98,6 +71,41 @@
 		}
 	}
 
+public:
+
+	/**
+	 * Single requested fields might generate multiple attributes in the relation.
+	 * But usually it is 1:1.
+	 * @param field requested field from the user (usually from CLI arguments)
+	 * @return attribute metadata to be used in the RelationalWriter.startRelation()
+	 */
+	virtual vector<AttributeMetadata> toMetadata(const RequestedField& field) = 0;
+
+	/**
+	 * Writing of the record for current file is starting.
+	 * Following writeField() calls are related to this file.
+	 * @param file path to the file
+	 * @param fileRaw raw file name as it was on the input
+	 */
+	virtual void startFile(const fs::path& file, const string& fileRaw, bool exists) {
+		currentFile = file;
+		currentFileRaw = fileRaw;
+		currentFileExists = exists;
+	}
+
+	virtual void writeField(RelationalWriter* writer, const RequestedField& field) {
+		if (currentFileExists) writeFieldOfExistingFile(writer, field);
+		else writeEmptyField(writer, field);
+	}
+
+	/**
+	 * Writing of the record for current file is finished. All resources linked to this file should be released.
+	 */
+	virtual void endFile() {
+		currentFile.clear();
+		currentFileRaw.clear();
+	}
+
 	virtual ~AttributeFinder() {
 	}
 };