6
6
#include < ydb/core/kqp/gateway/kqp_metadata_loader.h>
7
7
#include < ydb/core/kqp/host/kqp_host_impl.h>
8
8
9
+ #include < ydb/public/sdk/cpp/adapters/issue/issue.h>
9
10
#include < ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/operation/operation.h>
10
11
#include < ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/proto/accessor.h>
11
12
#include < ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/table/table.h>
@@ -27,6 +28,12 @@ using namespace NYdb::NTable;
27
28
28
29
Y_UNIT_TEST_SUITE (KqpVectorIndexes) {
29
30
31
+ NYdb::NTable::TDataQueryResult ExecuteDataQuery (TSession& session, const TString& query) {
32
+ const auto txSettings = TTxControl::BeginTx (TTxSettings::SerializableRW ()).CommitTx ();
33
+ return session.ExecuteDataQuery (query, txSettings,
34
+ TExecDataQuerySettings ().KeepInQueryCache (true ).CollectQueryStats (ECollectQueryStatsMode::Basic)).ExtractValueSync ();
35
+ }
36
+
30
37
std::vector<i64 > DoPositiveQueryVectorIndex (TSession& session, const TString& query, bool covered = false ) {
31
38
{
32
39
auto result = session.ExplainDataQuery (query).ExtractValueSync ();
@@ -520,6 +527,59 @@ Y_UNIT_TEST_SUITE(KqpVectorIndexes) {
520
527
DoPositiveQueriesVectorIndexOrderByCosine (session, true /* covered*/ );
521
528
}
522
529
530
+ Y_UNIT_TEST (OrderByReject) {
531
+ NKikimrConfig::TFeatureFlags featureFlags;
532
+ featureFlags.SetEnableVectorIndex (true );
533
+ auto setting = NKikimrKqp::TKqpSetting ();
534
+ auto serverSettings = TKikimrSettings ()
535
+ .SetFeatureFlags (featureFlags)
536
+ .SetKqpSettings ({setting});
537
+
538
+ TKikimrRunner kikimr (serverSettings);
539
+ kikimr.GetTestServer ().GetRuntime ()->SetLogPriority (NKikimrServices::BUILD_INDEX, NActors::NLog::PRI_TRACE);
540
+ kikimr.GetTestServer ().GetRuntime ()->SetLogPriority (NKikimrServices::FLAT_TX_SCHEMESHARD, NActors::NLog::PRI_TRACE);
541
+
542
+ auto db = kikimr.GetTableClient ();
543
+ auto session = DoCreateTableForVectorIndex (db, false );
544
+
545
+ for (const auto & check: TVector<TVector<const char *>>({
546
+ {" distance=cosine" , " Knn::CosineDistance(emb, 'abc') DESC" , " Knn::CosineSimilarity(emb, ...) DESC or Knn::CosineDistance(emb, ...) ASC" },
547
+ {" distance=cosine" , " Knn::CosineSimilarity(emb, 'abc') ASC" , " Knn::CosineSimilarity(emb, ...) DESC or Knn::CosineDistance(emb, ...) ASC" },
548
+ {" similarity=cosine" , " Knn::CosineDistance(emb, 'abc') DESC" , " Knn::CosineSimilarity(emb, ...) DESC or Knn::CosineDistance(emb, ...) ASC" },
549
+ {" similarity=cosine" , " Knn::CosineSimilarity(emb, 'abc') ASC" , " Knn::CosineSimilarity(emb, ...) DESC or Knn::CosineDistance(emb, ...) ASC" },
550
+ {" similarity=inner_product" , " Knn::InnerProductSimilarity(emb, 'abc') ASC" , " Knn::InnerProductSimilarity(emb, ...) DESC" },
551
+ {" distance=manhattan" , " Knn::ManhattanDistance(emb, 'abc') DESC" , " Knn::ManhattanDistance(emb, ...) ASC" },
552
+ {" distance=euclidean" , " Knn::EuclideanDistance(emb, 'abc') DESC" , " Knn::EuclideanDistance(emb, ...) ASC" },
553
+ }))
554
+ {
555
+ const TString createIndex (Q_ (Sprintf (R"(
556
+ ALTER TABLE `/Root/TestTable`
557
+ ADD INDEX index
558
+ GLOBAL USING vector_kmeans_tree
559
+ ON (emb)
560
+ WITH (%s, vector_type="uint8", vector_dimension=2, levels=1, clusters=2);
561
+ )" , check[0 ])));
562
+ auto result = session.ExecuteSchemeQuery (createIndex).ExtractValueSync ();
563
+ UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
564
+
565
+ const TString selectQuery (Q1_ (Sprintf (R"(
566
+ SELECT * FROM `/Root/TestTable`
567
+ VIEW index ORDER BY %s
568
+ )" , check[1 ])));
569
+ result = ExecuteDataQuery (session, selectQuery);
570
+ UNIT_ASSERT_C (HasIssue (NYdb::NAdapters::ToYqlIssues (result.GetIssues ()), NYql::TIssuesIds::KIKIMR_WRONG_INDEX_USAGE,
571
+ [&](const NYql::TIssue& issue) {
572
+ return issue.GetMessage ().Contains (" sorting must contain distance: " + TString (check[2 ]));
573
+ }), result.GetIssues ().ToString ());
574
+ UNIT_ASSERT (!result.IsSuccess ());
575
+
576
+ session = db.CreateSession ().GetValueSync ().GetSession ();
577
+ const TString dropIndex (Q_ (" ALTER TABLE `/Root/TestTable` DROP INDEX index" ));
578
+ result = session.ExecuteSchemeQuery (dropIndex).ExtractValueSync ();
579
+ UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
580
+ }
581
+ }
582
+
523
583
}
524
584
525
585
}
0 commit comments