27#include <libdap/BaseType.h>
28#include <libdap/Structure.h>
29#include <libdap/Grid.h>
30#include <libdap/Array.h>
31#include <libdap/D4Maps.h>
32#include <libdap/D4Group.h>
33#include <libdap/DMR.h>
34#include <libdap/util.h>
38#include "grid_utils.h"
39#include "gse_parser.h"
41#include "GridGeoConstraint.h"
46void gse_restart(FILE * in);
49void gse_delete_buffer(
void *buffer);
50void *gse_string(
const char *yy_str);
60void get_grids(BaseType *bt, vector<Grid *> *grids)
66 grids->push_back(
static_cast<Grid*
>(bt));
69 case dods_structure_c: {
71 Structure &s =
static_cast<Structure&
>(*bt);
72 for (Structure::Vars_iter i = s.var_begin(); i != s.var_begin(); i++) {
91void get_grids(DDS &dds, vector<Grid *> *grids)
93 for (DDS::Vars_iter i = dds.var_begin(); i != dds.var_end(); i++) {
107bool is_geo_grid(Grid *grid)
119void parse_gse_expression(
gse_arg *arg, BaseType *expr)
122 void *cls = gse_string(extract_string_argument(expr).c_str());
124 bool status = gse_parse(arg) == 0;
125 gse_delete_buffer(cls);
127 throw Error(malformed_expr,
"Error parsing grid selection.");
130static void apply_grid_selection_expr(Grid *grid,
GSEClause *clause)
134 Grid::Map_iter map_i = grid->map_begin();
135 while (map_i != grid->map_end() && (*map_i)->name() != clause->get_map_name())
138 if (map_i == grid->map_end())
139 throw Error(malformed_expr,
"The map vector '" + clause->get_map_name()
140 +
"' is not in the grid '" + grid->name() +
"'.");
143 Array::Dim_iter grid_dim = (grid->get_array()->dim_begin() + (map_i - grid->map_begin()));
145 Array *map =
dynamic_cast < Array *
>((*map_i));
147 throw InternalErr(__FILE__, __LINE__,
"Expected an Array");
148 int start = max(map->dimension_start(map->dim_begin()), clause->get_start());
149 int stop = min(map->dimension_stop(map->dim_begin()), clause->get_stop());
154 <<
"The expressions passed to grid() do not result in an inclusive \n"
155 <<
"subset of '" << clause->get_map_name()
156 <<
"'. The map's values range " <<
"from "
157 << clause->get_map_min_value() <<
" to "
158 << clause->get_map_max_value() <<
".";
159 throw Error(malformed_expr,msg.str());
162 BESDEBUG(
"GeoGrid",
"Setting constraint on " << map->name() <<
"[" << start <<
":" << stop <<
"]" << endl);
165 map->add_constraint(map->dim_begin(), start, 1, stop);
166 grid->get_array()->add_constraint(grid_dim, start, 1, stop);
169void apply_grid_selection_expressions(Grid * grid, vector < GSEClause * >clauses)
171 vector < GSEClause * >::iterator clause_i = clauses.begin();
172 while (clause_i != clauses.end())
173 apply_grid_selection_expr(grid, *clause_i++);
175 grid->set_read_p(
false);
184void get_coverages(BaseType *bt, vector<Array *> *coverages)
186 switch (bt->type()) {
189 if (
static_cast<Array *
>(bt)->is_dap2_grid() ) {
191 coverages->push_back(
static_cast<Array *
>(bt));
195 case dods_structure_c: {
197 Structure &s =
static_cast<Structure&
>(*bt);
198 for (Structure::Vars_iter i = s.var_begin(); i != s.var_begin(); i++) {
199 get_coverages(*i, coverages);
206 D4Group &g =
static_cast<D4Group&
>(*bt);
207 for (D4Group::Vars_iter i = g.var_begin(); i != g.var_begin(); i++) {
208 get_coverages(*i, coverages);
225void get_coverages(DMR &dmr, vector<Array *> *coverages)
227 D4Group *root = dmr.root();
230 Constructor::Vars_iter v = root->var_begin();
231 while (v != root->var_end()) {
232 get_coverages(*v, coverages);
236 D4Group::groupsIter g = root->grp_begin();
237 while (g != root->grp_end())
238 get_coverages((*g++),coverages);
241static void apply_grid_selection_expr(Array *coverage,
GSEClause *clause)
245 D4Maps *d4_maps = coverage->maps();
246 D4Maps::D4MapsIter miter = d4_maps->map_begin();
247 while (miter != d4_maps->map_end() && (*miter)->name() != clause->get_map()->FQN())
250 if (miter == d4_maps->map_end())
251 throw Error(malformed_expr,
"The map vector '" + clause->get_map_name()
252 +
"' is not in the array '" + coverage->name() +
"'.");
254 D4Map *d4_map = (*miter);
258 Array::Dim_iter dim_i = coverage->dim_begin();
259 while (dim_i != coverage->dim_end() && coverage->dimension_D4dim(dim_i)->fully_qualified_name() != clause->get_map()->FQN())
262 if (dim_i == coverage->dim_end())
263 throw Error(malformed_expr,
"The map vector '" + clause->get_map_name()
264 +
"' is not a dimension in the array '" + coverage->name() +
"'.");
266 Array::Dim_iter coverage_dim = (coverage->dim_begin() + (dim_i - coverage->dim_begin()));
268 Array *map =
const_cast<Array *
>(d4_map->array());
270 throw InternalErr(__FILE__, __LINE__,
"Expected an Array");
271 int start = max(map->dimension_start(map->dim_begin()), clause->get_start());
272 int stop = min(map->dimension_stop(map->dim_begin()), clause->get_stop());
277 <<
"The expressions passed to grid() do not result in an inclusive \n"
278 <<
"subset of '" << clause->get_map_name()
279 <<
"'. The map's values range " <<
"from "
280 << clause->get_map_min_value() <<
" to "
281 << clause->get_map_max_value() <<
".";
282 throw Error(malformed_expr,msg.str());
285 BESDEBUG(
"GeoGrid",
"Setting constraint on " << map->name() <<
"[" << start <<
":" << stop <<
"]" << endl);
288 map->add_constraint(map->dim_begin(), start, 1, stop);
290 coverage->dimension_D4dim(coverage_dim)->set_constraint(start, 1, stop);
291 coverage->add_constraint(coverage_dim,coverage->dimension_D4dim(coverage_dim));
294void apply_grid_selection_expressions(Array * coverage, vector < GSEClause * >clauses)
296 vector < GSEClause * >::iterator clause_i = clauses.begin();
297 while (clause_i != clauses.end())
298 apply_grid_selection_expr(coverage, *clause_i++);
300 coverage->set_read_p(
false);