00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "config.h"
00036
00037 #include <cassert>
00038 #include <algorithm>
00039
00040 #include "expr.h"
00041 #include "DDS.h"
00042 #include "Clause.h"
00043
00044 using std::cerr;
00045 using std::endl;
00046
00047 namespace libdap {
00048
00049 Clause::Clause(const int oper, rvalue *a1, rvalue_list *rv)
00050 : _op(oper), _b_func(0), _bt_func(0), _arg1(a1), _args(rv)
00051 {
00052 assert(OK());
00053 }
00054
00055 Clause::Clause(bool_func func, rvalue_list *rv)
00056 : _op(0), _b_func(func), _bt_func(0), _arg1(0), _args(rv)
00057 {
00058 assert(OK());
00059
00060 if (_args)
00061 _argc = _args->size();
00062 else
00063 _argc = 0;
00064 }
00065
00066 Clause::Clause(btp_func func, rvalue_list *rv)
00067 : _op(0), _b_func(0), _bt_func(func), _arg1(0), _args(rv)
00068 {
00069 assert(OK());
00070
00071 if (_args)
00072 _argc = _args->size();
00073 else
00074 _argc = 0;
00075 }
00076
00077 Clause::Clause() : _op(0), _b_func(0), _bt_func(0), _arg1(0), _args(0)
00078 {}
00079
00080 static inline void
00081 delete_rvalue(rvalue *rv)
00082 {
00083 delete rv; rv = 0;
00084 }
00085
00086 Clause::~Clause()
00087 {
00088 if (_arg1) {
00089 delete _arg1; _arg1 = 0;
00090 }
00091
00092 if (_args) {
00093
00094
00095 for_each(_args->begin(), _args->end(), delete_rvalue);
00096 delete _args; _args = 0;
00097 }
00098 }
00099
00101 bool
00102 Clause::OK()
00103 {
00104
00105
00106
00107
00108
00109 bool relational = (_op && !_b_func && !_bt_func);
00110 bool boolean = (!_op && _b_func && !_bt_func);
00111 bool basetype = (!_op && !_b_func && _bt_func);
00112
00113 if (relational)
00114 return _arg1 && _args;
00115 else if (boolean || basetype)
00116 return true;
00117 else
00118 return false;
00119 }
00120
00122 bool
00123 Clause::boolean_clause()
00124 {
00125 assert(OK());
00126
00127 return _op || _b_func;
00128 }
00129
00131 bool
00132 Clause::value_clause()
00133 {
00134 assert(OK());
00135
00136 return (_bt_func != 0);
00137 }
00138
00148 bool
00149 Clause::value(const string &dataset, DDS &dds)
00150 {
00151 assert(OK());
00152 assert(_op || _b_func);
00153
00154 if (_op) {
00155
00156
00157 BaseType *btp = _arg1->bvalue(dataset, dds);
00158
00159
00160 bool result = false;
00161 for (rvalue_list_iter i = _args->begin();
00162 i != _args->end() && !result;
00163 i++) {
00164 result = result || btp->ops((*i)->bvalue(dataset, dds),
00165 _op, dataset);
00166 }
00167
00168 return result;
00169 }
00170 else if (_b_func) {
00171 BaseType **argv = build_btp_args(_args, dds, dataset);
00172
00173 bool result = (*_b_func)(_argc, argv, dds);
00174 delete[] argv;
00175 argv = 0;
00176
00177 return result;
00178 }
00179 else {
00180 throw InternalErr(__FILE__, __LINE__,
00181 "A selection expression must contain only boolean clauses.");
00182 }
00183 }
00184
00197 bool
00198 Clause::value(const string &dataset, DDS &dds, BaseType **value)
00199 {
00200 assert(OK());
00201 assert(_bt_func);
00202
00203 if (_bt_func) {
00204
00205
00206
00207 BaseType **argv = build_btp_args(_args, dds, dataset);
00208
00209 *value = (*_bt_func)(_argc, argv, dds, dataset);
00210 delete[] argv;
00211 argv = 0;
00212
00213 if (*value) {
00214 (*value)->set_send_p(true);
00215 (*value)->set_read_p(true);
00216 return true;
00217 }
00218 else {
00219 return false;
00220 }
00221 }
00222 else {
00223 throw InternalErr(__FILE__, __LINE__,
00224 "Claue::value() was called in a context expecting a BaseType pointer return, but the Clause was boolean-valued instead.");
00225 }
00226 }
00227
00228 }