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;
67 static const string _sTypeName;
70 static const vector<string> _sValidAttrs;
79 virtual void handleContent(
const string& content);
83 const string& type()
const
87 const string& dimName()
const
91 const string& recheckEvery()
const
96 bool isJoinNewAggregation()
const;
97 bool isUnionAggregation()
const;
98 bool isJoinExistingAggregation()
const;
125 string printAggregationVariables()
const;
127 typedef vector<string>::const_iterator AggVarIter;
128 AggVarIter beginAggVarIter()
const;
129 AggVarIter endAggVarIter()
const;
175 void processJoinNew();
176 void processJoinExisting();
184 void unionAddAllRequiredNonAggregatedVariablesFrom(
const DDS& templateDDS);
204 void fillDimensionCacheForJoinExistingDimension(agg_util::AMDList& granuleList,
const std::string& aggDimName);
207 bool doesFirstGranuleSpecifyNcoords()
const;
210 bool doAllGranulesSpecifyNcoords()
const;
216 void seedDimensionCacheFromUserSpecs(agg_util::AMDList& rGranuleList)
const;
223 void addNewDimensionForJoinExisting(
const agg_util::AMDList& rGranuleList);
235 void decideWhichVariablesToJoinExist(
const libdap::DDS& templateDDS);
250 void findVariablesWithOuterDimensionName(vector<string>& oMatchingVars,
const DDS& templateDDS,
251 const string& outerDimName)
const;
254 struct JoinAggParams {
256 _pAggVarTemplate(0), _pAggDim(0), _memberDatasets()
262 _pAggVarTemplate = NULL;
264 _memberDatasets.clear();
265 _memberDatasets.resize(0);
268 libdap::BaseType* _pAggVarTemplate;
270 agg_util::AMDList _memberDatasets;
281 void getParamsForJoinAggOnVariable(JoinAggParams* pOutParams,
const DDS& aggOutputDDS,
const std::string& varName,
282 const DDS& templateDDS);
292 void processJoinNewOnAggVar(DDS* pAggDDS,
const std::string& varName,
const DDS& templateDDS);
302 void processJoinExistingOnAggVar(DDS* pAggDDS,
const std::string& varName,
const DDS& templateDDS);
324 void processAggVarJoinNewForArray(DDS& aggDDS,
const Array& arrayTemplate,
const agg_util::Dimension& dim,
325 const agg_util::AMDList& memberDatasets);
352 void processAggVarJoinNewForGrid(DDS& aggDDS,
const Grid& gridTemplate,
const agg_util::Dimension& dim,
353 const agg_util::AMDList& memberDatasets);
355 void processAggVarJoinExistingForArray(DDS& aggDDS,
const libdap::Array& arrayTemplate,
358 void processAggVarJoinExistingForGrid(DDS& aggDDS,
const Grid& gridTemplate,
const agg_util::Dimension& dim,
359 const agg_util::AMDList& memberDatasets);
365 void collectDatasetsInOrder(vector<const DDS*>& ddsList)
const;
375 void collectAggMemberDatasets(agg_util::AMDList& rMemberDatasets)
const;
381 void processAnyScanElements();
394 void mergeDimensions(
bool checkDimensionMismatch =
true,
const std::string& dimToSkip =
"");
397 void processParentDatasetCompleteForJoinNew();
400 void processParentDatasetCompleteForJoinExisting();
411 void processPlaceholderCoordinateVariableForJoinExisting(
const libdap::BaseType& placeholderVar,
412 libdap::Array* pNewVar);
423 libdap::Array* ensureVariableIsProperNewCoordinateVariable(libdap::BaseType* pBT,
const agg_util::Dimension& dim,
424 bool throwIfInvalid)
const;
449 libdap::Array* findMatchingCoordinateVariable(
const DDS& dds,
const agg_util::Dimension& dim,
450 bool throwOnInvalidCV =
true)
const;
474 libdap::Array* processDeferredCoordinateVariable(libdap::BaseType* pBT,
const agg_util::Dimension& dim);
496 auto_ptr<libdap::Array> createCoordinateVariableForNewDimension(
const agg_util::Dimension& dim)
const;
511 libdap::Array* createAndAddCoordinateVariableForNewDimension(libdap::DDS& dds,
const agg_util::Dimension& dim);
528 auto_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingCoordValue(
530 auto_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingCoordValueAsDouble(
532 auto_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingCoordValueAsString(
543 auto_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingLocation(
const agg_util::Dimension& dim)
const;
546 static void addCoordinateAxisType(libdap::Array& rCV,
const std::string& cat);
549 static vector<string> getValidAttributes();
556 string _recheckEvery;
563 vector<NetcdfElement*> _datasets;
566 vector<ScanElement*> _scanners;
570 vector<string> _aggVars;
573 bool _gotVariableAggElement;
577 bool _wasAggregatedMapAddedForJoinExistingGrid;
581 std::string _coordinateAxisType;