This is an automated email from the ASF dual-hosted git repository.
wyf pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new af06adb [Doris On ES][Bug-fix] fix boolean predicate pushdown manner
(#4990)
af06adb is described below
commit af06adb57fbaf306534971bae8cf11162d714404
Author: Yunfeng,Wu <[email protected]>
AuthorDate: Wed Dec 2 10:13:13 2020 +0800
[Doris On ES][Bug-fix] fix boolean predicate pushdown manner (#4990)
Correct handling `boolean` field predicate through set the predicate value
to `true`、`false` or `empty set` for DOE
---
be/src/exec/es/es_query_builder.cpp | 32 ++++++++++++++++++++++++++------
be/src/exec/es/es_query_builder.h | 1 +
2 files changed, 27 insertions(+), 6 deletions(-)
diff --git a/be/src/exec/es/es_query_builder.cpp
b/be/src/exec/es/es_query_builder.cpp
index a75ed0e..4149d3a 100644
--- a/be/src/exec/es/es_query_builder.cpp
+++ b/be/src/exec/es/es_query_builder.cpp
@@ -50,19 +50,39 @@ void ESQueryBuilder::to_json(rapidjson::Document* document,
rapidjson::Value* qu
}
TermQueryBuilder::TermQueryBuilder(const std::string& field, const
std::string& term)
- : _field(field), _term(term) {}
+ : _field(field), _term(term), _match_none(false) {}
TermQueryBuilder::TermQueryBuilder(const ExtBinaryPredicate& binary_predicate)
- : _field(binary_predicate.col.name),
_term(binary_predicate.value.to_string()) {}
+ : _field(binary_predicate.col.name), _match_none(false) {
+ if (binary_predicate.col.type.type == PrimitiveType::TYPE_BOOLEAN) {
+ int val = atoi(binary_predicate.value.to_string().c_str());
+ if (val == 1) {
+ _term = std::string("true");
+ } else if (val == 0){
+ _term = std::string("false");
+ } else {
+ // keep semantic consistent with mysql
+ _match_none = true;
+ }
+ } else {
+ _term = binary_predicate.value.to_string();
+ }
+}
void TermQueryBuilder::to_json(rapidjson::Document* document,
rapidjson::Value* query) {
rapidjson::Document::AllocatorType& allocator = document->GetAllocator();
rapidjson::Value term_node(rapidjson::kObjectType);
term_node.SetObject();
- rapidjson::Value field_value(_field.c_str(), allocator);
- rapidjson::Value term_value(_term.c_str(), allocator);
- term_node.AddMember(field_value, term_value, allocator);
- query->AddMember("term", term_node, allocator);
+ if (!_match_none) {
+ rapidjson::Value field_value(_field.c_str(), allocator);
+ rapidjson::Value term_value(_term.c_str(), allocator);
+ term_node.AddMember(field_value, term_value, allocator);
+ query->AddMember("term", term_node, allocator);
+ } else {
+ // this would only appear `bool` column's predicate (a = 2)
+ query->AddMember("match_none", term_node, allocator);
+ }
+
}
RangeQueryBuilder::RangeQueryBuilder(const ExtBinaryPredicate& range_predicate)
diff --git a/be/src/exec/es/es_query_builder.h
b/be/src/exec/es/es_query_builder.h
index 6fb66bf..c471380 100644
--- a/be/src/exec/es/es_query_builder.h
+++ b/be/src/exec/es/es_query_builder.h
@@ -53,6 +53,7 @@ public:
private:
std::string _field;
std::string _term;
+ bool _match_none;
};
// process range predicate field >= value or field < value etc.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]