63class AggregationElement:
public NCMLElement {
65 AggregationElement& operator=(
const AggregationElement& rhs);
69 static const string _sTypeName;
75 AggregationElement(
const AggregationElement& proto);
76 virtual ~AggregationElement();
78 virtual AggregationElement*
clone()
const;
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;
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,
358 const agg_util::Dimension& dim,
const agg_util::AMDList& memberDatasets);
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(
531 const agg_util::Dimension& dim)
const;
532 std::unique_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingCoordValueAsDouble(
533 const agg_util::Dimension& dim)
const;
534 std::unique_ptr<libdap::Array> createCoordinateVariableForNewDimensionUsingCoordValueAsString(
535 const agg_util::Dimension& dim)
const;
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;
561 NetcdfElement* _parent;
565 vector<NetcdfElement*> _datasets;
568 vector<ScanElement*> _scanners;
572 vector<string> _aggVars;
575 bool _gotVariableAggElement;
579 bool _wasAggregatedMapAddedForJoinExistingGrid;
583 std::string _coordinateAxisType;