memory/DataSet.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/memory/DataSet.cpp
22 
23  \brief Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver.
24 */
25 
26 // TerraLib
27 #include "../common/STLUtils.h"
28 #include "../core/translator/Translator.h"
29 #include "../dataaccess/dataset/DataSetType.h"
30 #include "../dataaccess/utils/Utils.h"
31 #include "../datatype/ByteArray.h"
32 #include "../datatype/DataType.h"
33 #include "../datatype/Property.h"
34 #include "../datatype/SimpleData.h"
35 #include "../datatype/StringProperty.h"
36 #include "../datatype/Utils.h"
37 #include "../geometry/Envelope.h"
38 #include "../geometry/Geometry.h"
39 #include "../geometry/Utils.h"
40 #include "DataSet.h"
41 #include "DataSetItem.h"
42 #include "Exception.h"
43 
44 // STL
45 #include <limits>
46 
48  : m_items(new boost::ptr_vector<DataSetItem>),
49  m_i(-1)
50 {
52 }
53 
55  : m_items(new boost::ptr_vector<DataSetItem>),
56  m_i(-1)
57 {
59 
60  copy(rhs, 0);
61 }
62 
63 te::mem::DataSet::DataSet(const DataSet& rhs, const bool deepCopy)
64  : m_items(new boost::ptr_vector<DataSetItem>),
65  m_i(-1)
66 {
68 
69  if(deepCopy)
70  m_items.reset(new boost::ptr_vector<DataSetItem>(*(rhs.m_items)));
71  else
72  m_items = rhs.m_items;
73 }
74 
75 te::mem::DataSet::DataSet(te::da::DataSet& rhs, const std::vector<std::size_t>& properties, std::size_t limit)
76  : m_items(new boost::ptr_vector<DataSetItem>),
77  m_i(-1)
78 {
79  for(std::size_t i = 0; i != properties.size(); ++i)
80  {
81  int ptype = rhs.getPropertyDataType(properties[i]);
82 
83  m_pnames.push_back(rhs.getPropertyName(properties[i]));
84  m_ptypes.push_back(ptype);
85  }
86 
87  copy(rhs, properties, limit);
88 }
89 
90 te::mem::DataSet::~DataSet() = default;
91 
93 {
94  m_items->clear();
95 }
96 
97 void te::mem::DataSet::copy(te::da::DataSet& src, std::size_t limit)
98 {
99  std::vector<std::size_t> properties;
100 
101  const std::size_t np = src.getNumProperties();
102 
103  for(std::size_t i = 0; i != np; ++i)
104  properties.push_back(i);
105 
106  copy(src, properties, limit);
107 }
108 
109 void te::mem::DataSet::copy(te::da::DataSet& src, const std::vector<std::size_t>& properties, std::size_t limit)
110 {
111  bool unlimited = true;
112 
113  if(limit == 0)
114  {
115  limit = std::numeric_limits<std::size_t>::max();
116  }
117  else
118  {
119  m_items->reserve(m_items->size() + limit);
120  unlimited = false;
121  }
122 
123  std::size_t i = 0;
124 
125  const std::size_t nproperties = properties.size();
126 
127  while(src.moveNext() && (i < limit))
128  {
129  std::unique_ptr<DataSetItem> item(new DataSetItem(this));
130 
131  for(std::size_t c = 0; c < nproperties; ++c)
132  {
133  if(!src.isNull(properties[c]))
134  item->setValue(c, src.getValue(properties[c]).release());
135  else
136  item->setValue(c, nullptr);
137  }
138 
139  m_items->push_back(item.release());
140 
141  ++i;
142  }
143 
144  //src.moveBeforeFirst();
145 
146  if(!unlimited & (i < limit))
147  throw Exception(TE_TR("The source dataset has few items than requested copy limit!"));
148 }
149 
151 {
152  m_items->push_back(item);
153 }
154 
156 {
157  m_items->erase(m_items->begin() + m_i);
158 }
159 
161 {
162  const std::size_t nitems = m_items->size();
163 
164  for(std::size_t i = 0; i < nitems; ++i)
165  {
166  if(&(m_items->operator[](i)) == item)
167  {
168  m_items->erase(m_items->begin() + i);
169  break;
170  }
171  }
172 
173  throw Exception(TE_TR("Item not found in the dataset!"));
174 }
175 
176 void te::mem::DataSet::add(const std::string& propertyName, std::size_t propertyType, const te::dt::AbstractData* defaultValue)
177 {
178  m_pnames.push_back(propertyName);
179  m_ptypes.push_back(static_cast<int>(propertyType));
180 
181  const std::size_t nitems = m_items->size();
182 
183  for(std::size_t i = 0; i < nitems; ++i)
184  m_items->operator[](i).m_data.push_back(defaultValue ? defaultValue->clone() : nullptr);
185 }
186 
187 void te::mem::DataSet::drop(std::size_t pos)
188 {
189  const std::size_t nitems = m_items->size();
190 
191  for(std::size_t i = 0; i < nitems; ++i)
192  m_items->operator[](i).m_data.erase( m_items->operator[](i).m_data.begin() + pos);
193 
194  m_pnames.erase(m_pnames.begin() + pos);
195  m_ptypes.erase(m_ptypes.begin() + pos);
196 }
197 
199 {
200  //std::size_t propPos = m_dt->getPropertyPosition(prop);
201 
202  //const std::size_t nitems = m_items->size();
203 
204  //for(std::size_t i = 0; i < nitems; ++i)
205  // m_items->operator[](i).m_data.replace(m_items->operator[](i).m_data.begin() + propPos, 0);
206  throw Exception("No implemented yet!");
207 }
208 
210 {
211  return te::common::RANDOM;
212 }
213 
215 {
216  return te::common::RWAccess;
217 }
218 
219 std::unique_ptr<te::gm::Envelope> te::mem::DataSet::getExtent(std::size_t i)
220 {
221  std::unique_ptr<te::gm::Envelope> mbr(new te::gm::Envelope);
222 
223  const std::size_t nitems = m_items->size();
224 
225  for(std::size_t ii = 0; ii < nitems; ++ii)
226  {
227  std::unique_ptr<te::gm::Geometry> geom((*m_items)[ii].getGeometry(i));
228 
229  mbr->Union(*(geom->getMBR()));
230  }
231 
232  return mbr;
233 }
234 
236 {
237  return m_pnames.size();
238 }
239 
240 int te::mem::DataSet::getPropertyDataType(std::size_t pos) const
241 {
242  return m_ptypes[pos];
243 }
244 
245 void te::mem::DataSet::setPropertyDataType(int dt, std::size_t pos)
246 {
247  m_ptypes[pos] = dt;
248 }
249 
250 std::string te::mem::DataSet::getPropertyName(std::size_t pos) const
251 {
252  return m_pnames[pos];
253 }
254 
255 void te::mem::DataSet::setPropertyName(const std::string& name, std::size_t pos)
256 {
257  m_pnames[pos] = name;
258 }
259 
260 std::string te::mem::DataSet::getDatasetNameOfProperty(std::size_t /*pos*/) const
261 {
262  throw Exception("No implemented yet!");
263 }
264 
266 {
267  return (*m_items)[m_i].clone().get();
268 }
269 
271 {
272  return m_items->empty();
273 }
274 
276 {
277  return false;
278 }
279 
280 std::size_t te::mem::DataSet::size() const
281 {
282  return m_items->size();
283 }
284 
286 {
287  ++m_i;
288  return m_i < static_cast<int>(m_items->size());
289 }
290 
292 {
293  --m_i;
294  return m_i > 0;
295 }
296 
298 {
299  m_i = -1;
300  return true;
301 }
302 
304 {
305  m_i = 0;
306  return true;
307 }
308 
310 {
311  m_i = static_cast<int>(m_items->size()) - 1;
312  return m_i < static_cast<int>(m_items->size());
313 }
314 
315 bool te::mem::DataSet::move(std::size_t i)
316 {
317  m_i = static_cast<int>(i);
318  return m_i < static_cast<int>(m_items->size());
319 }
320 
322 {
323  return m_i == 0;
324 }
325 
327 {
328  return m_i < 0;
329 }
330 
332 {
333  return m_i == (static_cast<int>(m_items->size()) - 1);
334 }
335 
337 {
338  return m_i > static_cast<int>(m_items->size());
339 }
340 
342 {
343  return m_i > -1 && m_i < static_cast<int>(m_items->size());
344 }
345 
346 char te::mem::DataSet::getChar(std::size_t i) const
347 {
348  return (*m_items)[m_i].getChar(i);
349 }
350 
351 void te::mem::DataSet::setChar(std::size_t i, char value)
352 {
353  (*m_items)[m_i].setChar(i, value);
354 }
355 
356 void te::mem::DataSet::setChar(const std::string& name, char value)
357 {
358  (*m_items)[m_i].setChar(name, value);
359 }
360 
361 unsigned char te::mem::DataSet::getUChar(std::size_t i) const
362 {
363  return (*m_items)[m_i].getUChar(i);
364 }
365 
366 void te::mem::DataSet::setUChar(std::size_t i, unsigned char value)
367 {
368  (*m_items)[m_i].setUChar(i, value);
369 }
370 
371 void te::mem::DataSet::setUChar(const std::string& name, unsigned char value)
372 {
373  (*m_items)[m_i].setUChar(name, value);
374 }
375 
376 boost::int16_t te::mem::DataSet::getInt16(std::size_t i) const
377 {
378  return (*m_items)[m_i].getInt16(i);
379 }
380 
381 void te::mem::DataSet::setInt16(std::size_t i, boost::int16_t value)
382 {
383  (*m_items)[m_i].setInt16(i, value);
384 }
385 
386 void te::mem::DataSet::setInt16(const std::string& name, boost::int16_t value)
387 {
388  (*m_items)[m_i].setInt16(name, value);
389 }
390 
391 boost::int32_t te::mem::DataSet::getInt32(std::size_t i) const
392 {
393  return (*m_items)[m_i].getInt32(i);
394 }
395 
396 void te::mem::DataSet::setInt32(std::size_t i, boost::int32_t value)
397 {
398  (*m_items)[m_i].setInt32(i, value);
399 }
400 
401 void te::mem::DataSet::setInt32(const std::string& name, boost::int32_t value)
402 {
403  (*m_items)[m_i].setInt32(name, value);
404 }
405 
406 boost::int64_t te::mem::DataSet::getInt64(std::size_t i) const
407 {
408  return (*m_items)[m_i].getInt64(i);
409 }
410 
411 void te::mem::DataSet::setInt64(std::size_t i, boost::int64_t value)
412 {
413  (*m_items)[m_i].setInt64(i, value);
414 }
415 
416 void te::mem::DataSet::setInt64(const std::string& name, boost::int64_t value)
417 {
418  (*m_items)[m_i].setInt64(name, value);
419 }
420 
421 bool te::mem::DataSet::getBool(std::size_t i) const
422 {
423  return (*m_items)[m_i].getBool(i);
424 }
425 
426 void te::mem::DataSet::setBool(std::size_t i, bool value)
427 {
428  (*m_items)[m_i].setBool(i, value);
429 }
430 
431 void te::mem::DataSet::setBool(const std::string& name, bool value)
432 {
433  (*m_items)[m_i].setBool(name, value);
434 }
435 
436 float te::mem::DataSet::getFloat(std::size_t i) const
437 {
438  return (*m_items)[m_i].getFloat(i);
439 }
440 
441 void te::mem::DataSet::setFloat(std::size_t i, float value)
442 {
443  (*m_items)[m_i].setFloat(i, value);
444 }
445 
446 void te::mem::DataSet::setFloat(const std::string& name, float value)
447 {
448  (*m_items)[m_i].setFloat(name, value);
449 }
450 
451 double te::mem::DataSet::getDouble(std::size_t i) const
452 {
453  return (*m_items)[m_i].getDouble(i);
454 }
455 
456 void te::mem::DataSet::setDouble(std::size_t i, double value)
457 {
458  (*m_items)[m_i].setDouble(i, value);
459 }
460 
461 void te::mem::DataSet::setDouble(const std::string& name, double value)
462 {
463  (*m_items)[m_i].setDouble(name, value);
464 }
465 
466 std::string te::mem::DataSet::getNumeric(std::size_t i) const
467 {
468  return (*m_items)[m_i].getNumeric(i);
469 }
470 
471 void te::mem::DataSet::setNumeric(std::size_t i, const std::string& value)
472 {
473  (*m_items)[m_i].setNumeric(i, value);
474 }
475 
476 void te::mem::DataSet::setNumeric(const std::string& name, const std::string& value)
477 {
478  (*m_items)[m_i].setNumeric(name, value);
479 }
480 
481 std::string te::mem::DataSet::getString(std::size_t i) const
482 {
483  return (*m_items)[m_i].getString(i);
484 }
485 
486 void te::mem::DataSet::setString(std::size_t i, const std::string& value)
487 {
488  (*m_items)[m_i].setString(i, value);
489 }
490 
491 void te::mem::DataSet::setString(const std::string& name, const std::string& value)
492 {
493  (*m_items)[m_i].setString(name, value);
494 }
495 
496 std::unique_ptr<te::dt::ByteArray> te::mem::DataSet::getByteArray(std::size_t i) const
497 {
498  return (*m_items)[m_i].getByteArray(i);
499 }
500 
502 {
503  (*m_items)[m_i].setByteArray(i, value);
504 }
505 
506 void te::mem::DataSet::setByteArray(const std::string& name, te::dt::ByteArray* value)
507 {
508  (*m_items)[m_i].setByteArray(name, value);
509 }
510 
511 std::unique_ptr<te::gm::Geometry> te::mem::DataSet::getGeometry(std::size_t i) const
512 {
513  return (*m_items)[m_i].getGeometry(i);
514 }
515 
517 {
518  (*m_items)[m_i].setGeometry(i, value);
519 }
520 
521 void te::mem::DataSet::setGeometry(const std::string& name, te::gm::Geometry* value)
522 {
523  (*m_items)[m_i].setGeometry(name, value);
524 }
525 
526 std::unique_ptr<te::rst::Raster> te::mem::DataSet::getRaster(std::size_t i) const
527 {
528  return (*m_items)[m_i].getRaster(i);
529 }
530 
531 void te::mem::DataSet::setRaster(std::size_t i, te::rst::Raster* value)
532 {
533  (*m_items)[m_i].setRaster(i, value);
534 }
535 
536 void te::mem::DataSet::setRaster(const std::string& name, te::rst::Raster* value)
537 {
538  (*m_items)[m_i].setRaster(name, value);
539 }
540 
541 std::unique_ptr<te::dt::DateTime> te::mem::DataSet::getDateTime(std::size_t i) const
542 {
543  return std::unique_ptr<te::dt::DateTime>((*m_items)[m_i].getDateTime(i));
544 }
545 
547 {
548  (*m_items)[m_i].setDateTime(i, value);
549 }
550 
551 void te::mem::DataSet::setDateTime(const std::string& name, te::dt::DateTime* value)
552 {
553  (*m_items)[m_i].setDateTime(name, value);
554 }
555 
556 std::unique_ptr<te::dt::Array> te::mem::DataSet::getArray(
557  std::size_t /*i*/) const
558 {
559  return std::unique_ptr<te::dt::Array>(nullptr);
560 }
561 
562 std::unique_ptr<te::dt::AbstractData> te::mem::DataSet::getValue(std::size_t i) const
563 {
564  return (*m_items)[m_i].getValue(i);
565 }
566 
568 {
569  (*m_items)[m_i].setValue(i, value);
570 }
571 
572 void te::mem::DataSet::setValue(const std::string& name, te::dt::AbstractData* ad)
573 {
574  (*m_items)[m_i].setValue(name, ad);
575 }
576 
577 bool te::mem::DataSet::isNull(std::size_t i) const
578 {
579  return (*m_items)[m_i].isNull(i);
580 }
std::size_t size() const
It returns the collection size, if it is known.
void setString(std::size_t i, const std::string &value)
boost::shared_ptr< boost::ptr_vector< DataSetItem > > m_items
The list of dataset items.
bool move(std::size_t i)
It moves the dataset internal pointer to a given position.
boost::int16_t getInt16(std::size_t i) const
Method for retrieving a 16-bit integer attribute value (2 bytes long).
bool isAfterEnd() const
It tells if the dataset internal pointer is on the sentinel position after the last element of the co...
bool isPositionValid() const
It tells if the dataset internal pointer is on a valid position.
std::unique_ptr< te::rst::Raster > getRaster(std::size_t i) const
Method for retrieving a raster attribute value.
std::unique_ptr< te::dt::AbstractData > getValue(std::size_t i) const
Method for retrieving any other type of data value stored in the data source.
std::unique_ptr< te::gm::Envelope > getExtent(std::size_t i)
It computes the bounding rectangle for a spatial property of the dataset.
void setByteArray(std::size_t i, te::dt::ByteArray *value)
Base exception class for plugin module.
A class that models the description of a dataset.
Definition: DataSetType.h:72
te::common::TraverseType getTraverseType() const
It returns the traverse type associated to the dataset.
te::common::AccessPolicy getAccessPolicy() const
It returns the read and write permission associated to the dataset.
DataSet()
Default constructor.
void setInt16(std::size_t i, boost::int16_t value)
bool isAtEnd() const
It tells if the dataset internal pointer is on the last element of the collection.
An exception class for the TerraLib In-Memory Data Access driver.
std::unique_ptr< te::dt::ByteArray > getByteArray(std::size_t i) const
Method for retrieving a byte array.
bool isConnected() const
It returns true if the dataset is connected and false if it is disconnected. A dataset can be connect...
bool getBool(std::size_t i) const
Method for retrieving a boolean attribute value.
void setInt32(std::size_t i, boost::int32_t value)
bool moveFirst()
It moves the internal pointer to the first item in the collection.
std::string getString(std::size_t i) const
Method for retrieving a string value attribute.
#define TE_TR(message)
It marks a string in order to get translated.
Definition: Translator.h:242
int getPropertyDataType(std::size_t pos) const
It returns the underlying data type of the property at position pos.
bool isNull(std::size_t i) const
It checks if the attribute value is NULL.
bool isEmpty() const
It returns true if the collection is empty.
It models a property definition.
Definition: Property.h:59
std::vector< int > m_ptypes
The list of property types.
void drop(std::size_t pos)
It drops a property from the dataset.
void add(DataSetItem *item)
It adds a new item to the dataset and takes its ownership.
std::unique_ptr< te::dt::Array > getArray(std::size_t i) const
Method for retrieving an array.
~DataSet()
Destructor.
void setInt64(std::size_t i, boost::int64_t value)
std::string getDatasetNameOfProperty(std::size_t pos) const
It returns the underlying dataset name of the property at position pos.
virtual bool moveNext()=0
It moves the internal pointer to the next item of the collection.
AccessPolicy
Supported data access policies (can be used as bitfield).
void setValue(std::size_t i, te::dt::AbstractData *value)
TraverseType
A dataset can be traversed in two ways:
float getFloat(std::size_t i) const
Method for retrieving a float attribute value.
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
virtual int getPropertyDataType(std::size_t i) const =0
It returns the underlying data type of the property at position pos.
boost::int32_t getInt32(std::size_t i) const
Method for retrieving a 32-bit integer attribute value (4 bytes long).
An Envelope defines a 2D rectangular region.
An abstract class for raster data strucutures.
std::unique_ptr< te::gm::Geometry > getGeometry(std::size_t i) const
Method for retrieving a geometric attribute value.
bool moveLast()
It sets the dataset internal pointer to the last item in the collection.
static te::dt::TimeDuration dt(20, 30, 50, 11)
bool isBeforeBegin() const
It tells if the dataset internal pointer is in a position before the first element of the collection ...
std::vector< std::string > m_pnames
The list of property names.
virtual AbstractData * clone() const =0
It returns a clone of this object.
A base class for values that can be retrieved from the data access module.
Definition: AbstractData.h:57
An implementation of the DatasetItem class for the TerraLib In-Memory Data Access driver...
void setNumeric(std::size_t i, const std::string &value)
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
void remove()
It removes the current dataset item.
void setDateTime(std::size_t i, te::dt::DateTime *value)
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
void setFloat(std::size_t i, float value)
bool isAtBegin() const
It tells if the dataset internal pointer is on the first element of the collection or not...
std::unique_ptr< te::dt::DateTime > getDateTime(std::size_t i) const
Method for retrieving a date and time attribute value.
DataSetItem * getItem() const
std::unique_ptr< DataSetItem > clone() const
It returns a clone of the DataSetItem.
std::string getNumeric(std::size_t i) const
Method for retrieving a numeric attribute value.
unsigned char getUChar(std::size_t i) const
Method for retrieving an unsigned character attribute value (1 byte long).
bool moveBeforeFirst()
It moves the internal pointer to a position before the first item in the collection.
bool moveNext()
It moves the internal pointer to the next item of the collection.
void setGeometry(std::size_t i, te::gm::Geometry *value)
boost::int64_t getInt64(std::size_t i) const
Method for retrieving a 64-bit integer attribute value (8 bytes long).
An implementation of the DatasetItem class for the TerraLib In-Memory Data Access driver...
A dataset is the unit of information manipulated by the data access module of TerraLib.
void copy(te::da::DataSet &src, std::size_t limit=0)
It copies up to limit items from the source dataset.
std::string getPropertyName(std::size_t pos) const
It returns the property name at position pos.
void update(te::dt::Property *prop)
It update a property from the dataset.
int m_i
The index of the current item.
double getDouble(std::size_t i) const
Method for retrieving a double attribute value.
virtual std::unique_ptr< te::dt::AbstractData > getValue(std::size_t i) const
Method for retrieving any other type of data value stored in the data source.
char getChar(std::size_t i) const
Method for retrieving a signed character attribute value (1 byte long).
void setChar(std::size_t i, char value)
virtual bool isNull(std::size_t i) const =0
It checks if the attribute value is NULL.
void clear()
It clears all the dataset items.
void setBool(std::size_t i, bool value)
void setUChar(std::size_t i, unsigned char value)
virtual std::size_t getNumProperties() const =0
It returns the number of properties that composes an item of the dataset.
virtual std::string getPropertyName(std::size_t i) const =0
It returns the property name at position pos.
bool movePrevious()
It moves the internal pointer to the previous item of the collection.
void setRaster(std::size_t i, te::rst::Raster *value)
void setPropertyName(const std::string &name, std::size_t pos)
void setDouble(std::size_t i, double value)
A class for representing binary data.
Definition: ByteArray.h:51
void setPropertyDataType(int dt, std::size_t pos)
TEDATAACCESSEXPORT void GetPropertyInfo(const DataSetType *const dt, std::vector< std::string > &pnames, std::vector< int > &ptypes)
std::size_t getNumProperties() const
It returns the number of properties that composes an item of the dataset.