40#include <libdap/Array.h>
41#include <libdap/Grid.h>
42#include <libdap/dods-datatypes.h>
45#include <libdap/debug.h>
47#include "BESInternalError.h"
50#include <libdap/parser.h>
62compare(T elem, relop op,
double value)
67 case dods_greater_equal_op:
71 case dods_less_equal_op:
75 case dods_not_equal_op:
78 throw Error(malformed_expr,
"Attempt to use NOP in Grid selection.");
80 throw Error(malformed_expr,
"Unknown relational operator in Grid selection.");
87GSEClause::set_map_min_max_value(T min, T max)
89 DBG(cerr <<
"Inside set map min max value " << min <<
", " << max << endl);
90 std::ostringstream oss1;
92 d_map_min_value = oss1.str();
94 std::ostringstream oss2;
96 d_map_max_value = oss2.str();
106GSEClause::set_start_stop()
108 vector<T> vals(d_map->length());
109 d_map->value(vals.data());
111 if (!((
unsigned long)d_start < vals.size() && (
unsigned long)d_stop < vals.size()))
112 throw BESInternalError(
"Access beyond the bounds of a Grid Map.", __FILE__, __LINE__);
116 set_map_min_max_value<T>(vals[d_start], vals[d_stop]);
125 while (i <= end && !compare<T>(vals[i], d_op1, d_value1))
132 while (i >= 0 && !compare<T>(vals[i], d_op1, d_value1))
140 if (d_op2 != dods_nop_op) {
143 while (i <= end && !compare<T>(vals[i], d_op2, d_value2))
149 while (i >= 0 && !compare<T>(vals[i], d_op2, d_value2))
157GSEClause::compute_indices()
159 switch (d_map->var()->type()) {
161 set_start_stop<dods_byte>();
164 set_start_stop<dods_int16>();
167 set_start_stop<dods_uint16>();
170 set_start_stop<dods_int32>();
173 set_start_stop<dods_uint32>();
176 set_start_stop<dods_float32>();
179 set_start_stop<dods_float64>();
182 throw Error(malformed_expr,
183 "Grid selection using non-numeric map vectors is not supported");
191GSEClause::GSEClause(Grid *grid,
const string &map,
const double value,
194 d_value1(value), d_value2(0), d_op1(op), d_op2(dods_nop_op),
195 d_map_min_value(
""), d_map_max_value(
"")
197 d_map =
dynamic_cast<Array *
>(grid->var(map));
199 throw Error(
string(
"The map variable '") + map
200 +
string(
"' does not exist in the grid '")
201 + grid->name() +
string(
"'."));
203 DBG(cerr << d_map->toString());
206 Array::Dim_iter iter = d_map->dim_begin();
207 d_start = d_map->dimension_start(iter);
208 d_stop = d_map->dimension_stop(iter);
214GSEClause::GSEClause(Grid *grid,
const string &map,
const double value1,
215 const relop op1,
const double value2,
const relop op2)
217 d_value1(value1), d_value2(value2), d_op1(op1), d_op2(op2),
218 d_map_min_value(
""), d_map_max_value(
"")
220 d_map =
dynamic_cast<Array *
>(grid->var(map));
222 throw Error(
string(
"The map variable '") + map
223 +
string(
"' does not exist in the grid '")
224 + grid->name() +
string(
"'."));
226 DBG(cerr << d_map->toString());
229 Array::Dim_iter iter = d_map->dim_begin();
230 d_start = d_map->dimension_start(iter);
231 d_stop = d_map->dimension_stop(iter);
236GSEClause::~GSEClause()
257GSEClause::get_map()
const
267GSEClause::set_map(Array *map)
275GSEClause::get_map_name()
const
277 return d_map->name();
284GSEClause::get_start()
const
292GSEClause::set_start(
int start)
301GSEClause::get_stop()
const
303 DBG(cerr <<
"Returning stop index value of: " << d_stop << endl);
310GSEClause::set_stop(
int stop)
320GSEClause::get_map_min_value()
const
322 return d_map_min_value;
330GSEClause::get_map_max_value()
const
332 return d_map_max_value;
exception thrown if internal error encountered