29#ifndef __NCML_MODULE__AGGREGATION_ELEMENT_H__
30#define __NCML_MODULE__AGGREGATION_ELEMENT_H__
34#include "AggMemberDataset.h"
35#include "AggregationUtil.h"
36#include "ArrayJoinExistingAggregation.h"
38#include "NCMLElement.h"
54using libdap::BaseType;
69 static const string _sTypeName;
72 static const vector<string> _sValidAttrs;
81 virtual void handleContent(
const string& content);
85 const string& type()
const
89 const string& dimName()
const
93 const string& recheckEvery()
const
98 bool isJoinNewAggregation()
const;
99 bool isUnionAggregation()
const;
100 bool isJoinExistingAggregation()
const;
127 string printAggregationVariables()
const;
129 typedef vector<string>::const_iterator AggVarIter;
130 AggVarIter beginAggVarIter()
const;
131 AggVarIter endAggVarIter()
const;
177 void processJoinNew();
178 void processJoinExisting();
186 void unionAddAllRequiredNonAggregatedVariablesFrom(
const DDS& templateDDS);
206 void fillDimensionCacheForJoinExistingDimension(agg_util::AMDList& granuleList,
const std::string& aggDimName);
209 bool doesFirstGranuleSpecifyNcoords()
const;
212 bool doAllGranulesSpecifyNcoords()
const;
218 void seedDimensionCacheFromUserSpecs(agg_util::AMDList& rGranuleList)
const;
225 void addNewDimensionForJoinExisting(
const agg_util::AMDList& rGranuleList);
237 void decideWhichVariablesToJoinExist(
const libdap::DDS& templateDDS);
252 void findVariablesWithOuterDimensionName(vector<string>& oMatchingVars,
const DDS& templateDDS,
253 const string& outerDimName)
const;
256 struct JoinAggParams {
258 _pAggVarTemplate(0), _pAggDim(0), _memberDatasets()
264 _pAggVarTemplate = NULL;
266 _memberDatasets.clear();
267 _memberDatasets.resize(0);
270 libdap::BaseType* _pAggVarTemplate;
272 agg_util::AMDList _memberDatasets;
283 void getParamsForJoinAggOnVariable(JoinAggParams* pOutParams,
const DDS& aggOutputDDS,
const std::string& varName,
284 const DDS& templateDDS);
294 void processJoinNewOnAggVar(DDS* pAggDDS,
const std::string& varName,
const DDS& templateDDS);
304 void processJoinExistingOnAggVar(DDS* pAggDDS,
const std::string& varName,
const DDS& templateDDS);
326 static void processAggVarJoinNewForArray(DDS& aggDDS,
const Array& arrayTemplate,
const agg_util::Dimension& dim,
327 const agg_util::AMDList& memberDatasets);
354 void processAggVarJoinNewForGrid(DDS& aggDDS,
const Grid& gridTemplate,
const agg_util::Dimension& dim,
355 const agg_util::AMDList& memberDatasets);
357 static void processAggVarJoinExistingForArray(DDS& aggDDS,
const libdap::Array& arrayTemplate,
360 void processAggVarJoinExistingForGrid(DDS& aggDDS,
const Grid& gridTemplate,
const agg_util::Dimension& dim,
361 const agg_util::AMDList& memberDatasets);
367 void collectDatasetsInOrder(vector<const DDS*>& ddsList)
const;
377 void collectAggMemberDatasets(agg_util::AMDList& rMemberDatasets)
const;
383 void processAnyScanElements();
396 void mergeDimensions(
bool checkDimensionMismatch =
true,
const std::string& dimToSkip =
"");
399 void processParentDatasetCompleteForJoinNew();
402 void processParentDatasetCompleteForJoinExisting();
413 void processPlaceholderCoordinateVariableForJoinExisting(
const libdap::BaseType& placeholderVar,
414 libdap::Array* pNewVar);
425 libdap::Array* ensureVariableIsProperNewCoordinateVariable(libdap::BaseType* pBT,
const agg_util::Dimension& dim,
426 bool throwIfInvalid)
const;
451 libdap::Array* findMatchingCoordinateVariable(
const DDS& dds,
const agg_util::Dimension& dim,
452 bool throwOnInvalidCV =
true)
const;
476 libdap::Array* processDeferredCoordinateVariable(libdap::BaseType* pBT,
const agg_util::Dimension& dim);
498 std::unique_ptr<libdap::Array> createCoordinateVariableForNewDimension(
const agg_util::Dimension& dim)
const;
513 libdap::Array* createAndAddCoordinateVariableForNewDimension(libdap::DDS& dds,
const agg_util::Dimension& dim);
530 std::unique_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingCoordValue(
532 std::unique_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingCoordValueAsDouble(
534 std::unique_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingCoordValueAsString(
545 std::unique_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingLocation(
const agg_util::Dimension& dim)
const;
548 static void addCoordinateAxisType(libdap::Array& rCV,
const std::string& cat);
551 static vector<string> getValidAttributes();
558 string _recheckEvery;
565 vector<NetcdfElement*> _datasets;
568 vector<ScanElement*> _scanners;
572 vector<string> _aggVars;
575 bool _gotVariableAggElement;
579 bool _wasAggregatedMapAddedForJoinExistingGrid;
583 std::string _coordinateAxisType;
virtual string toString() const
const std::string & getAggregationVariableCoordinateAxisType() const
void setAggregationVariableCoordinateAxisType(const std::string &cat)
void setVariableAggElement()
void addChildDataset(NetcdfElement *pDataset)
NetcdfElement * setParentDataset(NetcdfElement *parent)
Private Impl.
void processParentDatasetComplete()
void addScanElement(ScanElement *pScanner)
bool isAggregationVariable(const string &name) const
bool gotVariableAggElement() const
virtual void setAttributes(const XMLAttributeMap &attrs)
virtual void handleBegin()
virtual const string & getTypeName() const
void addAggregationVariable(const string &name)
virtual AggregationElement * clone() const
Base class for NcML element concrete classes.
Concrete class for NcML <netcdf> element.
Helper class for temporarily hijacking an existing dhi to load a DDX response for one particular file...
NcML Parser for adding/modifying/removing metadata (attributes) to existing local datasets using NcML...