OPeNDAP Hyrax Back End Server (BES)  Updated for version 3.8.3
GridFunction.cc
Go to the documentation of this file.
1 
2 // -*- mode: c++; c-basic-offset:4 -*-
3 
4 // This file is part of libdap, A C++ implementation of the OPeNDAP Data
5 // Access Protocol.
6 
7 // Copyright (c) 2002,2003,2013 OPeNDAP, Inc.
8 // Authors: Nathan Potter <npotter@opendap.org>
9 // James Gallagher <jgallagher@opendap.org>
10 //
11 // This library is free software; you can redistribute it and/or
12 // modify it under the terms of the GNU Lesser General Public
13 // License as published by the Free Software Foundation; either
14 // version 2.1 of the License, or (at your option) any later version.
15 //
16 // This library is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 // Lesser General Public License for more details.
20 //
21 // You should have received a copy of the GNU Lesser General Public
22 // License along with this library; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 //
25 // You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
26 
27 #include "config.h"
28 
29 #include <BaseType.h>
30 #include <Str.h>
31 #include <Array.h>
32 #include <Grid.h>
33 #include <Error.h>
34 #include <DDS.h>
35 #include <debug.h>
36 #include <util.h>
37 
38 #include "GridFunction.h"
39 #include "gse_parser.h"
40 #include "grid_utils.h"
41 
42 namespace libdap {
43 
73 void
74 function_grid(int argc, BaseType *argv[], DDS &, BaseType **btpp)
75 {
76  DBG(cerr << "Entering function_grid..." << endl);
77 
78  string info =
79  string("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") +
80  "<function name=\"grid\" version=\"1.0\" href=\"http://docs.opendap.org/index.php/Server_Side_Processing_Functions#grid\">\n" +
81  "</function>\n";
82 
83  if (argc == 0) {
84  Str *response = new Str("info");
85  response->set_value(info);
86  *btpp = response;
87  return;
88  }
89 
90  Grid *original_grid = dynamic_cast < Grid * >(argv[0]);
91  if (!original_grid)
92  throw Error(malformed_expr,"The first argument to grid() must be a Grid variable!");
93 
94  // Duplicate the grid; ResponseBuilder::send_data() will delete the variable
95  // after serializing it.
96  BaseType *btp = original_grid->ptr_duplicate();
97  Grid *l_grid = dynamic_cast < Grid * >(btp);
98  if (!l_grid) {
99  delete btp;
100  throw InternalErr(__FILE__, __LINE__, "Expected a Grid.");
101  }
102 
103  DBG(cerr << "grid: past initialization code" << endl);
104 
105  // Read the maps. Do this before calling parse_gse_expression(). Avoid
106  // reading the array until the constraints have been applied because it
107  // might be really large.
108 
109  // This version makes sure to set the send_p flags which is needed for
110  // the hdf4 handler (and is what should be done in general).
111  Grid::Map_iter i = l_grid->map_begin();
112  while (i != l_grid->map_end())
113  (*i++)->set_send_p(true);
114 
115  l_grid->read();
116 
117  DBG(cerr << "grid: past map read" << endl);
118 
119  // argv[1..n] holds strings; each are little expressions to be parsed.
120  // When each expression is parsed, the parser makes a new instance of
121  // GSEClause. GSEClause checks to make sure the named map really exists
122  // in the Grid and that the range of values given makes sense.
123  vector < GSEClause * > clauses;
124  gse_arg *arg = new gse_arg(l_grid);
125  for (int i = 1; i < argc; ++i) {
126  parse_gse_expression(arg, argv[i]);
127  clauses.push_back(arg->get_gsec());
128  }
129  delete arg;
130  arg = 0;
131 
132  apply_grid_selection_expressions(l_grid, clauses);
133 
134  DBG(cerr << "grid: past gse application" << endl);
135 
136  l_grid->get_array()->set_send_p(true);
137 
138  l_grid->read();
139 
140  // Make a new grid here and copy just the parts of the Grid
141  // that are in the current projection - this means reading
142  // the array slicing information, extracting the correct
143  // values and building destination arrays with just those
144  // values.
145 
146  *btpp = l_grid;
147  return;
148 }
149 
156  //vector<Grid *> *grids = new vector<Grid *>();
157  vector<Grid *> grids;
158  getGrids(dds, &grids);
159 
160  return !grids.empty();
161 #if 0
162  bool usable = !grids->empty();
163 
164  delete grids;
165 
166  return usable;
167 #endif
168 }
169 
170 } // namesspace libdap
void getGrids(BaseType *bt, vector< Grid * > *grids)
Recursively traverses the BaseType bt (if its a constructor type) and collects pointers to all of the...
Definition: grid_utils.cc:54
void apply_grid_selection_expressions(Grid *grid, vector< GSEClause * >clauses)
Definition: grid_utils.cc:166
GSEClause * get_gsec()
Definition: gse_parser.h:60
static class NCMLUtil overview
bool canOperateOn(DDS &dds)
The passed DDS parameter dds is evaluated to see if it contains Grid objects.
Argument to the GSE parser.
Definition: gse_parser.h:43
void function_grid(int argc, BaseType *argv[], DDS &, BaseType **btpp)
The grid function uses a set of relational expressions to form a selection within a Grid variable bas...
Definition: GridFunction.cc:74
#define gse_arg(arg)
Definition: gse.tab.cc:122
void parse_gse_expression(gse_arg *arg, BaseType *expr)
Definition: grid_utils.cc:116