From e45424d7daaf54d4d6c3c437491dc17533556db3 Mon Sep 17 00:00:00 2001 From: Priec Date: Wed, 2 Sep 2026 18:01:34 +0200 Subject: [PATCH] column reindexation implemented and others --- client | 2 +- client-gui2 | 2 +- common/proto/table_definition.proto | 24 ++++ common/src/proto/descriptor.bin | Bin 234091 -> 235679 bytes common/src/proto/komp_ac.table_definition.rs | 115 +++++++++++++++++++ server | 2 +- 6 files changed, 142 insertions(+), 3 deletions(-) diff --git a/client b/client index a46ff110..70241e22 160000 --- a/client +++ b/client @@ -1 +1 @@ -Subproject commit a46ff11093302dfaea766cf09067c9a4011b7501 +Subproject commit 70241e22c4064bcbc43cd27aa6d54dbf4e226b68 diff --git a/client-gui2 b/client-gui2 index fbb19315..6af9d5a1 160000 --- a/client-gui2 +++ b/client-gui2 @@ -1 +1 @@ -Subproject commit fbb193158022958de058f268cf425578fa6005b8 +Subproject commit 6af9d5a1277aad3f0888c4ceb6861540a2cea8e1 diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index a4df95ee..1c686310 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -66,6 +66,10 @@ service TableDefinition { // presentation metadata and may be changed after rows have been stored. rpc SetRowDisplayColumns(SetRowDisplayColumnsRequest) returns (SetRowDisplayColumnsResponse); + // Replaces the user-managed indexes of an existing dynamic table. Physical + // indexes are created or dropped even when rows have already been stored. + rpc SetTableIndexes(SetTableIndexesRequest) returns (SetTableIndexesResponse); + // Replaces the optional user-visible aliases for a fixed-option column. // Stored values remain stable machine values and scripts never depend on labels. rpc SetColumnOptionAliases(SetColumnOptionAliasesRequest) returns (SetColumnOptionAliasesResponse); @@ -529,6 +533,9 @@ message TableDetail { // soft-deleted row. Populated tables are append-only: PutTableDefinition is // no longer available, while AddTableColumns remains available. bool has_data = 12; + + // User-managed single-column indexes. Backend-managed indexes are omitted. + repeated string indexes = 13; } // Server-owned behavior for one logical column returned in table details. @@ -608,6 +615,23 @@ message SetRowDisplayColumnsResponse { int64 row_version = 3; } +// Atomically replaces the table's user-managed single-column indexes. Indexes +// owned by the backend, including link and navigation indexes, are unchanged. +message SetTableIndexesRequest { + string profile_name = 1; + string table_name = 2; + repeated string indexes = 3; + // Row version returned by GetProfileDetails when the indexes were read. + int64 expected_row_version = 4; +} + +message SetTableIndexesResponse { + bool success = 1; + repeated string indexes = 2; + // New row version after the update, or the current version for a no-op. + int64 row_version = 3; +} + // One public option name. `value` identifies the option by its current public // alias and `alias` is its desired public alias; stored values remain internal. message OptionValueAlias { diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 0ef56abb0164c4d1eb31ea9481f6b06370f4ffa1..d947dc1254ee6aea4b109b948def73a0b12aba57 100644 GIT binary patch delta 15468 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%0DEWI#^yhBWnH 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 L{jQGA8u@<#8mvFF delta 14310 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, } /// Server-owned behavior for one logical column returned in table details. #[derive(serde::Serialize, serde::Deserialize)] @@ -654,6 +657,32 @@ pub struct SetRowDisplayColumnsResponse { #[prost(int64, tag = "3")] pub row_version: i64, } +/// Atomically replaces the table's user-managed single-column indexes. Indexes +/// owned by the backend, including link and navigation indexes, are unchanged. +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct SetTableIndexesRequest { + #[prost(string, tag = "1")] + pub profile_name: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub table_name: ::prost::alloc::string::String, + #[prost(string, repeated, tag = "3")] + pub indexes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Row version returned by GetProfileDetails when the indexes were read. + #[prost(int64, tag = "4")] + pub expected_row_version: i64, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct SetTableIndexesResponse { + #[prost(bool, tag = "1")] + pub success: bool, + #[prost(string, repeated, tag = "2")] + pub indexes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// New row version after the update, or the current version for a no-op. + #[prost(int64, tag = "3")] + pub row_version: i64, +} /// One public option name. `value` identifies the option by its current public /// alias and `alias` is its desired public alias; stored values remain internal. #[derive(serde::Serialize, serde::Deserialize)] @@ -1551,6 +1580,37 @@ pub mod table_definition_client { ); self.inner.unary(req, path, codec).await } + /// Replaces the user-managed indexes of an existing dynamic table. Physical + /// indexes are created or dropped even when rows have already been stored. + pub async fn set_table_indexes( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::unknown( + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic_prost::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/komp_ac.table_definition.TableDefinition/SetTableIndexes", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "komp_ac.table_definition.TableDefinition", + "SetTableIndexes", + ), + ); + self.inner.unary(req, path, codec).await + } /// Replaces the optional user-visible aliases for a fixed-option column. /// Stored values remain stable machine values and scripts never depend on labels. pub async fn set_column_option_aliases( @@ -1786,6 +1846,15 @@ pub mod table_definition_server { tonic::Response, tonic::Status, >; + /// Replaces the user-managed indexes of an existing dynamic table. Physical + /// indexes are created or dropped even when rows have already been stored. + async fn set_table_indexes( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; /// Replaces the optional user-visible aliases for a fixed-option column. /// Stored values remain stable machine values and scripts never depend on labels. async fn set_column_option_aliases( @@ -2572,6 +2641,52 @@ pub mod table_definition_server { }; Box::pin(fut) } + "/komp_ac.table_definition.TableDefinition/SetTableIndexes" => { + #[allow(non_camel_case_types)] + struct SetTableIndexesSvc(pub Arc); + impl< + T: TableDefinition, + > tonic::server::UnaryService + for SetTableIndexesSvc { + type Response = super::SetTableIndexesResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::set_table_indexes(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = SetTableIndexesSvc(inner); + let codec = tonic_prost::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } "/komp_ac.table_definition.TableDefinition/SetColumnOptionAliases" => { #[allow(non_camel_case_types)] struct SetColumnOptionAliasesSvc(pub Arc); diff --git a/server b/server index 6b63dde5..6dbaccc8 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 6b63dde568b71c9e651168336660b73b12d3db41 +Subproject commit 6dbaccc8685a2d0db3b4d8687b7673aadf0ba05a