27 #include "../common/Translator.h"
28 #include "../common/progress/TaskProgress.h"
29 #include "../dataaccess/dataset/DataSet.h"
30 #include "../dataaccess/dataset/DataSetAdapter.h"
31 #include "../dataaccess/dataset/DataSetType.h"
32 #include "../dataaccess/datasource/DataSourceCapabilities.h"
33 #include "../dataaccess/datasource/DataSourceInfo.h"
34 #include "../dataaccess/datasource/DataSourceManager.h"
35 #include "../dataaccess/datasource/DataSourceFactory.h"
36 #include "../dataaccess/dataset/DataSetTypeConverter.h"
37 #include "../dataaccess/query_h.h"
38 #include "../dataaccess/utils/Utils.h"
39 #include "../datatype/Property.h"
40 #include "../datatype/SimpleProperty.h"
41 #include "../datatype/StringProperty.h"
42 #include "../geometry/Geometry.h"
43 #include "../geometry/GeometryCollection.h"
44 #include "../geometry/GeometryProperty.h"
45 #include "../geometry/Utils.h"
46 #include "../memory/DataSet.h"
47 #include "../memory/DataSetItem.h"
48 #include "../statistics/core/SummaryFunctions.h"
49 #include "../statistics/core/StringStatisticalSummary.h"
50 #include "../statistics/core/NumericStatisticalSummary.h"
51 #include "../statistics/core/Utils.h"
64 #include <boost/lexical_cast.hpp>
65 #include <boost/algorithm/string.hpp>
71 const std::vector<te::dt::Property*>& groupingProperties,
72 const std::map<
te::dt::Property*, std::vector<te::stat::StatisticalSummary> >& statisticalSummary,
78 const std::vector<te::dt::Property*>& groupingProperties,
79 const std::map<
te::dt::Property*, std::vector<te::stat::StatisticalSummary> >& statisticalSummary,
84 const std::vector<te::dt::Property*>& properties,
85 const std::map<
te::dt::Property*, std::vector<te::stat::StatisticalSummary> >& statisticalSummary);
92 const std::vector<te::dt::Property*>& groupingProperties);
95 const std::vector<te::mem::DataSetItem*>& items);
98 const std::vector<te::mem::DataSetItem*>& items);
104 const std::vector<te::dt::Property*>& groupingProperties,
105 const std::map<
te::dt::Property*, std::vector<te::stat::StatisticalSummary> >& statisticalSummary,
106 const std::string& outDataset,
109 assert(inDatasource);
110 assert(outDatasource);
113 std::auto_ptr<te::da::DataSetType> outputDataSetType(
BuildOutputDataSetType(outDataset, groupingProperties, statisticalSummary));
116 std::auto_ptr<te::da::DataSetType> inSchema = inDatasource->
getDataSetType(inDataset);
124 outputDataSetType->add(geometry);
127 std::auto_ptr<te::mem::DataSet> memDataset(
new te::mem::DataSet(outputDataSetType.get()));
136 res =
AggregationQuery(inDataset, inDatasource, groupingProperties, statisticalSummary, memDataset.get(),outGeoType);
140 res =
AggregationMemory(inDataset, inDatasource, groupingProperties, statisticalSummary, memDataset.get(),outGeoType);
151 std::map<std::string, std::string> options;
156 memDataset->moveBeforeFirst();
157 outDatasource->
add(dsTypeResult->getName(),memDataset.get(), options);
162 std::string pk_name = dsTypeResult->getName() +
"_pkey";
164 pk->
add(dsTypeResult->getProperty(0));
173 const std::vector<te::dt::Property*>& groupingProperties,
174 const std::map<
te::dt::Property*, std::vector<te::stat::StatisticalSummary> >& statisticalSummary,
178 std::map<te::dt::Property*, std::vector<te::stat::StatisticalSummary> >::const_iterator itStatSummary = statisticalSummary.begin();
180 std::auto_ptr<te::da::DataSetType> dsType = inDatasource->
getDataSetType(inDataset);
184 for(std::size_t i = 0; i < groupingProperties.size(); ++i)
187 fields->push_back(f_aggName);
192 fields->push_back(f_aggCount);
194 while(itStatSummary != statisticalSummary.end())
196 int propType = itStatSummary->first->getType();
215 fields->push_back(f_min);
216 fields->push_back(f_max);
217 fields->push_back(f_count);
218 fields->push_back(f_validcount);
252 fields->push_back(f_min);
253 fields->push_back(f_max);
254 fields->push_back(f_count);
255 fields->push_back(f_validcount);
256 fields->push_back(f_sum);
257 fields->push_back(f_mean);
258 fields->push_back(f_stddev);
259 fields->push_back(f_variance);
260 fields->push_back(f_amplitude);
266 if(dsType->hasGeom())
272 fields->push_back(f_union);
277 from->push_back(fromItem);
281 if(!groupingProperties.empty())
285 for(std::size_t i = 0; i < groupingProperties.size(); ++i)
288 groupBy->push_back(e_groupBy);
293 std::auto_ptr<te::da::DataSet> dsQuery = inDatasource->
query(select);
302 const std::vector<te::dt::Property*>& groupingProperties,
303 const std::map<
te::dt::Property*, std::vector<te::stat::StatisticalSummary> >& statisticalSummary,
307 std::auto_ptr<te::da::DataSet> inputDataSet = inDatasource->
getDataSet(inDataset);
308 std::auto_ptr<te::da::DataSetType> dsType = inDatasource->
getDataSetType(inDataset);
311 std::string geomName =
"";
313 if(dsType->hasGeom())
317 geomIdx = boost::lexical_cast<std::size_t>(dsType->getPropertyPosition(geomName));
320 std::map<std::string, std::vector<te::mem::DataSetItem*> > groupValues =
GetGroups(inputDataSet.get(), groupingProperties);
322 std::map<std::string, std::vector<te::mem::DataSetItem*> >::const_iterator itGroupValues = groupValues.begin();
329 while(itGroupValues != groupValues.end())
331 std::string value = itGroupValues->first.c_str();
332 int aggregationCount = itGroupValues->second.size();
345 outputDataSetItem->
setInt32(1, aggregationCount);
347 if(!functionResultStringMap.empty())
349 std::map<std::string, std::string>::iterator itFuncResultString = functionResultStringMap.begin();
351 while(itFuncResultString != functionResultStringMap.end())
354 outputDataSetItem->
setString(itFuncResultString->first.c_str(), itFuncResultString->second.c_str());
356 ++itFuncResultString;
360 if(!functionResultDoubleMap.empty())
362 std::map<std::string, double>::iterator itFuncResultDouble = functionResultDoubleMap.begin();
364 std::string propMode;
365 std::string auxPropMode;
366 std::string modeValue;
367 std::string auxValue;
370 while(itFuncResultDouble != functionResultDoubleMap.end())
372 propMode = itFuncResultDouble->first.c_str();
374 unsigned pos = propMode.find(
"_");
375 propMode = propMode.substr(pos+1);
376 pos = propMode.find(
"_");
377 propMode = propMode.substr(pos+1);
379 std::string shortMode =
"";
381 if(propMode.length() > 3)
382 shortMode = propMode.substr(propMode.length()-4, 4);
384 if(propMode == auxPropMode || auxPropMode ==
"")
386 if(shortMode ==
"MODE")
388 modeValue +=
", "+boost::lexical_cast<std::string>(itFuncResultDouble->second);
389 auxPropMode = propMode;
397 modeValue.erase(0,2);
400 outputDataSetItem->
setString(auxPropMode, modeValue);
404 if(shortMode ==
"MODE")
407 modeValue +=
", "+boost::lexical_cast<std::string>(itFuncResultDouble->second);
408 auxPropMode = propMode;
415 outputDataSetItem->
setDouble(itFuncResultDouble->first.c_str(), itFuncResultDouble->second);
417 ++itFuncResultDouble;
423 outputDataSet->
add(outputDataSetItem);
430 throw te::vp::Exception(
TR_VP(
"Operation canceled!"));
440 const std::vector<te::dt::Property*>& properties,
441 const std::map<
te::dt::Property*, std::vector<te::stat::StatisticalSummary> >& statisticalSummary)
446 std::string propertyResult;
447 for(std::size_t i = 0; i < properties.size(); ++i)
449 propertyResult +=
"_" + properties[i]->getName();
451 propertyResult.erase(propertyResult.begin());
453 dataSetType->
add(stringProperty);
457 dataSetType->
add(aggregationProperty);
460 std::string functionResult;
461 std::vector<te::stat::StatisticalSummary> vectorResult;
462 std::map<te::dt::Property*, std::vector<te::stat::StatisticalSummary> >::const_iterator it = statisticalSummary.begin();
463 while(it != statisticalSummary.end())
466 propertyResult = it->first->getName();
467 propertyResult +=
"_";
469 vectorResult = it->second;
471 for(std::size_t i = 0; i < vectorResult.size(); ++i)
473 functionResult = propertyResult;
479 dataSetType->
add(functrionProperty);
484 dataSetType->
add(functrionProperty);
500 std::size_t selectedPropSize = groupingProperties.size();
509 std::string aggregItem =
"";
511 for(std::size_t i = 0; i < n_dsProp; ++i)
513 if(i < selectedPropSize)
520 outputDataSetItem->
setString(0, aggregItem);
526 if(boost::iequals(propName,
"NUM_OBJ"))
528 int aggregValue = boost::lexical_cast<
int>(dsQuery->
getAsString(i));
529 outputDataSetItem->
setInt32(1, aggregValue);
537 std::auto_ptr<te::gm::Geometry> geometry(dsQuery->
getGeometry(i));
538 if (geometry->getGeomTypeId() != outGeoType)
545 outputDataSetItem->
setGeometry(
"geom", geometry.release());
552 if(index < outputDataSetItem->getNumProperties())
556 outputDataSetItem->
setString(index, value);
564 if(index < outputDataSetItem->getNumProperties())
566 std::string queryValue = dsQuery->
getNumeric(i);
567 if(!queryValue.empty())
569 double value = boost::lexical_cast<
double>(queryValue);
570 outputDataSetItem->
setDouble(index, value);
579 if(index < outputDataSetItem->getNumProperties())
582 outputDataSetItem->
setDouble(index, value);
590 if(index < outputDataSetItem->getNumProperties())
596 if(!queryValue.empty())
598 double value = boost::lexical_cast<
double>(queryValue);
599 outputDataSetItem->
setDouble(index, value);
606 outputDataSetItem->
setString(index, value);
615 if(index < outputDataSetItem->getNumProperties())
621 if(!queryValue.empty())
623 double value = boost::lexical_cast<
double>(queryValue);
624 outputDataSetItem->
setDouble(index, value);
631 outputDataSetItem->
setString(index, value);
639 outputDataSet->
add(outputDataSetItem);
646 const std::vector<te::dt::Property*>& groupingProperties)
648 std::map<std::string, std::vector<te::mem::DataSetItem*> > groupValues;
656 if (!inputDataSet->
isNull(i))
658 std::auto_ptr<te::dt::AbstractData> val = inputDataSet->
getValue(i);
659 dataSetItem->
setValue(i,val.release());
663 std::size_t propertyIndex = 0;
666 std::vector<te::mem::DataSetItem*> dataSetItemVector;
667 std::map<std::string, std::vector<te::mem::DataSetItem*> >::iterator it;
669 std::string propertyName;
672 for(std::size_t i = 0; i < groupingProperties.size(); ++i)
674 propertyName +=
"_" + groupingProperties[i]->getName();
677 value +=
"_" + inputDataSet->
getAsString(propertyIndex);
680 propertyName.erase(propertyName.begin());
681 value.erase(value.begin());
683 for(it = groupValues.begin(); it != groupValues.end(); ++it)
685 if(it->first == value)
687 it->second.push_back(dataSetItem);
695 dataSetItemVector.push_back(dataSetItem);
696 groupValues.insert(std::pair<std::string, std::vector<te::mem::DataSetItem*> >(value, dataSetItemVector));
704 const std::vector<te::mem::DataSetItem*>& items)
706 std::map<std::string, std::string> result;
708 std::map<te::dt::Property*, std::vector<te::stat::StatisticalSummary> >::const_iterator it = statisticalSummary.begin();
710 while(it != statisticalSummary.end())
714 std::vector<std::string> values;
715 std::string propertyName = it->first->getName();
718 for(std::size_t i = 0; i < items.size(); ++i)
720 if (!items[i]->isNull(index))
721 values.push_back(items[i]->getString(index));
727 result.insert( std::map<std::string, std::string>::value_type( propertyName +
"_MIN_VALUE", ss.
m_minVal ));
728 result.insert( std::map<std::string, std::string>::value_type( propertyName +
"_MAX_VALUE", ss.
m_maxVal ));
729 result.insert( std::map<std::string, std::string>::value_type( propertyName +
"_COUNT", boost::lexical_cast<std::string>(items.size())));
730 result.insert( std::map<std::string, std::string>::value_type( propertyName +
"_VALID_COUNT", boost::lexical_cast<std::string>(values.size())));
739 const std::vector<te::mem::DataSetItem*>& items)
741 std::map<std::string, double> result;
743 std::map<te::dt::Property*, std::vector<te::stat::StatisticalSummary> >::const_iterator it = statisticalSummary.begin();
745 while(it != statisticalSummary.end())
749 std::string propertyName = it->first->getName();
751 std::size_t type = items[0]->getParent()->getPropertyDataType(index);
753 std::vector<double> values;
754 for(std::size_t i = 0; i < items.size(); ++i)
756 if (!items[i]->isNull(index))
760 numval = items[i]->getInt16(index);
762 numval = items[i]->getInt32(index);
764 numval = (double)items[i]->getInt64(index);
766 numval = items[i]->getFloat(index);
768 numval = items[i]->getDouble(index);
769 values.push_back(numval);
776 result.insert( std::map<std::string, double>::value_type( propertyName +
"_MIN_VALUE", ss.
m_minVal ) );
777 result.insert( std::map<std::string, double>::value_type( propertyName +
"_MAX_VALUE", ss.
m_maxVal ) );
778 result.insert( std::map<std::string, double>::value_type( propertyName +
"_COUNT", items.size()) );
779 result.insert( std::map<std::string, double>::value_type( propertyName +
"_VALID_COUNT", values.size()) );
780 result.insert( std::map<std::string, double>::value_type( propertyName +
"_MEAN", ss.
m_mean ) );
781 result.insert( std::map<std::string, double>::value_type( propertyName +
"_SUM", ss.
m_sum ) );
782 result.insert( std::map<std::string, double>::value_type( propertyName +
"_STANDARD_DEVIATION", ss.
m_stdDeviation ) );
783 result.insert( std::map<std::string, double>::value_type( propertyName +
"_VARIANCE", ss.
m_variance ) );
784 result.insert( std::map<std::string, double>::value_type( propertyName +
"_SKEWNESS", ss.
m_skewness ) );
785 result.insert( std::map<std::string, double>::value_type( propertyName +
"_KURTOSIS", ss.
m_kurtosis ) );
786 result.insert( std::map<std::string, double>::value_type( propertyName +
"_AMPLITUDE", ss.
m_amplitude ) );
787 result.insert( std::map<std::string, double>::value_type( propertyName +
"_MEDIAN", ss.
m_median ) );
788 result.insert( std::map<std::string, double>::value_type( propertyName +
"_VAR_COEFF", ss.
m_varCoeff ) );
790 for(std::size_t i = 0; i < ss.
m_mode.size(); ++i)
791 result.insert( std::map<std::string, double>::value_type( boost::lexical_cast<std::string>(idProp) +
"_" +
792 boost::lexical_cast<std::string>(i) +
"_" +
793 propertyName +
"_MODE", ss.
m_mode[i] ) );
std::vector< double > m_mode
virtual std::string getPropertyName(std::size_t i) const =0
It returns the property name at position pos.
virtual double getDouble(std::size_t i) const =0
Method for retrieving a double attribute value.
void setGeometryType(GeomType t)
It sets the geometry subtype.
bool isActive() const
Verify if the task is active.
virtual std::size_t getNumProperties() const =0
It returns the number of properties that composes an item of the dataset.
const DataSetTypeCapabilities & getDataSetTypeCapabilities() const
virtual void createDataSet(DataSetType *dt, const std::map< std::string, std::string > &options)
It creates the dataset schema definition in the target data source.
te::da::DataSet * getParent() const
It returns its parent.
void setGeometry(std::size_t i, te::gm::Geometry *value)
It sets the value of the i-th property.
A class that models the name of a dataset used in a From clause.
te::gm::GeomType GeomOpResultType(te::gm::GeomType firstGeom, te::gm::GeomType secondGeom)
An atomic property like an integer or double.
TEVPEXPORT bool Aggregation(const std::string &inDataset, te::da::DataSource *inDatasource, const std::vector< te::dt::Property * > &groupingProperties, const std::map< te::dt::Property *, std::vector< te::stat::StatisticalSummary > > &statisticalSummary, const std::string &outDataset, te::da::DataSource *outDatasource)
Executes the Aggregation Geographical Operation and persists the result as a dataset in a given outpu...
An converter for DataSetType.
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
virtual std::string getAsString(std::size_t i, int precision=0) const
Method for retrieving a data value as a string plain representation.
virtual const DataSourceCapabilities & getCapabilities() const =0
It returns the known capabilities of the data source.
The subtraction operator.
A Select models a query to be used when retrieving data from a DataSource.
TESTATEXPORT void GetStringStatisticalSummary(std::vector< std::string > &values, te::stat::StringStatisticalSummary &ss)
int getSRID() const
It returns the spatial reference system identifier associated to this property.
void setTotalSteps(int value)
Set the task total stepes.
The type for string types: FIXED_STRING, VAR_STRING or STRING.
bool supportsSpatialSQLDialect() const
te::gm::Geometry * GetGeometryUnion(const std::vector< te::mem::DataSetItem * > &items, size_t geomIdx, te::gm::GeomType outGeoType)
It returns the union of a geometry vector.
std::map< std::string, std::vector< te::mem::DataSetItem * > > GetGroups(te::da::DataSet *inputDataSet, const std::vector< te::dt::Property * > &groupingProperties)
const std::string & getName() const
It returns the property name.
void add(DataSetItem *item)
It adds a new item to the dataset and takes its ownership.
The Field class can be used to model an expression that takes part of the output items of a SELECT...
virtual bool moveNext()=0
It moves the internal pointer to the next item of the collection.
It describes a primary key (pk) constraint.
boost::ptr_vector< FromItem > From
It models the FROM clause for a query.
const QueryCapabilities & getQueryCapabilities() const
An implementation of the DatasetItem class for the TerraLib In-Memory Data Access driver...
virtual void addPrimaryKey(const std::string &datasetName, PrimaryKey *pk)
It adds a primary key constraint to the dataset schema.
const std::string & getName() const
It returns the property name.
void add(Constraint *c)
It adds a new constraint.
virtual std::string getNumeric(std::size_t i) const =0
Method for retrieving a numeric attribute value.
void setGroupBy(GroupBy *g)
It sets the list of expressions used to condense the result set.
void setInt32(std::size_t i, boost::int32_t value)
It sets the value of the i-th property.
A class that models the name of any property of an object.
virtual bool isNull(std::size_t i) const =0
It checks if the attribute value is NULL.
te::da::DataSetType * BuildOutputDataSetType(const std::string &name, const std::vector< te::dt::Property * > &properties, const std::map< te::dt::Property *, std::vector< te::stat::StatisticalSummary > > &statisticalSummary)
A class that represents the known capabilities of a specific data source, i.e. this class informs all...
boost::ptr_vector< Field > Fields
Fields is just a boost::ptr_vector of Field pointers.
Max statistical function.
void setValue(std::size_t i, te::dt::AbstractData *value)
It sets the value of the i-th property.
Aggregation Vector Processing functions.
ST_Union statistical function.
GeomType getGeometryType() const
It returns the geometry subtype allowed for the property.
Configuration flags for the Terrralib Vector Processing module.
void SetOutputDatasetQuery(const std::vector< te::dt::Property * > &groupingProperties, te::da::DataSet *dsQuery, te::mem::DataSet *outputDataSet, te::gm::GeomType outGeoType)
An abstract class that models a source of data in a query.
Utility functions for the data access module.
void setDouble(std::size_t i, double value)
It sets the value of the i-th property.
StdDev statistical function.
void pulse()
Calls setCurrentStep() function using getCurrentStep() + 1.
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
virtual int getPropertyDataType(std::size_t i) const =0
It returns the underlying data type of the property at position pos.
virtual std::auto_ptr< te::dt::AbstractData > getValue(std::size_t i) const
Method for retrieving any other type of data value stored in the data source.
GeomType
Each enumerated type is compatible with a Well-known Binary (WKB) type code.
A structure to hold the set of statistics from a set of numerical values.
std::map< std::string, double > CalculateDoubleGroupingFunctions(const std::map< te::dt::Property *, std::vector< te::stat::StatisticalSummary > > &statisticalSummary, const std::vector< te::mem::DataSetItem * > &items)
bool supportsPrimaryKey() const
A structure to hold the set of statistics from a set of categorical (sample) values.
virtual std::auto_ptr< DataSet > query(const Select &q, te::common::TraverseType travType=te::common::FORWARDONLY, const te::common::AccessPolicy accessPolicy=te::common::RAccess)
It executes a query that may return some data using a generic query. This method always returns a dis...
std::size_t getNumProperties() const
It returns the number of properties that composes an item of the dataset.
virtual bool moveBeforeFirst()=0
It moves the internal pointer to a position before the first item in the collection.
void setString(std::size_t i, const std::string &value)
It sets the value of the i-th property.
virtual void add(const std::string &datasetName, DataSet *d, const std::map< std::string, std::string > &options, std::size_t limit=0)
It adds data items to the dataset in the data source.
A class that can be used in a GROUP BY clause.
std::map< std::string, std::string > CalculateStringGroupingFunctions(const std::map< te::dt::Property *, std::vector< te::stat::StatisticalSummary > > &statisticalSummary, const std::vector< te::mem::DataSetItem * > &items)
An exception class for the Vector processing module.
bool supportsPreparedQueryAPI() const
Min statistical function.
TEDATAACCESSEXPORT std::size_t GetPropertyPos(const DataSet *dataset, const std::string &name)
An abstract class for data providers like a DBMS, Web Services or a regular file. ...
boost::ptr_vector< GroupByItem > GroupBy
A class that can be used to model a GROUP BY clause.
It is a collection of other geometric objects.
A class that models the description of a dataset.
DataSetType * getResult() const
int getPropertyDataType(std::size_t pos) const
It returns the type of the pos-th property.
void add(te::dt::Property *p)
It adds a property to the list of properties of the primary key.
It models a property definition.
This is an abstract class that models a query expression.
bool moveBeforeFirst()
It moves the internal pointer to a position before the first item in the collection.
void useTimer(bool flag)
Used to define if task use progress timer information.
This class can be used to inform the progress of a task.
virtual std::auto_ptr< DataSet > getDataSet(const std::string &name, te::common::TraverseType travType=te::common::FORWARDONLY, const te::common::AccessPolicy accessPolicy=te::common::RAccess)
It gets the dataset identified by the given name. This method always returns a disconnected dataset...
Variance statistical function.
TESTATEXPORT void GetNumericStatisticalSummary(std::vector< double > &values, te::stat::NumericStatisticalSummary &ss, double nullVal)
bool AggregationMemory(const std::string &inDataset, te::da::DataSource *inDatasource, const std::vector< te::dt::Property * > &groupingProperties, const std::map< te::dt::Property *, std::vector< te::stat::StatisticalSummary > > &statisticalSummary, te::mem::DataSet *outputDataSet, te::gm::GeomType outGeoType)
virtual std::auto_ptr< te::gm::Geometry > getGeometry(std::size_t i) const =0
Method for retrieving a geometric attribute value.
void setSRID(int srid)
It sets the spatial reference system identifier associated to this property.
void setGeometryN(std::size_t i, Geometry *g)
It sets the n-th geometry in this geometry collection.
bool AggregationQuery(const std::string &inDataset, te::da::DataSource *inDatasource, const std::vector< te::dt::Property * > &groupingProperties, const std::map< te::dt::Property *, std::vector< te::stat::StatisticalSummary > > &statisticalSummary, te::mem::DataSet *outputDataSet, te::gm::GeomType outGeoType)
#define TR_VP(message)
It marks a string in order to get translated. This is a special mark used in the Terrralib Vector Pro...
A dataset is the unit of information manipulated by the data access module of TerraLib.
Avg statistical function.
TESTATEXPORT std::string GetStatSummaryShortName(const int &e)
Get the statistical parameter short name from its enumerator.
TEDATAACCESSEXPORT DataSetAdapter * CreateAdapter(DataSet *ds, DataSetTypeConverter *converter, bool isOwner=false)
virtual std::auto_ptr< te::da::DataSetType > getDataSetType(const std::string &name)
It gets information about the given dataset.
Count statistical function.