blob: ffd05af86a14313412fe12b3a892e6d5132b5d95 [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.
#pragma once
#include <glog/logging.h>
#include <stdint.h>
#include <ostream>
#include <string>
#include <utility>
#include "common/status.h"
#include "olap/column_predicate.h"
#include "olap/rowset/segment_v2/bloom_filter.h"
#include "olap/schema.h"
#include "olap/wrapper_field.h"
namespace roaring {
class Roaring;
} // namespace roaring
namespace doris {
namespace segment_v2 {
class BitmapIndexIterator;
class InvertedIndexIterator;
} // namespace segment_v2
namespace vectorized {
class IColumn;
} // namespace vectorized
class NullPredicate : public ColumnPredicate {
public:
NullPredicate(uint32_t column_id, bool is_null, bool opposite = false);
PredicateType type() const override;
Status evaluate(BitmapIndexIterator* iterator, uint32_t num_rows,
roaring::Roaring* roaring) const override;
Status evaluate(const vectorized::IndexFieldNameAndTypePair& name_with_type,
IndexIterator* iterator, uint32_t num_rows,
roaring::Roaring* bitmap) const override;
void evaluate_or(const vectorized::IColumn& column, const uint16_t* sel, uint16_t size,
bool* flags) const override;
void evaluate_and(const vectorized::IColumn& column, const uint16_t* sel, uint16_t size,
bool* flags) const override;
bool evaluate_and(const std::pair<WrapperField*, WrapperField*>& statistic) const override {
if (_is_null) {
return statistic.first->is_null();
} else {
return !statistic.second->is_null();
}
}
bool evaluate_del(const std::pair<WrapperField*, WrapperField*>& statistic) const override {
// evaluate_del only use for delete condition to filter page, need use delete condition origin value,
// when opposite==true, origin value 'is null'->'is not null' and 'is not null'->'is null',
// so when _is_null==true, need check 'is not null' and _is_null==false, need check 'is null'
if (_is_null) {
return !statistic.first->is_null() && !statistic.second->is_null();
} else {
return statistic.first->is_null() && statistic.second->is_null();
}
}
bool evaluate_and(const segment_v2::BloomFilter* bf) const override {
// null predicate can not use ngram bf, just return true to accept
if (bf->is_ngram_bf()) return true;
if (_is_null) {
return bf->test_bytes(nullptr, 0);
} else {
throw Exception(Status::FatalError(
"Bloom filter is not supported by predicate type: is_null="));
}
}
bool can_do_bloom_filter(bool ngram) const override { return _is_null && !ngram; }
void evaluate_vec(const vectorized::IColumn& column, uint16_t size, bool* flags) const override;
private:
uint16_t _evaluate_inner(const vectorized::IColumn& column, uint16_t* sel,
uint16_t size) const override;
std::string _debug_string() const override {
std::string info = "NullPredicate(" + std::string(_is_null ? "is_null" : "not_null") + ")";
return info;
}
bool _is_null; //true for null, false for not null
};
} //namespace doris