34#include <libdap/Marshaller.h>
37#include "BESStopWatch.h"
39#include "ArrayJoinExistingAggregation.h"
41#include "AggregationException.h"
42#include "AggregationUtil.h"
45#define DEBUG_CHANNEL "ncml:2"
50 AMDList memberDatasets, std::unique_ptr<ArrayGetterInterface> arrayGetter,
const Dimension& joinDim) :
54 BESDEBUG_FUNC(DEBUG_CHANNEL,
"Making the aggregated outer dimension be: " + joinDim.
toString() +
"\n");
59 libdap::Array::dimension& rOuterDim = *(dim_begin());
60 NCML_ASSERT_MSG(rOuterDim.name == joinDim.name,
"The outer dimension name of this is not the expected "
61 "outer dimension name! Broken precondition: This ctor cannot be called "
62 "without this being true!");
63 rOuterDim.size = joinDim.size;
70 BESDEBUG_FUNC(DEBUG_CHANNEL,
"Constrained Dims after set are: " + oss.str());
80ArrayJoinExistingAggregation::~ArrayJoinExistingAggregation()
85ArrayJoinExistingAggregation&
86ArrayJoinExistingAggregation::operator=(
const ArrayJoinExistingAggregation& rhs)
90 ArrayAggregationBase::operator=(rhs);
97ArrayJoinExistingAggregation*
113bool ArrayJoinExistingAggregation::serialize(libdap::ConstraintEvaluator &eval, libdap::DDS &dds, libdap::Marshaller &m,
124 if (!(send_p() || is_in_selection())) {
125 BESDEBUG_FUNC(DEBUG_CHANNEL,
"Object not in output, skipping... name=" << name() << endl);
143 const Array::dimension& outerDim = *(dim_begin());
145 "Aggregating datasets array with outer dimension constraints: " <<
" start=" << outerDim.start <<
" stride=" << outerDim.stride <<
" stop=" << outerDim.stop << endl);
150 m.put_vector_start(length());
152 reserve_value_capacity();
157 NCML_ASSERT(!datasets.empty());
158 int currDatasetIndex = 0;
159 const AggMemberDataset* pCurrDataset = (datasets[currDatasetIndex]).get();
161 int outerDimIndexOfCurrDatasetHead = 0;
162 int currDatasetSize =
int(pCurrDataset->getCachedDimensionSize(_joinDim.name));
163 bool currDatasetWasRead =
false;
166 unsigned int nextOutputBufferElementIndex = 0;
171 for (
int outerDimIndex = outerDim.start; outerDimIndex <= outerDim.stop && outerDimIndex < outerDim.size;
172 outerDimIndex += outerDim.stride) {
174 int localGranuleIndex = outerDimIndex - outerDimIndexOfCurrDatasetHead;
178 while (localGranuleIndex >= currDatasetSize) {
179 localGranuleIndex -= currDatasetSize;
180 outerDimIndexOfCurrDatasetHead += currDatasetSize;
182 NCML_ASSERT(currDatasetIndex <
int(datasets.size()));
183 pCurrDataset = datasets[currDatasetIndex].get();
184 currDatasetSize = pCurrDataset->getCachedDimensionSize(_joinDim.name);
185 currDatasetWasRead =
false;
187 BESDEBUG_FUNC(DEBUG_CHANNEL,
188 "The constraint traversal passed a granule boundary " <<
"on the outer dimension and is stepping forward into " <<
"granule index=" << currDatasetIndex << endl);
193 if (!currDatasetWasRead) {
194 BESDEBUG_FUNC(DEBUG_CHANNEL,
195 " Current granule dataset was traversed but not yet " "read and copied into output. Mapping constraints " "and calling read()..." << endl);
204 Array::Dim_iter outerDimIt = granuleConstraintTemplate.dim_begin();
209 outerDimIt->size = currDatasetSize;
210 outerDimIt->c_size = currDatasetSize;
215 int granuleStopIndex = std::min(outerDim.stop - outerDimIndexOfCurrDatasetHead,
216 currDatasetSize - 1);
221 int clampedStride = std::min(outerDim.stride, currDatasetSize);
223 granuleConstraintTemplate.add_constraint(outerDimIt, localGranuleIndex, clampedStride,
232 this->set_value_slice_from_row_major_vector(*pDatasetArray, nextOutputBufferElementIndex);
235 pDatasetArray->clear_local_data();
239 currDatasetWasRead =
true;
241 BESDEBUG_FUNC(DEBUG_CHANNEL,
242 " The granule index " << currDatasetIndex <<
" was read with constraints and copied into the aggregation output." << endl);
246 catch (AggregationException& ex) {
247 THROW_NCML_PARSE_ERROR(-1, ex.what());
257 status = libdap::Array::serialize(eval, dds, m, ce_eval);
261 status = libdap::Array::serialize(eval, dds, m, ce_eval);
270void ArrayJoinExistingAggregation::duplicate(
const ArrayJoinExistingAggregation& rhs)
272 _joinDim = rhs._joinDim;
275void ArrayJoinExistingAggregation::cleanup() noexcept
297 sw.
start(
"ArrayJoinExistingAggregation::readConstrainedGranuleArraysAndAggregateDataHook",
"");
300 const Array::dimension& outerDim = *(dim_begin());
302 "Aggregating datasets array with outer dimension constraints: " <<
" start=" << outerDim.start <<
" stride=" << outerDim.stride <<
" stop=" << outerDim.stop << endl);
306 reserve_value_capacity();
310 NCML_ASSERT(!datasets.empty());
311 int currDatasetIndex = 0;
314 int outerDimIndexOfCurrDatasetHead = 0;
316 bool currDatasetWasRead =
false;
319 unsigned int nextOutputBufferElementIndex = 0;
324 for (
int outerDimIndex = outerDim.start; outerDimIndex <= outerDim.stop && outerDimIndex < outerDim.size;
325 outerDimIndex += outerDim.stride) {
327 int localGranuleIndex = outerDimIndex - outerDimIndexOfCurrDatasetHead;
331 while (localGranuleIndex >= currDatasetSize) {
332 localGranuleIndex -= currDatasetSize;
333 outerDimIndexOfCurrDatasetHead += currDatasetSize;
335 NCML_ASSERT(currDatasetIndex <
int(datasets.size()));
336 pCurrDataset = datasets[currDatasetIndex].get();
338 currDatasetWasRead =
false;
340 BESDEBUG_FUNC(DEBUG_CHANNEL,
341 "The constraint traversal passed a granule boundary " <<
"on the outer dimension and is stepping forward into " <<
"granule index=" << currDatasetIndex << endl);
346 if (!currDatasetWasRead) {
347 BESDEBUG_FUNC(DEBUG_CHANNEL,
348 " Current granule dataset was traversed but not yet " "read and copied into output. Mapping constraints " "and calling read()..." << endl);
357 Array::Dim_iter outerDimIt = granuleConstraintTemplate.dim_begin();
362 outerDimIt->size = currDatasetSize;
363 outerDimIt->c_size = currDatasetSize;
368 int granuleStopIndex = std::min(outerDim.stop - outerDimIndexOfCurrDatasetHead, currDatasetSize - 1);
373 int clampedStride = std::min(outerDim.stride, currDatasetSize);
375 granuleConstraintTemplate.add_constraint(outerDimIt, localGranuleIndex, clampedStride, granuleStopIndex);
379 nextOutputBufferElementIndex,
387 currDatasetWasRead =
true;
389 BESDEBUG_FUNC(DEBUG_CHANNEL,
390 " The granule index " << currDatasetIndex <<
" was read with constraints and copied into the aggregation output." << endl);
396 THROW_NCML_PARSE_ERROR(-1, ex.what());
static bool IsSet(const std::string &flagName)
see if the debug context flagName is set to true
virtual bool start(std::string name)
virtual unsigned int getCachedDimensionSize(const std::string &dimName) const =0
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 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)
const AMDList & getDatasetList() const
libdap::Array & getGranuleTemplateArray()
const ArrayGetterInterface & getArrayGetterInterface() const
virtual void readConstrainedGranuleArraysAndAggregateDataHook()
virtual ArrayJoinExistingAggregation * ptr_duplicate()
virtual void transferOutputConstraintsIntoGranuleTemplateHook()
ArrayJoinExistingAggregation(const libdap::Array &granuleTemplate, AMDList memberDatasets, std::unique_ptr< ArrayGetterInterface > arrayGetter, const Dimension &joinDim)
Helper class for temporarily hijacking an existing dhi to load a DDX response for one particular file...
std::string toString() const