30 #include "../../common/STLUtils.h" 
   31 #include "../../common/StringUtils.h" 
   32 #include "../../common/Translator.h" 
   33 #include "../../dataaccess/dataset/DataSet.h" 
   34 #include "../../dataaccess/dataset/DataSetType.h" 
   35 #include "../../dataaccess/datasource/DataSource.h" 
   36 #include "../../dataaccess/query_h.h" 
   37 #include "../../memory/DataSet.h" 
   38 #include "../../memory/DataSetItem.h" 
   39 #include "../core/AbstractGraph.h" 
   40 #include "../core/Edge.h" 
   41 #include "../core/GraphCache.h" 
   42 #include "../core/EdgeProperty.h" 
   43 #include "../core/GraphData.h" 
   44 #include "../core/GraphMetadata.h" 
   45 #include "../core/Vertex.h" 
   46 #include "../core/VertexProperty.h" 
   47 #include "../Config.h" 
   48 #include "../Globals.h" 
   49 #include "../Exception.h" 
   59   delete m_graphMetadata;
 
   64   return m_graphMetadata;
 
   69   if(m_graphMetadata == 0 || m_graphMetadata->getDataSource() == 0)
 
   71     throw Exception(
TE_TR(
""));
 
   77     saveGraphEdgeList(data);
 
   84   if(m_graphMetadata == 0 || m_graphMetadata->getDataSource() == 0)
 
   86     throw Exception(
TE_TR(
""));
 
   93   if(m_graphMetadata == 0 || m_graphMetadata->getDataSource() == 0)
 
   95     throw Exception(
TE_TR(
""));
 
  107   std::string tableName = m_graphMetadata->getEdgeTableName();
 
  110   std::auto_ptr<te::da::DataSetType> dsType(m_graphMetadata->getDataSource()->getDataSetType(tableName));
 
  113   std::auto_ptr<te::mem::DataSet> outDataSet(
new te::mem::DataSet(dsType.get()));
 
  114   std::auto_ptr<te::mem::DataSet> outDataSetUpdate(
new te::mem::DataSet(dsType.get()));
 
  116   te::graph::GraphData::EdgeMap::iterator it = data->
getEdgeMap().begin();
 
  118   bool hasNewObjects = 
false;
 
  119   bool hasUpdatedObjects = 
false;
 
  123     if(it->second->isNew()) 
 
  128       dsItem->
setInt32(0, it->second->getId());
 
  129       dsItem->
setInt32(1, it->second->getIdFrom());
 
  130       dsItem->
setInt32(2, it->second->getIdTo());
 
  135       if(m_graphMetadata->getEdgePropertySize() != 0)
 
  137         for(
size_t i = 0; i < it->second->getAttributes().size(); ++i)
 
  139           dsItem->
setValue(pos + i, it->second->getAttributes()[i]->clone());
 
  143       outDataSet->add(dsItem);
 
  145       hasNewObjects = 
true;
 
  147     else if(it->second->isDirty()) 
 
  152       dsItem->
setInt32(0, it->second->getId());
 
  153       dsItem->
setInt32(1, it->second->getIdFrom());
 
  154       dsItem->
setInt32(2, it->second->getIdTo());
 
  159       if(m_graphMetadata->getEdgePropertySize() != 0)
 
  161         for(
size_t i = 0; i < it->second->getAttributes().size(); ++i)
 
  163           dsItem->
setValue(pos + i, it->second->getAttributes()[i]->clone());
 
  167       outDataSetUpdate->add(dsItem);
 
  169       hasUpdatedObjects = 
