21#ifndef CSVGRAPHIMPORT_H
22#define CSVGRAPHIMPORT_H
24#include <unordered_map>
26#include <tulip/CSVContentHandler.h>
27#include <tulip/Graph.h>
28#include <tulip/tulipconf.h>
33class PropertyInterface;
41class TLP_QT_SCOPE CSVColumn {
43 CSVColumn(
const std::string &columnName =
"",
const std::string &columnType =
"")
44 : _used(true), _name(columnName), _type(columnType), _valueSeparator(0) {}
49 const std::string &name()
const {
63 const std::string &dataType()
const {
67 bool needMultiValues()
const {
68 return _valueSeparator != 0;
71 char getMultiValueSeparator()
const {
72 return _valueSeparator;
77 enum Action { ASSIGN_NO_VALUE = 0, SKIP_ROW = 1, ASSIGN_VALUE = 2 };
82 Exception(
const std::string &v, Action a) : value(v), action(a) {}
85 void addException(
const std::string &value, Action action) {
86 _exceptions.emplace_back(value, action);
89 void clearExceptions() {
94 Action getActionForToken(
const std::string &token) {
95 for (
const Exception &exception : _exceptions) {
96 if (exception.value == token)
97 return exception.action;
99 return Action::ASSIGN_VALUE;
106 char _valueSeparator;
107 std::vector<Exception> _exceptions;
115class TLP_QT_SCOPE CSVImportParameters {
117 CSVImportParameters(
unsigned int fromLine = 0,
unsigned int toLine = UINT_MAX,
118 const std::vector<CSVColumn *> &columns = std::vector<CSVColumn *>());
119 virtual ~CSVImportParameters();
124 unsigned int columnNumber()
const;
129 bool importColumn(
unsigned int column)
const;
133 std::string getColumnName(
unsigned int column)
const;
137 std::string getColumnDataType(
unsigned int column)
const;
142 char getColumnMultiValueSeparator(
unsigned int column)
const;
147 CSVColumn::Action getColumnActionForToken(
unsigned int column,
const std::string &token)
const;
152 unsigned int getFirstLineIndex()
const;
156 unsigned int getLastLineIndex()
const;
161 bool importRow(
unsigned int row)
const;
164 unsigned int fromLine;
166 std::vector<CSVColumn *> columns;
182class TLP_QT_SCOPE CSVToGraphDataMapping {
184 virtual ~CSVToGraphDataMapping() {}
185 virtual std::pair<tlp::ElementType, std::vector<unsigned int>>
186 getElementsForRow(
const std::vector<std::vector<std::string>> &tokens) = 0;
187 virtual void init(
unsigned int rowNumber) = 0;
197class TLP_QT_SCOPE AbstractCSVToGraphDataMapping :
public CSVToGraphDataMapping {
200 const std::vector<unsigned int> &columnIds,
201 const std::vector<std::string> &propertyNames);
202 ~AbstractCSVToGraphDataMapping()
override {}
204 void init(
unsigned int rowNumber)
override;
205 std::pair<tlp::ElementType, std::vector<unsigned int>>
206 getElementsForRow(
const std::vector<std::vector<std::string>> &tokens)
override;
213 virtual unsigned int buildIndexForRow(
unsigned int row,
const std::vector<std::string> &keys) = 0;
216 std::unordered_map<std::string, unsigned int> valueToId;
219 std::vector<unsigned int> columnIds;
220 std::vector<tlp::PropertyInterface *> keyProperties;
225class TLP_QT_SCOPE CSVToNewNodeIdMapping :
public CSVToGraphDataMapping {
228 void init(
unsigned int rowNumber)
override;
229 std::pair<tlp::ElementType, std::vector<unsigned int>>
230 getElementsForRow(
const std::vector<std::vector<std::string>> &tokens)
override;
242class TLP_QT_SCOPE CSVToGraphNodeIdMapping :
public AbstractCSVToGraphDataMapping {
253 CSVToGraphNodeIdMapping(
tlp::Graph *graph,
const std::vector<unsigned int> &columnIds,
254 const std::vector<std::string> &propertyNames,
bool createNode =
false);
255 void init(
unsigned int rowNumber)
override;
258 unsigned int buildIndexForRow(
unsigned int row,
const std::vector<std::string> &keys)
override;
261 bool createMissingNodes;
269class TLP_QT_SCOPE CSVToGraphEdgeIdMapping :
public AbstractCSVToGraphDataMapping {
278 CSVToGraphEdgeIdMapping(
tlp::Graph *graph,
const std::vector<unsigned int> &columnIds,
279 const std::vector<std::string> &propertyNames);
282 unsigned int buildIndexForRow(
unsigned int row,
const std::vector<std::string> &keys)
override;
292class TLP_QT_SCOPE CSVToGraphEdgeSrcTgtMapping :
public CSVToGraphDataMapping {
305 CSVToGraphEdgeSrcTgtMapping(
tlp::Graph *graph,
const std::vector<unsigned int> &srcColumnIds,
306 const std::vector<unsigned int> &tgtColumnIds,
307 const std::vector<std::string> &srcPropNames,
308 const std::vector<std::string> &tgtPropNames,
309 bool createMissinElements =
false);
310 std::pair<tlp::ElementType, unsigned int> getElementForRow(
unsigned int row);
311 void init(
unsigned int lineNumbers)
override;
312 std::pair<tlp::ElementType, std::vector<unsigned int>>
313 getElementsForRow(
const std::vector<std::vector<std::string>> &tokens)
override;
317 std::unordered_map<std::string, unsigned int> srcValueToId;
318 std::unordered_map<std::string, unsigned int> tgtValueToId;
319 std::vector<unsigned int> srcColumnIds;
320 std::vector<unsigned int> tgtColumnIds;
321 std::vector<tlp::PropertyInterface *> srcProperties;
322 std::vector<tlp::PropertyInterface *> tgtProperties;
323 bool sameSrcTgtProperties;
324 bool buildMissingElements;
332class TLP_QT_SCOPE CSVImportColumnToGraphPropertyMapping {
334 virtual ~CSVImportColumnToGraphPropertyMapping() {}
343 const std::string &token) = 0;
353class TLP_QT_SCOPE CSVImportColumnToGraphPropertyMappingProxy
354 :
public CSVImportColumnToGraphPropertyMapping {
356 CSVImportColumnToGraphPropertyMappingProxy(
tlp::Graph *graph,
357 const CSVImportParameters &importParameters,
358 QWidget *parent =
nullptr);
359 ~CSVImportColumnToGraphPropertyMappingProxy()
override {}
361 const std::string &token)
override;
365 CSVImportParameters importParameters;
366 std::unordered_map<unsigned int, tlp::PropertyInterface *> propertiesBuffer;
367 QMessageBox::StandardButton overwritePropertiesButton;
369 PropertyInterface *generateApproximateProperty(
const std::string &name,
const std::string &type);
377class TLP_QT_SCOPE CSVGraphImport :
public tlp::CSVContentHandler {
379 CSVGraphImport(CSVToGraphDataMapping *mapping,
380 CSVImportColumnToGraphPropertyMapping *propertiesManager,
381 const CSVImportParameters &importParameters);
382 ~CSVGraphImport()
override;
383 bool begin()
override;
384 bool line(
unsigned int row,
const std::vector<CSVToken> &lineTokens)
override;
385 bool end(
unsigned int rowNumber,
unsigned int columnNumber)
override;
388 CSVToGraphDataMapping *mapping;
389 CSVImportColumnToGraphPropertyMapping *propertiesManager;
390 CSVImportParameters importParameters;
PropertyInterface describes the interface of a graph property.