blob: f38404b0c9dea27cfbc6c6daf8403b889cc231d4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* License); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef READER_EXPRESSION_H
#define READER_EXPRESSION_H
#include <string>
#include <vector>
#include "common/db_common.h"
#include "common/path.h"
#include "filter/filter.h"
namespace storage {
class Filter;
enum ExpressionType {
AND_EXPR,
OR_EXPR,
SERIES_EXPR,
GLOBALTIME_EXPR,
INVALID_EXPR
};
struct Expression {
ExpressionType type_;
Expression *left_;
Expression *right_;
Filter *filter_;
Path series_path_;
Expression(ExpressionType t)
: type_(t),
left_(nullptr),
right_(nullptr),
filter_(nullptr),
series_path_() {}
Expression(ExpressionType t, Expression *l, Expression *r)
: type_(t), left_(l), right_(r), filter_(nullptr), series_path_() {}
Expression(ExpressionType t, Filter *f)
: type_(t),
left_(nullptr),
right_(nullptr),
filter_(f),
series_path_() {}
Expression(ExpressionType t, const Path &path, Filter *f)
: type_(t),
left_(nullptr),
right_(nullptr),
filter_(f),
series_path_(path) {}
void destroy() {
if (filter_ != nullptr) {
delete filter_;
filter_ = nullptr;
}
if (left_ != nullptr) {
delete left_;
left_ = nullptr;
}
if (right_ != nullptr) {
delete right_;
right_ = nullptr;
}
}
~Expression() { destroy(); }
};
class QueryExpression {
public:
QueryExpression() : has_filter_(false), expression_(nullptr) {}
~QueryExpression() { destory(); }
static QueryExpression *create(const std::vector<Path> &selected_series,
Expression *expression) {
QueryExpression *ret = new QueryExpression();
ret->selected_series_ = selected_series;
ret->expression_ = expression;
ret->has_filter_ = (expression != nullptr);
return ret;
}
static void destory(QueryExpression *expr) {
if (expr) {
delete expr;
}
}
FORCE_INLINE void set_select_series(
const std::vector<Path> &selected_series) {
selected_series_ = selected_series;
}
FORCE_INLINE void add_select_series(const Path &path) {
selected_series_.push_back(path);
}
FORCE_INLINE void set_expression(Expression *expression) {
if (expression) {
expression_ = expression;
has_filter_ = true;
}
}
Expression *optimize(Expression *expression,
std::vector<Path> &series_paths);
void destory();
private:
Expression *combine_two_global_time_filter(Expression *left,
Expression *right,
ExpressionType type);
Expression *handle_one_global_time_filter(
Expression *left, Expression *expression,
std::vector<Path> &selected_series, ExpressionType type);
void add_time_filter_to_query_filter(Filter *time_filter,
Expression *expression);
void add_time_filter_to_series_filter(Filter *time_filter,
Expression *single_series_expr);
Expression *push_global_time_filter_to_all_series(
Expression *time_filter, std::vector<Path> &selected_series);
Expression *merge_second_tree_to_first_tree(Expression *left_expression,
Expression *right_expression);
bool update_filter_with_or(Expression *expression, Filter *filter,
Path &path);
public:
bool has_filter_;
std::vector<Path> selected_series_;
std::vector<common::TSDataType> data_types_;
Expression *expression_;
std::vector<Expression *> my_exprs_;
std::vector<Filter *> my_filters_;
};
} // namespace storage
#endif // READER_EXPRESSION_H