Skip to content

Commit 789ccc3

Browse files
committed
WL12721: DevAPI: Add overlaps and not_overlaps as operator
1 parent 292deec commit 789ccc3

File tree

3 files changed

+72
-3
lines changed

3 files changed

+72
-3
lines changed

cdk/parser/expr_parser.cc

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1569,6 +1569,7 @@ Expression* Expr_parser_base::parse_ilri(Processor *prc)
15691569
next.insert(Op::BETWEEN);
15701570
next.insert(Op::REGEXP);
15711571
next.insert(Op::SOUNDS_LIKE);
1572+
next.insert(Op::OVERLAPS);
15721573

15731574
const Token *t = consume_token(next);
15741575

@@ -1580,7 +1581,7 @@ Expression* Expr_parser_base::parse_ilri(Processor *prc)
15801581
if (!t)
15811582
{
15821583
if (neg)
1583-
parse_error("Expected IN, (R)LIKE, BETWEEN or REGEXP after NOT");
1584+
parse_error("Expected IN, (R)LIKE, BETWEEN, OVERLAPS or REGEXP after NOT");
15841585

15851586
// If prc is NULL return already stored expression.
15861587

@@ -1650,7 +1651,10 @@ Expression* Expr_parser_base::parse_ilri(Processor *prc)
16501651
if (neg)
16511652
op = Op::NOT_REGEXP;
16521653
break;
1653-
1654+
case Op::OVERLAPS:
1655+
if (neg)
1656+
op = Op::NOT_OVERLAPS;
1657+
break;
16541658
default: break;
16551659
}
16561660

@@ -1747,6 +1751,11 @@ Expression* Expr_parser_base::parse_ilri(Processor *prc)
17471751
parse(COMP, aprc->list_el());
17481752
break;
17491753

1754+
case Op::OVERLAPS:
1755+
case Op::NOT_OVERLAPS:
1756+
parse(COMP, aprc->list_el());
1757+
break;
1758+
17501759
case Op::BETWEEN:
17511760
case Op::NOT_BETWEEN:
17521761
parse(COMP, aprc->list_el());

cdk/parser/expr_parser.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ POP_SYS_WARNINGS_CDK
7171
X(RLIKE, "rlike") \
7272
X(INTERVAL, "interval") \
7373
X(REGEXP, "regexp") \
74+
X(OVERLAPS, "overlaps")\
7475
X(ESCAPE, "escape") \
7576
X(HEX, "hex") \
7677
X(BIN, "bin") \
@@ -176,7 +177,9 @@ POP_SYS_WARNINGS_CDK
176177
X(REGEXP, "regexp", {}, {Keyword::REGEXP}) \
177178
X(NOT_REGEXP, "not_regexp", {}, {}) \
178179
X(CAST, "cast", {}, {Keyword::CAST}) \
179-
X(SOUNDS_LIKE, "sounds like", {}, {Keyword::SOUNDS})
180+
X(SOUNDS_LIKE, "sounds like", {}, {Keyword::SOUNDS})\
181+
X(OVERLAPS, "overlaps", {}, {Keyword::OVERLAPS}) \
182+
X(NOT_OVERLAPS, "not_overlaps", {}, {}) \
180183

181184

182185

devapi/tests/crud-t.cc

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2836,3 +2836,60 @@ TEST_F(Crud, PS)
28362836
}
28372837

28382838
}
2839+
2840+
TEST_F(Crud, overlaps)
2841+
{
2842+
SKIP_IF_NO_XPLUGIN;
2843+
SKIP_IF_SERVER_VERSION_LESS(8, 0, 15)
2844+
2845+
cout << "Creating collection..." << endl;
2846+
2847+
Schema sch = getSchema("test");
2848+
Collection coll = sch.createCollection("c1", true);
2849+
2850+
coll.remove("true").execute();
2851+
2852+
2853+
coll.add("{ \"name\": \"foo\", \"age\": 2, \
2854+
\"food\": [\"Milk\", \"Soup\"] }")
2855+
.add("{ \"name\": \"baz\", \"age\": 2, \
2856+
\"food\": [\"Beer\", \"Soup\"] }")
2857+
.execute();
2858+
2859+
auto res = coll.find(R"(food overlaps ["Soup"])").execute();
2860+
EXPECT_EQ(2, res.count());
2861+
2862+
res = coll.find(R"(food overlaps ["Milk", "Soup"])").execute();
2863+
EXPECT_EQ(2, res.count());
2864+
2865+
res = coll.find(R"(food overlaps ["Milk"])").execute();
2866+
EXPECT_EQ(1, res.count());
2867+
EXPECT_EQ(string("foo"),res.fetchOne()["name"]);
2868+
2869+
res = coll.find(R"(food overlaps ["Beer"])").execute();
2870+
EXPECT_EQ(1, res.count());
2871+
EXPECT_EQ(string("baz"),res.fetchOne()["name"]);
2872+
2873+
res = coll.find(R"(food overlaps ["Meat"])").execute();
2874+
EXPECT_EQ(0, res.count());
2875+
2876+
// Not Overlaps tests
2877+
2878+
res = coll.find(R"(food not overlaps ["Soup"])").execute();
2879+
EXPECT_EQ(0, res.count());
2880+
2881+
res = coll.find(R"(food not overlaps ["Milk", "Soup"])").execute();
2882+
EXPECT_EQ(0, res.count());
2883+
2884+
res = coll.find(R"(food not overlaps ["Milk"])").execute();
2885+
EXPECT_EQ(1, res.count());
2886+
EXPECT_EQ(string("baz"),res.fetchOne()["name"]);
2887+
2888+
res = coll.find(R"(food not overlaps ["Beer"])").execute();
2889+
EXPECT_EQ(1, res.count());
2890+
EXPECT_EQ(string("foo"),res.fetchOne()["name"]);
2891+
2892+
res = coll.find(R"(food not overlaps ["Meat"])").execute();
2893+
EXPECT_EQ(2, res.count());
2894+
2895+
}

0 commit comments

Comments
 (0)