xref: /aosp_15_r20/external/googleapis/google/api/expr/v1alpha1/eval.proto (revision d5c09012810ac0c9f33fe448fb6da8260d444cc9)
1*d5c09012SAndroid Build Coastguard Worker// Copyright 2023 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 Workersyntax = "proto3";
16*d5c09012SAndroid Build Coastguard Worker
17*d5c09012SAndroid Build Coastguard Workerpackage google.api.expr.v1alpha1;
18*d5c09012SAndroid Build Coastguard Worker
19*d5c09012SAndroid Build Coastguard Workerimport "google/api/expr/v1alpha1/value.proto";
20*d5c09012SAndroid Build Coastguard Workerimport "google/rpc/status.proto";
21*d5c09012SAndroid Build Coastguard Worker
22*d5c09012SAndroid Build Coastguard Workeroption cc_enable_arenas = true;
23*d5c09012SAndroid Build Coastguard Workeroption go_package = "google.golang.org/genproto/googleapis/api/expr/v1alpha1;expr";
24*d5c09012SAndroid Build Coastguard Workeroption java_multiple_files = true;
25*d5c09012SAndroid Build Coastguard Workeroption java_outer_classname = "EvalProto";
26*d5c09012SAndroid Build Coastguard Workeroption java_package = "com.google.api.expr.v1alpha1";
27*d5c09012SAndroid Build Coastguard Worker
28*d5c09012SAndroid Build Coastguard Worker// The state of an evaluation.
29*d5c09012SAndroid Build Coastguard Worker//
30*d5c09012SAndroid Build Coastguard Worker// Can represent an inital, partial, or completed state of evaluation.
31*d5c09012SAndroid Build Coastguard Workermessage EvalState {
32*d5c09012SAndroid Build Coastguard Worker  // A single evalution result.
33*d5c09012SAndroid Build Coastguard Worker  message Result {
34*d5c09012SAndroid Build Coastguard Worker    // The id of the expression this result if for.
35*d5c09012SAndroid Build Coastguard Worker    int64 expr = 1;
36*d5c09012SAndroid Build Coastguard Worker
37*d5c09012SAndroid Build Coastguard Worker    // The index in `values` of the resulting value.
38*d5c09012SAndroid Build Coastguard Worker    int64 value = 2;
39*d5c09012SAndroid Build Coastguard Worker  }
40*d5c09012SAndroid Build Coastguard Worker
41*d5c09012SAndroid Build Coastguard Worker  // The unique values referenced in this message.
42*d5c09012SAndroid Build Coastguard Worker  repeated ExprValue values = 1;
43*d5c09012SAndroid Build Coastguard Worker
44*d5c09012SAndroid Build Coastguard Worker  // An ordered list of results.
45*d5c09012SAndroid Build Coastguard Worker  //
46*d5c09012SAndroid Build Coastguard Worker  // Tracks the flow of evaluation through the expression.
47*d5c09012SAndroid Build Coastguard Worker  // May be sparse.
48*d5c09012SAndroid Build Coastguard Worker  repeated Result results = 3;
49*d5c09012SAndroid Build Coastguard Worker}
50*d5c09012SAndroid Build Coastguard Worker
51*d5c09012SAndroid Build Coastguard Worker// The value of an evaluated expression.
52*d5c09012SAndroid Build Coastguard Workermessage ExprValue {
53*d5c09012SAndroid Build Coastguard Worker  // An expression can resolve to a value, error or unknown.
54*d5c09012SAndroid Build Coastguard Worker  oneof kind {
55*d5c09012SAndroid Build Coastguard Worker    // A concrete value.
56*d5c09012SAndroid Build Coastguard Worker    Value value = 1;
57*d5c09012SAndroid Build Coastguard Worker
58*d5c09012SAndroid Build Coastguard Worker    // The set of errors in the critical path of evalution.
59*d5c09012SAndroid Build Coastguard Worker    //
60*d5c09012SAndroid Build Coastguard Worker    // Only errors in the critical path are included. For example,
61*d5c09012SAndroid Build Coastguard Worker    // `(<error1> || true) && <error2>` will only result in `<error2>`,
62*d5c09012SAndroid Build Coastguard Worker    // while `<error1> || <error2>` will result in both `<error1>` and
63*d5c09012SAndroid Build Coastguard Worker    // `<error2>`.
64*d5c09012SAndroid Build Coastguard Worker    //
65*d5c09012SAndroid Build Coastguard Worker    // Errors cause by the presence of other errors are not included in the
66*d5c09012SAndroid Build Coastguard Worker    // set. For example `<error1>.foo`, `foo(<error1>)`, and `<error1> + 1` will
67*d5c09012SAndroid Build Coastguard Worker    // only result in `<error1>`.
68*d5c09012SAndroid Build Coastguard Worker    //
69*d5c09012SAndroid Build Coastguard Worker    // Multiple errors *might* be included when evaluation could result
70*d5c09012SAndroid Build Coastguard Worker    // in different errors. For example `<error1> + <error2>` and
71*d5c09012SAndroid Build Coastguard Worker    // `foo(<error1>, <error2>)` may result in `<error1>`, `<error2>` or both.
72*d5c09012SAndroid Build Coastguard Worker    // The exact subset of errors included for this case is unspecified and
73*d5c09012SAndroid Build Coastguard Worker    // depends on the implementation details of the evaluator.
74*d5c09012SAndroid Build Coastguard Worker    ErrorSet error = 2;
75*d5c09012SAndroid Build Coastguard Worker
76*d5c09012SAndroid Build Coastguard Worker    // The set of unknowns in the critical path of evaluation.
77*d5c09012SAndroid Build Coastguard Worker    //
78*d5c09012SAndroid Build Coastguard Worker    // Unknown behaves identically to Error with regards to propagation.
79*d5c09012SAndroid Build Coastguard Worker    // Specifically, only unknowns in the critical path are included, unknowns
80*d5c09012SAndroid Build Coastguard Worker    // caused by the presence of other unknowns are not included, and multiple
81*d5c09012SAndroid Build Coastguard Worker    // unknowns *might* be included included when evaluation could result in
82*d5c09012SAndroid Build Coastguard Worker    // different unknowns. For example:
83*d5c09012SAndroid Build Coastguard Worker    //
84*d5c09012SAndroid Build Coastguard Worker    //     (<unknown[1]> || true) && <unknown[2]> -> <unknown[2]>
85*d5c09012SAndroid Build Coastguard Worker    //     <unknown[1]> || <unknown[2]> -> <unknown[1,2]>
86*d5c09012SAndroid Build Coastguard Worker    //     <unknown[1]>.foo -> <unknown[1]>
87*d5c09012SAndroid Build Coastguard Worker    //     foo(<unknown[1]>) -> <unknown[1]>
88*d5c09012SAndroid Build Coastguard Worker    //     <unknown[1]> + <unknown[2]> -> <unknown[1]> or <unknown[2[>
89*d5c09012SAndroid Build Coastguard Worker    //
90*d5c09012SAndroid Build Coastguard Worker    // Unknown takes precidence over Error in cases where a `Value` can short
91*d5c09012SAndroid Build Coastguard Worker    // circuit the result:
92*d5c09012SAndroid Build Coastguard Worker    //
93*d5c09012SAndroid Build Coastguard Worker    //     <error> || <unknown> -> <unknown>
94*d5c09012SAndroid Build Coastguard Worker    //     <error> && <unknown> -> <unknown>
95*d5c09012SAndroid Build Coastguard Worker    //
96*d5c09012SAndroid Build Coastguard Worker    // Errors take precidence in all other cases:
97*d5c09012SAndroid Build Coastguard Worker    //
98*d5c09012SAndroid Build Coastguard Worker    //     <unknown> + <error> -> <error>
99*d5c09012SAndroid Build Coastguard Worker    //     foo(<unknown>, <error>) -> <error>
100*d5c09012SAndroid Build Coastguard Worker    UnknownSet unknown = 3;
101*d5c09012SAndroid Build Coastguard Worker  }
102*d5c09012SAndroid Build Coastguard Worker}
103*d5c09012SAndroid Build Coastguard Worker
104*d5c09012SAndroid Build Coastguard Worker// A set of errors.
105*d5c09012SAndroid Build Coastguard Worker//
106*d5c09012SAndroid Build Coastguard Worker// The errors included depend on the context. See `ExprValue.error`.
107*d5c09012SAndroid Build Coastguard Workermessage ErrorSet {
108*d5c09012SAndroid Build Coastguard Worker  // The errors in the set.
109*d5c09012SAndroid Build Coastguard Worker  repeated google.rpc.Status errors = 1;
110*d5c09012SAndroid Build Coastguard Worker}
111*d5c09012SAndroid Build Coastguard Worker
112*d5c09012SAndroid Build Coastguard Worker// A set of expressions for which the value is unknown.
113*d5c09012SAndroid Build Coastguard Worker//
114*d5c09012SAndroid Build Coastguard Worker// The unknowns included depend on the context. See `ExprValue.unknown`.
115*d5c09012SAndroid Build Coastguard Workermessage UnknownSet {
116*d5c09012SAndroid Build Coastguard Worker  // The ids of the expressions with unknown values.
117*d5c09012SAndroid Build Coastguard Worker  repeated int64 exprs = 1;
118*d5c09012SAndroid Build Coastguard Worker}
119