99#include < absl/strings/ascii.h>
1010#include < absl/strings/match.h>
1111#include < absl/strings/str_format.h>
12+ #include < absl/strings/str_join.h>
1213#include < absl/strings/str_split.h>
1314#include < absl/strings/string_view.h>
1415
2425#include " facade/error.h"
2526#include " facade/reply_builder.h"
2627#include " server/acl/acl_commands_def.h"
28+ #include " server/cluster/cluster_config.h"
29+ #include " server/cluster/coordinator.h"
2730#include " server/command_registry.h"
2831#include " server/config_registry.h"
2932#include " server/conn_context.h"
@@ -316,7 +319,7 @@ ParseResult<bool> ParseSchema(CmdArgParser* parser, DocIndex* index) {
316319#pragma GCC diagnostic pop
317320#endif
318321
319- ParseResult<DocIndex> ParseCreateParams (CmdArgParser* parser) {
322+ ParseResult<DocIndex> CreateDocIndex (CmdArgParser* parser) {
320323 DocIndex index{};
321324
322325 while (parser->HasNext ()) {
@@ -1047,7 +1050,9 @@ void SearchFamily::FtCreate(CmdArgList args, const CommandContext& cmd_cntx) {
10471050 CmdArgParser parser{args};
10481051 string_view idx_name = parser.Next ();
10491052
1050- auto parsed_index = ParseCreateParams (&parser);
1053+ bool is_cross_shard = parser.Check (" CSS" );
1054+
1055+ auto parsed_index = CreateDocIndex (&parser);
10511056 if (SendErrorIfOccurred (parsed_index, &parser, builder)) {
10521057 return ;
10531058 }
@@ -1069,6 +1074,15 @@ void SearchFamily::FtCreate(CmdArgList args, const CommandContext& cmd_cntx) {
10691074 return builder->SendError (" Index already exists" );
10701075 }
10711076
1077+ if (!is_cross_shard && IsClusterEnabled ()) {
1078+ std::string args_str = absl::StrJoin (args.subspan (1 ), " " );
1079+ std::string cmd = absl::StrCat (" FT.CREATE " , idx_name, " CSS " , args_str);
1080+
1081+ // TODO add processing of the reply to make sure index was created successfully on all shards,
1082+ // and prevent simultaneous creation of the same index.
1083+ cluster::Coordinator::Current ().DispatchAll (cmd);
1084+ }
1085+
10721086 auto idx_ptr = make_shared<DocIndex>(std::move (parsed_index).value ());
10731087 cmd_cntx.tx ->Execute (
10741088 [idx_name, idx_ptr](auto * tx, auto * es) {
@@ -1283,6 +1297,8 @@ void SearchFamily::FtSearch(CmdArgList args, const CommandContext& cmd_cntx) {
12831297 string_view index_name = parser.Next ();
12841298 string_view query_str = parser.Next ();
12851299
1300+ bool is_cross_shard = parser.Check (" CSS" );
1301+
12861302 auto * builder = cmd_cntx.rb ;
12871303 auto params = ParseSearchParams (&parser);
12881304 if (SendErrorIfOccurred (params, &parser, builder))
@@ -1295,6 +1311,13 @@ void SearchFamily::FtSearch(CmdArgList args, const CommandContext& cmd_cntx) {
12951311 absl::StrCat (" Query string is too long, max length is " , max_query_bytes, " bytes" ));
12961312 }
12971313
1314+ if (!is_cross_shard && IsClusterEnabled ()) {
1315+ std::string args_str = absl::StrJoin (args.subspan (2 ), " " );
1316+ std::string cmd = absl::StrCat (" FT.SEARCH " , index_name, " " , query_str, " CSS " , args_str);
1317+
1318+ cluster::Coordinator::Current ().DispatchAll (cmd);
1319+ }
1320+
12981321 search::SearchAlgorithm search_algo;
12991322 if (!search_algo.Init (query_str, ¶ms->query_params , ¶ms->optional_filters ))
13001323 return builder->SendError (" Query syntax error" );
0 commit comments