true;
 
  175   std::map<std::string, std::string> options;
 
  179     outDataSet->moveFirst();
 
  180     m_graphMetadata->getDataSource()->add(tableName, outDataSet.get(), options);
 
  184   if(hasUpdatedObjects)
 
  186     outDataSetUpdate->moveFirst();
 
  187     std::map<std::string, std::string> options;
 
  188     std::vector<std::size_t> properties;
 
  190     for(
size_t t = 0; t < dsType->getProperties().size(); ++t)
 
  193         properties.push_back(t);
 
  196     m_graphMetadata->getDataSource()->update(tableName, outDataSetUpdate.get(), properties, 0, options);
 
  198   outDataSetUpdate->clear();
 
  201   if(m_graphMetadata->getVertexPropertySize() != 0)
 
  203     saveVertexAttributes(data);
 
  214   std::string tableName = m_graphMetadata->getVertexTableName();
 
  217   std::auto_ptr<te::da::DataSetType> dsType(m_graphMetadata->getDataSource()->getDataSetType(tableName));
 
  220   std::auto_ptr<te::mem::DataSet> outDataSet(
new te::mem::DataSet(dsType.get()));
 
  221   std::auto_ptr<te::mem::DataSet> outDataSetUpdate(
new te::mem::DataSet(dsType.get()));
 
  223   te::graph::GraphData::VertexMap::iterator it = data->
getVertexMap().begin();
 
  225   bool hasNewObjects = 
false;
 
  226   bool hasUpdatedObjects = 
false;
 
  230     if(it->second->isNew()) 
 
  235       dsItem->
setInt32(0, it->second->getId());
 
  240       if(m_graphMetadata->getVertexPropertySize() != 0)
 
  242         for(
size_t i = 0; i < it->second->getAttributes().size(); ++i)
 
  244           dsItem->
setValue(pos + i, it->second->getAttributes()[i]->clone());
 
  248       outDataSet->add(dsItem);
 
  250       hasNewObjects = 
true;
 
  252     else if(it->second->isDirty()) 
 
  257       dsItem->
setInt32(0, it->second->getId());
 
  262       if(m_graphMetadata->getVertexPropertySize() != 0)
 
  264         for(
size_t i = 0; i < it->second->getAttributes().size(); ++i)
 
  266           dsItem->
setValue(pos + i, it->second->getAttributes()[i]->clone());
 
  270       outDataSetUpdate->add(dsItem);
 
  272       hasUpdatedObjects = 
true;
 
  278   std::map<std::string, std::string> options;
 
  282     outDataSet->moveFirst();
 
  283     m_graphMetadata->getDataSource()->add(tableName, outDataSet.get(), options);
 
  287   if(hasUpdatedObjects)
 
  289     outDataSetUpdate->moveFirst();
 
  290     std::map<std::string, std::string> options;
 
  291     std::vector<std::size_t> properties;
 
  293     for(
size_t t = 0; t < dsType->getProperties().size(); ++t)
 
  296         properties.push_back(t);
 
  299     m_graphMetadata->getDataSource()->update(tableName, outDataSetUpdate.get(), properties, 0, options);
 
  301   outDataSetUpdate->clear();
 
  306   throw Exception(
TE_TR(
"TO DO"));
 
  311   throw Exception(
TE_TR(
"TO DO"));
 
  316   throw Exception(
TE_TR(
"TO DO"));
 
  322   std::string tableName = m_graphMetadata->getVertexTableName();
 
  323   std::auto_ptr<te::da::DataSetType> dsType(m_graphMetadata->getDataSource()->getDataSetType(tableName));
 
  328   fields->push_back(f);
 
  342   std::auto_ptr<te::da::DataSet> dataset = m_graphMetadata->getDataSource()->query(select);
 
  347   if(dataset->moveNext())
 
  356     for(
size_t i = 1; i < dsType->getProperties().size(); ++i)
 
  358       v->
addAttribute(i - 1, dataset->getValue(dsType->getProperty(i)->getName()).release());
 
  368   std::string tableName = m_graphMetadata->getEdgeTableName();
 
  369   std::auto_ptr<te::da::DataSetType> dsType(m_graphMetadata->getDataSource()->getDataSetType(tableName));
 
  374   fields->push_back(f);
 
  388   std::auto_ptr<te::da::DataSet> dataset = m_graphMetadata->getDataSource()->query(select);
 
  393   if(dataset->moveNext())
 
  404     for(
size_t i = 3; i < dsType->getProperties().size(); ++i)
 
  406       e->
