29#ifndef __AGG_UTIL__AGGREGATION_UTIL_H__
30#define __AGG_UTIL__AGGREGATION_UTIL_H__
32#include <libdap/AttrTable.h>
82 virtual libdap::Array*
readAndGetArray(
const std::string& name,
const libdap::DDS& dds,
83 const libdap::Array*
const pConstraintTemplate,
const std::string& debugChannel)
const = 0;
95 TopLevelArrayGetter();
96 virtual ~TopLevelArrayGetter();
98 virtual TopLevelArrayGetter*
clone()
const;
106 virtual libdap::Array*
readAndGetArray(
const std::string& name,
const libdap::DDS& dds,
107 const libdap::Array*
const pConstraintTemplate,
const std::string& debugChannel)
const;
112 TopLevelGridDataArrayGetter();
113 virtual ~TopLevelGridDataArrayGetter();
115 virtual TopLevelGridDataArrayGetter*
clone()
const;
128 virtual libdap::Array*
readAndGetArray(
const std::string& name,
const libdap::DDS& dds,
129 const libdap::Array*
const pConstraintTemplate,
const std::string& debugChannel)
const;
134 TopLevelGridMapArrayGetter(
const std::string& gridName);
135 virtual ~TopLevelGridMapArrayGetter();
137 virtual TopLevelGridMapArrayGetter*
clone()
const;
149 virtual libdap::Array*
readAndGetArray(
const std::string& name,
const libdap::DDS& dds,
150 const libdap::Array*
const pConstraintTemplate,
const std::string& debugChannel)
const;
153 const string _gridName;
164class AggregationUtil {
174 static int d_last_added_cv_position;
179 typedef std::vector<const libdap::DDS*> ConstDDSList;
195 static void unionAttrsInto(libdap::AttrTable* pOut,
const libdap::AttrTable& fromTable);
201 static bool findAttribute(
const libdap::AttrTable& inTable,
const string& name, libdap::AttrTable::Attr_iter& attr);
221 static void unionAllVariablesInto(libdap::DDS* pOutputUnion,
const libdap::DDS& fromDDS,
bool add_at_top =
false);
230 bool add_at_top =
false);
286 static void produceOuterDimensionJoinedArray(libdap::Array* pJoinedArray,
const std::string& joinedArrayName,
287 const std::string& newOuterDimName,
const std::vector<libdap::Array*>& fromVars,
bool copyData);
297 bool enforceMatchingDimNames);
300 static bool doTypesMatch(
const libdap::Array& lhs,
const libdap::Array& rhs);
305 static bool doShapesMatch(
const libdap::Array& lhs,
const libdap::Array& rhs,
bool checkDimNames);
316 const std::string& collectVarName,
const ConstDDSList& datasetsInOrder);
347 static void joinArrayData(libdap::Array* pAggArray,
const std::vector<libdap::Array*>& varArrays,
348 bool reserveStorage =
true,
bool clearDataAfterUse =
false);
352 static void printDimensions(std::ostream& os,
const libdap::Array& fromArray);
359 static void printConstraints(std::ostream& os,
const libdap::Array& fromArray);
388 static void transferArrayConstraints(libdap::Array* pToArray,
const libdap::Array& fromArray,
bool skipFirstFromDim,
389 bool skipFirstToDim,
bool printDebug =
false,
const std::string& debugChannel =
"agg_util");
405 static libdap::BaseType*
getVariableNoRecurse(
const libdap::Constructor& varContainer,
const std::string& name);
417 static const libdap::Array*
findMapByName(
const libdap::Grid& inGrid,
const std::string& findName);
439 const std::string& debugChannel);
460 unsigned int atIndex,
461 const libdap::Array& constrainedTemplateArray,
462 const string& varName,
465 const string& debugChannel
490 while (!vecToClear.empty()) {
491 T* pElt = vecToClear.back();
493 vecToClear.pop_back();
501 while (!vecToClear.empty()) {
502 T* pElt = vecToClear.back();
504 vecToClear.pop_back();
512 class std::vector<T*>::const_iterator it;
513 class std::vector<T*>::const_iterator endIt = fromVec.end();
514 for (it = fromVec.begin(); it != endIt; ++it) {
519 intoVec.push_back(pElt);
static void addDatasetArrayDataToAggregationOutputArray(libdap::Array &oOutputArray, unsigned int atIndex, const libdap::Array &constrainedTemplateArray, const string &varName, AggMemberDataset &dataset, const ArrayGetterInterface &arrayGetter, const string &debugChannel)
static void printConstraintsToDebugChannel(const std::string &debugChannel, const libdap::Array &fromArray)
static void gatherMetadataChangesFrom(libdap::BaseType *pIntoVar, const libdap::BaseType &fromVar)
static LibdapType * findTypedVariableAtDDSTopLevel(const libdap::DDS &dds, const string &name)
static bool doTypesMatch(const libdap::Array &lhs, const libdap::Array &rhs)
static unsigned int collectVariableArraysInOrder(std::vector< libdap::Array * > &varArrays, const std::string &collectVarName, const ConstDDSList &datasetsInOrder)
static void transferArrayConstraints(libdap::Array *pToArray, const libdap::Array &fromArray, bool skipFirstFromDim, bool skipFirstToDim, bool printDebug=false, const std::string &debugChannel="agg_util")
static void printDimensions(std::ostream &os, const libdap::Array &fromArray)
static libdap::Array * readDatasetArrayDataForAggregation(const libdap::Array &constrainedTemplateArray, const std::string &varName, AggMemberDataset &dataset, const ArrayGetterInterface &arrayGetter, const std::string &debugChannel)
static void performUnionAggregation(libdap::DDS *pOutputUnion, const ConstDDSList &datasetsInOrder)
static libdap::BaseType * getVariableNoRecurse(const libdap::DDS &dds, const std::string &name)
static void unionAllVariablesInto(libdap::DDS *pOutputUnion, const ConstDDSList &datasetsInOrder)
static libdap::Array * getAsArrayIfPossible(libdap::BaseType *pBT)
static bool couldBeCoordinateVariable(libdap::BaseType *pBT)
static const libdap::Array * findMapByName(const libdap::Grid &inGrid, const std::string &findName)
static bool addCopyOfVariableIfNameIsAvailable(libdap::DDS *pOutDDS, const libdap::BaseType &varProto, bool add_at_top=false)
static void addOrReplaceVariableForName(libdap::DDS *pOutDDS, const libdap::BaseType &varProto)
static void unionAttrsInto(libdap::AttrTable *pOut, const libdap::AttrTable &fromTable)
static bool doShapesMatch(const libdap::Array &lhs, const libdap::Array &rhs, bool checkDimNames)
static bool findAttribute(const libdap::AttrTable &inTable, const string &name, libdap::AttrTable::Attr_iter &attr)
static void resetCVInsertionPosition()
static bool validateArrayTypesAndShapesMatch(const std::vector< libdap::Array * > &arrays, bool enforceMatchingDimNames)
static void printConstraints(std::ostream &os, const libdap::Array &fromArray)
static libdap::BaseType * findVariableAtDDSTopLevel(const libdap::DDS &dds, const string &name)
Helper class for temporarily hijacking an existing dhi to load a DDX response for one particular file...
void clearAndUnrefAllElements(std::vector< T * > &vecToClear)
void clearVectorAndDeletePointers(std::vector< T * > &vecToClear)
void appendVectorOfRCObject(std::vector< T * > &intoVec, const std::vector< T * > &fromVec)
virtual ArrayGetterInterface * clone() const =0
virtual libdap::Array * readAndGetArray(const std::string &name, const libdap::DDS &dds, const libdap::Array *const pConstraintTemplate, const std::string &debugChannel) const =0
virtual libdap::Array * readAndGetArray(const std::string &name, const libdap::DDS &dds, const libdap::Array *const pConstraintTemplate, const std::string &debugChannel) const
virtual TopLevelArrayGetter * clone() const
virtual libdap::Array * readAndGetArray(const std::string &name, const libdap::DDS &dds, const libdap::Array *const pConstraintTemplate, const std::string &debugChannel) const
virtual TopLevelGridDataArrayGetter * clone() const
virtual TopLevelGridMapArrayGetter * clone() const
virtual libdap::Array * readAndGetArray(const std::string &name, const libdap::DDS &dds, const libdap::Array *const pConstraintTemplate, const std::string &debugChannel) const