db_filters.h
Go to the documentation of this file.
1 /*********************************************************************
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2009, Willow Garage, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above
14  * copyright notice, this list of conditions and the following
15  * disclaimer in the documentation and/or other materials provided
16  * with the distribution.
17  * * Neither the name of the Willow Garage nor the names of its
18  * contributors may be used to endorse or promote products derived
19  * from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *********************************************************************/
34 
35 // Author(s): Lorenz Moesenlechner
36 
37 #ifndef _DB_FILTERS_H_
38 #define _DB_FILTERS_H_
39 
40 #include <boost/lexical_cast.hpp>
41 #include <boost/format.hpp>
42 
43 #include <string>
44 
46 
58 namespace database_interface
59 {
60 
61 template<typename T>
62 inline std::string toString(const T &data)
63 {
64  return boost::lexical_cast<std::string>(data);
65 }
66 
67 template<>
68 inline std::string toString<double>(const double &data)
69 {
70  return (boost::format("%.5f") % data).str();
71 }
72 
74 {
75  std::string clause_;
76 
78  FilterClause(const std::string clause)
79  : clause_(clause) {}
80 };
81 
82 struct dbField
83 {
84  std::string name_;
85 
86  dbField(const std::string name)
87  : name_(name) {}
88 };
89 
90 // All operators return a FilterClause that contains a string
91 // representation of the specific operation. To extend it, you need
92 // to implement an operator for the classes DBField<T> and dbField
93 // in all different possible combinations. To get a string
94 // representation of the arbitrary datatype T, boost::lexical_cast
95 // is used.
96 
97 // Operator <
98 template<typename T>
99 FilterClause operator<(const DBField<T> &lhs, const T &rhs)
100 {
101  return FilterClause(lhs.getName() + " < '" + toString(rhs) + "'");
102 }
103 
104 template<typename T>
105 FilterClause operator<(const T &lhs, const DBField<T> &rhs)
106 {
107  return FilterClause("'" + toString(lhs) + "' < " + rhs.getName());
108 }
109 
110 template<typename T>
111 FilterClause operator<(const DBField<T> &lhs, const DBField<T> &rhs)
112 {
113  return FilterClause(lhs.getName() + " < " + rhs.getName());
114 }
115 
116 template<typename T>
117 FilterClause operator<(const dbField &lhs, const T &rhs)
118 {
119  return FilterClause(lhs.name_ + " < '" + toString(rhs) + "'");
120 }
121 
122 template<typename T>
123 FilterClause operator<(const T &lhs, const dbField &rhs)
124 {
125  return FilterClause("'" + toString(lhs) + "' < " + rhs.name_);
126 }
127 
128 template<typename T>
129 FilterClause operator<(const dbField &lhs, const dbField &rhs)
130 {
131  return FilterClause(lhs.name_ + " < " + rhs.name_);
132 }
133 
134 // Opetrator <=
135 template<typename T>
136 FilterClause operator<=(const DBField<T> &lhs, const T &rhs)
137 {
138  return FilterClause(lhs.getName() + " <= '" + toString(rhs) + "'");
139 }
140 
141 template<typename T>
142 FilterClause operator<=(const T &lhs, const DBField<T> &rhs)
143 {
144  return FilterClause("'" + toString(lhs) + "' <= " + rhs.getName());
145 }
146 
147 template<typename T>
148 FilterClause operator<=(const DBField<T> &lhs, const DBField<T> &rhs)
149 {
150  return FilterClause(lhs.getName() + " <= " + rhs.getName());
151 }
152 
153 template<typename T>
154 FilterClause operator<=(const dbField &lhs, const T &rhs)
155 {
156  return FilterClause(lhs.name_ + " <= '" + toString(rhs) + "'");
157 }
158 
159 template<typename T>
160 FilterClause operator<=(const T &lhs, const dbField &rhs)
161 {
162  return FilterClause("'" + toString(lhs) + "' <= " + rhs.name_);
163 }
164 
165 template<typename T>
166 FilterClause operator<=(const dbField &lhs, const dbField &rhs)
167 {
168  return FilterClause(lhs.name_ + " <= " + rhs.name_);
169 }
170 
171 // Operator >
172 template<typename T>
173 FilterClause operator>(const DBField<T> &lhs, const T &rhs)
174 {
175  return FilterClause(lhs.getName() + " > '" + toString(rhs) + "'");
176 }
177 
178 template<typename T>
179 FilterClause operator>(const T &lhs, const DBField<T> &rhs)
180 {
181  return FilterClause("'" + toString(lhs) + "' > " + rhs.getName());
182 }
183 
184 template<typename T>
186 {
187  return FilterClause(lhs.getName() + " > " + rhs.getName());
188 }
189 
190 template<typename T>
191 FilterClause operator>(const dbField &lhs, const T &rhs)
192 {
193  return FilterClause(lhs.name_ + " > '" + toString(rhs) + "'");
194 }
195 
196 template<typename T>
197 FilterClause operator>(const T &lhs, const dbField &rhs)
198 {
199  return FilterClause("'" + toString(lhs) + "' > " + rhs.name_);
200 }
201 
202 template<typename T>
203 FilterClause operator>(const dbField &lhs, const dbField &rhs)
204 {
205  return FilterClause(lhs.name_ + " > " + rhs.name_);
206 }
207 
208 // Opetrator >=
209 template<typename T>
210 FilterClause operator>=(const DBField<T> &lhs, const T &rhs)
211 {
212  return FilterClause(lhs.getName() + " >= '" + toString(rhs) + "'");
213 }
214 
215 template<typename T>
216 FilterClause operator>=(const T &lhs, const DBField<T> &rhs)
217 {
218  return FilterClause("'" + toString(lhs) + "' >= " + rhs.getName());
219 }
220 
221 template<typename T>
223 {
224  return FilterClause(lhs.getName() + " >= " + rhs.getName());
225 }
226 
227 template<typename T>
228 FilterClause operator>=(const dbField &lhs, const T &rhs)
229 {
230  return FilterClause(lhs.name_ + " >= '" + toString(rhs) + "'");
231 }
232 
233 template<typename T>
234 FilterClause operator>=(const T &lhs, const dbField &rhs)
235 {
236  return FilterClause("'" + toString(lhs) + "' >= " + rhs.name_);
237 }
238 
239 template<typename T>
240 FilterClause operator>=(const dbField &lhs, const dbField &rhs)
241 {
242  return FilterClause(lhs.name_ + " >= " + rhs.name_);
243 }
244 
245 // Operator ==
246 template<typename T>
247 FilterClause operator==(const DBField<T> &lhs, const T &rhs)
248 {
249  return FilterClause(lhs.getName() + " == '" + toString(rhs) + "'");
250 }
251 
252 template<typename T>
253 FilterClause operator==(const T &lhs, const DBField<T> &rhs)
254 {
255  return FilterClause("'" + toString(lhs) + "' == " + rhs.getName());
256 }
257 
258 template<typename T>
260 {
261  return FilterClause(lhs.getName() + " == " + rhs.getName());
262 }
263 
264 template<typename T>
265 FilterClause operator==(const dbField &lhs, const T &rhs)
266 {
267  return FilterClause(lhs.name_ + " == '" + toString(rhs) + "'");
268 }
269 
270 template<typename T>
271 FilterClause operator==(const T &lhs, const dbField &rhs)
272 {
273  return FilterClause("'" + toString(lhs) + "' == " + rhs.name_);
274 }
275 
276 template<typename T>
277 FilterClause operator==(const dbField &lhs, const dbField &rhs)
278 {
279  return FilterClause(lhs.name_ + " == " + rhs.name_);
280 }
281 
282 // Operator !=
283 template<typename T>
284 FilterClause operator!=(const DBField<T> &lhs, const T &rhs)
285 {
286  return FilterClause(lhs.getName() + " != '" + toString(rhs) + "'");
287 }
288 
289 template<typename T>
290 FilterClause operator!=(const T &lhs, const DBField<T> &rhs)
291 {
292  return FilterClause("'" + toString(lhs) + "' != " + rhs.getName());
293 }
294 
295 template<typename T>
297 {
298  return FilterClause(lhs.getName() + " != " + rhs.getName());
299 }
300 
301 template<typename T>
302 FilterClause operator!=(const dbField &lhs, const T &rhs)
303 {
304  return FilterClause(lhs.name_ + " != '" + toString(rhs) + "'");
305 }
306 
307 template<typename T>
308 FilterClause operator!=(const T &lhs, const dbField &rhs)
309 {
310  return FilterClause("'" + toString(lhs) + "' != " + rhs.name_);
311 }
312 
313 template<typename T>
314 FilterClause operator!=(const dbField &lhs, const dbField &rhs)
315 {
316  return FilterClause(lhs.name_ + " != " + rhs.name_);
317 }
318 
319 // Combination clauses (and, or, ...)
320 inline FilterClause operator&&(const FilterClause &lhs, const FilterClause &rhs)
321 {
322  return FilterClause(" ( " + lhs.clause_ + " AND " + rhs.clause_ + " )");
323 }
324 
325 inline FilterClause operator||(const FilterClause &lhs, const FilterClause &rhs)
326 {
327  return FilterClause(" ( " + lhs.clause_ + " OR " + rhs.clause_ + " )");
328 }
329 
330 } //namespace
331 
332 #endif
std::string toString< double >(const double &data)
Definition: db_filters.h:68
dbField(const std::string name)
Definition: db_filters.h:86
std::string getName() const
Definition: db_field.h:149
The base class for a usable DBField.
Definition: db_field.h:348
std::string toString(const T &data)
Definition: db_filters.h:62
FilterClause operator==(const DBField< T > &lhs, const T &rhs)
Definition: db_filters.h:247
FilterClause operator<=(const DBField< T > &lhs, const T &rhs)
Definition: db_filters.h:136
FilterClause operator!=(const DBField< T > &lhs, const T &rhs)
Definition: db_filters.h:284
FilterClause operator<(const DBField< T > &lhs, const T &rhs)
Definition: db_filters.h:99
FilterClause operator>=(const DBField< T > &lhs, const T &rhs)
Definition: db_filters.h:210
FilterClause operator||(const FilterClause &lhs, const FilterClause &rhs)
Definition: db_filters.h:325
FilterClause operator>(const DBField< T > &lhs, const T &rhs)
Definition: db_filters.h:173
FilterClause operator&&(const FilterClause &lhs, const FilterClause &rhs)
Definition: db_filters.h:320
FilterClause(const std::string clause)
Definition: db_filters.h:78


database_interface
Author(s): Matei Ciocarlie and Lorenz Mosenlechner
autogenerated on Mon Mar 2 2015 01:31:34