| 67 | using testing::MatchesRegex; |
| 68 | |
| 69 | TEST(SemaCheckerTest, Simple) { |
| 70 | auto index_map = MakeIndexMap(); |
| 71 | |
| 72 | { |
| 73 | SemaChecker checker(index_map); |
| 74 | ASSERT_EQ(checker.Check(Parse("select a from b")->get()).Msg(), "index `b` not found"); |
| 75 | ASSERT_EQ(checker.Check(Parse("select a from ia")->get()).Msg(), "field `a` not found in index `ia`"); |
| 76 | ASSERT_EQ(checker.Check(Parse("select f1 from ia")->get()).Msg(), "ok"); |
| 77 | ASSERT_EQ(checker.Check(Parse("select f1 from ia where b = 1")->get()).Msg(), "field `b` not found in index `ia`"); |
| 78 | ASSERT_EQ(checker.Check(Parse("select f1 from ia where f1 = 1")->get()).Msg(), "field `f1` is not a numeric field"); |
| 79 | ASSERT_EQ(checker.Check(Parse("select f1 from ia where f2 hastag \"a\"")->get()).Msg(), |
| 80 | "field `f2` is not a tag field"); |
| 81 | ASSERT_EQ(checker.Check(Parse("select f1 from ia where f1 hastag \"a\" and f2 = 1")->get()).Msg(), "ok"); |
| 82 | ASSERT_EQ(checker.Check(Parse("select f1 from ia where f1 hastag \"\"")->get()).Msg(), |
| 83 | "tag cannot be an empty string"); |
| 84 | ASSERT_EQ(checker.Check(Parse("select f1 from ia where f1 hastag \",\"")->get()).Msg(), |
| 85 | "tag cannot contain the separator `,`"); |
| 86 | ASSERT_EQ(checker.Check(Parse("select f1 from ia order by a")->get()).Msg(), "field `a` not found in index `ia`"); |
| 87 | ASSERT_EQ(checker.Check(Parse("select f4 from ia order by f4 <-> [3.6,4.7] limit 5")->get()).Msg(), |
| 88 | "vector should be of size `3` for field `f4`"); |
| 89 | ASSERT_EQ(checker.Check(Parse("select f4 from ia where f4 <-> [3.6,4.7] < 5")->get()).Msg(), |
| 90 | "vector should be of size `3` for field `f4`"); |
| 91 | ASSERT_EQ(checker.Check(Parse("select f4 from ia where f4 <-> [3.6,4.7,5.6] < -5")->get()).Msg(), |
| 92 | "range cannot be a negative number for l2 distance metric"); |
| 93 | ASSERT_EQ(checker.Check(Parse("select f4 from ia order by f4 limit 5")->get()).Msg(), |
| 94 | "field `f4` is a vector field according to metadata and does expect a vector parameter"); |
| 95 | ASSERT_EQ(checker.Check(Parse("select f4 from ia order by f1 <-> [3.6,4.7,5.6] limit 5")->get()).Msg(), |
| 96 | "field `f1` is not sortable"); |
| 97 | ASSERT_EQ(checker.Check(Parse("select f4 from ia order by f2 <-> [3.6,4.7,5.6] limit 5")->get()).Msg(), |
| 98 | "field `f2` is not a vector field according to metadata and does not expect a vector parameter"); |
| 99 | ASSERT_EQ(checker.Check(Parse("select f4 from ia order by f4 <-> [3.6,4.7,5.6]")->get()).Msg(), |
| 100 | "expect a LIMIT clause for vector field to construct a KNN search"); |
| 101 | ASSERT_EQ(checker.Check(Parse("select f5 from ia order by f5 <-> [3.6,4.7,5.6] limit 5")->get()).Msg(), |
| 102 | "field `f5` is marked as NOINDEX and cannot be used for KNN search"); |
| 103 | ASSERT_EQ(checker.Check(Parse("select f5 from ia where f2 = 1 order by f4 <-> [3.6,4.7,5.6] limit 5")->get()).Msg(), |
| 104 | "KNN search cannot be combined with other query expressions"); |
| 105 | ASSERT_EQ(checker.Check(Parse("select f5 from ia where true order by f4 <-> [3.6,4.7,5.6] limit 5")->get()).Msg(), |
| 106 | "ok"); |
| 107 | ASSERT_EQ(checker.Check(Parse("select f5 from ia where false order by f4 <-> [3.6,4.7,5.6] limit 5")->get()).Msg(), |
| 108 | "ok"); |
| 109 | ASSERT_EQ(checker.Check(Parse("select f5 from ia where f2 = 1 and f5 <-> [3.6,4.7,5.6] < 1")->get()).Msg(), "ok"); |
| 110 | ASSERT_EQ(checker.Check(Parse("select f5 from ia where f5 <-> [3.6,4.7,5.6] < 5")->get()).Msg(), |
| 111 | "range has to be between 0 and 2 for cosine distance metric"); |
| 112 | ASSERT_EQ(checker.Check(Parse("select f5 from ia where f5 <-> [3.6,4.7,5.6] < 0.5")->get()).Msg(), "ok"); |
| 113 | } |
| 114 | |
| 115 | { |
| 116 | SemaChecker checker(index_map); |
| 117 | auto root = *Parse("select f1 from ia where f1 hastag \"a\" and f2 = 1 order by f3"); |
| 118 | |
| 119 | ASSERT_EQ(checker.Check(root.get()).Msg(), "ok"); |
| 120 | } |
| 121 | } |
nothing calls this directly
no test coverage detected