From 36d401f3a46af3b983f364dddd9ff032773f4145 Mon Sep 17 00:00:00 2001 From: Filipriec Date: Sat, 29 Aug 2026 15:30:04 +0200 Subject: [PATCH] boolean quantity ledger --- common/build.rs | 4 ++ common/proto/table_definition.proto | 14 ++++++- common/src/proto/descriptor.bin | Bin 201108 -> 201712 bytes common/src/proto/komp_ac.table_definition.rs | 38 ++++++++++++++++++- server | 2 +- 5 files changed, 53 insertions(+), 5 deletions(-) diff --git a/common/build.rs b/common/build.rs index 4d05e10a..4b80a955 100644 --- a/common/build.rs +++ b/common/build.rs @@ -157,6 +157,10 @@ fn main() -> Result<(), Box> { ".komp_ac.table_definition.ColumnDefinition", "#[derive(serde::Serialize, serde::Deserialize)]", ) + .field_attribute( + ".komp_ac.table_definition.ColumnDefinition.boolean_ledger_operator", + "#[serde(default)]", + ) .type_attribute( ".komp_ac.table_definition.PostTableDefinitionRequest", "#[derive(serde::Serialize, serde::Deserialize)]", diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index 8dc9ecfe..3fbdfa63 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -291,8 +291,8 @@ message ColumnDefinition { // MONEY rounding applied before a value is stored. MoneyRounding rounding = 3; - // When true, this numeric column is server-owned and projected from the - // profile quantity ledger. + // When true, this numeric or Boolean column is server-owned and projected + // from ledger contributions. bool quantity_ledger = 4; // Canonical uppercase ISO-4217 currency code. Required for MONEY and forbidden @@ -301,6 +301,16 @@ message ColumnDefinition { // When true, the server rejects omitted or explicitly null values. bool required = 6; + + // Required for Boolean ledger columns and forbidden otherwise. ANY means + // one true contribution wins; ALL means one false contribution wins. + BooleanLedgerOperator boolean_ledger_operator = 7; +} + +enum BooleanLedgerOperator { + BOOLEAN_LEDGER_OPERATOR_UNSPECIFIED = 0; + BOOLEAN_LEDGER_OPERATOR_ANY = 1; + BOOLEAN_LEDGER_OPERATOR_ALL = 2; } // Response after table creation (success + DDL preview). diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 29713fe95b9afe6146a14f27665a9afddd2ae5c8..371c8cbed221618a019df85add525c4c4dfe33cd 100644 GIT binary patch delta 6801 zcmaJ_dvI079lra>$-U<$BsocL!c7Pl5J4UhNb2|~Rvr-%1PUniF(Q^|=?KvTbnH02 z2E>kyQ$P!g70`|^97SGAkkRnaOaLP^7>bCz3@sSIA`v1Y+V8h}HYd*5{&&CK-}mkB zb$0jeUtdZ)^IF>DZ?hjBXG zsTB{FS5BK6w>X1s4QG1uq*bhu}ko2M52h2^WnqpW}J z?mw{gnaR1#&HY&suaDbn`1tW-%Z81cI<{=&sIrMu$4@AmIBfFxiBoSKH)%rIh|xEW zE*qH{^18bP|I2XLxZ5+?|1(G#Hg;?#udS|OpE%Lo`n*IsF+n%ThqX%u;lYh>o}fV$9ZY|X_lB+{?MEmmF3eD_XTQ!!UJ<=&Z(rOs_h!$wqkfJY3+8 zhftabc}@f8yH(9jHZH4yyE*O^u0!MG)ehCVll3p%!KLeFxT$6si|pXh++YC9?BMxb z-BrwI!eW;i{SjMTx~nsj+}p*Yu?{8!a~JO#cl&EsP{uu+pHu@HS--439A-CbL0!XU zb$=rpdv!CH5ub00+00Q6;~NGb*h~>$;}fysJ}z_OSE%B1yhuepX89!;u+cD1KJDYt zj1CF%X&?8p-N$?h6!L(Y{4x9E=mW@NhaE?I9^mPD!2pyF@cf>^0F(~!-j}<#`AWct zxEv6_Q7wFl#nj+kZ0JY~1ezj+EYh<(Bm^`M@ti)vfY#{O-@V<}l%71Q*6m_nuevlZX zQ64GuIn-O<^X>_BESKq?^CJ(<6?)T>>9G8fhl|`vP)jF=s)hRW6E-P6$B)njirYi?BXeWET0hMDQM30tmhV8s7k+xJ3As2ZZ1fp(`&z#iRAjAb|;sS)!QrjVbkXkA{6Bi()mQq-Q5tipU%S7n!>ZyHfP;!~T zfk1ilD6HjzXX~(lAP8shh)t_tq}ukV~rs z&(IkGf*_!Y5)gu`MA)wlJjpuS~uo6MoQtQI`s zFH3a+w98VktEqM9GlDI+s|EH%YKI&`YXr~tC#f!gc3G;+8WAyl23u_$%k!z|>a~J* zOZr?1F0kd&>9$rxtTLT#Yehk!&xP$eaD8fuftE_=+q!^Cr`x)Kid|uS;IWf3NMp;T z18#lbG97R01ze^pUasfViqIyt@c=7J){1a{?MyCJZKF*+5S#%tf`Aa*Xd4L-f*Wn> zb1Ap)3jPZn2M|&MXetZ{SKk%UzIIj{UtzZN7^Wfht|%$R4T{T{=e#dMd(<z+kTh@^+Reu z`q*MT)syu>F;hVWG}|^NL9G|5C}zG+Mk=`VRLxs8H|)s<^`Ap*N@+t-#V|Mx)GQ`{ zVNe=GEZ^No_njDzc(M_jZv1to>UOii>W#x}UNJ_jw-L}AZEwRI^hS{%cMlo5>&Yf{ z*AaH4xG8Yc1*b`*nmsPYU2vL&m*Y-B6X$u(UJ*K`et(qRma&&M^xNS_9yRekwfiW$ zbKpKJgh2@H6RBpq1%%K(I%_E0JnE^>)RZsSl!2cG6l&Vf0tz+lXGEE-Dd^dQ>cAK5 zwt)w2h4~mHShYASFL4oV;L`?xYqV8^ClLsCNR-rCDB2vu_E|1f$cSPjm`i`ON zTGZhdHl?`5)*(-KTZ;%=3UylxQAQvs`JQuJgifpJ$Jp@XaS=8LaXuyGgy81P141(Z zn$HsuKAf=jdhw0u|6wDQhPM{*+KFVpbdDZ-DU_Svw_o*K7S*`dEQ2 zmp;~0B4U*(eWyfTzB`X0e_cK2YY{r94*iSG&G?$Gc4H7pSIS?Ts`xj%WoDbr8wR1& zX7dIJr8b+lt`yxj_SyslCjgBTfOuY``VC#1Cc}rg=X@(dKM02Zh4(CDx$64k z?AqkFB7B*SFHX)}utx|GlmU%0Ae1lI&kPXC7wi!dC#Sx%`w0-JfR;*5eP{O*%!2xz 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 Q079W-PK?*Y#IgMU0fR0VUjP6A diff --git a/common/src/proto/komp_ac.table_definition.rs b/common/src/proto/komp_ac.table_definition.rs index 3b8cb7f6..ac0ab261 100644 --- a/common/src/proto/komp_ac.table_definition.rs +++ b/common/src/proto/komp_ac.table_definition.rs @@ -255,8 +255,8 @@ pub struct ColumnDefinition { /// MONEY rounding applied before a value is stored. #[prost(enumeration = "MoneyRounding", tag = "3")] pub rounding: i32, - /// When true, this numeric column is server-owned and projected from the - /// profile quantity ledger. + /// When true, this numeric or Boolean column is server-owned and projected + /// from ledger contributions. #[prost(bool, tag = "4")] pub quantity_ledger: bool, /// Canonical uppercase ISO-4217 currency code. Required for MONEY and forbidden @@ -266,6 +266,11 @@ pub struct ColumnDefinition { /// When true, the server rejects omitted or explicitly null values. #[prost(bool, tag = "6")] pub required: bool, + /// Required for Boolean ledger columns and forbidden otherwise. ANY means + /// one true contribution wins; ALL means one false contribution wins. + #[prost(enumeration = "BooleanLedgerOperator", tag = "7")] + #[serde(default)] + pub boolean_ledger_operator: i32, } /// Response after table creation (success + DDL preview). #[derive(serde::Serialize, serde::Deserialize)] @@ -677,6 +682,35 @@ impl MoneyRounding { } } } +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum BooleanLedgerOperator { + Unspecified = 0, + Any = 1, + All = 2, +} +impl BooleanLedgerOperator { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "BOOLEAN_LEDGER_OPERATOR_UNSPECIFIED", + Self::Any => "BOOLEAN_LEDGER_OPERATOR_ANY", + Self::All => "BOOLEAN_LEDGER_OPERATOR_ALL", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "BOOLEAN_LEDGER_OPERATOR_UNSPECIFIED" => Some(Self::Unspecified), + "BOOLEAN_LEDGER_OPERATOR_ANY" => Some(Self::Any), + "BOOLEAN_LEDGER_OPERATOR_ALL" => Some(Self::All), + _ => None, + } + } +} /// How a column type is spelled in ColumnDefinition.field_type. #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] #[repr(i32)] diff --git a/server b/server index 3b4f7ee7..554e98ec 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 3b4f7ee71ec316ead162c698f934b15959fcce27 +Subproject commit 554e98ec117ea09f9a856dcbc3c1c86b6768fc30