29#include <libdap/BaseType.h>
30#include <libdap/Str.h>
31#include <libdap/Array.h>
32#include <libdap/Grid.h>
33#include <libdap/D4Group.h>
34#include <libdap/D4RValue.h>
35#include <libdap/D4Maps.h>
37#include <libdap/Error.h>
38#include <libdap/DDS.h>
39#include <libdap/DMR.h>
40#include <libdap/debug.h>
41#include <libdap/util.h>
45#include "GridFunction.h"
46#include "gse_parser.h"
47#include "grid_utils.h"
54 string(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
55 +
"<function name=\"grid\" version=\"1.0b1\" href=\"http://docs.opendap.org/index.php/Server_Side_Processing_Functions#grid\">\n"
89function_dap2_grid(
int argc, BaseType *argv[], DDS &, BaseType **btpp)
91 DBG(cerr <<
"Entering function_grid..." << endl);
92 BESDEBUG(
"function",
"function_dap2_grid() BEGIN " << endl);
95 Str *response =
new Str(
"info");
96 response->set_value(grid_info);
101 Grid *original_grid =
dynamic_cast < Grid *
>(argv[0]);
103 throw Error(malformed_expr,
"The first argument to grid() must be a Grid variable!");
107 BaseType *btp = original_grid->ptr_duplicate();
108 Grid *l_grid =
dynamic_cast < Grid *
>(btp);
111 throw InternalErr(__FILE__, __LINE__,
"Expected a Grid.");
114 DBG(cerr <<
"grid: past initialization code" << endl);
120 BESDEBUG(
"functions",
"original_grid: read_p: " << original_grid->read_p() << endl);
121 BESDEBUG(
"functions",
"l_grid: read_p: " << l_grid->read_p() << endl);
123 BESDEBUG(
"functions",
"original_grid->array_(): read_p: " << original_grid->array_var()->read_p() << endl);
124 BESDEBUG(
"functions",
"l_grid->array+var(): read_p: " << l_grid->array_var()->read_p() << endl);
128 Grid::Map_iter i = l_grid->map_begin();
129 while (i != l_grid->map_end())
130 (*i++)->set_send_p(
true);
134 DBG(cerr <<
"grid: past map read" << endl);
140 vector < GSEClause * > clauses;
142 for (
int i = 1; i < argc; ++i) {
143 parse_gse_expression(arg, argv[i]);
144 clauses.push_back(arg->get_gsec());
149 apply_grid_selection_expressions(l_grid, clauses);
151 DBG(cerr <<
"grid: past gse application" << endl);
153 l_grid->get_array()->set_send_p(
true);
175 get_grids(dds, &grids);
177 return !grids.empty();
210BaseType *function_dap4_grid(D4RValueList *args, DMR &dmr)
212 BESDEBUG(
"function",
"function_dap4_grid() BEGIN " << endl);
215 if (args == 0 || args->size() < 2) {
216 Str *response =
new Str(
"info");
217 response->set_value(grid_info);
222 BaseType *a_btp = args->get_rvalue(0)->value(dmr);
223 Array *original_array =
dynamic_cast < Array *
>(a_btp);
224 if (!original_array) {
226 throw InternalErr(__FILE__, __LINE__,
"Expected an Array.");
231 BaseType *btp = original_array->ptr_duplicate();
232 Array *l_array =
dynamic_cast < Array *
>(btp);
235 throw InternalErr(__FILE__, __LINE__,
"Expected an Array.");
238 DBG(cerr <<
"array: past initialization code" << endl);
244 BESDEBUG(
"functions",
"original_array: read_p: " << original_array->read_p() << endl);
245 BESDEBUG(
"functions",
"l_array: read_p: " << l_array->read_p() << endl);
248 D4Maps *d4_maps = l_array->maps();
249 D4Maps::D4MapsIter miter = d4_maps->map_begin();
250 while (miter != d4_maps->map_end()) {
251 D4Map *d4_map = (*miter);
252 Array *map =
const_cast<Array *
>(d4_map->array());
253 map->set_send_p(
true);
258 DBG(cerr <<
"array: past map read" << endl);
264 vector < GSEClause * > clauses;
266 for (
unsigned int i = 1; i < args->size(); ++i) {
267 string relop = extract_string_argument(args->get_rvalue(i)->value(dmr));
268 parse_gse_expression(arg, args->get_rvalue(i)->value(dmr));
269 clauses.push_back(arg->get_gsec());
274 apply_grid_selection_expressions(l_array, clauses);
276 DBG(cerr <<
"array: past gse application" << endl);
285 D4Group *dapResult =
new D4Group(
"grid_result");
288 dapResult->set_parent(dmr.root());
291 l_array->set_read_p(
false);
292 dapResult->add_var_nocopy(l_array);
295 D4Dimensions *grp_d4_dims = dapResult->dims();
297 Array *g_array =
dynamic_cast<Array *
>(dapResult->find_var(l_array->name()));
299 Array::Dim_iter dim_i = g_array->dim_begin();
300 while (dim_i != g_array->dim_end()) {
301 D4Dimension *d4_dim = g_array->dimension_D4dim(dim_i);
302 grp_d4_dims->add_dim_nocopy(d4_dim);
307 d4_maps = l_array->maps();
308 miter = d4_maps->map_begin();
309 while (miter != d4_maps->map_end()) {
310 D4Map *d4_map = (*miter);
311 Array *map =
const_cast<Array *
>(d4_map->array());
312 map->set_read_p(
false);
313 dapResult->add_var_nocopy(map);
318 dapResult->set_send_p(
true);
332 get_coverages(dmr, &coverages);
334 return !coverages.empty();
bool canOperateOn(libdap::DDS &dds)