From f8a333e5403adbd7afa03c7c7eaca37f4f8d7dff Mon Sep 17 00:00:00 2001 From: Priec Date: Wed, 12 Aug 2026 19:50:43 +0200 Subject: [PATCH] FK columns can be directly referenced from now on --- client | 2 +- common/proto/table_definition.proto | 8 +++++++- common/src/proto/descriptor.bin | Bin 167061 -> 167503 bytes common/src/proto/komp_ac.table_definition.rs | 8 +++++++- server | 2 +- 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/client b/client index e17321c9..1d7d88e4 160000 --- a/client +++ b/client @@ -1 +1 @@ -Subproject commit e17321c951fd3b1d18d2b10ecd0966742091abcc +Subproject commit 1d7d88e4c6640c3172afd45be18a1f1cea51c584 diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index b443afc5..a0d9d328 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -62,7 +62,9 @@ message PostTableDefinitionRequest { // two are named side by side. The "_id" suffix is allowed. string table_name = 1; - // The table's columns, including its links. System columns are added on top. + // The table's columns, including its links and stored linked projections. + // A projection uses field_type FROM(link_column.source_column); its physical + // type and money metadata are inferred from the linked source column. repeated ColumnDefinition columns = 3; // Column names to index, matching names declared above. System columns @@ -139,6 +141,7 @@ message AddTableColumnsRequest { string table_name = 2; // New user-defined columns only. Existing columns cannot be changed here. + // Stored linked projections use field_type FROM(link_column.source_column). repeated ColumnDefinition columns = 3; // Optional indexes for the new columns only. @@ -188,6 +191,9 @@ message ColumnDefinition { // LINK(table) → BIGINT referencing that table in the same profile, indexed // automatically. A table may hold several links to the same // target as long as the columns are named differently. + // FROM(link.source) → stored, read-only copy of an atomic column reached + // through another column in this definition whose type is + // LINK(...). SQL type and money metadata are inferred. // DECIMAL args must be integers (no sign, no dot, no leading zeros); // s ≤ p and p ≥ 1. string field_type = 2; diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index f404c4dc7f21cf87486033b4eb714fcf5be3a593..8a1045f97e9bf8c27dbde6a089ebbcd5271d9190 100644 GIT binary patch delta 7597 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 diff --git a/common/src/proto/komp_ac.table_definition.rs b/common/src/proto/komp_ac.table_definition.rs index e5a680fa..d870c9c1 100644 --- a/common/src/proto/komp_ac.table_definition.rs +++ b/common/src/proto/komp_ac.table_definition.rs @@ -11,7 +11,9 @@ pub struct PostTableDefinitionRequest { /// two are named side by side. The "\_id" suffix is allowed. #[prost(string, tag = "1")] pub table_name: ::prost::alloc::string::String, - /// The table's columns, including its links. System columns are added on top. + /// The table's columns, including its links and stored linked projections. + /// A projection uses field_type FROM(link_column.source_column); its physical + /// type and money metadata are inferred from the linked source column. #[prost(message, repeated, tag = "3")] pub columns: ::prost::alloc::vec::Vec, /// Column names to index, matching names declared above. System columns @@ -102,6 +104,7 @@ pub struct AddTableColumnsRequest { #[prost(string, tag = "2")] pub table_name: ::prost::alloc::string::String, /// New user-defined columns only. Existing columns cannot be changed here. + /// Stored linked projections use field_type FROM(link_column.source_column). #[prost(message, repeated, tag = "3")] pub columns: ::prost::alloc::vec::Vec, /// Optional indexes for the new columns only. @@ -147,6 +150,9 @@ pub struct ColumnDefinition { /// LINK(table) → BIGINT referencing that table in the same profile, indexed /// automatically. A table may hold several links to the same /// target as long as the columns are named differently. + /// FROM(link.source) → stored, read-only copy of an atomic column reached + /// through another column in this definition whose type is + /// LINK(...). SQL type and money metadata are inferred. /// DECIMAL args must be integers (no sign, no dot, no leading zeros); /// s ≤ p and p ≥ 1. #[prost(string, tag = "2")] diff --git a/server b/server index 195db2f0..5b6b8603 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 195db2f04a8bb514e3a73bb112ecea486da5e08d +Subproject commit 5b6b860372459553eced168717d4dd4ecc639a26