xref: /aosp_15_r20/external/googleapis/google/api/expr/v1beta1/eval.proto (revision d5c09012810ac0c9f33fe448fb6da8260d444cc9)
1*d5c09012SAndroid Build Coastguard Worker// Copyright 2019 Google LLC.
2*d5c09012SAndroid Build Coastguard Worker//
3*d5c09012SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*d5c09012SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*d5c09012SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*d5c09012SAndroid Build Coastguard Worker//
7*d5c09012SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*d5c09012SAndroid Build Coastguard Worker//
9*d5c09012SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*d5c09012SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*d5c09012SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*d5c09012SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*d5c09012SAndroid Build Coastguard Worker// limitations under the License.
14*d5c09012SAndroid Build Coastguard Worker//
15*d5c09012SAndroid Build Coastguard Worker
16*d5c09012SAndroid Build Coastguard Workersyntax = "proto3";
17*d5c09012SAndroid Build Coastguard Worker
18*d5c09012SAndroid Build Coastguard Workerpackage google.api.expr.v1beta1;
19*d5c09012SAndroid Build Coastguard Worker
20*d5c09012SAndroid Build Coastguard Workerimport "google/api/expr/v1beta1/value.proto";
21*d5c09012SAndroid Build Coastguard Workerimport "google/rpc/status.proto";
22*d5c09012SAndroid Build Coastguard Worker
23*d5c09012SAndroid Build Coastguard Workeroption cc_enable_arenas = true;
24*d5c09012SAndroid Build Coastguard Workeroption go_package = "google.golang.org/genproto/googleapis/api/expr/v1beta1;expr";
25*d5c09012SAndroid Build Coastguard Workeroption java_multiple_files = true;
26*d5c09012SAndroid Build Coastguard Workeroption java_outer_classname = "EvalProto";
27*d5c09012SAndroid Build Coastguard Workeroption java_package = "com.google.api.expr.v1beta1";
28*d5c09012SAndroid Build Coastguard Worker
29*d5c09012SAndroid Build Coastguard Worker// The state of an evaluation.
30*d5c09012SAndroid Build Coastguard Worker//
31*d5c09012SAndroid Build Coastguard Worker// Can represent an initial, partial, or completed state of evaluation.
32*d5c09012SAndroid Build Coastguard Workermessage EvalState {
33*d5c09012SAndroid Build Coastguard Worker  // A single evaluation result.
34*d5c09012SAndroid Build Coastguard Worker  message Result {
35*d5c09012SAndroid Build Coastguard Worker    // The expression this result is for.
36*d5c09012SAndroid Build Coastguard Worker    IdRef expr = 1;
37*d5c09012SAndroid Build Coastguard Worker
38*d5c09012SAndroid Build Coastguard Worker    // The index in `values` of the resulting value.
39*d5c09012SAndroid Build Coastguard Worker    int32 value = 2;
40*d5c09012SAndroid Build Coastguard Worker  }
41*d5c09012SAndroid Build Coastguard Worker
42*d5c09012SAndroid Build Coastguard Worker  // The unique values referenced in this message.
43*d5c09012SAndroid Build Coastguard Worker  repeated ExprValue values = 1;
44*d5c09012SAndroid Build Coastguard Worker
45*d5c09012SAndroid Build Coastguard Worker  // An ordered list of results.
46*d5c09012SAndroid Build Coastguard Worker  //
47*d5c09012SAndroid Build Coastguard Worker  // Tracks the flow of evaluation through the expression.
48*d5c09012SAndroid Build Coastguard Worker  // May be sparse.
49*d5c09012SAndroid Build Coastguard Worker  repeated Result results = 3;
50*d5c09012SAndroid Build Coastguard Worker}
51*d5c09012SAndroid Build Coastguard Worker
52*d5c09012SAndroid Build Coastguard Worker// The value of an evaluated expression.
53*d5c09012SAndroid Build Coastguard Workermessage ExprValue {
54*d5c09012SAndroid Build Coastguard Worker  // An expression can resolve to a value, error or unknown.
55*d5c09012SAndroid Build Coastguard Worker  oneof kind {
56*d5c09012SAndroid Build Coastguard Worker    // A concrete value.
57*d5c09012SAndroid Build Coastguard Worker    Value value = 1;
58*d5c09012SAndroid Build Coastguard Worker
59*d5c09012SAndroid Build Coastguard Worker    // The set of errors in the critical path of evalution.
60*d5c09012SAndroid Build Coastguard Worker    //
61*d5c09012SAndroid Build Coastguard Worker    // Only errors in the critical path are included. For example,
62*d5c09012SAndroid Build Coastguard Worker    // `(<error1> || true) && <error2>` will only result in `<error2>`,
63*d5c09012SAndroid Build Coastguard Worker    // while `<error1> || <error2>` will result in both `<error1>` and
64*d5c09012SAndroid Build Coastguard Worker    // `<error2>`.
65*d5c09012SAndroid Build Coastguard Worker    //
66*d5c09012SAndroid Build Coastguard Worker    // Errors cause by the presence of other errors are not included in the
67*d5c09012SAndroid Build Coastguard Worker    // set. For example `<error1>.foo`, `foo(<error1>)`, and `<error1> + 1` will
68*d5c09012SAndroid Build Coastguard Worker    // only result in `<error1>`.
69*d5c09012SAndroid Build Coastguard Worker    //
70*d5c09012SAndroid Build Coastguard Worker    // Multiple errors *might* be included when evaluation could result
71*d5c09012SAndroid Build Coastguard Worker    // in different errors. For example `<error1> + <error2>` and
72*d5c09012SAndroid Build Coastguard Worker    // `foo(<error1>, <error2>)` may result in `<error1>`, `<error2>` or both.
73*d5c09012SAndroid Build Coastguard Worker    // The exact subset of errors included for this case is unspecified and
74*d5c09012SAndroid Build Coastguard Worker    // depends on the implementation details of the evaluator.
75*d5c09012SAndroid Build Coastguard Worker    ErrorSet error = 2;
76*d5c09012SAndroid Build Coastguard Worker
77*d5c09012SAndroid Build Coastguard Worker    // The set of unknowns in the critical path of evaluation.
78*d5c09012SAndroid Build Coastguard Worker    //
79*d5c09012SAndroid Build Coastguard Worker    // Unknown behaves identically to Error with regards to propagation.
80*d5c09012SAndroid Build Coastguard Worker    // Specifically, only unknowns in the critical path are included, unknowns
81*d5c09012SAndroid Build Coastguard Worker    // caused by the presence of other unknowns are not included, and multiple
82*d5c09012SAndroid Build Coastguard Worker    // unknowns *might* be included included when evaluation could result in
83*d5c09012SAndroid Build Coastguard Worker    // different unknowns. For example:
84*d5c09012SAndroid Build Coastguard Worker    //
85*d5c09012SAndroid Build Coastguard Worker    //     (<unknown[1]> || true) && <unknown[2]> -> <unknown[2]>
86*d5c09012SAndroid Build Coastguard Worker    //     <unknown[1]> || <unknown[2]> -> <unknown[1,2]>
87*d5c09012SAndroid Build Coastguard Worker    //     <unknown[1]>.foo -> <unknown[1]>
88*d5c09012SAndroid Build Coastguard Worker    //     foo(<unknown[1]>) -> <unknown[1]>
89*d5c09012SAndroid Build Coastguard Worker    //     <unknown[1]> + <unknown[2]> -> <unknown[1]> or <unknown[2[>
90*d5c09012SAndroid Build Coastguard Worker    //
91*d5c09012SAndroid Build Coastguard Worker    // Unknown takes precidence over Error in cases where a `Value` can short
92*d5c09012SAndroid Build Coastguard Worker    // circuit the result:
93*d5c09012SAndroid Build Coastguard Worker    //
94*d5c09012SAndroid Build Coastguard Worker    //     <error> || <unknown> -> <unknown>
95*d5c09012SAndroid Build Coastguard Worker    //     <error> && <unknown> -> <unknown>
96*d5c09012SAndroid Build Coastguard Worker    //
97*d5c09012SAndroid Build Coastguard Worker    // Errors take precidence in all other cases:
98*d5c09012SAndroid Build Coastguard Worker    //
99*d5c09012SAndroid Build Coastguard Worker    //     <unknown> + <error> -> <error>
100*d5c09012SAndroid Build Coastguard Worker    //     foo(<unknown>, <error>) -> <error>
101*d5c09012SAndroid Build Coastguard Worker    UnknownSet unknown = 3;
102*d5c09012SAndroid Build Coastguard Worker  }
103*d5c09012SAndroid Build Coastguard Worker}
104*d5c09012SAndroid Build Coastguard Worker
105*d5c09012SAndroid Build Coastguard Worker// A set of errors.
106*d5c09012SAndroid Build Coastguard Worker//
107*d5c09012SAndroid Build Coastguard Worker// The errors included depend on the context. See `ExprValue.error`.
108*d5c09012SAndroid Build Coastguard Workermessage ErrorSet {
109*d5c09012SAndroid Build Coastguard Worker  // The errors in the set.
110*d5c09012SAndroid Build Coastguard Worker  repeated google.rpc.Status errors = 1;
111*d5c09012SAndroid Build Coastguard Worker}
112*d5c09012SAndroid Build Coastguard Worker
113*d5c09012SAndroid Build Coastguard Worker// A set of expressions for which the value is unknown.
114*d5c09012SAndroid Build Coastguard Worker//
115*d5c09012SAndroid Build Coastguard Worker// The unknowns included depend on the context. See `ExprValue.unknown`.
116*d5c09012SAndroid Build Coastguard Workermessage UnknownSet {
117*d5c09012SAndroid Build Coastguard Worker  // The ids of the expressions with unknown values.
118*d5c09012SAndroid Build Coastguard Worker  repeated IdRef exprs = 1;
119*d5c09012SAndroid Build Coastguard Worker}
120*d5c09012SAndroid Build Coastguard Worker
121*d5c09012SAndroid Build Coastguard Worker// A reference to an expression id.
122*d5c09012SAndroid Build Coastguard Workermessage IdRef {
123*d5c09012SAndroid Build Coastguard Worker  // The expression id.
124*d5c09012SAndroid Build Coastguard Worker  int32 id = 1;
125*d5c09012SAndroid Build Coastguard Worker}
126