Skip to content

Commit ae25697

Browse files
obdevhnwyllmm
authored andcommitted
[hybrid search] support expression in DBMS_HYBRID_SEARCH.GET_SQL
Co-authored-by: hnwyllmm <hnwyllmm@126.com>
1 parent 7f8bddf commit ae25697

5 files changed

Lines changed: 146 additions & 74 deletions

File tree

src/share/hybrid_search/ob_query_parse.cpp

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1566,7 +1566,7 @@ int ObESQueryParser::parse_range(ObIJsonBase &req_node, ObEsQueryInfo &query_inf
15661566
int ret = OB_SUCCESS;
15671567
ObString col_name;
15681568
ObIJsonBase *sub_node = nullptr;
1569-
ObReqColumnExpr *col_para = nullptr;
1569+
ObReqExpr *key_expr = nullptr;
15701570
uint64_t count = 0;
15711571
int condition_num = 0;
15721572
common::ObSEArray<ObReqExpr *, 4, common::ModulePageAllocator, true> condition_exprs;
@@ -1585,8 +1585,8 @@ int ObESQueryParser::parse_range(ObIJsonBase &req_node, ObEsQueryInfo &query_inf
15851585
} else if (count == 0) {
15861586
ret = OB_INVALID_ARGUMENT;
15871587
LOG_WARN("unexpectd range condition", K(ret));
1588-
} else if (OB_FAIL(ObReqColumnExpr::construct_column_expr(col_para, alloc_, col_name))) {
1589-
LOG_WARN("fail to create column expr", K(ret));
1588+
} else if (OB_FAIL(create_column_or_base_expr(col_name, key_expr))) {
1589+
LOG_WARN("fail to create column or base expr", K(ret));
15901590
}
15911591
for (uint64_t i = 0; OB_SUCC(ret) && i < count; i++) {
15921592
ObString key;
@@ -1627,7 +1627,7 @@ int ObESQueryParser::parse_range(ObIJsonBase &req_node, ObEsQueryInfo &query_inf
16271627
}
16281628

16291629
if (OB_FAIL(ret)) {
1630-
} else if (type != T_INVALID && OB_FAIL(ObReqOpExpr::construct_binary_op_expr(cmp_expr, alloc_, type, col_para, var))) {
1630+
} else if (type != T_INVALID && OB_FAIL(ObReqOpExpr::construct_binary_op_expr(cmp_expr, alloc_, type, key_expr, var))) {
16311631
LOG_WARN("fail to construct cmp expr", K(ret));
16321632
} else if (OB_FAIL(condition_exprs.push_back(cmp_expr))) {
16331633
LOG_WARN("fail to add condition to array", K(ret));
@@ -2005,7 +2005,7 @@ int ObESQueryParser::parse_term(ObIJsonBase &req_node, ObEsQueryInfo &query_info
20052005
ObString col_name;
20062006
ObIJsonBase *col_para = NULL;
20072007
ObReqOpExpr *eq_expr = NULL;
2008-
ObReqColumnExpr *col_expr = NULL;
2008+
ObReqExpr *key_expr = NULL;
20092009
ObReqConstExpr *value_expr = NULL;
20102010
query_info.query_item_ = QUERY_ITEM_TERM;
20112011
if (req_node.json_type() != ObJsonNodeType::J_OBJECT) {
@@ -2016,15 +2016,15 @@ int ObESQueryParser::parse_term(ObIJsonBase &req_node, ObEsQueryInfo &query_info
20162016
LOG_WARN("term expr should have exactly one element", K(ret));
20172017
} else if (OB_FAIL(req_node.get_object_value(0, col_name, col_para))) {
20182018
LOG_WARN("fail to get value.", K(ret));
2019-
} else if (OB_FAIL(ObReqColumnExpr::construct_column_expr(col_expr, alloc_, col_name))) {
2020-
LOG_WARN("fail to create term expr", K(ret));
2019+
} else if (OB_FAIL(create_column_or_base_expr(col_name, key_expr))) {
2020+
LOG_WARN("fail to create column or base expr", K(ret));
20212021
} else if (col_para->json_type() == ObJsonNodeType::J_ARRAY) {
20222022
ret = OB_ERR_INVALID_TYPE_FOR_ARGUMENT;
20232023
LOG_WARN("term field should have exactly one element", K(ret));
20242024
} else if (col_para->json_type() != ObJsonNodeType::J_OBJECT) {
20252025
if (OB_FAIL(parse_const(*col_para, value_expr))) {
20262026
LOG_WARN("fail to parse const value", K(ret));
2027-
} else if (OB_FAIL(ObReqOpExpr::construct_binary_op_expr(eq_expr, alloc_, T_OP_EQ, col_expr, value_expr))) {
2027+
} else if (OB_FAIL(ObReqOpExpr::construct_binary_op_expr(eq_expr, alloc_, T_OP_EQ, key_expr, value_expr))) {
20282028
LOG_WARN("fail to construct eq expr", K(ret));
20292029
} else {
20302030
query_info.score_expr_ = eq_expr;
@@ -2039,7 +2039,7 @@ int ObESQueryParser::parse_term(ObIJsonBase &req_node, ObEsQueryInfo &query_info
20392039
} else if (key.case_compare("value") == 0) {
20402040
if (OB_FAIL(parse_const(*value_node, value_expr))) {
20412041
LOG_WARN("fail to parse const value", K(ret));
2042-
} else if (OB_FAIL(ObReqOpExpr::construct_binary_op_expr(eq_expr, alloc_, T_OP_EQ, col_expr, value_expr))) {
2042+
} else if (OB_FAIL(ObReqOpExpr::construct_binary_op_expr(eq_expr, alloc_, T_OP_EQ, key_expr, value_expr))) {
20432043
LOG_WARN("fail to construct eq expr", K(ret));
20442044
}
20452045
} else if (key.case_compare("boost") == 0) {
@@ -2070,7 +2070,7 @@ int ObESQueryParser::parse_terms(ObIJsonBase &req_node, ObEsQueryInfo &query_inf
20702070
{
20712071
int ret = OB_SUCCESS;
20722072
uint64_t count = 0;
2073-
ObReqColumnExpr *col_expr = NULL;
2073+
ObReqExpr *key_expr = NULL;
20742074
ObReqConstExpr *value_expr = NULL;
20752075
ObReqOpExpr *in_expr = NULL;
20762076
common::ObSEArray<ObReqConstExpr*, 4, common::ModulePageAllocator, true> value_exprs;
@@ -2108,11 +2108,11 @@ int ObESQueryParser::parse_terms(ObIJsonBase &req_node, ObEsQueryInfo &query_inf
21082108
ret = OB_INVALID_ARGUMENT;
21092109
LOG_WARN("field should not be empty string", K(ret));
21102110
} else if (FALSE_IT(has_field = true)) {
2111-
} else if (OB_FAIL(ObReqColumnExpr::construct_column_expr(col_expr, alloc_, key))) {
2112-
LOG_WARN("fail to create term expr", K(ret));
2111+
} else if (OB_FAIL(create_column_or_base_expr(key, key_expr))) {
2112+
LOG_WARN("fail to create column or base expr", K(ret));
21132113
} else if (OB_FAIL(parse_keyword_array(*value_node, value_exprs))) {
21142114
LOG_WARN("fail to parse keyword array", K(ret));
2115-
} else if (OB_FAIL(ObReqOpExpr::construct_in_expr(alloc_, col_expr, value_exprs, in_expr))) {
2115+
} else if (OB_FAIL(ObReqOpExpr::construct_in_expr(alloc_, key_expr, value_exprs, in_expr))) {
21162116
LOG_WARN("fail to construct in expr", K(ret));
21172117
}
21182118
}
@@ -3979,6 +3979,36 @@ int ObESQueryParser::construct_partition_cols(const ObIArray<ObString> &column_n
39793979
return ret;
39803980
}
39813981

3982+
bool ObESQueryParser::check_is_column_name(const ObString &key)
3983+
{
3984+
bool is_column_name = false;
3985+
for (int64_t i = 0; !is_column_name && i < user_cols_.count(); i++) {
3986+
if (user_cols_.at(i).case_compare(key) == 0) {
3987+
is_column_name = true;
3988+
}
3989+
}
3990+
LOG_INFO("hnwyllmm check_is_column_name", K(key), K(is_column_name));
3991+
return is_column_name;
3992+
}
3993+
3994+
int ObESQueryParser::create_column_or_base_expr(const ObString &key, ObReqExpr *&expr)
3995+
{
3996+
int ret = OB_SUCCESS;
3997+
if (check_is_column_name(key)) {
3998+
ObReqColumnExpr *col_expr = nullptr;
3999+
if (OB_FAIL(ObReqColumnExpr::construct_column_expr(col_expr, alloc_, key))) {
4000+
LOG_WARN("fail to create column expr", K(ret));
4001+
} else {
4002+
expr = col_expr;
4003+
}
4004+
} else {
4005+
if (OB_FAIL(ObReqExpr::construct_expr(expr, alloc_, key))) {
4006+
LOG_WARN("fail to create normal expr", K(ret));
4007+
}
4008+
}
4009+
return ret;
4010+
}
4011+
39824012
void ObEsQueryInfo::set_msm_apply_type()
39834013
{
39844014
uint64_t msm_val = msm_info_.get_msm_val();

src/share/hybrid_search/ob_query_parse.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,9 @@ private :
378378
inline bool check_is_bool_key(ObString &key) {
379379
return key.case_compare("must") == 0 || key.case_compare("must_not") == 0 || key.case_compare("should") == 0 || key.case_compare("filter") == 0 || key.case_compare("bool") == 0;
380380
}
381+
bool check_is_column_name(const ObString &key);
382+
int create_column_or_base_expr(const ObString &key, ObReqExpr *&expr);
383+
381384
ObIAllocator &alloc_;
382385
common::ObSEArray<common::ObString, 4, common::ModulePageAllocator, true> source_cols_;
383386
bool need_json_wrap_;

src/share/hybrid_search/ob_request_base.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ int ObReqColumnExpr::translate_expr(ObObjPrintParams &print_params_, char *buf_,
325325
PRINT_IDENT_WITH_QUOT(table_name);
326326
DATA_PRINTF(".");
327327
}
328+
328329
PRINT_IDENT_WITH_QUOT(expr_name);
329330
// For ES mode MATCH field, output weight in format: `column`^weight
330331
if (OB_SUCC(ret) && print_weight_ && weight_ >= 0) {
@@ -934,19 +935,19 @@ int ObReqOpExpr::construct_op_expr(ObReqOpExpr *&expr, ObIAllocator &alloc, ObIt
934935
return ret;
935936
}
936937

937-
int ObReqOpExpr::construct_in_expr(ObIAllocator &alloc, ObReqColumnExpr *col_expr, common::ObIArray<ObReqConstExpr *> &value_exprs, ObReqOpExpr *&in_expr)
938+
int ObReqOpExpr::construct_in_expr(ObIAllocator &alloc, ObReqExpr *key_expr, common::ObIArray<ObReqConstExpr *> &value_exprs, ObReqOpExpr *&in_expr)
938939
{
939940
int ret = OB_SUCCESS;
940-
if (OB_ISNULL(col_expr) || value_exprs.count() == 0) {
941+
if (OB_ISNULL(key_expr) || value_exprs.count() == 0) {
941942
ret = OB_INVALID_ARGUMENT;
942943
LOG_WARN("invalid argument", K(ret));
943944
} else if (OB_ISNULL(in_expr = OB_NEWx(ObReqOpExpr, &alloc, T_OP_IN))) {
944945
ret = OB_ALLOCATE_MEMORY_FAILED;
945946
LOG_WARN("fail to create in expr", K(ret));
946-
} else if (OB_ISNULL(col_expr)) {
947+
} else if (OB_ISNULL(key_expr)) {
947948
ret = OB_ERR_UNEXPECTED;
948949
LOG_WARN("unexpectd null ptr", K(ret));
949-
} else if (OB_FAIL(in_expr->params.push_back(col_expr))) {
950+
} else if (OB_FAIL(in_expr->params.push_back(key_expr))) {
950951
LOG_WARN("fail to push in expr param", K(ret));
951952
} else {
952953
for (int64_t i = 0; OB_SUCC(ret) && i < value_exprs.count(); i++) {

src/share/hybrid_search/ob_request_base.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ class ObReqOpExpr : public ObReqExpr
196196
static int construct_binary_op_expr(ObReqOpExpr *&expr, ObIAllocator &alloc, ObItemType type, ObReqExpr *l_param, ObReqExpr *r_param, const ObString &alias_name = ObString());
197197
static int construct_unary_op_expr(ObReqOpExpr *&expr, ObIAllocator &alloc, ObItemType type, ObReqExpr *param);
198198
static int construct_op_expr(ObReqOpExpr *&expr, ObIAllocator &alloc, ObItemType type, const common::ObIArray<ObReqExpr *> &params);
199-
static int construct_in_expr(ObIAllocator &alloc, ObReqColumnExpr *col_expr, common::ObIArray<ObReqConstExpr *> &value_exprs, ObReqOpExpr *&in_expr);
199+
static int construct_in_expr(ObIAllocator &alloc, ObReqExpr *key_expr, common::ObIArray<ObReqConstExpr *> &value_exprs, ObReqOpExpr *&in_expr);
200200
virtual ~ObReqOpExpr() {}
201201
virtual int translate_expr(ObObjPrintParams &print_params_, char *buf_, int64_t buf_len_, int64_t *pos_, ObReqScope scope = FIELD_LIST_SCOPE, bool need_alias = true);
202202
int translate_in_expr(ObObjPrintParams &print_params_, char *buf_, int64_t buf_len_, int64_t *pos_, ObReqScope scope = FIELD_LIST_SCOPE, bool need_alias = true);

0 commit comments

Comments
 (0)