20 #include "queryoptimizer.h" 21 #include "parser/parsertypes.h" 52 template <
typename SearchPo
intType,
typename DataSetType>
53 parser::PredLabelIsIn* BaseQueryOptimizer<SearchPointType, DataSetType>::findPointID(parser::Predicate* pred) {
56 parser::PredLabelIsIn* labelPred =
dynamic_cast<parser::PredLabelIsIn*
>(pred);
57 if (labelPred && dynamic_cast<parser::LabelPointID*>(labelPred->_var)) {
62 parser::PredNegate* negPred =
dynamic_cast<parser::PredNegate*
>(pred);
63 if (negPred)
return findPointID(negPred->_pred);
66 parser::PredLogicalOp* logicPred =
dynamic_cast<parser::PredLogicalOp*
>(pred);
68 parser::PredLabelIsIn* labelPred = findPointID(logicPred->_lhs);
69 if (labelPred)
return labelPred;
70 return findPointID(logicPred->_rhs);
77 template <
typename SearchPo
intType,
typename DataSetType>
78 template <
typename PredicateType>
79 PredicateType* BaseQueryOptimizer<SearchPointType, DataSetType>::findPredicate(parser::Predicate* pred) {
81 PredicateType* result =
dynamic_cast<PredicateType*
>(pred);
82 if (result)
return result;
85 parser::PredNegate* negPred =
dynamic_cast<parser::PredNegate*
>(pred);
86 if (negPred)
return findPredicate<PredicateType>(negPred->_pred);
89 parser::PredLogicalOp* logicPred =
dynamic_cast<parser::PredLogicalOp*
>(pred);
91 result = findPredicate<PredicateType>(logicPred->_lhs);
92 if (result)
return result;
93 return findPredicate<PredicateType>(logicPred->_rhs);
101 template <
typename SearchPo
intType,
typename DataSetType>
105 if (filter->_pred == swapOut) {
106 filter->_pred = swapIn;
110 return swapPredicate(filter->_pred, swapOut, swapIn);
113 template <
typename SearchPo
intType,
typename DataSetType>
120 if (negPred->_pred == swapOut) {
121 negPred->_pred = swapIn;
125 return swapPredicate(negPred->_pred, swapOut, swapIn);
131 if (logicPred->_lhs == swapOut) { logicPred->_lhs = swapIn;
return true; }
132 if (logicPred->_rhs == swapOut) { logicPred->_rhs = swapIn;
return true; }
134 return swapPredicate(logicPred->_lhs, swapOut, swapIn) ||
135 swapPredicate(logicPred->_rhs, swapOut, swapIn);
141 template <
typename SearchPo
intType,
typename DataSetType>
148 template <
typename SearchPo
intType,
typename DataSetType>
151 while ((reduced = reducePredicate(finalPred))) finalPred = reduced;
153 filter->_pred = finalPred;
155 G_DEBUG(GParser,
"optimized filter: " << finalPred->toString());
158 template <
typename SearchPo
intType,
typename DataSetType>
163 if (negPred && dynamic_cast<parser::PredNegate*>(negPred->_pred)) {
172 if (negPred && dynamic_cast<parser::BooleanConstant*>(negPred->_pred)) {
181 if (!result)
return 0;
183 negPred->_pred = result;
192 if (logicPred && dynamic_cast<parser::BooleanConstant*>(logicPred->_lhs)) {
195 switch (logicPred->_op) {
198 if (lvalue ==
true) { result = logicPred->_rhs; logicPred->_rhs = 0; }
204 else { result = logicPred->_rhs; logicPred->_rhs = 0; }
208 if (result)
delete logicPred;
214 if (logicPred && dynamic_cast<parser::BooleanConstant*>(logicPred->_rhs)) {
217 switch (logicPred->_op) {
220 if (rvalue ==
true) { result = logicPred->_lhs; logicPred->_lhs = 0; }
226 else { result = logicPred->_lhs; logicPred->_lhs = 0; }
230 if (result)
delete logicPred;
242 if (!lhs && !rhs)
return 0;
244 if (lhs) logicPred->_lhs = lhs;
245 if (rhs) logicPred->_rhs = rhs;
254 template <
typename SearchPo
intType,
typename DataSetType>
256 G_DEBUG(GParser,
"optimizing filter: " << filter->_pred->toString());
260 reduceFilter(filter);
267 result = _spool->getAllPoints();
268 result->setFilter(filter,
true);
279 template <
typename SearchPo
intType,
typename DataSetType>
281 G_DEBUG(GParser,
"optimizing predicate:" << pred->toString());
283 if (dynamic_cast<parser::PredNegate*>(pred))
return 0;
287 if (dynamic_cast<parser::PredValueComparison*>(pred) ||
289 dynamic_cast<parser::PredValueRange*>(pred)) {
290 return _spool->getSubSpace(pred);
297 if (!lhs || !
isAlwaysTrue(lhs->_filter->_pred))
return 0;
299 if (!rhs || !
isAlwaysTrue(rhs->_filter->_pred))
return 0;
301 switch (logicPred->_op) {
319 result->setFilter(alwaysFalse);
326 if (!dynamic_cast<parser::LabelPointID*>(labelPred->_var)) {
330 return SearchSpaceType::createFromPoints(_spool->dataset(), labelPred->_slist);
354 if (dynamic_cast<parser::PredValueIsIn*>(pred)) {
Definition: parsertypes.h:210
static parser::Predicate * reducePredicate(parser::Predicate *pred)
Tries to apply simplification on the predicate, such as replacing "X and True" by "X"...
Definition: queryoptimizer_impl.h:159
static void reduceFilter(Filter *filter)
Tries to apply simplification on the filter, such as replacing "X and True" by "X", etc...
Definition: queryoptimizer_impl.h:149
static void deletePredicate(Filter *filter, parser::Predicate *pred)
Deletes given predicate inside filter (replaces it with the always true predicate).
Definition: queryoptimizer_impl.h:142
static Filter * parse(const QString &str)
Parses a given string and returns the newly created Filter object.
Definition: filter.cpp:181
Definition: parsertypes.h:40
void setUnion(const BaseSearchSpace< SearchPointType, DataSetType > *other)
This computes the union of this SearchSpace with the other one.
Definition: searchspace.h:299
The Filter class allows to check whether a predicate is true for a given Point.
Definition: filter.h:73
Definition: parsertypes.h:256
Main Gaia namespace, which contains all the library functions.
Definition: addfield.cpp:22
Definition: parsertypes.h:164
SearchSpaceType * optimize(Filter *filter)
Ownership of the SearchSpace is yielded to the caller of the function.
Definition: queryoptimizer_impl.h:255
bool isAlwaysFalse(parser::Predicate *pred)
Returns true if the given predicate is always false (ie: it is a boolean constant which value is Fals...
Definition: filter.h:57
static bool swapPredicate(Filter *filter, parser::Predicate *swapOut, parser::Predicate *swapIn)
Swaps predicate swapOut inside of filter for predicate swapIn.
Definition: queryoptimizer_impl.h:102
A SearchSpace is a structure dedicated to the task of storing pointers to Point with an associated di...
Definition: searchspace.h:91
bool isAlwaysTrue(parser::Predicate *pred)
Returns true if the given predicate is always true (ie: it is a boolean constant which value is True)...
Definition: filter.h:48
Definition: parsertypes.h:281
Definition: parsertypes.h:329
void setIntersection(const BaseSearchSpace< SearchPointType, DataSetType > *other)
This computes the intersection of this SearchSpace with the other one.
Definition: searchspace.h:277