blob: 1cf72b6d2a7bd41c64be7acb9ae1ef3663c7c0c6 [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