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