addAttribute(i - 3, dataset->getValue(dsType->getProperty(i)->getName()).release());
 
  415   throw Exception(
TE_TR(
"TO DO"));
 
void saveEdgeAttributes(GraphData *data)
Used to save the edges elements attributes from a graph data. 
 
void setAttributeVecSize(int size)
This function is used to set the number of attributes associated with the vertex elements. 
 
te::graph::GraphMetadata * getMetadata()
It returns a pointer to a class that describes the graph metadata. 
 
void setAttributeVecSize(int size)
This function is used to set the number of attributes associated with the edge elements. 
 
An abstract class that models a source of data in a query. 
 
The Field class can be used to model an expression that takes part of the output items of a SELECT...
 
VertexMap & getVertexMap()
It returns the the vertex map. 
 
static const std::string sm_tableVertexModelAttrId
Attribute id. 
 
A class that models the name of a dataset used in a From clause. 
 
A class that models the name of any property of an object. 
 
void setValue(std::size_t i, te::dt::AbstractData *value)
It sets the value of the i-th property. 
 
#define TE_TR(message)
It marks a string in order to get translated. 
 
From the point of view of graph theory, vertices are treated as featureless and indivisible objects...
 
AbstractGraphLoaderStrategy(te::graph::GraphMetadata *metadata)
Default constructor. 
 
void setInt32(std::size_t i, boost::int32_t value)
It sets the value of the i-th property. 
 
Class used to define the edge struct of a graph. Its compose with a identifier, the vertex origin and...
 
virtual void saveData(GraphData *data)
Save the graph data structure in Data Source. 
 
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
 
static const std::string sm_tableEdgeModelAttrId
Attribute Id. 
 
void saveGraphVertexList(GraphData *data)
Used to save the vertex elements from a graph data. 
 
virtual void removeVertex(int id)
Function used to remove a vertex saved in a data source. 
 
boost::ptr_vector< Field > Fields
Fields is just a boost::ptr_vector of Field pointers. 
 
A class that can be used to model a filter expression that can be applied to a query. 
 
Vertex * loadVertexAttrs(int id)
Function used to load one vertex given a ID. 
 
Edge * loadEdgeAttrs(int id)
Function used to load one edge given a ID. 
 
Edge * loadEdge(int id)
Function used to load one edge given a ID. 
 
EdgeMap & getEdgeMap()
It returns the the edge map. 
 
A Select models a query to be used when retrieving data from a DataSource. 
 
void saveVertexAttributes(GraphData *data)
Used to save the vertex elements attributes from a graph data. 
 
boost::ptr_vector< FromItem > From
It models the FROM clause for a query. 
 
An implementation of the DatasetItem class for the TerraLib In-Memory Data Access driver...
 
This class define a important struct used to group a map of vertex and edges. A flag is used to indic...
 
bool isDirty()
Used to check the graph data state. 
 
It models the comparison operator. 
 
void addAttribute(int idx, te::dt::AbstractData *ad)
Add a new attribute to this element. 
 
std::string Convert2String(boost::int16_t value)
It converts a short integer value to a string. 
 
static const std::string sm_tableEdgeModelAttrVFrom
Attribute Vertex From. 
 
Vertex * loadVertex(int id)
Function used to load one vertex given a ID. 
 
virtual void removeEdge(int id)
Function used to remove a edge saved in a data source. 
 
void saveGraphEdgeList(GraphData *data)
Used to save the edge elements from a graph data. 
 
virtual ~AbstractGraphLoaderStrategy()
Default destructor. 
 
void addAttribute(int idx, te::dt::AbstractData *ad)
Add a new attribute to this element. 
 
static const std::string sm_tableEdgeModelAttrVTo
Attribute Vertex To. 
 
This class define the main functions necessary to save and load the graph data and metadata informati...
 
This class models a string Literal value.