29 #ifndef __NCML_MODULE__AGGREGATION_ELEMENT_H__
30 #define __NCML_MODULE__AGGREGATION_ELEMENT_H__
32 #include "AggMemberDataset.h"
33 #include "AggregationUtil.h"
34 #include "ArrayJoinExistingAggregation.h"
36 #include "NCMLElement.h"
52 using libdap::BaseType;
68 static const string _sTypeName;
71 static const vector<string> _sValidAttrs;
84 const string& type()
const
88 const string& dimName()
const
92 const string& recheckEvery()
const
97 bool isJoinNewAggregation()
const;
98 bool isUnionAggregation()
const;
99 bool isJoinExistingAggregation()
const;
126 string printAggregationVariables()
const;
128 typedef vector<string>::const_iterator AggVarIter;
129 AggVarIter beginAggVarIter()
const;
130 AggVarIter endAggVarIter()
const;
176 void processJoinNew();
177 void processJoinExisting();
185 void unionAddAllRequiredNonAggregatedVariablesFrom(
const DDS& templateDDS);
205 void fillDimensionCacheForJoinExistingDimension(agg_util::AMDList& granuleList,
const std::string& aggDimName);
208 bool doesFirstGranuleSpecifyNcoords()
const;
211 bool doAllGranulesSpecifyNcoords()
const;
217 void seedDimensionCacheFromUserSpecs(agg_util::AMDList& rGranuleList)
const;
224 void addNewDimensionForJoinExisting(
const agg_util::AMDList& rGranuleList);
236 void decideWhichVariablesToJoinExist(
const libdap::DDS& templateDDS);
251 void findVariablesWithOuterDimensionName(vector<string>& oMatchingVars,
const DDS& templateDDS,
252 const string& outerDimName)
const;
255 struct JoinAggParams {
257 _pAggVarTemplate(0), _pAggDim(0), _memberDatasets()
263 _pAggVarTemplate = NULL;
265 _memberDatasets.clear();
266 _memberDatasets.resize(0);
269 libdap::BaseType* _pAggVarTemplate;
271 agg_util::AMDList _memberDatasets;
282 void getParamsForJoinAggOnVariable(JoinAggParams* pOutParams,
const DDS& aggOutputDDS,
const std::string& varName,
283 const DDS& templateDDS);
293 void processJoinNewOnAggVar(DDS* pAggDDS,
const std::string& varName,
const DDS& templateDDS);
303 void processJoinExistingOnAggVar(DDS* pAggDDS,
const std::string& varName,
const DDS& templateDDS);
325 void processAggVarJoinNewForArray(DDS& aggDDS,
const Array& arrayTemplate,
const agg_util::Dimension& dim,
326 const agg_util::AMDList& memberDatasets);
353 void processAggVarJoinNewForGrid(DDS& aggDDS,
const Grid& gridTemplate,
const agg_util::Dimension& dim,
354 const agg_util::AMDList& memberDatasets);
356 void processAggVarJoinExistingForArray(DDS& aggDDS,
const libdap::Array& arrayTemplate,
359 void processAggVarJoinExistingForGrid(DDS& aggDDS,
const Grid& gridTemplate,
const agg_util::Dimension& dim,
360 const agg_util::AMDList& memberDatasets);
366 void collectDatasetsInOrder(vector<const DDS*>& ddsList)
const;
376 void collectAggMemberDatasets(agg_util::AMDList& rMemberDatasets)
const;
382 void processAnyScanElements();
395 void mergeDimensions(
bool checkDimensionMismatch =
true,
const std::string& dimToSkip =
"");
398 void processParentDatasetCompleteForJoinNew();
401 void processParentDatasetCompleteForJoinExisting();
412 void processPlaceholderCoordinateVariableForJoinExisting(
const libdap::BaseType& placeholderVar,
413 libdap::Array* pNewVar);
424 libdap::Array* ensureVariableIsProperNewCoordinateVariable(libdap::BaseType* pBT,
const agg_util::Dimension& dim,
425 bool throwIfInvalid)
const;
450 libdap::Array* findMatchingCoordinateVariable(
const DDS& dds,
const agg_util::Dimension& dim,
451 bool throwOnInvalidCV =
true)
const;
475 libdap::Array* processDeferredCoordinateVariable(libdap::BaseType* pBT,
const agg_util::Dimension& dim);
497 auto_ptr<libdap::Array> createCoordinateVariableForNewDimension(
const agg_util::Dimension& dim)
const;
512 libdap::Array* createAndAddCoordinateVariableForNewDimension(libdap::DDS& dds,
const agg_util::Dimension& dim);
529 auto_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingCoordValue(
531 auto_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingCoordValueAsDouble(
533 auto_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingCoordValueAsString(
544 auto_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingLocation(
const agg_util::Dimension& dim)
const;
547 static void addCoordinateAxisType(libdap::Array& rCV,
const std::string& cat);
550 static vector<string> getValidAttributes();
557 string _recheckEvery;
564 vector<NetcdfElement*> _datasets;
567 vector<ScanElement*> _scanners;
571 vector<string> _aggVars;
574 bool _gotVariableAggElement;
578 bool _wasAggregatedMapAddedForJoinExistingGrid;
582 std::string _coordinateAxisType;