pyspiral 0.2.5__pp310-pypy310_pp73-macosx_10_13_x86_64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. pyspiral-0.2.5.dist-info/METADATA +48 -0
  2. pyspiral-0.2.5.dist-info/RECORD +81 -0
  3. pyspiral-0.2.5.dist-info/WHEEL +4 -0
  4. pyspiral-0.2.5.dist-info/entry_points.txt +2 -0
  5. spiral/__init__.py +11 -0
  6. spiral/_lib.pypy310-pp73-darwin.so +0 -0
  7. spiral/adbc.py +386 -0
  8. spiral/api/__init__.py +221 -0
  9. spiral/api/admin.py +29 -0
  10. spiral/api/filesystems.py +125 -0
  11. spiral/api/organizations.py +90 -0
  12. spiral/api/projects.py +160 -0
  13. spiral/api/tables.py +94 -0
  14. spiral/api/tokens.py +56 -0
  15. spiral/api/workloads.py +45 -0
  16. spiral/arrow.py +209 -0
  17. spiral/authn/__init__.py +0 -0
  18. spiral/authn/authn.py +89 -0
  19. spiral/authn/device.py +206 -0
  20. spiral/authn/github_.py +33 -0
  21. spiral/authn/modal_.py +18 -0
  22. spiral/catalog.py +78 -0
  23. spiral/cli/__init__.py +82 -0
  24. spiral/cli/__main__.py +4 -0
  25. spiral/cli/admin.py +21 -0
  26. spiral/cli/app.py +48 -0
  27. spiral/cli/console.py +95 -0
  28. spiral/cli/fs.py +47 -0
  29. spiral/cli/login.py +13 -0
  30. spiral/cli/org.py +90 -0
  31. spiral/cli/printer.py +45 -0
  32. spiral/cli/project.py +107 -0
  33. spiral/cli/state.py +3 -0
  34. spiral/cli/table.py +20 -0
  35. spiral/cli/token.py +27 -0
  36. spiral/cli/types.py +53 -0
  37. spiral/cli/workload.py +59 -0
  38. spiral/config.py +26 -0
  39. spiral/core/__init__.py +0 -0
  40. spiral/core/core/__init__.pyi +53 -0
  41. spiral/core/manifests/__init__.pyi +53 -0
  42. spiral/core/metastore/__init__.pyi +91 -0
  43. spiral/core/spec/__init__.pyi +257 -0
  44. spiral/dataset.py +239 -0
  45. spiral/debug.py +251 -0
  46. spiral/expressions/__init__.py +222 -0
  47. spiral/expressions/base.py +149 -0
  48. spiral/expressions/http.py +86 -0
  49. spiral/expressions/io.py +100 -0
  50. spiral/expressions/list_.py +68 -0
  51. spiral/expressions/refs.py +44 -0
  52. spiral/expressions/str_.py +39 -0
  53. spiral/expressions/struct.py +57 -0
  54. spiral/expressions/tiff.py +223 -0
  55. spiral/expressions/udf.py +46 -0
  56. spiral/grpc_.py +32 -0
  57. spiral/project.py +137 -0
  58. spiral/proto/_/__init__.py +0 -0
  59. spiral/proto/_/arrow/__init__.py +0 -0
  60. spiral/proto/_/arrow/flight/__init__.py +0 -0
  61. spiral/proto/_/arrow/flight/protocol/__init__.py +0 -0
  62. spiral/proto/_/arrow/flight/protocol/sql/__init__.py +1990 -0
  63. spiral/proto/_/scandal/__init__.py +223 -0
  64. spiral/proto/_/spfs/__init__.py +36 -0
  65. spiral/proto/_/spiral/__init__.py +0 -0
  66. spiral/proto/_/spiral/table/__init__.py +225 -0
  67. spiral/proto/_/spiraldb/__init__.py +0 -0
  68. spiral/proto/_/spiraldb/metastore/__init__.py +499 -0
  69. spiral/proto/__init__.py +0 -0
  70. spiral/proto/scandal/__init__.py +45 -0
  71. spiral/proto/spiral/__init__.py +0 -0
  72. spiral/proto/spiral/table/__init__.py +96 -0
  73. spiral/proto/substrait/__init__.py +3399 -0
  74. spiral/proto/substrait/extensions/__init__.py +115 -0
  75. spiral/proto/util.py +41 -0
  76. spiral/py.typed +0 -0
  77. spiral/scan_.py +168 -0
  78. spiral/settings.py +157 -0
  79. spiral/substrait_.py +275 -0
  80. spiral/table.py +157 -0
  81. spiral/types_.py +6 -0
@@ -0,0 +1,3399 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # sources: substrait/algebra.proto, substrait/capabilities.proto, substrait/extended_expression.proto, substrait/function.proto, substrait/parameterized_types.proto, substrait/plan.proto, substrait/type.proto, substrait/type_expressions.proto
3
+ # plugin: python-betterproto
4
+ # This file has been @generated
5
+ import warnings
6
+ from dataclasses import dataclass
7
+ from typing import (
8
+ List,
9
+ Optional,
10
+ )
11
+
12
+ import betterproto
13
+ import betterproto.lib.google.protobuf as betterproto_lib_google_protobuf
14
+
15
+ from . import extensions
16
+
17
+
18
+ class TypeNullability(betterproto.Enum):
19
+ NULLABILITY_UNSPECIFIED = 0
20
+ NULLABILITY_NULLABLE = 1
21
+ NULLABILITY_REQUIRED = 2
22
+
23
+
24
+ class AggregationPhase(betterproto.Enum):
25
+ """
26
+ Describes which part of an aggregation or window function to perform within
27
+ the context of distributed algorithms.
28
+ """
29
+
30
+ UNSPECIFIED = 0
31
+ """Implies `INTERMEDIATE_TO_RESULT`."""
32
+
33
+ INITIAL_TO_INTERMEDIATE = 1
34
+ """
35
+ Specifies that the function should be run only up to the point of
36
+ generating an intermediate value, to be further aggregated later using
37
+ INTERMEDIATE_TO_INTERMEDIATE or INTERMEDIATE_TO_RESULT.
38
+ """
39
+
40
+ INTERMEDIATE_TO_INTERMEDIATE = 2
41
+ """
42
+ Specifies that the inputs of the aggregate or window function are the
43
+ intermediate values of the function, and that the output should also be
44
+ an intermediate value, to be further aggregated later using
45
+ INTERMEDIATE_TO_INTERMEDIATE or INTERMEDIATE_TO_RESULT.
46
+ """
47
+
48
+ INITIAL_TO_RESULT = 3
49
+ """
50
+ A complete invocation: the function should aggregate the given set of
51
+ inputs to yield a single return value. This style must be used for
52
+ aggregate or window functions that are not decomposable.
53
+ """
54
+
55
+ INTERMEDIATE_TO_RESULT = 4
56
+ """
57
+ Specifies that the inputs of the aggregate or window function are the
58
+ intermediate values of the function, generated previously using
59
+ INITIAL_TO_INTERMEDIATE and possibly INTERMEDIATE_TO_INTERMEDIATE calls.
60
+ This call should combine the intermediate values to yield the final
61
+ return value.
62
+ """
63
+
64
+
65
+ class RelCommonHintComputationType(betterproto.Enum):
66
+ COMPUTATION_TYPE_UNSPECIFIED = 0
67
+ COMPUTATION_TYPE_HASHTABLE = 1
68
+ COMPUTATION_TYPE_BLOOM_FILTER = 2
69
+ COMPUTATION_TYPE_UNKNOWN = 9999
70
+
71
+
72
+ class JoinRelJoinType(betterproto.Enum):
73
+ JOIN_TYPE_UNSPECIFIED = 0
74
+ JOIN_TYPE_INNER = 1
75
+ JOIN_TYPE_OUTER = 2
76
+ JOIN_TYPE_LEFT = 3
77
+ JOIN_TYPE_RIGHT = 4
78
+ JOIN_TYPE_LEFT_SEMI = 5
79
+ JOIN_TYPE_LEFT_ANTI = 6
80
+ JOIN_TYPE_LEFT_SINGLE = 7
81
+ JOIN_TYPE_RIGHT_SEMI = 8
82
+ JOIN_TYPE_RIGHT_ANTI = 9
83
+ JOIN_TYPE_RIGHT_SINGLE = 10
84
+ JOIN_TYPE_LEFT_MARK = 11
85
+ JOIN_TYPE_RIGHT_MARK = 12
86
+
87
+
88
+ class SetRelSetOp(betterproto.Enum):
89
+ SET_OP_UNSPECIFIED = 0
90
+ SET_OP_MINUS_PRIMARY = 1
91
+ SET_OP_MINUS_PRIMARY_ALL = 7
92
+ SET_OP_MINUS_MULTISET = 2
93
+ SET_OP_INTERSECTION_PRIMARY = 3
94
+ SET_OP_INTERSECTION_MULTISET = 4
95
+ SET_OP_INTERSECTION_MULTISET_ALL = 8
96
+ SET_OP_UNION_DISTINCT = 5
97
+ SET_OP_UNION_ALL = 6
98
+
99
+
100
+ class DdlRelDdlObject(betterproto.Enum):
101
+ DDL_OBJECT_UNSPECIFIED = 0
102
+ DDL_OBJECT_TABLE = 1
103
+ """A Table object in the system"""
104
+
105
+ DDL_OBJECT_VIEW = 2
106
+ """A View object in the system"""
107
+
108
+
109
+ class DdlRelDdlOp(betterproto.Enum):
110
+ DDL_OP_UNSPECIFIED = 0
111
+ DDL_OP_CREATE = 1
112
+ """A create operation (for any object)"""
113
+
114
+ DDL_OP_CREATE_OR_REPLACE = 2
115
+ """
116
+ A create operation if the object does not exist, or replaces it (equivalent to a DROP + CREATE) if the object already exists
117
+ """
118
+
119
+ DDL_OP_ALTER = 3
120
+ """
121
+ An operation that modifies the schema (e.g., column names, types, default values) for the target object
122
+ """
123
+
124
+ DDL_OP_DROP = 4
125
+ """An operation that removes an object from the system"""
126
+
127
+ DDL_OP_DROP_IF_EXIST = 5
128
+ """
129
+ An operation that removes an object from the system (without throwing an exception if the object did not exist)
130
+ """
131
+
132
+
133
+ class WriteRelWriteOp(betterproto.Enum):
134
+ WRITE_OP_UNSPECIFIED = 0
135
+ WRITE_OP_INSERT = 1
136
+ """The insert of new records in a table"""
137
+
138
+ WRITE_OP_DELETE = 2
139
+ """The removal of records from a table"""
140
+
141
+ WRITE_OP_UPDATE = 3
142
+ """The modification of existing records within a table"""
143
+
144
+ WRITE_OP_CTAS = 4
145
+ """
146
+ The Creation of a new table, and the insert of new records in the table
147
+ """
148
+
149
+
150
+ class WriteRelOutputMode(betterproto.Enum):
151
+ OUTPUT_MODE_UNSPECIFIED = 0
152
+ OUTPUT_MODE_NO_OUTPUT = 1
153
+ """return no records at all"""
154
+
155
+ OUTPUT_MODE_MODIFIED_RECORDS = 2
156
+ """
157
+ this mode makes the operator return all the record INSERTED/DELETED/UPDATED by the operator.
158
+ The operator returns the AFTER-image of any change. This can be further manipulated by operators upstreams
159
+ (e.g., retunring the typical "count of modified records").
160
+ For scenarios in which the BEFORE image is required, the user must implement a spool (via references to
161
+ subplans in the body of the Rel input) and return those with anounter PlanRel.relations.
162
+ """
163
+
164
+
165
+ class ComparisonJoinKeySimpleComparisonType(betterproto.Enum):
166
+ """
167
+ Most joins will use one of the following behaviors. To avoid the complexity
168
+ of a function lookup we define the common behaviors here
169
+ """
170
+
171
+ SIMPLE_COMPARISON_TYPE_UNSPECIFIED = 0
172
+ SIMPLE_COMPARISON_TYPE_EQ = 1
173
+ """Returns true only if both values are equal and not null"""
174
+
175
+ SIMPLE_COMPARISON_TYPE_IS_NOT_DISTINCT_FROM = 2
176
+ """
177
+ Returns true if both values are equal and not null
178
+ Returns true if both values are null
179
+ Returns false if one value is null and the other value is not null
180
+
181
+ This can be expressed as a = b OR (isnull(a) AND isnull(b))
182
+ """
183
+
184
+ SIMPLE_COMPARISON_TYPE_MIGHT_EQUAL = 3
185
+ """
186
+ Returns true if both values are equal and not null
187
+ Returns true if either value is null
188
+
189
+ This can be expressed as a = b OR isnull(a = b)
190
+ """
191
+
192
+
193
+ class HashJoinRelJoinType(betterproto.Enum):
194
+ JOIN_TYPE_UNSPECIFIED = 0
195
+ JOIN_TYPE_INNER = 1
196
+ JOIN_TYPE_OUTER = 2
197
+ JOIN_TYPE_LEFT = 3
198
+ JOIN_TYPE_RIGHT = 4
199
+ JOIN_TYPE_LEFT_SEMI = 5
200
+ JOIN_TYPE_RIGHT_SEMI = 6
201
+ JOIN_TYPE_LEFT_ANTI = 7
202
+ JOIN_TYPE_RIGHT_ANTI = 8
203
+ JOIN_TYPE_LEFT_SINGLE = 9
204
+ JOIN_TYPE_RIGHT_SINGLE = 10
205
+ JOIN_TYPE_LEFT_MARK = 11
206
+ JOIN_TYPE_RIGHT_MARK = 12
207
+
208
+
209
+ class MergeJoinRelJoinType(betterproto.Enum):
210
+ JOIN_TYPE_UNSPECIFIED = 0
211
+ JOIN_TYPE_INNER = 1
212
+ JOIN_TYPE_OUTER = 2
213
+ JOIN_TYPE_LEFT = 3
214
+ JOIN_TYPE_RIGHT = 4
215
+ JOIN_TYPE_LEFT_SEMI = 5
216
+ JOIN_TYPE_RIGHT_SEMI = 6
217
+ JOIN_TYPE_LEFT_ANTI = 7
218
+ JOIN_TYPE_RIGHT_ANTI = 8
219
+ JOIN_TYPE_LEFT_SINGLE = 9
220
+ JOIN_TYPE_RIGHT_SINGLE = 10
221
+ JOIN_TYPE_LEFT_MARK = 11
222
+ JOIN_TYPE_RIGHT_MARK = 12
223
+
224
+
225
+ class NestedLoopJoinRelJoinType(betterproto.Enum):
226
+ JOIN_TYPE_UNSPECIFIED = 0
227
+ JOIN_TYPE_INNER = 1
228
+ JOIN_TYPE_OUTER = 2
229
+ JOIN_TYPE_LEFT = 3
230
+ JOIN_TYPE_RIGHT = 4
231
+ JOIN_TYPE_LEFT_SEMI = 5
232
+ JOIN_TYPE_RIGHT_SEMI = 6
233
+ JOIN_TYPE_LEFT_ANTI = 7
234
+ JOIN_TYPE_RIGHT_ANTI = 8
235
+ JOIN_TYPE_LEFT_SINGLE = 9
236
+ JOIN_TYPE_RIGHT_SINGLE = 10
237
+ JOIN_TYPE_LEFT_MARK = 11
238
+ JOIN_TYPE_RIGHT_MARK = 12
239
+
240
+
241
+ class ExpressionWindowFunctionBoundsType(betterproto.Enum):
242
+ BOUNDS_TYPE_UNSPECIFIED = 0
243
+ BOUNDS_TYPE_ROWS = 1
244
+ """
245
+ The lower and upper bound specify how many rows before and after the current row
246
+ the window should extend.
247
+ """
248
+
249
+ BOUNDS_TYPE_RANGE = 2
250
+ """
251
+ The lower and upper bound describe a range of values. The window should include all rows
252
+ where the value of the ordering column is greater than or equal to (current_value - lower bound)
253
+ and less than or equal to (current_value + upper bound). This bounds type is only valid if there
254
+ is a single ordering column.
255
+ """
256
+
257
+
258
+ class ExpressionCastFailureBehavior(betterproto.Enum):
259
+ FAILURE_BEHAVIOR_UNSPECIFIED = 0
260
+ FAILURE_BEHAVIOR_RETURN_NULL = 1
261
+ FAILURE_BEHAVIOR_THROW_EXCEPTION = 2
262
+
263
+
264
+ class ExpressionSubquerySetPredicatePredicateOp(betterproto.Enum):
265
+ PREDICATE_OP_UNSPECIFIED = 0
266
+ PREDICATE_OP_EXISTS = 1
267
+ PREDICATE_OP_UNIQUE = 2
268
+
269
+
270
+ class ExpressionSubquerySetComparisonComparisonOp(betterproto.Enum):
271
+ COMPARISON_OP_UNSPECIFIED = 0
272
+ COMPARISON_OP_EQ = 1
273
+ COMPARISON_OP_NE = 2
274
+ COMPARISON_OP_LT = 3
275
+ COMPARISON_OP_GT = 4
276
+ COMPARISON_OP_LE = 5
277
+ COMPARISON_OP_GE = 6
278
+
279
+
280
+ class ExpressionSubquerySetComparisonReductionOp(betterproto.Enum):
281
+ REDUCTION_OP_UNSPECIFIED = 0
282
+ REDUCTION_OP_ANY = 1
283
+ REDUCTION_OP_ALL = 2
284
+
285
+
286
+ class SortFieldSortDirection(betterproto.Enum):
287
+ SORT_DIRECTION_UNSPECIFIED = 0
288
+ SORT_DIRECTION_ASC_NULLS_FIRST = 1
289
+ SORT_DIRECTION_ASC_NULLS_LAST = 2
290
+ SORT_DIRECTION_DESC_NULLS_FIRST = 3
291
+ SORT_DIRECTION_DESC_NULLS_LAST = 4
292
+ SORT_DIRECTION_CLUSTERED = 5
293
+
294
+
295
+ class AggregateFunctionAggregationInvocation(betterproto.Enum):
296
+ """
297
+ Method in which equivalent records are merged before being aggregated.
298
+ """
299
+
300
+ AGGREGATION_INVOCATION_UNSPECIFIED = 0
301
+ """This default value implies AGGREGATION_INVOCATION_ALL."""
302
+
303
+ AGGREGATION_INVOCATION_ALL = 1
304
+ """Use all values in the aggregation calculation."""
305
+
306
+ AGGREGATION_INVOCATION_DISTINCT = 2
307
+ """Use only distinct values in the aggregation calculation."""
308
+
309
+
310
+ class DerivationExpressionUnaryOpUnaryOpType(betterproto.Enum):
311
+ UNARY_OP_TYPE_UNSPECIFIED = 0
312
+ UNARY_OP_TYPE_BOOLEAN_NOT = 1
313
+
314
+
315
+ class DerivationExpressionBinaryOpBinaryOpType(betterproto.Enum):
316
+ BINARY_OP_TYPE_UNSPECIFIED = 0
317
+ BINARY_OP_TYPE_PLUS = 1
318
+ BINARY_OP_TYPE_MINUS = 2
319
+ BINARY_OP_TYPE_MULTIPLY = 3
320
+ BINARY_OP_TYPE_DIVIDE = 4
321
+ BINARY_OP_TYPE_MIN = 5
322
+ BINARY_OP_TYPE_MAX = 6
323
+ BINARY_OP_TYPE_GREATER_THAN = 7
324
+ BINARY_OP_TYPE_LESS_THAN = 8
325
+ BINARY_OP_TYPE_AND = 9
326
+ BINARY_OP_TYPE_OR = 10
327
+ BINARY_OP_TYPE_EQUALS = 11
328
+ BINARY_OP_TYPE_COVERS = 12
329
+
330
+
331
+ class FunctionSignatureFinalArgVariadicParameterConsistency(betterproto.Enum):
332
+ PARAMETER_CONSISTENCY_UNSPECIFIED = 0
333
+ PARAMETER_CONSISTENCY_CONSISTENT = 1
334
+ """All argument must be the same concrete type."""
335
+
336
+ PARAMETER_CONSISTENCY_INCONSISTENT = 2
337
+ """
338
+ Each argument can be any possible concrete type afforded by the bounds
339
+ of any parameter defined in the arguments specification.
340
+ """
341
+
342
+
343
+ class FunctionSignatureWindowWindowType(betterproto.Enum):
344
+ WINDOW_TYPE_UNSPECIFIED = 0
345
+ WINDOW_TYPE_STREAMING = 1
346
+ WINDOW_TYPE_PARTITION = 2
347
+
348
+
349
+ class FunctionSignatureImplementationType(betterproto.Enum):
350
+ TYPE_UNSPECIFIED = 0
351
+ TYPE_WEB_ASSEMBLY = 1
352
+ TYPE_TRINO_JAR = 2
353
+
354
+
355
+ @dataclass(eq=False, repr=False)
356
+ class Capabilities(betterproto.Message):
357
+ """
358
+ Defines a set of Capabilities that a system (producer or consumer) supports.
359
+ """
360
+
361
+ substrait_versions: List[str] = betterproto.string_field(1)
362
+ """List of Substrait versions this system supports"""
363
+
364
+ advanced_extension_type_urls: List[str] = betterproto.string_field(2)
365
+ """
366
+ list of com.google.Any message types this system supports for advanced
367
+ extensions.
368
+ """
369
+
370
+ simple_extensions: List["CapabilitiesSimpleExtension"] = betterproto.message_field(
371
+ 3
372
+ )
373
+ """list of simple extensions this system supports."""
374
+
375
+
376
+ @dataclass(eq=False, repr=False)
377
+ class CapabilitiesSimpleExtension(betterproto.Message):
378
+ uri: str = betterproto.string_field(1)
379
+ function_keys: List[str] = betterproto.string_field(2)
380
+ type_keys: List[str] = betterproto.string_field(3)
381
+ type_variation_keys: List[str] = betterproto.string_field(4)
382
+
383
+
384
+ @dataclass(eq=False, repr=False)
385
+ class Type(betterproto.Message):
386
+ bool: "TypeBoolean" = betterproto.message_field(1, group="kind")
387
+ i8: "TypeI8" = betterproto.message_field(2, group="kind")
388
+ i16: "TypeI16" = betterproto.message_field(3, group="kind")
389
+ i32: "TypeI32" = betterproto.message_field(5, group="kind")
390
+ i64: "TypeI64" = betterproto.message_field(7, group="kind")
391
+ fp32: "TypeFp32" = betterproto.message_field(10, group="kind")
392
+ fp64: "TypeFp64" = betterproto.message_field(11, group="kind")
393
+ string: "TypeString" = betterproto.message_field(12, group="kind")
394
+ binary: "TypeBinary" = betterproto.message_field(13, group="kind")
395
+ timestamp: "TypeTimestamp" = betterproto.message_field(14, group="kind")
396
+ """Deprecated in favor of `PrecisionTimestamp precision_timestamp`"""
397
+
398
+ date: "TypeDate" = betterproto.message_field(16, group="kind")
399
+ time: "TypeTime" = betterproto.message_field(17, group="kind")
400
+ interval_year: "TypeIntervalYear" = betterproto.message_field(19, group="kind")
401
+ interval_day: "TypeIntervalDay" = betterproto.message_field(20, group="kind")
402
+ interval_compound: "TypeIntervalCompound" = betterproto.message_field(
403
+ 35, group="kind"
404
+ )
405
+ timestamp_tz: "TypeTimestampTz" = betterproto.message_field(29, group="kind")
406
+ """Deprecated in favor of `PrecisionTimestampTZ precision_timestamp_tz`"""
407
+
408
+ uuid: "TypeUuid" = betterproto.message_field(32, group="kind")
409
+ fixed_char: "TypeFixedChar" = betterproto.message_field(21, group="kind")
410
+ varchar: "TypeVarChar" = betterproto.message_field(22, group="kind")
411
+ fixed_binary: "TypeFixedBinary" = betterproto.message_field(23, group="kind")
412
+ decimal: "TypeDecimal" = betterproto.message_field(24, group="kind")
413
+ precision_timestamp: "TypePrecisionTimestamp" = betterproto.message_field(
414
+ 33, group="kind"
415
+ )
416
+ precision_timestamp_tz: "TypePrecisionTimestampTz" = betterproto.message_field(
417
+ 34, group="kind"
418
+ )
419
+ struct: "TypeStruct" = betterproto.message_field(25, group="kind")
420
+ list: "TypeList" = betterproto.message_field(27, group="kind")
421
+ map: "TypeMap" = betterproto.message_field(28, group="kind")
422
+ user_defined: "TypeUserDefined" = betterproto.message_field(30, group="kind")
423
+ user_defined_type_reference: int = betterproto.uint32_field(31, group="kind")
424
+ """
425
+ Deprecated in favor of user_defined, which allows nullability and
426
+ variations to be specified. If user_defined_type_reference is
427
+ encountered, treat it as being non-nullable and having the default
428
+ variation.
429
+ """
430
+
431
+ def __post_init__(self) -> None:
432
+ super().__post_init__()
433
+ if self.is_set("timestamp"):
434
+ warnings.warn("Type.timestamp is deprecated", DeprecationWarning)
435
+ if self.is_set("timestamp_tz"):
436
+ warnings.warn("Type.timestamp_tz is deprecated", DeprecationWarning)
437
+ if self.is_set("user_defined_type_reference"):
438
+ warnings.warn(
439
+ "Type.user_defined_type_reference is deprecated", DeprecationWarning
440
+ )
441
+
442
+
443
+ @dataclass(eq=False, repr=False)
444
+ class TypeBoolean(betterproto.Message):
445
+ type_variation_reference: int = betterproto.uint32_field(1)
446
+ nullability: "TypeNullability" = betterproto.enum_field(2)
447
+
448
+
449
+ @dataclass(eq=False, repr=False)
450
+ class TypeI8(betterproto.Message):
451
+ type_variation_reference: int = betterproto.uint32_field(1)
452
+ nullability: "TypeNullability" = betterproto.enum_field(2)
453
+
454
+
455
+ @dataclass(eq=False, repr=False)
456
+ class TypeI16(betterproto.Message):
457
+ type_variation_reference: int = betterproto.uint32_field(1)
458
+ nullability: "TypeNullability" = betterproto.enum_field(2)
459
+
460
+
461
+ @dataclass(eq=False, repr=False)
462
+ class TypeI32(betterproto.Message):
463
+ type_variation_reference: int = betterproto.uint32_field(1)
464
+ nullability: "TypeNullability" = betterproto.enum_field(2)
465
+
466
+
467
+ @dataclass(eq=False, repr=False)
468
+ class TypeI64(betterproto.Message):
469
+ type_variation_reference: int = betterproto.uint32_field(1)
470
+ nullability: "TypeNullability" = betterproto.enum_field(2)
471
+
472
+
473
+ @dataclass(eq=False, repr=False)
474
+ class TypeFp32(betterproto.Message):
475
+ type_variation_reference: int = betterproto.uint32_field(1)
476
+ nullability: "TypeNullability" = betterproto.enum_field(2)
477
+
478
+
479
+ @dataclass(eq=False, repr=False)
480
+ class TypeFp64(betterproto.Message):
481
+ type_variation_reference: int = betterproto.uint32_field(1)
482
+ nullability: "TypeNullability" = betterproto.enum_field(2)
483
+
484
+
485
+ @dataclass(eq=False, repr=False)
486
+ class TypeString(betterproto.Message):
487
+ type_variation_reference: int = betterproto.uint32_field(1)
488
+ nullability: "TypeNullability" = betterproto.enum_field(2)
489
+
490
+
491
+ @dataclass(eq=False, repr=False)
492
+ class TypeBinary(betterproto.Message):
493
+ type_variation_reference: int = betterproto.uint32_field(1)
494
+ nullability: "TypeNullability" = betterproto.enum_field(2)
495
+
496
+
497
+ @dataclass(eq=False, repr=False)
498
+ class TypeTimestamp(betterproto.Message):
499
+ type_variation_reference: int = betterproto.uint32_field(1)
500
+ nullability: "TypeNullability" = betterproto.enum_field(2)
501
+
502
+
503
+ @dataclass(eq=False, repr=False)
504
+ class TypeDate(betterproto.Message):
505
+ type_variation_reference: int = betterproto.uint32_field(1)
506
+ nullability: "TypeNullability" = betterproto.enum_field(2)
507
+
508
+
509
+ @dataclass(eq=False, repr=False)
510
+ class TypeTime(betterproto.Message):
511
+ type_variation_reference: int = betterproto.uint32_field(1)
512
+ nullability: "TypeNullability" = betterproto.enum_field(2)
513
+
514
+
515
+ @dataclass(eq=False, repr=False)
516
+ class TypeTimestampTz(betterproto.Message):
517
+ type_variation_reference: int = betterproto.uint32_field(1)
518
+ nullability: "TypeNullability" = betterproto.enum_field(2)
519
+
520
+
521
+ @dataclass(eq=False, repr=False)
522
+ class TypeIntervalYear(betterproto.Message):
523
+ """An interval consisting of years and months"""
524
+
525
+ type_variation_reference: int = betterproto.uint32_field(1)
526
+ nullability: "TypeNullability" = betterproto.enum_field(2)
527
+
528
+
529
+ @dataclass(eq=False, repr=False)
530
+ class TypeIntervalDay(betterproto.Message):
531
+ """An interval consisting of days, seconds, and microseconds"""
532
+
533
+ type_variation_reference: int = betterproto.uint32_field(1)
534
+ nullability: "TypeNullability" = betterproto.enum_field(2)
535
+ precision: Optional[int] = betterproto.int32_field(3, optional=True)
536
+ """
537
+ Sub-second precision, 0 means the value given is in seconds, 3 is milliseconds, 6 microseconds, 9 is nanoseconds, etc.
538
+ if unset, treat as 6.
539
+ """
540
+
541
+
542
+ @dataclass(eq=False, repr=False)
543
+ class TypeIntervalCompound(betterproto.Message):
544
+ """
545
+ An interval consisting of the components of both IntervalMonth and IntervalDay
546
+ """
547
+
548
+ type_variation_reference: int = betterproto.uint32_field(1)
549
+ nullability: "TypeNullability" = betterproto.enum_field(2)
550
+ precision: int = betterproto.int32_field(3)
551
+ """
552
+ Sub-second precision, 0 means the value given is in seconds, 3 is milliseconds, 6 microseconds, 9 is nanoseconds, etc.
553
+ """
554
+
555
+
556
+ @dataclass(eq=False, repr=False)
557
+ class TypeUuid(betterproto.Message):
558
+ type_variation_reference: int = betterproto.uint32_field(1)
559
+ nullability: "TypeNullability" = betterproto.enum_field(2)
560
+
561
+
562
+ @dataclass(eq=False, repr=False)
563
+ class TypeFixedChar(betterproto.Message):
564
+ """Start compound types."""
565
+
566
+ length: int = betterproto.int32_field(1)
567
+ type_variation_reference: int = betterproto.uint32_field(2)
568
+ nullability: "TypeNullability" = betterproto.enum_field(3)
569
+
570
+
571
+ @dataclass(eq=False, repr=False)
572
+ class TypeVarChar(betterproto.Message):
573
+ length: int = betterproto.int32_field(1)
574
+ type_variation_reference: int = betterproto.uint32_field(2)
575
+ nullability: "TypeNullability" = betterproto.enum_field(3)
576
+
577
+
578
+ @dataclass(eq=False, repr=False)
579
+ class TypeFixedBinary(betterproto.Message):
580
+ length: int = betterproto.int32_field(1)
581
+ type_variation_reference: int = betterproto.uint32_field(2)
582
+ nullability: "TypeNullability" = betterproto.enum_field(3)
583
+
584
+
585
+ @dataclass(eq=False, repr=False)
586
+ class TypeDecimal(betterproto.Message):
587
+ scale: int = betterproto.int32_field(1)
588
+ precision: int = betterproto.int32_field(2)
589
+ type_variation_reference: int = betterproto.uint32_field(3)
590
+ nullability: "TypeNullability" = betterproto.enum_field(4)
591
+
592
+
593
+ @dataclass(eq=False, repr=False)
594
+ class TypePrecisionTimestamp(betterproto.Message):
595
+ precision: int = betterproto.int32_field(1)
596
+ """
597
+ Sub-second precision, 0 means the value given is in seconds, 3 is milliseconds, 6 microseconds, 9 is nanoseconds
598
+ """
599
+
600
+ type_variation_reference: int = betterproto.uint32_field(2)
601
+ nullability: "TypeNullability" = betterproto.enum_field(3)
602
+
603
+
604
+ @dataclass(eq=False, repr=False)
605
+ class TypePrecisionTimestampTz(betterproto.Message):
606
+ precision: int = betterproto.int32_field(1)
607
+ """
608
+ Sub-second precision, 0 means the value given is in seconds, 3 is milliseconds, 6 microseconds, 9 is nanoseconds
609
+ """
610
+
611
+ type_variation_reference: int = betterproto.uint32_field(2)
612
+ nullability: "TypeNullability" = betterproto.enum_field(3)
613
+
614
+
615
+ @dataclass(eq=False, repr=False)
616
+ class TypeStruct(betterproto.Message):
617
+ types: List["Type"] = betterproto.message_field(1)
618
+ type_variation_reference: int = betterproto.uint32_field(2)
619
+ nullability: "TypeNullability" = betterproto.enum_field(3)
620
+
621
+
622
+ @dataclass(eq=False, repr=False)
623
+ class TypeList(betterproto.Message):
624
+ type: "Type" = betterproto.message_field(1)
625
+ type_variation_reference: int = betterproto.uint32_field(2)
626
+ nullability: "TypeNullability" = betterproto.enum_field(3)
627
+
628
+
629
+ @dataclass(eq=False, repr=False)
630
+ class TypeMap(betterproto.Message):
631
+ key: "Type" = betterproto.message_field(1)
632
+ value: "Type" = betterproto.message_field(2)
633
+ type_variation_reference: int = betterproto.uint32_field(3)
634
+ nullability: "TypeNullability" = betterproto.enum_field(4)
635
+
636
+
637
+ @dataclass(eq=False, repr=False)
638
+ class TypeUserDefined(betterproto.Message):
639
+ type_reference: int = betterproto.uint32_field(1)
640
+ type_variation_reference: int = betterproto.uint32_field(2)
641
+ nullability: "TypeNullability" = betterproto.enum_field(3)
642
+ type_parameters: List["TypeParameter"] = betterproto.message_field(4)
643
+
644
+
645
+ @dataclass(eq=False, repr=False)
646
+ class TypeParameter(betterproto.Message):
647
+ null: "betterproto_lib_google_protobuf.Empty" = betterproto.message_field(
648
+ 1, group="parameter"
649
+ )
650
+ """
651
+ Explicitly null/unspecified parameter, to select the default value (if
652
+ any).
653
+ """
654
+
655
+ data_type: "Type" = betterproto.message_field(2, group="parameter")
656
+ """Data type parameters, like the i32 in LIST<i32>."""
657
+
658
+ boolean: bool = betterproto.bool_field(3, group="parameter")
659
+ """Value parameters, like the 10 in VARCHAR<10>."""
660
+
661
+ integer: int = betterproto.int64_field(4, group="parameter")
662
+ enum: str = betterproto.string_field(5, group="parameter")
663
+ string: str = betterproto.string_field(6, group="parameter")
664
+
665
+
666
+ @dataclass(eq=False, repr=False)
667
+ class NamedStruct(betterproto.Message):
668
+ """
669
+ A message for modeling name/type pairs.
670
+
671
+ Useful for representing relation schemas.
672
+
673
+ Notes:
674
+
675
+ * The names field is in depth-first order.
676
+
677
+ For example a schema such as:
678
+
679
+ a: int64
680
+ b: struct<c: float32, d: string>
681
+
682
+ would have a `names` field that looks like:
683
+
684
+ ["a", "b", "c", "d"]
685
+
686
+ * Only struct fields are contained in this field's elements,
687
+ * Map keys should be traversed first, then values when producing/consuming
688
+ """
689
+
690
+ names: List[str] = betterproto.string_field(1)
691
+ """list of names in dfs order"""
692
+
693
+ struct: "TypeStruct" = betterproto.message_field(2)
694
+
695
+
696
+ @dataclass(eq=False, repr=False)
697
+ class RelCommon(betterproto.Message):
698
+ """Common fields for all relational operators"""
699
+
700
+ direct: "RelCommonDirect" = betterproto.message_field(1, group="emit_kind")
701
+ """
702
+ The underlying relation is output as is (no reordering or projection of columns)
703
+ """
704
+
705
+ emit: "RelCommonEmit" = betterproto.message_field(2, group="emit_kind")
706
+ """Allows to control for order and inclusion of fields"""
707
+
708
+ hint: "RelCommonHint" = betterproto.message_field(3)
709
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(4)
710
+
711
+
712
+ @dataclass(eq=False, repr=False)
713
+ class RelCommonDirect(betterproto.Message):
714
+ """
715
+ Direct indicates no change on presence and ordering of fields in the output
716
+ """
717
+
718
+ pass
719
+
720
+
721
+ @dataclass(eq=False, repr=False)
722
+ class RelCommonEmit(betterproto.Message):
723
+ """Remap which fields are output and in which order"""
724
+
725
+ output_mapping: List[int] = betterproto.int32_field(1)
726
+
727
+
728
+ @dataclass(eq=False, repr=False)
729
+ class RelCommonHint(betterproto.Message):
730
+ """
731
+ Changes to the operation that can influence efficiency/performance but
732
+ should not impact correctness.
733
+ """
734
+
735
+ stats: "RelCommonHintStats" = betterproto.message_field(1)
736
+ constraint: "RelCommonHintRuntimeConstraint" = betterproto.message_field(2)
737
+ alias: str = betterproto.string_field(3)
738
+ """
739
+ Name (alias) for this relation. Can be used for e.g. qualifying the relation (see e.g.
740
+ Spark's SubqueryAlias), or debugging.
741
+ """
742
+
743
+ output_names: List[str] = betterproto.string_field(4)
744
+ """
745
+ Assigns alternative output field names for any relation. Equivalent to the names field
746
+ in RelRoot but applies to the output of the relation this RelCommon is attached to.
747
+ """
748
+
749
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
750
+ saved_computations: List[
751
+ "RelCommonHintSavedComputation"
752
+ ] = betterproto.message_field(11)
753
+ """
754
+ Save or load a system-specific computation for use in optimizing a remote operation.
755
+ The anchor refers to the source/destination of the computation. The computation type
756
+ and number refer to the current relation.
757
+ """
758
+
759
+ loaded_computations: List[
760
+ "RelCommonHintLoadedComputation"
761
+ ] = betterproto.message_field(12)
762
+
763
+
764
+ @dataclass(eq=False, repr=False)
765
+ class RelCommonHintStats(betterproto.Message):
766
+ """The statistics related to a hint (physical properties of records)"""
767
+
768
+ row_count: float = betterproto.double_field(1)
769
+ record_size: float = betterproto.double_field(2)
770
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
771
+
772
+
773
+ @dataclass(eq=False, repr=False)
774
+ class RelCommonHintRuntimeConstraint(betterproto.Message):
775
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
776
+
777
+
778
+ @dataclass(eq=False, repr=False)
779
+ class RelCommonHintSavedComputation(betterproto.Message):
780
+ computation_id: int = betterproto.int32_field(1)
781
+ """
782
+ The value corresponds to a plan unique number for that datastructure. Any particular
783
+ computation may be saved only once but it may be loaded multiple times.
784
+ """
785
+
786
+ type: "RelCommonHintComputationType" = betterproto.enum_field(2)
787
+ """
788
+ The type of this computation. While a plan may use COMPUTATION_TYPE_UNKNOWN for all
789
+ of its types it is recommended to use a more specific type so that the optimization
790
+ is more portable. The consumer should be able to decide if an unknown type here
791
+ matches the same unknown type at a different plan and ignore the optimization if they
792
+ are mismatched.
793
+ """
794
+
795
+
796
+ @dataclass(eq=False, repr=False)
797
+ class RelCommonHintLoadedComputation(betterproto.Message):
798
+ computation_id_reference: int = betterproto.int32_field(1)
799
+ """
800
+ The value corresponds to a plan unique number for that datastructure. Any particular
801
+ computation may be saved only once but it may be loaded multiple times.
802
+ """
803
+
804
+ type: "RelCommonHintComputationType" = betterproto.enum_field(2)
805
+ """
806
+ The type of this computation. While a plan may use COMPUTATION_TYPE_UNKNOWN for all
807
+ of its types it is recommended to use a more specific type so that the optimization
808
+ is more portable. The consumer should be able to decide if an unknown type here
809
+ matches the same unknown type at a different plan and ignore the optimization if they
810
+ are mismatched.
811
+ """
812
+
813
+
814
+ @dataclass(eq=False, repr=False)
815
+ class ReadRel(betterproto.Message):
816
+ """
817
+ The scan operator of base data (physical or virtual), including filtering and projection.
818
+ """
819
+
820
+ common: "RelCommon" = betterproto.message_field(1)
821
+ base_schema: "NamedStruct" = betterproto.message_field(2)
822
+ filter: "Expression" = betterproto.message_field(3)
823
+ best_effort_filter: "Expression" = betterproto.message_field(11)
824
+ projection: "ExpressionMaskExpression" = betterproto.message_field(4)
825
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
826
+ virtual_table: "ReadRelVirtualTable" = betterproto.message_field(
827
+ 5, group="read_type"
828
+ )
829
+ local_files: "ReadRelLocalFiles" = betterproto.message_field(6, group="read_type")
830
+ named_table: "ReadRelNamedTable" = betterproto.message_field(7, group="read_type")
831
+ extension_table: "ReadRelExtensionTable" = betterproto.message_field(
832
+ 8, group="read_type"
833
+ )
834
+
835
+
836
+ @dataclass(eq=False, repr=False)
837
+ class ReadRelNamedTable(betterproto.Message):
838
+ """
839
+ A base table. The list of string is used to represent namespacing (e.g., mydb.mytable).
840
+ This assumes shared catalog between systems exchanging a message.
841
+ """
842
+
843
+ names: List[str] = betterproto.string_field(1)
844
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
845
+
846
+
847
+ @dataclass(eq=False, repr=False)
848
+ class ReadRelVirtualTable(betterproto.Message):
849
+ """A table composed of expressions."""
850
+
851
+ values: List["ExpressionLiteralStruct"] = betterproto.message_field(1)
852
+ expressions: List["Expression"] = betterproto.message_field(2)
853
+
854
+ def __post_init__(self) -> None:
855
+ super().__post_init__()
856
+ if self.is_set("values"):
857
+ warnings.warn(
858
+ "ReadRelVirtualTable.values is deprecated", DeprecationWarning
859
+ )
860
+
861
+
862
+ @dataclass(eq=False, repr=False)
863
+ class ReadRelExtensionTable(betterproto.Message):
864
+ """
865
+ A stub type that can be used to extend/introduce new table types outside
866
+ the specification.
867
+ """
868
+
869
+ detail: "betterproto_lib_google_protobuf.Any" = betterproto.message_field(1)
870
+
871
+
872
+ @dataclass(eq=False, repr=False)
873
+ class ReadRelLocalFiles(betterproto.Message):
874
+ """Represents a list of files in input of a scan operation"""
875
+
876
+ items: List["ReadRelLocalFilesFileOrFiles"] = betterproto.message_field(1)
877
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
878
+
879
+
880
+ @dataclass(eq=False, repr=False)
881
+ class ReadRelLocalFilesFileOrFiles(betterproto.Message):
882
+ """
883
+ Many files consist of indivisible chunks (e.g. parquet row groups
884
+ or CSV rows). If a slice partially selects an indivisible chunk
885
+ then the consumer should employ some rule to decide which slice to
886
+ include the chunk in (e.g. include it in the slice that contains
887
+ the midpoint of the chunk)
888
+ """
889
+
890
+ uri_path: str = betterproto.string_field(1, group="path_type")
891
+ """A URI that can refer to either a single folder or a single file"""
892
+
893
+ uri_path_glob: str = betterproto.string_field(2, group="path_type")
894
+ """
895
+ A URI where the path portion is a glob expression that can
896
+ identify zero or more paths.
897
+ Consumers should support the POSIX syntax. The recursive
898
+ globstar (**) may not be supported.
899
+ """
900
+
901
+ uri_file: str = betterproto.string_field(3, group="path_type")
902
+ """A URI that refers to a single file"""
903
+
904
+ uri_folder: str = betterproto.string_field(4, group="path_type")
905
+ """A URI that refers to a single folder"""
906
+
907
+ partition_index: int = betterproto.uint64_field(6)
908
+ """The index of the partition this item belongs to"""
909
+
910
+ start: int = betterproto.uint64_field(7)
911
+ """The start position in byte to read from this item"""
912
+
913
+ length: int = betterproto.uint64_field(8)
914
+ """The length in byte to read from this item"""
915
+
916
+ parquet: "ReadRelLocalFilesFileOrFilesParquetReadOptions" = (
917
+ betterproto.message_field(9, group="file_format")
918
+ )
919
+ arrow: "ReadRelLocalFilesFileOrFilesArrowReadOptions" = betterproto.message_field(
920
+ 10, group="file_format"
921
+ )
922
+ orc: "ReadRelLocalFilesFileOrFilesOrcReadOptions" = betterproto.message_field(
923
+ 11, group="file_format"
924
+ )
925
+ extension: "betterproto_lib_google_protobuf.Any" = betterproto.message_field(
926
+ 12, group="file_format"
927
+ )
928
+ dwrf: "ReadRelLocalFilesFileOrFilesDwrfReadOptions" = betterproto.message_field(
929
+ 13, group="file_format"
930
+ )
931
+ text: "ReadRelLocalFilesFileOrFilesDelimiterSeparatedTextReadOptions" = (
932
+ betterproto.message_field(14, group="file_format")
933
+ )
934
+
935
+
936
+ @dataclass(eq=False, repr=False)
937
+ class ReadRelLocalFilesFileOrFilesParquetReadOptions(betterproto.Message):
938
+ pass
939
+
940
+
941
+ @dataclass(eq=False, repr=False)
942
+ class ReadRelLocalFilesFileOrFilesArrowReadOptions(betterproto.Message):
943
+ pass
944
+
945
+
946
+ @dataclass(eq=False, repr=False)
947
+ class ReadRelLocalFilesFileOrFilesOrcReadOptions(betterproto.Message):
948
+ pass
949
+
950
+
951
+ @dataclass(eq=False, repr=False)
952
+ class ReadRelLocalFilesFileOrFilesDwrfReadOptions(betterproto.Message):
953
+ pass
954
+
955
+
956
+ @dataclass(eq=False, repr=False)
957
+ class ReadRelLocalFilesFileOrFilesDelimiterSeparatedTextReadOptions(
958
+ betterproto.Message
959
+ ):
960
+ field_delimiter: str = betterproto.string_field(1)
961
+ """
962
+ The character(s) used to separate fields. Common values are comma,
963
+ tab, and pipe. Multiple characters are allowed.
964
+ """
965
+
966
+ max_line_size: int = betterproto.uint64_field(2)
967
+ """
968
+ The maximum number of bytes to read from a single line. If a line
969
+ exceeds this limit the resulting behavior is undefined.
970
+ """
971
+
972
+ quote: str = betterproto.string_field(3)
973
+ """
974
+ The character(s) used to quote strings. Common values are single
975
+ and double quotation marks.
976
+ """
977
+
978
+ header_lines_to_skip: int = betterproto.uint64_field(4)
979
+ """The number of lines to skip at the beginning of the file."""
980
+
981
+ escape: str = betterproto.string_field(5)
982
+ """
983
+ The character used to escape characters in strings. Backslash is
984
+ a common value. Note that a double quote mark can also be used as an
985
+ escape character but the external quotes should be removed first.
986
+ """
987
+
988
+ value_treated_as_null: Optional[str] = betterproto.string_field(6, optional=True)
989
+ """
990
+ If this value is encountered (including empty string), the resulting
991
+ value is null instead. Leave unset to disable. If this value is
992
+ provided, the effective schema of this file is comprised entirely of
993
+ nullable strings. If not provided, the effective schema is instead
994
+ made up of non-nullable strings.
995
+ """
996
+
997
+
998
+ @dataclass(eq=False, repr=False)
999
+ class ProjectRel(betterproto.Message):
1000
+ """
1001
+ This operator allows to represent calculated expressions of fields (e.g., a+b). Direct/Emit are used to represent classical relational projections
1002
+ """
1003
+
1004
+ common: "RelCommon" = betterproto.message_field(1)
1005
+ input: "Rel" = betterproto.message_field(2)
1006
+ expressions: List["Expression"] = betterproto.message_field(3)
1007
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1008
+
1009
+
1010
+ @dataclass(eq=False, repr=False)
1011
+ class JoinRel(betterproto.Message):
1012
+ """
1013
+ The binary JOIN relational operator left-join-right, including various join types, a join condition and post_join_filter expression
1014
+ """
1015
+
1016
+ common: "RelCommon" = betterproto.message_field(1)
1017
+ left: "Rel" = betterproto.message_field(2)
1018
+ right: "Rel" = betterproto.message_field(3)
1019
+ expression: "Expression" = betterproto.message_field(4)
1020
+ post_join_filter: "Expression" = betterproto.message_field(5)
1021
+ type: "JoinRelJoinType" = betterproto.enum_field(6)
1022
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1023
+
1024
+
1025
+ @dataclass(eq=False, repr=False)
1026
+ class CrossRel(betterproto.Message):
1027
+ """Cartesian product relational operator of two tables (left and right)"""
1028
+
1029
+ common: "RelCommon" = betterproto.message_field(1)
1030
+ left: "Rel" = betterproto.message_field(2)
1031
+ right: "Rel" = betterproto.message_field(3)
1032
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1033
+
1034
+
1035
+ @dataclass(eq=False, repr=False)
1036
+ class FetchRel(betterproto.Message):
1037
+ """
1038
+ The relational operator representing LIMIT/OFFSET or TOP type semantics.
1039
+ """
1040
+
1041
+ common: "RelCommon" = betterproto.message_field(1)
1042
+ input: "Rel" = betterproto.message_field(2)
1043
+ offset: int = betterproto.int64_field(3)
1044
+ """the offset expressed in number of records"""
1045
+
1046
+ count: int = betterproto.int64_field(4)
1047
+ """
1048
+ the amount of records to return
1049
+ use -1 to signal that ALL records should be returned
1050
+ """
1051
+
1052
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1053
+
1054
+
1055
+ @dataclass(eq=False, repr=False)
1056
+ class AggregateRel(betterproto.Message):
1057
+ """The relational operator representing a GROUP BY Aggregate"""
1058
+
1059
+ common: "RelCommon" = betterproto.message_field(1)
1060
+ input: "Rel" = betterproto.message_field(2)
1061
+ """Input of the aggregation"""
1062
+
1063
+ groupings: List["AggregateRelGrouping"] = betterproto.message_field(3)
1064
+ """
1065
+ A list of zero or more grouping sets that the aggregation measures should
1066
+ be calculated for. There must be at least one grouping set if there are no
1067
+ measures (but it can be the empty grouping set).
1068
+ """
1069
+
1070
+ measures: List["AggregateRelMeasure"] = betterproto.message_field(4)
1071
+ """
1072
+ A list of one or more aggregate expressions along with an optional filter.
1073
+ Required if there are no groupings.
1074
+ """
1075
+
1076
+ grouping_expressions: List["Expression"] = betterproto.message_field(5)
1077
+ """
1078
+ A list of zero or more grouping expressions that grouping sets (i.e.,
1079
+ `Grouping` messages in the `groupings` field) can reference. Each
1080
+ expression in this list must be referred to by at least one
1081
+ `Grouping.expression_references`.
1082
+ """
1083
+
1084
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1085
+
1086
+
1087
+ @dataclass(eq=False, repr=False)
1088
+ class AggregateRelGrouping(betterproto.Message):
1089
+ grouping_expressions: List["Expression"] = betterproto.message_field(1)
1090
+ """Deprecated in favor of `expression_references` below."""
1091
+
1092
+ expression_references: List[int] = betterproto.uint32_field(2)
1093
+ """
1094
+ A list of zero or more references to grouping expressions, i.e., indices
1095
+ into the `grouping_expression` list.
1096
+ """
1097
+
1098
+ def __post_init__(self) -> None:
1099
+ super().__post_init__()
1100
+ if self.is_set("grouping_expressions"):
1101
+ warnings.warn(
1102
+ "AggregateRelGrouping.grouping_expressions is deprecated",
1103
+ DeprecationWarning,
1104
+ )
1105
+
1106
+
1107
+ @dataclass(eq=False, repr=False)
1108
+ class AggregateRelMeasure(betterproto.Message):
1109
+ measure: "AggregateFunction" = betterproto.message_field(1)
1110
+ filter: "Expression" = betterproto.message_field(2)
1111
+ """
1112
+ An optional boolean expression that acts to filter which records are
1113
+ included in the measure. True means include this record for calculation
1114
+ within the measure.
1115
+ Helps to support SUM(<c>) FILTER(WHERE...) syntax without masking opportunities for optimization
1116
+ """
1117
+
1118
+
1119
+ @dataclass(eq=False, repr=False)
1120
+ class ConsistentPartitionWindowRel(betterproto.Message):
1121
+ """
1122
+ ConsistentPartitionWindowRel provides the ability to perform calculations across sets of rows
1123
+ that are related to the current query row. It can be used to execute window functions where
1124
+ all the windows share the same partitioning and ordering.
1125
+ """
1126
+
1127
+ common: "RelCommon" = betterproto.message_field(1)
1128
+ input: "Rel" = betterproto.message_field(2)
1129
+ window_functions: List[
1130
+ "ConsistentPartitionWindowRelWindowRelFunction"
1131
+ ] = betterproto.message_field(3)
1132
+ partition_expressions: List["Expression"] = betterproto.message_field(4)
1133
+ sorts: List["SortField"] = betterproto.message_field(5)
1134
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1135
+
1136
+
1137
+ @dataclass(eq=False, repr=False)
1138
+ class ConsistentPartitionWindowRelWindowRelFunction(betterproto.Message):
1139
+ """
1140
+ This message mirrors the `WindowFunction` message but removes the fields defining the partition,
1141
+ sorts, and bounds, since those must be consistent across the various functions in this rel. Refer
1142
+ to the `WindowFunction` message for a description of these fields.
1143
+ """
1144
+
1145
+ function_reference: int = betterproto.uint32_field(1)
1146
+ arguments: List["FunctionArgument"] = betterproto.message_field(9)
1147
+ options: List["FunctionOption"] = betterproto.message_field(11)
1148
+ output_type: "Type" = betterproto.message_field(7)
1149
+ phase: "AggregationPhase" = betterproto.enum_field(6)
1150
+ invocation: "AggregateFunctionAggregationInvocation" = betterproto.enum_field(10)
1151
+ lower_bound: "ExpressionWindowFunctionBound" = betterproto.message_field(5)
1152
+ upper_bound: "ExpressionWindowFunctionBound" = betterproto.message_field(4)
1153
+ bounds_type: "ExpressionWindowFunctionBoundsType" = betterproto.enum_field(12)
1154
+
1155
+
1156
+ @dataclass(eq=False, repr=False)
1157
+ class SortRel(betterproto.Message):
1158
+ """
1159
+ The ORDERY BY (or sorting) relational operator. Beside describing a base relation, it includes a list of fields to sort on
1160
+ """
1161
+
1162
+ common: "RelCommon" = betterproto.message_field(1)
1163
+ input: "Rel" = betterproto.message_field(2)
1164
+ sorts: List["SortField"] = betterproto.message_field(3)
1165
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1166
+
1167
+
1168
+ @dataclass(eq=False, repr=False)
1169
+ class FilterRel(betterproto.Message):
1170
+ """
1171
+ The relational operator capturing simple FILTERs (as in the WHERE clause of SQL)
1172
+ """
1173
+
1174
+ common: "RelCommon" = betterproto.message_field(1)
1175
+ input: "Rel" = betterproto.message_field(2)
1176
+ condition: "Expression" = betterproto.message_field(3)
1177
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1178
+
1179
+
1180
+ @dataclass(eq=False, repr=False)
1181
+ class SetRel(betterproto.Message):
1182
+ """The relational set operators (intersection/union/etc..)"""
1183
+
1184
+ common: "RelCommon" = betterproto.message_field(1)
1185
+ inputs: List["Rel"] = betterproto.message_field(2)
1186
+ """
1187
+ The first input is the primary input, the remaining are secondary
1188
+ inputs. There must be at least two inputs.
1189
+ """
1190
+
1191
+ op: "SetRelSetOp" = betterproto.enum_field(3)
1192
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1193
+
1194
+
1195
+ @dataclass(eq=False, repr=False)
1196
+ class ExtensionSingleRel(betterproto.Message):
1197
+ """Stub to support extension with a single input"""
1198
+
1199
+ common: "RelCommon" = betterproto.message_field(1)
1200
+ input: "Rel" = betterproto.message_field(2)
1201
+ detail: "betterproto_lib_google_protobuf.Any" = betterproto.message_field(3)
1202
+
1203
+
1204
+ @dataclass(eq=False, repr=False)
1205
+ class ExtensionLeafRel(betterproto.Message):
1206
+ """Stub to support extension with a zero inputs"""
1207
+
1208
+ common: "RelCommon" = betterproto.message_field(1)
1209
+ detail: "betterproto_lib_google_protobuf.Any" = betterproto.message_field(2)
1210
+
1211
+
1212
+ @dataclass(eq=False, repr=False)
1213
+ class ExtensionMultiRel(betterproto.Message):
1214
+ """Stub to support extension with multiple inputs"""
1215
+
1216
+ common: "RelCommon" = betterproto.message_field(1)
1217
+ inputs: List["Rel"] = betterproto.message_field(2)
1218
+ detail: "betterproto_lib_google_protobuf.Any" = betterproto.message_field(3)
1219
+
1220
+
1221
+ @dataclass(eq=False, repr=False)
1222
+ class ExchangeRel(betterproto.Message):
1223
+ """A redistribution operation"""
1224
+
1225
+ common: "RelCommon" = betterproto.message_field(1)
1226
+ input: "Rel" = betterproto.message_field(2)
1227
+ partition_count: int = betterproto.int32_field(3)
1228
+ targets: List["ExchangeRelExchangeTarget"] = betterproto.message_field(4)
1229
+ scatter_by_fields: "ExchangeRelScatterFields" = betterproto.message_field(
1230
+ 5, group="exchange_kind"
1231
+ )
1232
+ single_target: "ExchangeRelSingleBucketExpression" = betterproto.message_field(
1233
+ 6, group="exchange_kind"
1234
+ )
1235
+ multi_target: "ExchangeRelMultiBucketExpression" = betterproto.message_field(
1236
+ 7, group="exchange_kind"
1237
+ )
1238
+ round_robin: "ExchangeRelRoundRobin" = betterproto.message_field(
1239
+ 8, group="exchange_kind"
1240
+ )
1241
+ broadcast: "ExchangeRelBroadcast" = betterproto.message_field(
1242
+ 9, group="exchange_kind"
1243
+ )
1244
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1245
+
1246
+
1247
+ @dataclass(eq=False, repr=False)
1248
+ class ExchangeRelScatterFields(betterproto.Message):
1249
+ fields: List["ExpressionFieldReference"] = betterproto.message_field(1)
1250
+
1251
+
1252
+ @dataclass(eq=False, repr=False)
1253
+ class ExchangeRelSingleBucketExpression(betterproto.Message):
1254
+ """Returns a single bucket number per record."""
1255
+
1256
+ expression: "Expression" = betterproto.message_field(1)
1257
+
1258
+
1259
+ @dataclass(eq=False, repr=False)
1260
+ class ExchangeRelMultiBucketExpression(betterproto.Message):
1261
+ """Returns zero or more bucket numbers per record"""
1262
+
1263
+ expression: "Expression" = betterproto.message_field(1)
1264
+ constrained_to_count: bool = betterproto.bool_field(2)
1265
+
1266
+
1267
+ @dataclass(eq=False, repr=False)
1268
+ class ExchangeRelBroadcast(betterproto.Message):
1269
+ """Send all data to every target."""
1270
+
1271
+ pass
1272
+
1273
+
1274
+ @dataclass(eq=False, repr=False)
1275
+ class ExchangeRelRoundRobin(betterproto.Message):
1276
+ """Route approximately"""
1277
+
1278
+ exact: bool = betterproto.bool_field(1)
1279
+ """
1280
+ whether the round robin behavior is required to exact (per record) or
1281
+ approximate. Defaults to approximate.
1282
+ """
1283
+
1284
+
1285
+ @dataclass(eq=False, repr=False)
1286
+ class ExchangeRelExchangeTarget(betterproto.Message):
1287
+ """The message to describe partition targets of an exchange"""
1288
+
1289
+ partition_id: List[int] = betterproto.int32_field(1)
1290
+ """
1291
+ Describes the partition id(s) to send. If this is empty, all data is sent
1292
+ to this target.
1293
+ """
1294
+
1295
+ uri: str = betterproto.string_field(2, group="target_type")
1296
+ extended: "betterproto_lib_google_protobuf.Any" = betterproto.message_field(
1297
+ 3, group="target_type"
1298
+ )
1299
+
1300
+
1301
+ @dataclass(eq=False, repr=False)
1302
+ class ExpandRel(betterproto.Message):
1303
+ """
1304
+ Duplicates records by emitting one or more rows per input row. The number of rows emitted per
1305
+ input row is the same for all input rows.
1306
+
1307
+ In addition to a field being emitted per input field an extra int64 field is emitted which
1308
+ contains a zero-indexed ordinal corresponding to the duplicate definition.
1309
+ """
1310
+
1311
+ common: "RelCommon" = betterproto.message_field(1)
1312
+ input: "Rel" = betterproto.message_field(2)
1313
+ fields: List["ExpandRelExpandField"] = betterproto.message_field(4)
1314
+ """
1315
+ There should be one definition here for each input field. Any fields beyond the provided
1316
+ definitions will be emitted as is (as if a consistent_field record with an identity
1317
+ expression was provided).
1318
+ """
1319
+
1320
+
1321
+ @dataclass(eq=False, repr=False)
1322
+ class ExpandRelExpandField(betterproto.Message):
1323
+ switching_field: "ExpandRelSwitchingField" = betterproto.message_field(
1324
+ 2, group="field_type"
1325
+ )
1326
+ """
1327
+ Field that switches output based on which duplicate is being output. Every
1328
+ switching_field should contain the same number of duplicates (so that the output rows
1329
+ are of consistent size and type). If there are not enough switching field definitions
1330
+ to match the other field definitions NULL will be returned to fill the extras.
1331
+ """
1332
+
1333
+ consistent_field: "Expression" = betterproto.message_field(3, group="field_type")
1334
+ """
1335
+ Field that outputs the same value no matter which duplicate is being output. Equivalent
1336
+ to a switching_field that lists the same expression multiple times.
1337
+ """
1338
+
1339
+
1340
+ @dataclass(eq=False, repr=False)
1341
+ class ExpandRelSwitchingField(betterproto.Message):
1342
+ duplicates: List["Expression"] = betterproto.message_field(1)
1343
+ """
1344
+ All duplicates must return the same type class but may differ in nullability. The effective
1345
+ type of the output field will be nullable if any of the duplicate expressions are nullable.
1346
+ """
1347
+
1348
+
1349
+ @dataclass(eq=False, repr=False)
1350
+ class RelRoot(betterproto.Message):
1351
+ """
1352
+ A relation with output field names.
1353
+
1354
+ This is for use at the root of a `Rel` tree.
1355
+ """
1356
+
1357
+ input: "Rel" = betterproto.message_field(1)
1358
+ """A relation"""
1359
+
1360
+ names: List[str] = betterproto.string_field(2)
1361
+ """Field names in depth-first order"""
1362
+
1363
+
1364
+ @dataclass(eq=False, repr=False)
1365
+ class Rel(betterproto.Message):
1366
+ """A relation (used internally in a plan)"""
1367
+
1368
+ read: "ReadRel" = betterproto.message_field(1, group="rel_type")
1369
+ filter: "FilterRel" = betterproto.message_field(2, group="rel_type")
1370
+ fetch: "FetchRel" = betterproto.message_field(3, group="rel_type")
1371
+ aggregate: "AggregateRel" = betterproto.message_field(4, group="rel_type")
1372
+ sort: "SortRel" = betterproto.message_field(5, group="rel_type")
1373
+ join: "JoinRel" = betterproto.message_field(6, group="rel_type")
1374
+ project: "ProjectRel" = betterproto.message_field(7, group="rel_type")
1375
+ set: "SetRel" = betterproto.message_field(8, group="rel_type")
1376
+ extension_single: "ExtensionSingleRel" = betterproto.message_field(
1377
+ 9, group="rel_type"
1378
+ )
1379
+ extension_multi: "ExtensionMultiRel" = betterproto.message_field(
1380
+ 10, group="rel_type"
1381
+ )
1382
+ extension_leaf: "ExtensionLeafRel" = betterproto.message_field(11, group="rel_type")
1383
+ cross: "CrossRel" = betterproto.message_field(12, group="rel_type")
1384
+ reference: "ReferenceRel" = betterproto.message_field(21, group="rel_type")
1385
+ write: "WriteRel" = betterproto.message_field(19, group="rel_type")
1386
+ ddl: "DdlRel" = betterproto.message_field(20, group="rel_type")
1387
+ hash_join: "HashJoinRel" = betterproto.message_field(13, group="rel_type")
1388
+ """Physical relations"""
1389
+
1390
+ merge_join: "MergeJoinRel" = betterproto.message_field(14, group="rel_type")
1391
+ nested_loop_join: "NestedLoopJoinRel" = betterproto.message_field(
1392
+ 18, group="rel_type"
1393
+ )
1394
+ window: "ConsistentPartitionWindowRel" = betterproto.message_field(
1395
+ 17, group="rel_type"
1396
+ )
1397
+ exchange: "ExchangeRel" = betterproto.message_field(15, group="rel_type")
1398
+ expand: "ExpandRel" = betterproto.message_field(16, group="rel_type")
1399
+
1400
+
1401
+ @dataclass(eq=False, repr=False)
1402
+ class NamedObjectWrite(betterproto.Message):
1403
+ """A base object for writing (e.g., a table or a view)."""
1404
+
1405
+ names: List[str] = betterproto.string_field(1)
1406
+ """
1407
+ The list of string is used to represent namespacing (e.g., mydb.mytable).
1408
+ This assumes shared catalog between systems exchanging a message.
1409
+ """
1410
+
1411
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1412
+
1413
+
1414
+ @dataclass(eq=False, repr=False)
1415
+ class ExtensionObject(betterproto.Message):
1416
+ """
1417
+ A stub type that can be used to extend/introduce new table types outside
1418
+ the specification.
1419
+ """
1420
+
1421
+ detail: "betterproto_lib_google_protobuf.Any" = betterproto.message_field(1)
1422
+
1423
+
1424
+ @dataclass(eq=False, repr=False)
1425
+ class DdlRel(betterproto.Message):
1426
+ named_object: "NamedObjectWrite" = betterproto.message_field(1, group="write_type")
1427
+ extension_object: "ExtensionObject" = betterproto.message_field(
1428
+ 2, group="write_type"
1429
+ )
1430
+ table_schema: "NamedStruct" = betterproto.message_field(3)
1431
+ """
1432
+ The columns that will be modified (representing after-image of a schema change)
1433
+ """
1434
+
1435
+ table_defaults: "ExpressionLiteralStruct" = betterproto.message_field(4)
1436
+ """
1437
+ The default values for the columns (representing after-image of a schema change)
1438
+ E.g., in case of an ALTER TABLE that changes some of the column default values, we expect
1439
+ the table_defaults Struct to report a full list of default values reflecting the result of applying
1440
+ the ALTER TABLE operator successfully
1441
+ """
1442
+
1443
+ object: "DdlRelDdlObject" = betterproto.enum_field(5)
1444
+ """Which type of object we operate on"""
1445
+
1446
+ op: "DdlRelDdlOp" = betterproto.enum_field(6)
1447
+ """The type of operation to perform"""
1448
+
1449
+ view_definition: "Rel" = betterproto.message_field(7)
1450
+ """The body of the CREATE VIEW"""
1451
+
1452
+ common: "RelCommon" = betterproto.message_field(8)
1453
+
1454
+
1455
+ @dataclass(eq=False, repr=False)
1456
+ class WriteRel(betterproto.Message):
1457
+ """
1458
+ The operator that modifies the content of a database (operates on 1 table at a time, but record-selection/source can be
1459
+ based on joining of multiple tables).
1460
+ """
1461
+
1462
+ named_table: "NamedObjectWrite" = betterproto.message_field(1, group="write_type")
1463
+ extension_table: "ExtensionObject" = betterproto.message_field(
1464
+ 2, group="write_type"
1465
+ )
1466
+ table_schema: "NamedStruct" = betterproto.message_field(3)
1467
+ """
1468
+ The schema of the table (must align with Rel input (e.g., number of leaf fields must match))
1469
+ """
1470
+
1471
+ op: "WriteRelWriteOp" = betterproto.enum_field(4)
1472
+ """The type of operation to perform"""
1473
+
1474
+ input: "Rel" = betterproto.message_field(5)
1475
+ """
1476
+ The relation that determines the records to add/remove/modify
1477
+ the schema must match with table_schema. Default values must be explicitly stated
1478
+ in a ProjectRel at the top of the input. The match must also
1479
+ occur in case of DELETE to ensure multi-engine plans are unequivocal.
1480
+ """
1481
+
1482
+ output: "WriteRelOutputMode" = betterproto.enum_field(6)
1483
+ """Output mode determines what is the output of executing this rel"""
1484
+
1485
+ common: "RelCommon" = betterproto.message_field(7)
1486
+
1487
+
1488
+ @dataclass(eq=False, repr=False)
1489
+ class ComparisonJoinKey(betterproto.Message):
1490
+ """
1491
+ Hash joins and merge joins are a specialization of the general join where the join
1492
+ expression is an series of comparisons between fields that are ANDed together. The
1493
+ behavior of this comparison is flexible
1494
+ """
1495
+
1496
+ left: "ExpressionFieldReference" = betterproto.message_field(1)
1497
+ """The key to compare from the left table"""
1498
+
1499
+ right: "ExpressionFieldReference" = betterproto.message_field(2)
1500
+ """The key to compare from the right table"""
1501
+
1502
+ comparison: "ComparisonJoinKeyComparisonType" = betterproto.message_field(3)
1503
+ """Describes how to compare the two keys"""
1504
+
1505
+
1506
+ @dataclass(eq=False, repr=False)
1507
+ class ComparisonJoinKeyComparisonType(betterproto.Message):
1508
+ """Describes how the relation should consider if two rows are a match"""
1509
+
1510
+ simple: "ComparisonJoinKeySimpleComparisonType" = betterproto.enum_field(
1511
+ 1, group="inner_type"
1512
+ )
1513
+ """One of the simple comparison behaviors is used"""
1514
+
1515
+ custom_function_reference: int = betterproto.uint32_field(2, group="inner_type")
1516
+ """
1517
+ A custom comparison behavior is used. This can happen, for example, when using
1518
+ collations, where we might want to do something like a case-insensitive comparison.
1519
+
1520
+ This must be a binary function with a boolean return type
1521
+ """
1522
+
1523
+
1524
+ @dataclass(eq=False, repr=False)
1525
+ class HashJoinRel(betterproto.Message):
1526
+ """
1527
+ The hash equijoin join operator will build a hash table out of the right input based on a set of join keys.
1528
+ It will then probe that hash table for incoming inputs, finding matches.
1529
+
1530
+ Two rows are a match if the comparison function returns true for all keys
1531
+ """
1532
+
1533
+ common: "RelCommon" = betterproto.message_field(1)
1534
+ left: "Rel" = betterproto.message_field(2)
1535
+ right: "Rel" = betterproto.message_field(3)
1536
+ left_keys: List["ExpressionFieldReference"] = betterproto.message_field(4)
1537
+ """
1538
+ These fields are deprecated in favor of `keys`. If they are set then
1539
+ the two lists (left_keys and right_keys) must have the same length and
1540
+ the comparion function is considered to be SimpleEqualityType::EQ
1541
+ """
1542
+
1543
+ right_keys: List["ExpressionFieldReference"] = betterproto.message_field(5)
1544
+ keys: List["ComparisonJoinKey"] = betterproto.message_field(8)
1545
+ """
1546
+ One or more keys to join on. The relation is invalid if this is empty
1547
+ (unless the deprecated left_keys/right_keys fields are being used).
1548
+
1549
+ If a custom comparison function is used then it must be consistent with
1550
+ the hash function used for the keys.
1551
+
1552
+ In other words, the hash function must return the same hash code when the
1553
+ comparison returns true. For example, if the comparison function is
1554
+ "equals ignoring case" then the hash function must return the same hash
1555
+ code for strings that differ only by case. Note: the hash function is not
1556
+ specified here. It is the responsibility of the consumer to find an appropriate
1557
+ hash function for a given comparsion function or to reject the plan if it cannot
1558
+ do so.
1559
+ """
1560
+
1561
+ post_join_filter: "Expression" = betterproto.message_field(6)
1562
+ type: "HashJoinRelJoinType" = betterproto.enum_field(7)
1563
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1564
+
1565
+ def __post_init__(self) -> None:
1566
+ super().__post_init__()
1567
+ if self.is_set("left_keys"):
1568
+ warnings.warn("HashJoinRel.left_keys is deprecated", DeprecationWarning)
1569
+ if self.is_set("right_keys"):
1570
+ warnings.warn("HashJoinRel.right_keys is deprecated", DeprecationWarning)
1571
+
1572
+
1573
+ @dataclass(eq=False, repr=False)
1574
+ class MergeJoinRel(betterproto.Message):
1575
+ """
1576
+ The merge equijoin does a join by taking advantage of two sets that are sorted on the join keys.
1577
+ This allows the join operation to be done in a streaming fashion.
1578
+ """
1579
+
1580
+ common: "RelCommon" = betterproto.message_field(1)
1581
+ left: "Rel" = betterproto.message_field(2)
1582
+ right: "Rel" = betterproto.message_field(3)
1583
+ left_keys: List["ExpressionFieldReference"] = betterproto.message_field(4)
1584
+ """
1585
+ These fields are deprecated in favor of `keys`. If they are set then
1586
+ the two lists (left_keys and right_keys) must have the same length and
1587
+ the comparion function is considered to be SimpleEqualityType::EQ
1588
+ """
1589
+
1590
+ right_keys: List["ExpressionFieldReference"] = betterproto.message_field(5)
1591
+ keys: List["ComparisonJoinKey"] = betterproto.message_field(8)
1592
+ """
1593
+ One or more keys to join on. The relation is invalid if this is empty
1594
+ (unless the deprecated left_keys/right_keys fields are being used).
1595
+
1596
+ If a custom comparison function is used then it must be consistent with
1597
+ the ordering of the input data. For example, if the comparison function
1598
+ is "<" then we generally expect the data to be sorted in ascending order.
1599
+
1600
+ If the comparison function is something like "less than ignoring case" then
1601
+ the data should be sorted appropriately (e.g. both "A" and "a" should come
1602
+ before "b")
1603
+
1604
+ The sort order is not specified here. It is typically the responsibility of
1605
+ the producer to ensure the plan sorts the data if needed (although the consumer
1606
+ is free to do so as well). If possible, the consumer should verify the sort
1607
+ order and reject invalid plans.
1608
+ """
1609
+
1610
+ post_join_filter: "Expression" = betterproto.message_field(6)
1611
+ type: "MergeJoinRelJoinType" = betterproto.enum_field(7)
1612
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1613
+
1614
+ def __post_init__(self) -> None:
1615
+ super().__post_init__()
1616
+ if self.is_set("left_keys"):
1617
+ warnings.warn("MergeJoinRel.left_keys is deprecated", DeprecationWarning)
1618
+ if self.is_set("right_keys"):
1619
+ warnings.warn("MergeJoinRel.right_keys is deprecated", DeprecationWarning)
1620
+
1621
+
1622
+ @dataclass(eq=False, repr=False)
1623
+ class NestedLoopJoinRel(betterproto.Message):
1624
+ """
1625
+ The nested loop join (NLJ) operator will hold the entire right input and iterate over it using the
1626
+ left input, evaluating the join expression on the Cartesian product of all rows.
1627
+ """
1628
+
1629
+ common: "RelCommon" = betterproto.message_field(1)
1630
+ left: "Rel" = betterproto.message_field(2)
1631
+ right: "Rel" = betterproto.message_field(3)
1632
+ expression: "Expression" = betterproto.message_field(4)
1633
+ """optional, defaults to true (a cartesian join)"""
1634
+
1635
+ type: "NestedLoopJoinRelJoinType" = betterproto.enum_field(5)
1636
+ advanced_extension: "extensions.AdvancedExtension" = betterproto.message_field(10)
1637
+
1638
+
1639
+ @dataclass(eq=False, repr=False)
1640
+ class FunctionArgument(betterproto.Message):
1641
+ """The argument of a function"""
1642
+
1643
+ enum: str = betterproto.string_field(1, group="arg_type")
1644
+ type: "Type" = betterproto.message_field(2, group="arg_type")
1645
+ value: "Expression" = betterproto.message_field(3, group="arg_type")
1646
+
1647
+
1648
+ @dataclass(eq=False, repr=False)
1649
+ class FunctionOption(betterproto.Message):
1650
+ """
1651
+ An optional function argument. Typically used for specifying behavior in
1652
+ invalid or corner cases.
1653
+ """
1654
+
1655
+ name: str = betterproto.string_field(1)
1656
+ """
1657
+ Name of the option to set. If the consumer does not recognize the
1658
+ option, it must reject the plan. The name is matched case-insensitively
1659
+ with option names defined for the function.
1660
+ """
1661
+
1662
+ preference: List[str] = betterproto.string_field(2)
1663
+ """
1664
+ List of behavior options allowed by the producer. At least one must be
1665
+ specified; to leave an option unspecified, simply don't add an entry to
1666
+ `options`. The consumer must use the first option from the list that it
1667
+ supports. If the consumer supports none of the specified options, it
1668
+ must reject the plan. The name is matched case-insensitively and must
1669
+ match one of the option values defined for the option.
1670
+ """
1671
+
1672
+
1673
+ @dataclass(eq=False, repr=False)
1674
+ class Expression(betterproto.Message):
1675
+ literal: "ExpressionLiteral" = betterproto.message_field(1, group="rex_type")
1676
+ selection: "ExpressionFieldReference" = betterproto.message_field(
1677
+ 2, group="rex_type"
1678
+ )
1679
+ scalar_function: "ExpressionScalarFunction" = betterproto.message_field(
1680
+ 3, group="rex_type"
1681
+ )
1682
+ window_function: "ExpressionWindowFunction" = betterproto.message_field(
1683
+ 5, group="rex_type"
1684
+ )
1685
+ if_then: "ExpressionIfThen" = betterproto.message_field(6, group="rex_type")
1686
+ switch_expression: "ExpressionSwitchExpression" = betterproto.message_field(
1687
+ 7, group="rex_type"
1688
+ )
1689
+ singular_or_list: "ExpressionSingularOrList" = betterproto.message_field(
1690
+ 8, group="rex_type"
1691
+ )
1692
+ multi_or_list: "ExpressionMultiOrList" = betterproto.message_field(
1693
+ 9, group="rex_type"
1694
+ )
1695
+ cast: "ExpressionCast" = betterproto.message_field(11, group="rex_type")
1696
+ subquery: "ExpressionSubquery" = betterproto.message_field(12, group="rex_type")
1697
+ nested: "ExpressionNested" = betterproto.message_field(13, group="rex_type")
1698
+ enum: "ExpressionEnum" = betterproto.message_field(10, group="rex_type")
1699
+ """
1700
+ deprecated: enum literals are only sensible in the context of
1701
+ function arguments, for which FunctionArgument should now be
1702
+ used
1703
+ """
1704
+
1705
+ def __post_init__(self) -> None:
1706
+ super().__post_init__()
1707
+ if self.is_set("enum"):
1708
+ warnings.warn("Expression.enum is deprecated", DeprecationWarning)
1709
+
1710
+
1711
+ @dataclass(eq=False, repr=False)
1712
+ class ExpressionEnum(betterproto.Message):
1713
+ specified: str = betterproto.string_field(1, group="enum_kind")
1714
+ unspecified: "ExpressionEnumEmpty" = betterproto.message_field(2, group="enum_kind")
1715
+
1716
+ def __post_init__(self) -> None:
1717
+ warnings.warn("ExpressionEnum is deprecated", DeprecationWarning)
1718
+ super().__post_init__()
1719
+
1720
+
1721
+ @dataclass(eq=False, repr=False)
1722
+ class ExpressionEnumEmpty(betterproto.Message):
1723
+ pass
1724
+
1725
+ def __post_init__(self) -> None:
1726
+ warnings.warn("ExpressionEnumEmpty is deprecated", DeprecationWarning)
1727
+ super().__post_init__()
1728
+
1729
+
1730
+ @dataclass(eq=False, repr=False)
1731
+ class ExpressionLiteral(betterproto.Message):
1732
+ boolean: bool = betterproto.bool_field(1, group="literal_type")
1733
+ i8: int = betterproto.int32_field(2, group="literal_type")
1734
+ i16: int = betterproto.int32_field(3, group="literal_type")
1735
+ i32: int = betterproto.int32_field(5, group="literal_type")
1736
+ i64: int = betterproto.int64_field(7, group="literal_type")
1737
+ fp32: float = betterproto.float_field(10, group="literal_type")
1738
+ fp64: float = betterproto.double_field(11, group="literal_type")
1739
+ string: str = betterproto.string_field(12, group="literal_type")
1740
+ binary: bytes = betterproto.bytes_field(13, group="literal_type")
1741
+ timestamp: int = betterproto.int64_field(14, group="literal_type")
1742
+ """
1743
+ Timestamp in units of microseconds since the UNIX epoch.
1744
+ Deprecated in favor of `precision_timestamp`
1745
+ """
1746
+
1747
+ date: int = betterproto.int32_field(16, group="literal_type")
1748
+ """Date in units of days since the UNIX epoch."""
1749
+
1750
+ time: int = betterproto.int64_field(17, group="literal_type")
1751
+ """Time in units of microseconds past midnight"""
1752
+
1753
+ interval_year_to_month: "ExpressionLiteralIntervalYearToMonth" = (
1754
+ betterproto.message_field(19, group="literal_type")
1755
+ )
1756
+ interval_day_to_second: "ExpressionLiteralIntervalDayToSecond" = (
1757
+ betterproto.message_field(20, group="literal_type")
1758
+ )
1759
+ interval_compound: "ExpressionLiteralIntervalCompound" = betterproto.message_field(
1760
+ 36, group="literal_type"
1761
+ )
1762
+ fixed_char: str = betterproto.string_field(21, group="literal_type")
1763
+ var_char: "ExpressionLiteralVarChar" = betterproto.message_field(
1764
+ 22, group="literal_type"
1765
+ )
1766
+ fixed_binary: bytes = betterproto.bytes_field(23, group="literal_type")
1767
+ decimal: "ExpressionLiteralDecimal" = betterproto.message_field(
1768
+ 24, group="literal_type"
1769
+ )
1770
+ precision_timestamp: "ExpressionLiteralPrecisionTimestamp" = (
1771
+ betterproto.message_field(34, group="literal_type")
1772
+ )
1773
+ precision_timestamp_tz: "ExpressionLiteralPrecisionTimestamp" = (
1774
+ betterproto.message_field(35, group="literal_type")
1775
+ )
1776
+ struct: "ExpressionLiteralStruct" = betterproto.message_field(
1777
+ 25, group="literal_type"
1778
+ )
1779
+ map: "ExpressionLiteralMap" = betterproto.message_field(26, group="literal_type")
1780
+ timestamp_tz: int = betterproto.int64_field(27, group="literal_type")
1781
+ """
1782
+ Timestamp in units of microseconds since the UNIX epoch.
1783
+ Deprecated in favor of `precision_timestamp_tz`
1784
+ """
1785
+
1786
+ uuid: bytes = betterproto.bytes_field(28, group="literal_type")
1787
+ null: "Type" = betterproto.message_field(29, group="literal_type")
1788
+ list: "ExpressionLiteralList" = betterproto.message_field(30, group="literal_type")
1789
+ empty_list: "TypeList" = betterproto.message_field(31, group="literal_type")
1790
+ empty_map: "TypeMap" = betterproto.message_field(32, group="literal_type")
1791
+ user_defined: "ExpressionLiteralUserDefined" = betterproto.message_field(
1792
+ 33, group="literal_type"
1793
+ )
1794
+ nullable: bool = betterproto.bool_field(50)
1795
+ """
1796
+ Whether the literal_type above should be treated as a nullable type.
1797
+ Applies to all members of the literal_type oneof EXCEPT:
1798
+ * Type null (must be nullable by definition)
1799
+ * Type.List empty_list (use Type.List::nullability)
1800
+ * Type.Map empty_map (use Type.Map::nullability)
1801
+ """
1802
+
1803
+ type_variation_reference: int = betterproto.uint32_field(51)
1804
+ """
1805
+ optionally points to a type_variation_anchor defined in this plan.
1806
+ Applies to all members of union other than the Typed null (which should
1807
+ directly declare the type variation).
1808
+ """
1809
+
1810
+ def __post_init__(self) -> None:
1811
+ super().__post_init__()
1812
+ if self.is_set("timestamp"):
1813
+ warnings.warn(
1814
+ "ExpressionLiteral.timestamp is deprecated", DeprecationWarning
1815
+ )
1816
+ if self.is_set("timestamp_tz"):
1817
+ warnings.warn(
1818
+ "ExpressionLiteral.timestamp_tz is deprecated", DeprecationWarning
1819
+ )
1820
+
1821
+
1822
+ @dataclass(eq=False, repr=False)
1823
+ class ExpressionLiteralVarChar(betterproto.Message):
1824
+ value: str = betterproto.string_field(1)
1825
+ length: int = betterproto.uint32_field(2)
1826
+
1827
+
1828
+ @dataclass(eq=False, repr=False)
1829
+ class ExpressionLiteralDecimal(betterproto.Message):
1830
+ value: bytes = betterproto.bytes_field(1)
1831
+ """
1832
+ little-endian twos-complement integer representation of complete value
1833
+ (ignoring precision) Always 16 bytes in length
1834
+ """
1835
+
1836
+ precision: int = betterproto.int32_field(2)
1837
+ """
1838
+ The maximum number of digits allowed in the value.
1839
+ the maximum precision is 38.
1840
+ """
1841
+
1842
+ scale: int = betterproto.int32_field(3)
1843
+ """declared scale of decimal literal"""
1844
+
1845
+
1846
+ @dataclass(eq=False, repr=False)
1847
+ class ExpressionLiteralPrecisionTimestamp(betterproto.Message):
1848
+ precision: int = betterproto.int32_field(1)
1849
+ """
1850
+ Sub-second precision, 0 means the value given is in seconds, 3 is milliseconds, 6 microseconds, 9 is nanoseconds
1851
+ """
1852
+
1853
+ value: int = betterproto.int64_field(2)
1854
+ """
1855
+ Time passed since 1970-01-01 00:00:00.000000 in UTC for PrecisionTimestampTZ and unspecified timezone for PrecisionTimestamp
1856
+ """
1857
+
1858
+
1859
+ @dataclass(eq=False, repr=False)
1860
+ class ExpressionLiteralMap(betterproto.Message):
1861
+ key_values: List["ExpressionLiteralMapKeyValue"] = betterproto.message_field(1)
1862
+
1863
+
1864
+ @dataclass(eq=False, repr=False)
1865
+ class ExpressionLiteralMapKeyValue(betterproto.Message):
1866
+ key: "ExpressionLiteral" = betterproto.message_field(1)
1867
+ value: "ExpressionLiteral" = betterproto.message_field(2)
1868
+
1869
+
1870
+ @dataclass(eq=False, repr=False)
1871
+ class ExpressionLiteralIntervalYearToMonth(betterproto.Message):
1872
+ years: int = betterproto.int32_field(1)
1873
+ months: int = betterproto.int32_field(2)
1874
+
1875
+
1876
+ @dataclass(eq=False, repr=False)
1877
+ class ExpressionLiteralIntervalDayToSecond(betterproto.Message):
1878
+ days: int = betterproto.int32_field(1)
1879
+ seconds: int = betterproto.int32_field(2)
1880
+ microseconds: int = betterproto.int32_field(3, group="precision_mode")
1881
+ precision: int = betterproto.int32_field(4, group="precision_mode")
1882
+ """
1883
+ Sub-second precision, 0 means the value given is in seconds, 3 is milliseconds, 6 microseconds, 9 is nanoseconds. Should be used with subseconds below.
1884
+ """
1885
+
1886
+ subseconds: int = betterproto.int64_field(5)
1887
+ """
1888
+ the number of fractional seconds using 1e(-precision) units. Should only be used with precision field, not microseconds.
1889
+ """
1890
+
1891
+ def __post_init__(self) -> None:
1892
+ super().__post_init__()
1893
+ if self.is_set("microseconds"):
1894
+ warnings.warn(
1895
+ "ExpressionLiteralIntervalDayToSecond.microseconds is deprecated",
1896
+ DeprecationWarning,
1897
+ )
1898
+
1899
+
1900
+ @dataclass(eq=False, repr=False)
1901
+ class ExpressionLiteralIntervalCompound(betterproto.Message):
1902
+ interval_year_to_month: "ExpressionLiteralIntervalYearToMonth" = (
1903
+ betterproto.message_field(1)
1904
+ )
1905
+ interval_day_to_second: "ExpressionLiteralIntervalDayToSecond" = (
1906
+ betterproto.message_field(2)
1907
+ )
1908
+
1909
+
1910
+ @dataclass(eq=False, repr=False)
1911
+ class ExpressionLiteralStruct(betterproto.Message):
1912
+ fields: List["ExpressionLiteral"] = betterproto.message_field(1)
1913
+ """A possibly heterogeneously typed list of literals"""
1914
+
1915
+
1916
+ @dataclass(eq=False, repr=False)
1917
+ class ExpressionLiteralList(betterproto.Message):
1918
+ values: List["ExpressionLiteral"] = betterproto.message_field(1)
1919
+ """A homogeneously typed list of literals"""
1920
+
1921
+
1922
+ @dataclass(eq=False, repr=False)
1923
+ class ExpressionLiteralUserDefined(betterproto.Message):
1924
+ type_reference: int = betterproto.uint32_field(1)
1925
+ """points to a type_anchor defined in this plan"""
1926
+
1927
+ type_parameters: List["TypeParameter"] = betterproto.message_field(3)
1928
+ """
1929
+ The parameters to be bound to the type class, if the type class is
1930
+ parameterizable.
1931
+ """
1932
+
1933
+ value: "betterproto_lib_google_protobuf.Any" = betterproto.message_field(
1934
+ 2, group="val"
1935
+ )
1936
+ """
1937
+ the value of the literal, serialized using some type-specific protobuf message
1938
+ """
1939
+
1940
+ struct: "ExpressionLiteralStruct" = betterproto.message_field(4, group="val")
1941
+ """
1942
+ the value of the literal, serialized using the structure definition in its declaration
1943
+ """
1944
+
1945
+
1946
+ @dataclass(eq=False, repr=False)
1947
+ class ExpressionNested(betterproto.Message):
1948
+ """Expression to dynamically construct nested types."""
1949
+
1950
+ nullable: bool = betterproto.bool_field(1)
1951
+ """Whether the returned nested type is nullable."""
1952
+
1953
+ type_variation_reference: int = betterproto.uint32_field(2)
1954
+ """
1955
+ Optionally points to a type_variation_anchor defined in this plan for
1956
+ the returned nested type.
1957
+ """
1958
+
1959
+ struct: "ExpressionNestedStruct" = betterproto.message_field(3, group="nested_type")
1960
+ list: "ExpressionNestedList" = betterproto.message_field(4, group="nested_type")
1961
+ map: "ExpressionNestedMap" = betterproto.message_field(5, group="nested_type")
1962
+
1963
+
1964
+ @dataclass(eq=False, repr=False)
1965
+ class ExpressionNestedMap(betterproto.Message):
1966
+ key_values: List["ExpressionNestedMapKeyValue"] = betterproto.message_field(1)
1967
+ """
1968
+ One or more key-value pairs. To specify an empty map, use
1969
+ Literal.empty_map (otherwise type information would be missing).
1970
+ """
1971
+
1972
+
1973
+ @dataclass(eq=False, repr=False)
1974
+ class ExpressionNestedMapKeyValue(betterproto.Message):
1975
+ key: "Expression" = betterproto.message_field(1)
1976
+ """Mandatory key/value expressions."""
1977
+
1978
+ value: "Expression" = betterproto.message_field(2)
1979
+
1980
+
1981
+ @dataclass(eq=False, repr=False)
1982
+ class ExpressionNestedStruct(betterproto.Message):
1983
+ fields: List["Expression"] = betterproto.message_field(1)
1984
+ """
1985
+ Zero or more possibly heterogeneously-typed list of expressions that
1986
+ form the struct fields.
1987
+ """
1988
+
1989
+
1990
+ @dataclass(eq=False, repr=False)
1991
+ class ExpressionNestedList(betterproto.Message):
1992
+ values: List["Expression"] = betterproto.message_field(1)
1993
+ """
1994
+ A homogeneously-typed list of one or more expressions that form the
1995
+ list entries. To specify an empty list, use Literal.empty_list
1996
+ (otherwise type information would be missing).
1997
+ """
1998
+
1999
+
2000
+ @dataclass(eq=False, repr=False)
2001
+ class ExpressionScalarFunction(betterproto.Message):
2002
+ """A scalar function call."""
2003
+
2004
+ function_reference: int = betterproto.uint32_field(1)
2005
+ """
2006
+ Points to a function_anchor defined in this plan, which must refer
2007
+ to a scalar function in the associated YAML file. Required; avoid
2008
+ using anchor/reference zero.
2009
+ """
2010
+
2011
+ arguments: List["FunctionArgument"] = betterproto.message_field(4)
2012
+ """
2013
+ The arguments to be bound to the function. This must have exactly the
2014
+ number of arguments specified in the function definition, and the
2015
+ argument types must also match exactly:
2016
+
2017
+ - Value arguments must be bound using FunctionArgument.value, and
2018
+ the expression in that must yield a value of a type that a function
2019
+ overload is defined for.
2020
+ - Type arguments must be bound using FunctionArgument.type.
2021
+ - Enum arguments must be bound using FunctionArgument.enum
2022
+ followed by Enum.specified, with a string that case-insensitively
2023
+ matches one of the allowed options.
2024
+ """
2025
+
2026
+ options: List["FunctionOption"] = betterproto.message_field(5)
2027
+ """
2028
+ Options to specify behavior for corner cases, or leave behavior
2029
+ unspecified if the consumer does not need specific behavior in these
2030
+ cases.
2031
+ """
2032
+
2033
+ output_type: "Type" = betterproto.message_field(3)
2034
+ """
2035
+ Must be set to the return type of the function, exactly as derived
2036
+ using the declaration in the extension.
2037
+ """
2038
+
2039
+ args: List["Expression"] = betterproto.message_field(2)
2040
+ """Deprecated; use arguments instead."""
2041
+
2042
+ def __post_init__(self) -> None:
2043
+ super().__post_init__()
2044
+ if self.is_set("args"):
2045
+ warnings.warn(
2046
+ "ExpressionScalarFunction.args is deprecated", DeprecationWarning
2047
+ )
2048
+
2049
+
2050
+ @dataclass(eq=False, repr=False)
2051
+ class ExpressionWindowFunction(betterproto.Message):
2052
+ """A window function call."""
2053
+
2054
+ function_reference: int = betterproto.uint32_field(1)
2055
+ """
2056
+ Points to a function_anchor defined in this plan. The function must be:
2057
+ - a window function
2058
+ - an aggregate function
2059
+
2060
+ An aggregate function referenced here should be treated as a window
2061
+ function with Window Type STREAMING
2062
+
2063
+ Required; 0 is considered to be a valid anchor/reference.
2064
+ """
2065
+
2066
+ arguments: List["FunctionArgument"] = betterproto.message_field(9)
2067
+ """
2068
+ The arguments to be bound to the function. This must have exactly the
2069
+ number of arguments specified in the function definition, and the
2070
+ argument types must also match exactly:
2071
+
2072
+ - Value arguments must be bound using FunctionArgument.value, and
2073
+ the expression in that must yield a value of a type that a function
2074
+ overload is defined for.
2075
+ - Type arguments must be bound using FunctionArgument.type, and a
2076
+ function overload must be defined for that type.
2077
+ - Enum arguments must be bound using FunctionArgument.enum
2078
+ followed by Enum.specified, with a string that case-insensitively
2079
+ matches one of the allowed options.
2080
+ """
2081
+
2082
+ options: List["FunctionOption"] = betterproto.message_field(11)
2083
+ """
2084
+ Options to specify behavior for corner cases, or leave behavior
2085
+ unspecified if the consumer does not need specific behavior in these
2086
+ cases.
2087
+ """
2088
+
2089
+ output_type: "Type" = betterproto.message_field(7)
2090
+ """
2091
+ Must be set to the return type of the function, exactly as derived
2092
+ using the declaration in the extension.
2093
+ """
2094
+
2095
+ phase: "AggregationPhase" = betterproto.enum_field(6)
2096
+ """
2097
+ Describes which part of the window function to perform within the
2098
+ context of distributed algorithms. Required. Must be set to
2099
+ INITIAL_TO_RESULT for window functions that are not decomposable.
2100
+ """
2101
+
2102
+ sorts: List["SortField"] = betterproto.message_field(3)
2103
+ """
2104
+ If specified, the records that are part of the window defined by
2105
+ upper_bound and lower_bound are ordered according to this list
2106
+ before they are aggregated. The first sort field has the highest
2107
+ priority; only if a sort field determines two records to be equivalent
2108
+ is the next field queried. This field is optional, and is only allowed
2109
+ if the window function is defined to support sorting.
2110
+ """
2111
+
2112
+ invocation: "AggregateFunctionAggregationInvocation" = betterproto.enum_field(10)
2113
+ """
2114
+ Specifies whether equivalent records are merged before being aggregated.
2115
+ Optional, defaults to AGGREGATION_INVOCATION_ALL.
2116
+ """
2117
+
2118
+ partitions: List["Expression"] = betterproto.message_field(2)
2119
+ """
2120
+ When one or more partition expressions are specified, two records are
2121
+ considered to be in the same partition if and only if these expressions
2122
+ yield an equal record of values for both. When computing the window
2123
+ function, only the subset of records within the bounds that are also in
2124
+ the same partition as the current record are aggregated.
2125
+ """
2126
+
2127
+ bounds_type: "ExpressionWindowFunctionBoundsType" = betterproto.enum_field(12)
2128
+ """Defines the bounds type: ROWS, RANGE"""
2129
+
2130
+ lower_bound: "ExpressionWindowFunctionBound" = betterproto.message_field(5)
2131
+ """
2132
+ Defines the record relative to the current record from which the window
2133
+ extends. The bound is inclusive. If the lower bound indexes a record
2134
+ greater than the upper bound, TODO (null range/no records passed?
2135
+ wrapping around as if lower/upper were swapped? error? null?).
2136
+ Optional; defaults to the start of the partition.
2137
+ """
2138
+
2139
+ upper_bound: "ExpressionWindowFunctionBound" = betterproto.message_field(4)
2140
+ """
2141
+ Defines the record relative to the current record up to which the window
2142
+ extends. The bound is inclusive. If the upper bound indexes a record
2143
+ less than the lower bound, TODO (null range/no records passed?
2144
+ wrapping around as if lower/upper were swapped? error? null?).
2145
+ Optional; defaults to the end of the partition.
2146
+ """
2147
+
2148
+ args: List["Expression"] = betterproto.message_field(8)
2149
+ """Deprecated; use arguments instead."""
2150
+
2151
+ def __post_init__(self) -> None:
2152
+ super().__post_init__()
2153
+ if self.is_set("args"):
2154
+ warnings.warn(
2155
+ "ExpressionWindowFunction.args is deprecated", DeprecationWarning
2156
+ )
2157
+
2158
+
2159
+ @dataclass(eq=False, repr=False)
2160
+ class ExpressionWindowFunctionBound(betterproto.Message):
2161
+ """
2162
+ Defines one of the two boundaries for the window of a window function.
2163
+ """
2164
+
2165
+ preceding: "ExpressionWindowFunctionBoundPreceding" = betterproto.message_field(
2166
+ 1, group="kind"
2167
+ )
2168
+ """The bound extends some number of records behind the current record."""
2169
+
2170
+ following: "ExpressionWindowFunctionBoundFollowing" = betterproto.message_field(
2171
+ 2, group="kind"
2172
+ )
2173
+ """
2174
+ The bound extends some number of records ahead of the current
2175
+ record.
2176
+ """
2177
+
2178
+ current_row: "ExpressionWindowFunctionBoundCurrentRow" = betterproto.message_field(
2179
+ 3, group="kind"
2180
+ )
2181
+ """The bound extends to the current record."""
2182
+
2183
+ unbounded: "ExpressionWindowFunctionBoundUnbounded" = betterproto.message_field(
2184
+ 4, group="kind"
2185
+ )
2186
+ """
2187
+ The bound extends to the start of the partition or the end of the
2188
+ partition, depending on whether this represents the upper or lower
2189
+ bound.
2190
+ """
2191
+
2192
+
2193
+ @dataclass(eq=False, repr=False)
2194
+ class ExpressionWindowFunctionBoundPreceding(betterproto.Message):
2195
+ """
2196
+ Defines that the bound extends this far back from the current record.
2197
+ """
2198
+
2199
+ offset: int = betterproto.int64_field(1)
2200
+ """
2201
+ A strictly positive integer specifying the number of records that
2202
+ the window extends back from the current record. Required. Use
2203
+ CurrentRow for offset zero and Following for negative offsets.
2204
+ """
2205
+
2206
+
2207
+ @dataclass(eq=False, repr=False)
2208
+ class ExpressionWindowFunctionBoundFollowing(betterproto.Message):
2209
+ """Defines that the bound extends this far ahead of the current record."""
2210
+
2211
+ offset: int = betterproto.int64_field(1)
2212
+ """
2213
+ A strictly positive integer specifying the number of records that
2214
+ the window extends ahead of the current record. Required. Use
2215
+ CurrentRow for offset zero and Preceding for negative offsets.
2216
+ """
2217
+
2218
+
2219
+ @dataclass(eq=False, repr=False)
2220
+ class ExpressionWindowFunctionBoundCurrentRow(betterproto.Message):
2221
+ """Defines that the bound extends to or from the current record."""
2222
+
2223
+ pass
2224
+
2225
+
2226
+ @dataclass(eq=False, repr=False)
2227
+ class ExpressionWindowFunctionBoundUnbounded(betterproto.Message):
2228
+ """
2229
+ Defines an "unbounded bound": for lower bounds this means the start
2230
+ of the partition, and for upper bounds this means the end of the
2231
+ partition.
2232
+ """
2233
+
2234
+ pass
2235
+
2236
+
2237
+ @dataclass(eq=False, repr=False)
2238
+ class ExpressionIfThen(betterproto.Message):
2239
+ ifs: List["ExpressionIfThenIfClause"] = betterproto.message_field(1)
2240
+ """A list of one or more IfClauses"""
2241
+
2242
+ else_: "Expression" = betterproto.message_field(2)
2243
+ """The returned Expression if no IfClauses are satisified"""
2244
+
2245
+
2246
+ @dataclass(eq=False, repr=False)
2247
+ class ExpressionIfThenIfClause(betterproto.Message):
2248
+ if_: "Expression" = betterproto.message_field(1)
2249
+ then: "Expression" = betterproto.message_field(2)
2250
+
2251
+
2252
+ @dataclass(eq=False, repr=False)
2253
+ class ExpressionCast(betterproto.Message):
2254
+ type: "Type" = betterproto.message_field(1)
2255
+ input: "Expression" = betterproto.message_field(2)
2256
+ failure_behavior: "ExpressionCastFailureBehavior" = betterproto.enum_field(3)
2257
+
2258
+
2259
+ @dataclass(eq=False, repr=False)
2260
+ class ExpressionSwitchExpression(betterproto.Message):
2261
+ match: "Expression" = betterproto.message_field(3)
2262
+ ifs: List["ExpressionSwitchExpressionIfValue"] = betterproto.message_field(1)
2263
+ else_: "Expression" = betterproto.message_field(2)
2264
+
2265
+
2266
+ @dataclass(eq=False, repr=False)
2267
+ class ExpressionSwitchExpressionIfValue(betterproto.Message):
2268
+ if_: "ExpressionLiteral" = betterproto.message_field(1)
2269
+ then: "Expression" = betterproto.message_field(2)
2270
+
2271
+
2272
+ @dataclass(eq=False, repr=False)
2273
+ class ExpressionSingularOrList(betterproto.Message):
2274
+ value: "Expression" = betterproto.message_field(1)
2275
+ options: List["Expression"] = betterproto.message_field(2)
2276
+
2277
+
2278
+ @dataclass(eq=False, repr=False)
2279
+ class ExpressionMultiOrList(betterproto.Message):
2280
+ value: List["Expression"] = betterproto.message_field(1)
2281
+ options: List["ExpressionMultiOrListRecord"] = betterproto.message_field(2)
2282
+
2283
+
2284
+ @dataclass(eq=False, repr=False)
2285
+ class ExpressionMultiOrListRecord(betterproto.Message):
2286
+ fields: List["Expression"] = betterproto.message_field(1)
2287
+
2288
+
2289
+ @dataclass(eq=False, repr=False)
2290
+ class ExpressionEmbeddedFunction(betterproto.Message):
2291
+ arguments: List["Expression"] = betterproto.message_field(1)
2292
+ output_type: "Type" = betterproto.message_field(2)
2293
+ python_pickle_function: "ExpressionEmbeddedFunctionPythonPickleFunction" = (
2294
+ betterproto.message_field(3, group="kind")
2295
+ )
2296
+ web_assembly_function: "ExpressionEmbeddedFunctionWebAssemblyFunction" = (
2297
+ betterproto.message_field(4, group="kind")
2298
+ )
2299
+
2300
+
2301
+ @dataclass(eq=False, repr=False)
2302
+ class ExpressionEmbeddedFunctionPythonPickleFunction(betterproto.Message):
2303
+ function: bytes = betterproto.bytes_field(1)
2304
+ prerequisite: List[str] = betterproto.string_field(2)
2305
+
2306
+
2307
+ @dataclass(eq=False, repr=False)
2308
+ class ExpressionEmbeddedFunctionWebAssemblyFunction(betterproto.Message):
2309
+ script: bytes = betterproto.bytes_field(1)
2310
+ prerequisite: List[str] = betterproto.string_field(2)
2311
+
2312
+
2313
+ @dataclass(eq=False, repr=False)
2314
+ class ExpressionReferenceSegment(betterproto.Message):
2315
+ """
2316
+ A way to reference the inner property of a complex record. Can reference
2317
+ either a map key by literal, a struct field by the ordinal position of
2318
+ the desired field or a particular element in an array. Supports
2319
+ expressions that would roughly translate to something similar to:
2320
+ a.b[2].c['my_map_key'].x where a,b,c and x are struct field references
2321
+ (ordinalized in the internal representation here), [2] is a list offset
2322
+ and ['my_map_key'] is a reference into a map field.
2323
+ """
2324
+
2325
+ map_key: "ExpressionReferenceSegmentMapKey" = betterproto.message_field(
2326
+ 1, group="reference_type"
2327
+ )
2328
+ struct_field: "ExpressionReferenceSegmentStructField" = betterproto.message_field(
2329
+ 2, group="reference_type"
2330
+ )
2331
+ list_element: "ExpressionReferenceSegmentListElement" = betterproto.message_field(
2332
+ 3, group="reference_type"
2333
+ )
2334
+
2335
+
2336
+ @dataclass(eq=False, repr=False)
2337
+ class ExpressionReferenceSegmentMapKey(betterproto.Message):
2338
+ map_key: "ExpressionLiteral" = betterproto.message_field(1)
2339
+ """literal based reference to specific possible value in map."""
2340
+
2341
+ child: "ExpressionReferenceSegment" = betterproto.message_field(2)
2342
+ """Optional child segment"""
2343
+
2344
+
2345
+ @dataclass(eq=False, repr=False)
2346
+ class ExpressionReferenceSegmentStructField(betterproto.Message):
2347
+ field: int = betterproto.int32_field(1)
2348
+ """zero-indexed ordinal position of field in struct"""
2349
+
2350
+ child: "ExpressionReferenceSegment" = betterproto.message_field(2)
2351
+ """Optional child segment"""
2352
+
2353
+
2354
+ @dataclass(eq=False, repr=False)
2355
+ class ExpressionReferenceSegmentListElement(betterproto.Message):
2356
+ offset: int = betterproto.int32_field(1)
2357
+ """zero-indexed ordinal position of element in list"""
2358
+
2359
+ child: "ExpressionReferenceSegment" = betterproto.message_field(2)
2360
+ """Optional child segment"""
2361
+
2362
+
2363
+ @dataclass(eq=False, repr=False)
2364
+ class ExpressionMaskExpression(betterproto.Message):
2365
+ """
2366
+ A reference that takes an existing subtype and selectively removes fields
2367
+ from it. For example, one might initially have an inner struct with 100
2368
+ fields but a a particular operation only needs to interact with only 2 of
2369
+ those 100 fields. In this situation, one would use a mask expression to
2370
+ eliminate the 98 fields that are not relevant to the rest of the operation
2371
+ pipeline.
2372
+
2373
+ Note that this does not fundamentally alter the structure of data beyond
2374
+ the elimination of unnecessary elements.
2375
+ """
2376
+
2377
+ select: "ExpressionMaskExpressionStructSelect" = betterproto.message_field(1)
2378
+ maintain_singular_struct: bool = betterproto.bool_field(2)
2379
+
2380
+
2381
+ @dataclass(eq=False, repr=False)
2382
+ class ExpressionMaskExpressionSelect(betterproto.Message):
2383
+ struct: "ExpressionMaskExpressionStructSelect" = betterproto.message_field(
2384
+ 1, group="type"
2385
+ )
2386
+ list: "ExpressionMaskExpressionListSelect" = betterproto.message_field(
2387
+ 2, group="type"
2388
+ )
2389
+ map: "ExpressionMaskExpressionMapSelect" = betterproto.message_field(
2390
+ 3, group="type"
2391
+ )
2392
+
2393
+
2394
+ @dataclass(eq=False, repr=False)
2395
+ class ExpressionMaskExpressionStructSelect(betterproto.Message):
2396
+ struct_items: List[
2397
+ "ExpressionMaskExpressionStructItem"
2398
+ ] = betterproto.message_field(1)
2399
+
2400
+
2401
+ @dataclass(eq=False, repr=False)
2402
+ class ExpressionMaskExpressionStructItem(betterproto.Message):
2403
+ field: int = betterproto.int32_field(1)
2404
+ child: "ExpressionMaskExpressionSelect" = betterproto.message_field(2)
2405
+
2406
+
2407
+ @dataclass(eq=False, repr=False)
2408
+ class ExpressionMaskExpressionListSelect(betterproto.Message):
2409
+ selection: List[
2410
+ "ExpressionMaskExpressionListSelectListSelectItem"
2411
+ ] = betterproto.message_field(1)
2412
+ child: "ExpressionMaskExpressionSelect" = betterproto.message_field(2)
2413
+
2414
+
2415
+ @dataclass(eq=False, repr=False)
2416
+ class ExpressionMaskExpressionListSelectListSelectItem(betterproto.Message):
2417
+ item: "ExpressionMaskExpressionListSelectListSelectItemListElement" = (
2418
+ betterproto.message_field(1, group="type")
2419
+ )
2420
+ slice: "ExpressionMaskExpressionListSelectListSelectItemListSlice" = (
2421
+ betterproto.message_field(2, group="type")
2422
+ )
2423
+
2424
+
2425
+ @dataclass(eq=False, repr=False)
2426
+ class ExpressionMaskExpressionListSelectListSelectItemListElement(betterproto.Message):
2427
+ field: int = betterproto.int32_field(1)
2428
+
2429
+
2430
+ @dataclass(eq=False, repr=False)
2431
+ class ExpressionMaskExpressionListSelectListSelectItemListSlice(betterproto.Message):
2432
+ start: int = betterproto.int32_field(1)
2433
+ end: int = betterproto.int32_field(2)
2434
+
2435
+
2436
+ @dataclass(eq=False, repr=False)
2437
+ class ExpressionMaskExpressionMapSelect(betterproto.Message):
2438
+ key: "ExpressionMaskExpressionMapSelectMapKey" = betterproto.message_field(
2439
+ 1, group="select"
2440
+ )
2441
+ expression: "ExpressionMaskExpressionMapSelectMapKeyExpression" = (
2442
+ betterproto.message_field(2, group="select")
2443
+ )
2444
+ child: "ExpressionMaskExpressionSelect" = betterproto.message_field(3)
2445
+
2446
+
2447
+ @dataclass(eq=False, repr=False)
2448
+ class ExpressionMaskExpressionMapSelectMapKey(betterproto.Message):
2449
+ map_key: str = betterproto.string_field(1)
2450
+
2451
+
2452
+ @dataclass(eq=False, repr=False)
2453
+ class ExpressionMaskExpressionMapSelectMapKeyExpression(betterproto.Message):
2454
+ map_key_expression: str = betterproto.string_field(1)
2455
+
2456
+
2457
+ @dataclass(eq=False, repr=False)
2458
+ class ExpressionFieldReference(betterproto.Message):
2459
+ """
2460
+ A reference to an inner part of a complex object. Can reference reference a
2461
+ single element or a masked version of elements
2462
+ """
2463
+
2464
+ direct_reference: "ExpressionReferenceSegment" = betterproto.message_field(
2465
+ 1, group="reference_type"
2466
+ )
2467
+ masked_reference: "ExpressionMaskExpression" = betterproto.message_field(
2468
+ 2, group="reference_type"
2469
+ )
2470
+ expression: "Expression" = betterproto.message_field(3, group="root_type")
2471
+ root_reference: "ExpressionFieldReferenceRootReference" = betterproto.message_field(
2472
+ 4, group="root_type"
2473
+ )
2474
+ outer_reference: "ExpressionFieldReferenceOuterReference" = (
2475
+ betterproto.message_field(5, group="root_type")
2476
+ )
2477
+
2478
+
2479
+ @dataclass(eq=False, repr=False)
2480
+ class ExpressionFieldReferenceRootReference(betterproto.Message):
2481
+ """
2482
+ Singleton that expresses this FieldReference is rooted off the root
2483
+ incoming record type
2484
+ """
2485
+
2486
+ pass
2487
+
2488
+
2489
+ @dataclass(eq=False, repr=False)
2490
+ class ExpressionFieldReferenceOuterReference(betterproto.Message):
2491
+ """A root reference for the outer relation's subquery"""
2492
+
2493
+ steps_out: int = betterproto.uint32_field(1)
2494
+ """
2495
+ number of subquery boundaries to traverse up for this field's reference
2496
+
2497
+ This value must be >= 1
2498
+ """
2499
+
2500
+
2501
+ @dataclass(eq=False, repr=False)
2502
+ class ExpressionSubquery(betterproto.Message):
2503
+ """Subquery relation expression"""
2504
+
2505
+ scalar: "ExpressionSubqueryScalar" = betterproto.message_field(
2506
+ 1, group="subquery_type"
2507
+ )
2508
+ """Scalar subquery"""
2509
+
2510
+ in_predicate: "ExpressionSubqueryInPredicate" = betterproto.message_field(
2511
+ 2, group="subquery_type"
2512
+ )
2513
+ """x IN y predicate"""
2514
+
2515
+ set_predicate: "ExpressionSubquerySetPredicate" = betterproto.message_field(
2516
+ 3, group="subquery_type"
2517
+ )
2518
+ """EXISTS/UNIQUE predicate"""
2519
+
2520
+ set_comparison: "ExpressionSubquerySetComparison" = betterproto.message_field(
2521
+ 4, group="subquery_type"
2522
+ )
2523
+ """ANY/ALL predicate"""
2524
+
2525
+
2526
+ @dataclass(eq=False, repr=False)
2527
+ class ExpressionSubqueryScalar(betterproto.Message):
2528
+ """
2529
+ A subquery with one row and one column. This is often an aggregate
2530
+ though not required to be.
2531
+ """
2532
+
2533
+ input: "Rel" = betterproto.message_field(1)
2534
+
2535
+
2536
+ @dataclass(eq=False, repr=False)
2537
+ class ExpressionSubqueryInPredicate(betterproto.Message):
2538
+ """
2539
+ Predicate checking that the left expression is contained in the right
2540
+ subquery
2541
+
2542
+ Examples:
2543
+
2544
+ x IN (SELECT * FROM t)
2545
+ (x, y) IN (SELECT a, b FROM t)
2546
+ """
2547
+
2548
+ needles: List["Expression"] = betterproto.message_field(1)
2549
+ haystack: "Rel" = betterproto.message_field(2)
2550
+
2551
+
2552
+ @dataclass(eq=False, repr=False)
2553
+ class ExpressionSubquerySetPredicate(betterproto.Message):
2554
+ """
2555
+ A predicate over a set of rows in the form of a subquery
2556
+ EXISTS and UNIQUE are common SQL forms of this operation.
2557
+ """
2558
+
2559
+ predicate_op: "ExpressionSubquerySetPredicatePredicateOp" = betterproto.enum_field(
2560
+ 1
2561
+ )
2562
+ """TODO: should allow expressions"""
2563
+
2564
+ tuples: "Rel" = betterproto.message_field(2)
2565
+
2566
+
2567
+ @dataclass(eq=False, repr=False)
2568
+ class ExpressionSubquerySetComparison(betterproto.Message):
2569
+ """
2570
+ A subquery comparison using ANY or ALL.
2571
+ Examples:
2572
+
2573
+ SELECT *
2574
+ FROM t1
2575
+ WHERE x < ANY(SELECT y from t2)
2576
+ """
2577
+
2578
+ reduction_op: "ExpressionSubquerySetComparisonReductionOp" = betterproto.enum_field(
2579
+ 1
2580
+ )
2581
+ """ANY or ALL"""
2582
+
2583
+ comparison_op: "ExpressionSubquerySetComparisonComparisonOp" = (
2584
+ betterproto.enum_field(2)
2585
+ )
2586
+ """A comparison operator"""
2587
+
2588
+ left: "Expression" = betterproto.message_field(3)
2589
+ """left side of the expression"""
2590
+
2591
+ right: "Rel" = betterproto.message_field(4)
2592
+ """right side of the expression"""
2593
+
2594
+
2595
+ @dataclass(eq=False, repr=False)
2596
+ class SortField(betterproto.Message):
2597
+ """
2598
+ The description of a field to sort on (including the direction of sorting and null semantics)
2599
+ """
2600
+
2601
+ expr: "Expression" = betterproto.message_field(1)
2602
+ direction: "SortFieldSortDirection" = betterproto.enum_field(2, group="sort_kind")
2603
+ comparison_function_reference: int = betterproto.uint32_field(3, group="sort_kind")
2604
+
2605
+
2606
+ @dataclass(eq=False, repr=False)
2607
+ class AggregateFunction(betterproto.Message):
2608
+ """An aggregate function."""
2609
+
2610
+ function_reference: int = betterproto.uint32_field(1)
2611
+ """
2612
+ Points to a function_anchor defined in this plan, which must refer
2613
+ to an aggregate function in the associated YAML file. Required; 0 is
2614
+ considered to be a valid anchor/reference.
2615
+ """
2616
+
2617
+ arguments: List["FunctionArgument"] = betterproto.message_field(7)
2618
+ """
2619
+ The arguments to be bound to the function. This must have exactly the
2620
+ number of arguments specified in the function definition, and the
2621
+ argument types must also match exactly:
2622
+
2623
+ - Value arguments must be bound using FunctionArgument.value, and
2624
+ the expression in that must yield a value of a type that a function
2625
+ overload is defined for.
2626
+ - Type arguments must be bound using FunctionArgument.type, and a
2627
+ function overload must be defined for that type.
2628
+ - Enum arguments must be bound using FunctionArgument.enum
2629
+ followed by Enum.specified, with a string that case-insensitively
2630
+ matches one of the allowed options.
2631
+ - Optional enum arguments must be bound using FunctionArgument.enum
2632
+ followed by either Enum.specified or Enum.unspecified. If specified,
2633
+ the string must case-insensitively match one of the allowed options.
2634
+ """
2635
+
2636
+ options: List["FunctionOption"] = betterproto.message_field(8)
2637
+ """
2638
+ Options to specify behavior for corner cases, or leave behavior
2639
+ unspecified if the consumer does not need specific behavior in these
2640
+ cases.
2641
+ """
2642
+
2643
+ output_type: "Type" = betterproto.message_field(5)
2644
+ """
2645
+ Must be set to the return type of the function, exactly as derived
2646
+ using the declaration in the extension.
2647
+ """
2648
+
2649
+ phase: "AggregationPhase" = betterproto.enum_field(4)
2650
+ """
2651
+ Describes which part of the aggregation to perform within the context of
2652
+ distributed algorithms. Required. Must be set to INITIAL_TO_RESULT for
2653
+ aggregate functions that are not decomposable.
2654
+ """
2655
+
2656
+ sorts: List["SortField"] = betterproto.message_field(3)
2657
+ """
2658
+ If specified, the aggregated records are ordered according to this list
2659
+ before they are aggregated. The first sort field has the highest
2660
+ priority; only if a sort field determines two records to be equivalent is
2661
+ the next field queried. This field is optional.
2662
+ """
2663
+
2664
+ invocation: "AggregateFunctionAggregationInvocation" = betterproto.enum_field(6)
2665
+ """
2666
+ Specifies whether equivalent records are merged before being aggregated.
2667
+ Optional, defaults to AGGREGATION_INVOCATION_ALL.
2668
+ """
2669
+
2670
+ args: List["Expression"] = betterproto.message_field(2)
2671
+ """deprecated; use arguments instead"""
2672
+
2673
+ def __post_init__(self) -> None:
2674
+ super().__post_init__()
2675
+ if self.is_set("args"):
2676
+ warnings.warn("AggregateFunction.args is deprecated", DeprecationWarning)
2677
+
2678
+
2679
+ @dataclass(eq=False, repr=False)
2680
+ class ReferenceRel(betterproto.Message):
2681
+ """
2682
+ This rel is used to create references,
2683
+ in case we refer to a RelRoot field names will be ignored
2684
+ """
2685
+
2686
+ subtree_ordinal: int = betterproto.int32_field(1)
2687
+
2688
+
2689
+ @dataclass(eq=False, repr=False)
2690
+ class PlanRel(betterproto.Message):
2691
+ """Either a relation or root relation"""
2692
+
2693
+ rel: "Rel" = betterproto.message_field(1, group="rel_type")
2694
+ """Any relation (used for references and CTEs)"""
2695
+
2696
+ root: "RelRoot" = betterproto.message_field(2, group="rel_type")
2697
+ """The root of a relation tree"""
2698
+
2699
+
2700
+ @dataclass(eq=False, repr=False)
2701
+ class Plan(betterproto.Message):
2702
+ """
2703
+ Describe a set of operations to complete.
2704
+ For compactness sake, identifiers are normalized at the plan level.
2705
+ """
2706
+
2707
+ version: "Version" = betterproto.message_field(6)
2708
+ """
2709
+ Substrait version of the plan. Optional up to 0.17.0, required for later
2710
+ versions.
2711
+ """
2712
+
2713
+ extension_uris: List["extensions.SimpleExtensionUri"] = betterproto.message_field(1)
2714
+ """a list of yaml specifications this plan may depend on"""
2715
+
2716
+ extensions: List[
2717
+ "extensions.SimpleExtensionDeclaration"
2718
+ ] = betterproto.message_field(2)
2719
+ """a list of extensions this plan may depend on"""
2720
+
2721
+ relations: List["PlanRel"] = betterproto.message_field(3)
2722
+ """one or more relation trees that are associated with this plan."""
2723
+
2724
+ advanced_extensions: "extensions.AdvancedExtension" = betterproto.message_field(4)
2725
+ """additional extensions associated with this plan."""
2726
+
2727
+ expected_type_urls: List[str] = betterproto.string_field(5)
2728
+ """
2729
+ A list of com.google.Any entities that this plan may use. Can be used to
2730
+ warn if some embedded message types are unknown. Note that this list may
2731
+ include message types that are ignorable (optimizations) or that are
2732
+ unused. In many cases, a consumer may be able to work with a plan even if
2733
+ one or more message types defined here are unknown.
2734
+ """
2735
+
2736
+
2737
+ @dataclass(eq=False, repr=False)
2738
+ class PlanVersion(betterproto.Message):
2739
+ """
2740
+ This message type can be used to deserialize only the version of a Substrait
2741
+ Plan message. This prevents deserialization errors when there were breaking
2742
+ changes between the Substrait version of the tool that produced the plan and
2743
+ the Substrait version used to deserialize it, such that a consumer can emit
2744
+ a more helpful error message in this case.
2745
+ """
2746
+
2747
+ version: "Version" = betterproto.message_field(6)
2748
+
2749
+
2750
+ @dataclass(eq=False, repr=False)
2751
+ class Version(betterproto.Message):
2752
+ major_number: int = betterproto.uint32_field(1)
2753
+ """Substrait version number."""
2754
+
2755
+ minor_number: int = betterproto.uint32_field(2)
2756
+ patch_number: int = betterproto.uint32_field(3)
2757
+ git_hash: str = betterproto.string_field(4)
2758
+ """
2759
+ If a particular version of Substrait is used that does not correspond to
2760
+ a version number exactly (for example when using an unofficial fork or
2761
+ using a version that is not yet released or is between versions), set this
2762
+ to the full git hash of the utilized commit of
2763
+ https://github.com/substrait-io/substrait (or fork thereof), represented
2764
+ using a lowercase hex ASCII string 40 characters in length. The version
2765
+ number above should be set to the most recent version tag in the history
2766
+ of that commit.
2767
+ """
2768
+
2769
+ producer: str = betterproto.string_field(5)
2770
+ """
2771
+ Identifying information for the producer that created this plan. Under
2772
+ ideal circumstances, consumers should not need this information. However,
2773
+ it is foreseen that consumers may need to work around bugs in particular
2774
+ producers in practice, and therefore may need to know which producer
2775
+ created the plan.
2776
+ """
2777
+
2778
+
2779
+ @dataclass(eq=False, repr=False)
2780
+ class ExpressionReference(betterproto.Message):
2781
+ expression: "Expression" = betterproto.message_field(1, group="expr_type")
2782
+ measure: "AggregateFunction" = betterproto.message_field(2, group="expr_type")
2783
+ output_names: List[str] = betterproto.string_field(3)
2784
+ """Field names in depth-first order"""
2785
+
2786
+
2787
+ @dataclass(eq=False, repr=False)
2788
+ class ExtendedExpression(betterproto.Message):
2789
+ """
2790
+ Describe a set of operations to complete.
2791
+ For compactness sake, identifiers are normalized at the plan level.
2792
+ """
2793
+
2794
+ version: "Version" = betterproto.message_field(7)
2795
+ """
2796
+ Substrait version of the expression. Optional up to 0.17.0, required for later
2797
+ versions.
2798
+ """
2799
+
2800
+ extension_uris: List["extensions.SimpleExtensionUri"] = betterproto.message_field(1)
2801
+ """a list of yaml specifications this expression may depend on"""
2802
+
2803
+ extensions: List[
2804
+ "extensions.SimpleExtensionDeclaration"
2805
+ ] = betterproto.message_field(2)
2806
+ """a list of extensions this expression may depend on"""
2807
+
2808
+ referred_expr: List["ExpressionReference"] = betterproto.message_field(3)
2809
+ """one or more expression trees with same order in plan rel"""
2810
+
2811
+ base_schema: "NamedStruct" = betterproto.message_field(4)
2812
+ advanced_extensions: "extensions.AdvancedExtension" = betterproto.message_field(5)
2813
+ """additional extensions associated with this expression."""
2814
+
2815
+ expected_type_urls: List[str] = betterproto.string_field(6)
2816
+ """
2817
+ A list of com.google.Any entities that this plan may use. Can be used to
2818
+ warn if some embedded message types are unknown. Note that this list may
2819
+ include message types that are ignorable (optimizations) or that are
2820
+ unused. In many cases, a consumer may be able to work with a plan even if
2821
+ one or more message types defined here are unknown.
2822
+ """
2823
+
2824
+
2825
+ @dataclass(eq=False, repr=False)
2826
+ class ParameterizedType(betterproto.Message):
2827
+ bool: "TypeBoolean" = betterproto.message_field(1, group="kind")
2828
+ i8: "TypeI8" = betterproto.message_field(2, group="kind")
2829
+ i16: "TypeI16" = betterproto.message_field(3, group="kind")
2830
+ i32: "TypeI32" = betterproto.message_field(5, group="kind")
2831
+ i64: "TypeI64" = betterproto.message_field(7, group="kind")
2832
+ fp32: "TypeFp32" = betterproto.message_field(10, group="kind")
2833
+ fp64: "TypeFp64" = betterproto.message_field(11, group="kind")
2834
+ string: "TypeString" = betterproto.message_field(12, group="kind")
2835
+ binary: "TypeBinary" = betterproto.message_field(13, group="kind")
2836
+ timestamp: "TypeTimestamp" = betterproto.message_field(14, group="kind")
2837
+ """
2838
+ Deprecated in favor of `ParameterizedPrecisionTimestamp precision_timestamp`
2839
+ """
2840
+
2841
+ date: "TypeDate" = betterproto.message_field(16, group="kind")
2842
+ time: "TypeTime" = betterproto.message_field(17, group="kind")
2843
+ interval_year: "TypeIntervalYear" = betterproto.message_field(19, group="kind")
2844
+ interval_day: "ParameterizedTypeParameterizedIntervalDay" = (
2845
+ betterproto.message_field(20, group="kind")
2846
+ )
2847
+ interval_compound: "ParameterizedTypeParameterizedIntervalCompound" = (
2848
+ betterproto.message_field(36, group="kind")
2849
+ )
2850
+ timestamp_tz: "TypeTimestampTz" = betterproto.message_field(29, group="kind")
2851
+ """
2852
+ Deprecated in favor of `ParameterizedPrecisionTimestampTZ precision_timestamp_tz`
2853
+ """
2854
+
2855
+ uuid: "TypeUuid" = betterproto.message_field(32, group="kind")
2856
+ fixed_char: "ParameterizedTypeParameterizedFixedChar" = betterproto.message_field(
2857
+ 21, group="kind"
2858
+ )
2859
+ varchar: "ParameterizedTypeParameterizedVarChar" = betterproto.message_field(
2860
+ 22, group="kind"
2861
+ )
2862
+ fixed_binary: "ParameterizedTypeParameterizedFixedBinary" = (
2863
+ betterproto.message_field(23, group="kind")
2864
+ )
2865
+ decimal: "ParameterizedTypeParameterizedDecimal" = betterproto.message_field(
2866
+ 24, group="kind"
2867
+ )
2868
+ precision_timestamp: "ParameterizedTypeParameterizedPrecisionTimestamp" = (
2869
+ betterproto.message_field(34, group="kind")
2870
+ )
2871
+ precision_timestamp_tz: "ParameterizedTypeParameterizedPrecisionTimestampTz" = (
2872
+ betterproto.message_field(35, group="kind")
2873
+ )
2874
+ struct: "ParameterizedTypeParameterizedStruct" = betterproto.message_field(
2875
+ 25, group="kind"
2876
+ )
2877
+ list: "ParameterizedTypeParameterizedList" = betterproto.message_field(
2878
+ 27, group="kind"
2879
+ )
2880
+ map: "ParameterizedTypeParameterizedMap" = betterproto.message_field(
2881
+ 28, group="kind"
2882
+ )
2883
+ user_defined: "ParameterizedTypeParameterizedUserDefined" = (
2884
+ betterproto.message_field(30, group="kind")
2885
+ )
2886
+ user_defined_pointer: int = betterproto.uint32_field(31, group="kind")
2887
+ """
2888
+ Deprecated in favor of user_defined, which allows nullability and
2889
+ variations to be specified. If user_defined_pointer is encountered,
2890
+ treat it as being non-nullable and having the default variation.
2891
+ """
2892
+
2893
+ type_parameter: "ParameterizedTypeTypeParameter" = betterproto.message_field(
2894
+ 33, group="kind"
2895
+ )
2896
+
2897
+ def __post_init__(self) -> None:
2898
+ super().__post_init__()
2899
+ if self.is_set("timestamp"):
2900
+ warnings.warn(
2901
+ "ParameterizedType.timestamp is deprecated", DeprecationWarning
2902
+ )
2903
+ if self.is_set("timestamp_tz"):
2904
+ warnings.warn(
2905
+ "ParameterizedType.timestamp_tz is deprecated", DeprecationWarning
2906
+ )
2907
+ if self.is_set("user_defined_pointer"):
2908
+ warnings.warn(
2909
+ "ParameterizedType.user_defined_pointer is deprecated",
2910
+ DeprecationWarning,
2911
+ )
2912
+
2913
+
2914
+ @dataclass(eq=False, repr=False)
2915
+ class ParameterizedTypeTypeParameter(betterproto.Message):
2916
+ name: str = betterproto.string_field(1)
2917
+ bounds: List["ParameterizedType"] = betterproto.message_field(2)
2918
+
2919
+
2920
+ @dataclass(eq=False, repr=False)
2921
+ class ParameterizedTypeIntegerParameter(betterproto.Message):
2922
+ name: str = betterproto.string_field(1)
2923
+ range_start_inclusive: "ParameterizedTypeNullableInteger" = (
2924
+ betterproto.message_field(2)
2925
+ )
2926
+ range_end_exclusive: "ParameterizedTypeNullableInteger" = betterproto.message_field(
2927
+ 3
2928
+ )
2929
+
2930
+
2931
+ @dataclass(eq=False, repr=False)
2932
+ class ParameterizedTypeNullableInteger(betterproto.Message):
2933
+ value: int = betterproto.int64_field(1)
2934
+
2935
+
2936
+ @dataclass(eq=False, repr=False)
2937
+ class ParameterizedTypeParameterizedFixedChar(betterproto.Message):
2938
+ length: "ParameterizedTypeIntegerOption" = betterproto.message_field(1)
2939
+ variation_pointer: int = betterproto.uint32_field(2)
2940
+ nullability: "TypeNullability" = betterproto.enum_field(3)
2941
+
2942
+
2943
+ @dataclass(eq=False, repr=False)
2944
+ class ParameterizedTypeParameterizedVarChar(betterproto.Message):
2945
+ length: "ParameterizedTypeIntegerOption" = betterproto.message_field(1)
2946
+ variation_pointer: int = betterproto.uint32_field(2)
2947
+ nullability: "TypeNullability" = betterproto.enum_field(3)
2948
+
2949
+
2950
+ @dataclass(eq=False, repr=False)
2951
+ class ParameterizedTypeParameterizedFixedBinary(betterproto.Message):
2952
+ length: "ParameterizedTypeIntegerOption" = betterproto.message_field(1)
2953
+ variation_pointer: int = betterproto.uint32_field(2)
2954
+ nullability: "TypeNullability" = betterproto.enum_field(3)
2955
+
2956
+
2957
+ @dataclass(eq=False, repr=False)
2958
+ class ParameterizedTypeParameterizedDecimal(betterproto.Message):
2959
+ scale: "ParameterizedTypeIntegerOption" = betterproto.message_field(1)
2960
+ precision: "ParameterizedTypeIntegerOption" = betterproto.message_field(2)
2961
+ variation_pointer: int = betterproto.uint32_field(3)
2962
+ nullability: "TypeNullability" = betterproto.enum_field(4)
2963
+
2964
+
2965
+ @dataclass(eq=False, repr=False)
2966
+ class ParameterizedTypeParameterizedIntervalDay(betterproto.Message):
2967
+ precision: "ParameterizedTypeIntegerOption" = betterproto.message_field(1)
2968
+ variation_pointer: int = betterproto.uint32_field(2)
2969
+ nullability: "TypeNullability" = betterproto.enum_field(3)
2970
+
2971
+
2972
+ @dataclass(eq=False, repr=False)
2973
+ class ParameterizedTypeParameterizedIntervalCompound(betterproto.Message):
2974
+ precision: "ParameterizedTypeIntegerOption" = betterproto.message_field(1)
2975
+ variation_pointer: int = betterproto.uint32_field(2)
2976
+ nullability: "TypeNullability" = betterproto.enum_field(3)
2977
+
2978
+
2979
+ @dataclass(eq=False, repr=False)
2980
+ class ParameterizedTypeParameterizedPrecisionTimestamp(betterproto.Message):
2981
+ precision: "ParameterizedTypeIntegerOption" = betterproto.message_field(1)
2982
+ variation_pointer: int = betterproto.uint32_field(2)
2983
+ nullability: "TypeNullability" = betterproto.enum_field(3)
2984
+
2985
+
2986
+ @dataclass(eq=False, repr=False)
2987
+ class ParameterizedTypeParameterizedPrecisionTimestampTz(betterproto.Message):
2988
+ precision: "ParameterizedTypeIntegerOption" = betterproto.message_field(1)
2989
+ variation_pointer: int = betterproto.uint32_field(2)
2990
+ nullability: "TypeNullability" = betterproto.enum_field(3)
2991
+
2992
+
2993
+ @dataclass(eq=False, repr=False)
2994
+ class ParameterizedTypeParameterizedStruct(betterproto.Message):
2995
+ types: List["ParameterizedType"] = betterproto.message_field(1)
2996
+ variation_pointer: int = betterproto.uint32_field(2)
2997
+ nullability: "TypeNullability" = betterproto.enum_field(3)
2998
+
2999
+
3000
+ @dataclass(eq=False, repr=False)
3001
+ class ParameterizedTypeParameterizedNamedStruct(betterproto.Message):
3002
+ names: List[str] = betterproto.string_field(1)
3003
+ """list of names in dfs order"""
3004
+
3005
+ struct: "ParameterizedTypeParameterizedStruct" = betterproto.message_field(2)
3006
+
3007
+
3008
+ @dataclass(eq=False, repr=False)
3009
+ class ParameterizedTypeParameterizedList(betterproto.Message):
3010
+ type: "ParameterizedType" = betterproto.message_field(1)
3011
+ variation_pointer: int = betterproto.uint32_field(2)
3012
+ nullability: "TypeNullability" = betterproto.enum_field(3)
3013
+
3014
+
3015
+ @dataclass(eq=False, repr=False)
3016
+ class ParameterizedTypeParameterizedMap(betterproto.Message):
3017
+ key: "ParameterizedType" = betterproto.message_field(1)
3018
+ value: "ParameterizedType" = betterproto.message_field(2)
3019
+ variation_pointer: int = betterproto.uint32_field(3)
3020
+ nullability: "TypeNullability" = betterproto.enum_field(4)
3021
+
3022
+
3023
+ @dataclass(eq=False, repr=False)
3024
+ class ParameterizedTypeParameterizedUserDefined(betterproto.Message):
3025
+ type_pointer: int = betterproto.uint32_field(1)
3026
+ variation_pointer: int = betterproto.uint32_field(2)
3027
+ nullability: "TypeNullability" = betterproto.enum_field(3)
3028
+
3029
+
3030
+ @dataclass(eq=False, repr=False)
3031
+ class ParameterizedTypeIntegerOption(betterproto.Message):
3032
+ literal: int = betterproto.int32_field(1, group="integer_type")
3033
+ parameter: "ParameterizedTypeIntegerParameter" = betterproto.message_field(
3034
+ 2, group="integer_type"
3035
+ )
3036
+
3037
+
3038
+ @dataclass(eq=False, repr=False)
3039
+ class DerivationExpression(betterproto.Message):
3040
+ bool: "TypeBoolean" = betterproto.message_field(1, group="kind")
3041
+ i8: "TypeI8" = betterproto.message_field(2, group="kind")
3042
+ i16: "TypeI16" = betterproto.message_field(3, group="kind")
3043
+ i32: "TypeI32" = betterproto.message_field(5, group="kind")
3044
+ i64: "TypeI64" = betterproto.message_field(7, group="kind")
3045
+ fp32: "TypeFp32" = betterproto.message_field(10, group="kind")
3046
+ fp64: "TypeFp64" = betterproto.message_field(11, group="kind")
3047
+ string: "TypeString" = betterproto.message_field(12, group="kind")
3048
+ binary: "TypeBinary" = betterproto.message_field(13, group="kind")
3049
+ timestamp: "TypeTimestamp" = betterproto.message_field(14, group="kind")
3050
+ """
3051
+ Deprecated in favor of `ExpressionPrecisionTimestamp precision_timestamp`
3052
+ """
3053
+
3054
+ date: "TypeDate" = betterproto.message_field(16, group="kind")
3055
+ time: "TypeTime" = betterproto.message_field(17, group="kind")
3056
+ interval_year: "TypeIntervalYear" = betterproto.message_field(19, group="kind")
3057
+ timestamp_tz: "TypeTimestampTz" = betterproto.message_field(29, group="kind")
3058
+ """
3059
+ Deprecated in favor of `ExpressionPrecisionTimestampTZ precision_timestamp_tz`
3060
+ """
3061
+
3062
+ uuid: "TypeUuid" = betterproto.message_field(32, group="kind")
3063
+ interval_day: "DerivationExpressionExpressionIntervalDay" = (
3064
+ betterproto.message_field(20, group="kind")
3065
+ )
3066
+ interval_compound: "DerivationExpressionExpressionIntervalCompound" = (
3067
+ betterproto.message_field(42, group="kind")
3068
+ )
3069
+ fixed_char: "DerivationExpressionExpressionFixedChar" = betterproto.message_field(
3070
+ 21, group="kind"
3071
+ )
3072
+ varchar: "DerivationExpressionExpressionVarChar" = betterproto.message_field(
3073
+ 22, group="kind"
3074
+ )
3075
+ fixed_binary: "DerivationExpressionExpressionFixedBinary" = (
3076
+ betterproto.message_field(23, group="kind")
3077
+ )
3078
+ decimal: "DerivationExpressionExpressionDecimal" = betterproto.message_field(
3079
+ 24, group="kind"
3080
+ )
3081
+ precision_timestamp: "DerivationExpressionExpressionPrecisionTimestamp" = (
3082
+ betterproto.message_field(40, group="kind")
3083
+ )
3084
+ precision_timestamp_tz: "DerivationExpressionExpressionPrecisionTimestampTz" = (
3085
+ betterproto.message_field(41, group="kind")
3086
+ )
3087
+ struct: "DerivationExpressionExpressionStruct" = betterproto.message_field(
3088
+ 25, group="kind"
3089
+ )
3090
+ list: "DerivationExpressionExpressionList" = betterproto.message_field(
3091
+ 27, group="kind"
3092
+ )
3093
+ map: "DerivationExpressionExpressionMap" = betterproto.message_field(
3094
+ 28, group="kind"
3095
+ )
3096
+ user_defined: "DerivationExpressionExpressionUserDefined" = (
3097
+ betterproto.message_field(30, group="kind")
3098
+ )
3099
+ user_defined_pointer: int = betterproto.uint32_field(31, group="kind")
3100
+ """
3101
+ Deprecated in favor of user_defined, which allows nullability and
3102
+ variations to be specified. If user_defined_pointer is encountered,
3103
+ treat it as being non-nullable and having the default variation.
3104
+ """
3105
+
3106
+ type_parameter_name: str = betterproto.string_field(33, group="kind")
3107
+ integer_parameter_name: str = betterproto.string_field(34, group="kind")
3108
+ integer_literal: int = betterproto.int32_field(35, group="kind")
3109
+ unary_op: "DerivationExpressionUnaryOp" = betterproto.message_field(
3110
+ 36, group="kind"
3111
+ )
3112
+ binary_op: "DerivationExpressionBinaryOp" = betterproto.message_field(
3113
+ 37, group="kind"
3114
+ )
3115
+ if_else: "DerivationExpressionIfElse" = betterproto.message_field(38, group="kind")
3116
+ return_program: "DerivationExpressionReturnProgram" = betterproto.message_field(
3117
+ 39, group="kind"
3118
+ )
3119
+
3120
+ def __post_init__(self) -> None:
3121
+ super().__post_init__()
3122
+ if self.is_set("timestamp"):
3123
+ warnings.warn(
3124
+ "DerivationExpression.timestamp is deprecated", DeprecationWarning
3125
+ )
3126
+ if self.is_set("timestamp_tz"):
3127
+ warnings.warn(
3128
+ "DerivationExpression.timestamp_tz is deprecated", DeprecationWarning
3129
+ )
3130
+ if self.is_set("user_defined_pointer"):
3131
+ warnings.warn(
3132
+ "DerivationExpression.user_defined_pointer is deprecated",
3133
+ DeprecationWarning,
3134
+ )
3135
+
3136
+
3137
+ @dataclass(eq=False, repr=False)
3138
+ class DerivationExpressionExpressionFixedChar(betterproto.Message):
3139
+ length: "DerivationExpression" = betterproto.message_field(1)
3140
+ variation_pointer: int = betterproto.uint32_field(2)
3141
+ nullability: "TypeNullability" = betterproto.enum_field(3)
3142
+
3143
+
3144
+ @dataclass(eq=False, repr=False)
3145
+ class DerivationExpressionExpressionVarChar(betterproto.Message):
3146
+ length: "DerivationExpression" = betterproto.message_field(1)
3147
+ variation_pointer: int = betterproto.uint32_field(2)
3148
+ nullability: "TypeNullability" = betterproto.enum_field(3)
3149
+
3150
+
3151
+ @dataclass(eq=False, repr=False)
3152
+ class DerivationExpressionExpressionFixedBinary(betterproto.Message):
3153
+ length: "DerivationExpression" = betterproto.message_field(1)
3154
+ variation_pointer: int = betterproto.uint32_field(2)
3155
+ nullability: "TypeNullability" = betterproto.enum_field(3)
3156
+
3157
+
3158
+ @dataclass(eq=False, repr=False)
3159
+ class DerivationExpressionExpressionDecimal(betterproto.Message):
3160
+ scale: "DerivationExpression" = betterproto.message_field(1)
3161
+ precision: "DerivationExpression" = betterproto.message_field(2)
3162
+ variation_pointer: int = betterproto.uint32_field(3)
3163
+ nullability: "TypeNullability" = betterproto.enum_field(4)
3164
+
3165
+
3166
+ @dataclass(eq=False, repr=False)
3167
+ class DerivationExpressionExpressionPrecisionTimestamp(betterproto.Message):
3168
+ precision: "DerivationExpression" = betterproto.message_field(1)
3169
+ variation_pointer: int = betterproto.uint32_field(2)
3170
+ nullability: "TypeNullability" = betterproto.enum_field(3)
3171
+
3172
+
3173
+ @dataclass(eq=False, repr=False)
3174
+ class DerivationExpressionExpressionIntervalDay(betterproto.Message):
3175
+ precision: "DerivationExpression" = betterproto.message_field(1)
3176
+ variation_pointer: int = betterproto.uint32_field(2)
3177
+ nullability: "TypeNullability" = betterproto.enum_field(3)
3178
+
3179
+
3180
+ @dataclass(eq=False, repr=False)
3181
+ class DerivationExpressionExpressionIntervalCompound(betterproto.Message):
3182
+ precision: "DerivationExpression" = betterproto.message_field(1)
3183
+ variation_pointer: int = betterproto.uint32_field(2)
3184
+ nullability: "TypeNullability" = betterproto.enum_field(3)
3185
+
3186
+
3187
+ @dataclass(eq=False, repr=False)
3188
+ class DerivationExpressionExpressionPrecisionTimestampTz(betterproto.Message):
3189
+ precision: "DerivationExpression" = betterproto.message_field(1)
3190
+ variation_pointer: int = betterproto.uint32_field(2)
3191
+ nullability: "TypeNullability" = betterproto.enum_field(3)
3192
+
3193
+
3194
+ @dataclass(eq=False, repr=False)
3195
+ class DerivationExpressionExpressionStruct(betterproto.Message):
3196
+ types: List["DerivationExpression"] = betterproto.message_field(1)
3197
+ variation_pointer: int = betterproto.uint32_field(2)
3198
+ nullability: "TypeNullability" = betterproto.enum_field(3)
3199
+
3200
+
3201
+ @dataclass(eq=False, repr=False)
3202
+ class DerivationExpressionExpressionNamedStruct(betterproto.Message):
3203
+ names: List[str] = betterproto.string_field(1)
3204
+ struct: "DerivationExpressionExpressionStruct" = betterproto.message_field(2)
3205
+
3206
+
3207
+ @dataclass(eq=False, repr=False)
3208
+ class DerivationExpressionExpressionList(betterproto.Message):
3209
+ type: "DerivationExpression" = betterproto.message_field(1)
3210
+ variation_pointer: int = betterproto.uint32_field(2)
3211
+ nullability: "TypeNullability" = betterproto.enum_field(3)
3212
+
3213
+
3214
+ @dataclass(eq=False, repr=False)
3215
+ class DerivationExpressionExpressionMap(betterproto.Message):
3216
+ key: "DerivationExpression" = betterproto.message_field(1)
3217
+ value: "DerivationExpression" = betterproto.message_field(2)
3218
+ variation_pointer: int = betterproto.uint32_field(3)
3219
+ nullability: "TypeNullability" = betterproto.enum_field(4)
3220
+
3221
+
3222
+ @dataclass(eq=False, repr=False)
3223
+ class DerivationExpressionExpressionUserDefined(betterproto.Message):
3224
+ type_pointer: int = betterproto.uint32_field(1)
3225
+ variation_pointer: int = betterproto.uint32_field(2)
3226
+ nullability: "TypeNullability" = betterproto.enum_field(3)
3227
+
3228
+
3229
+ @dataclass(eq=False, repr=False)
3230
+ class DerivationExpressionIfElse(betterproto.Message):
3231
+ if_condition: "DerivationExpression" = betterproto.message_field(1)
3232
+ if_return: "DerivationExpression" = betterproto.message_field(2)
3233
+ else_return: "DerivationExpression" = betterproto.message_field(3)
3234
+
3235
+
3236
+ @dataclass(eq=False, repr=False)
3237
+ class DerivationExpressionUnaryOp(betterproto.Message):
3238
+ op_type: "DerivationExpressionUnaryOpUnaryOpType" = betterproto.enum_field(1)
3239
+ arg: "DerivationExpression" = betterproto.message_field(2)
3240
+
3241
+
3242
+ @dataclass(eq=False, repr=False)
3243
+ class DerivationExpressionBinaryOp(betterproto.Message):
3244
+ op_type: "DerivationExpressionBinaryOpBinaryOpType" = betterproto.enum_field(1)
3245
+ arg1: "DerivationExpression" = betterproto.message_field(2)
3246
+ arg2: "DerivationExpression" = betterproto.message_field(3)
3247
+
3248
+
3249
+ @dataclass(eq=False, repr=False)
3250
+ class DerivationExpressionReturnProgram(betterproto.Message):
3251
+ assignments: List[
3252
+ "DerivationExpressionReturnProgramAssignment"
3253
+ ] = betterproto.message_field(1)
3254
+ final_expression: "DerivationExpression" = betterproto.message_field(2)
3255
+
3256
+
3257
+ @dataclass(eq=False, repr=False)
3258
+ class DerivationExpressionReturnProgramAssignment(betterproto.Message):
3259
+ name: str = betterproto.string_field(1)
3260
+ expression: "DerivationExpression" = betterproto.message_field(2)
3261
+
3262
+
3263
+ @dataclass(eq=False, repr=False)
3264
+ class FunctionSignature(betterproto.Message):
3265
+ """List of function signatures available."""
3266
+
3267
+ pass
3268
+
3269
+
3270
+ @dataclass(eq=False, repr=False)
3271
+ class FunctionSignatureFinalArgVariadic(betterproto.Message):
3272
+ min_args: int = betterproto.int64_field(1)
3273
+ """
3274
+ the minimum number of arguments allowed for the list of final arguments
3275
+ (inclusive).
3276
+ """
3277
+
3278
+ max_args: int = betterproto.int64_field(2)
3279
+ """
3280
+ the maximum number of arguments allowed for the list of final arguments
3281
+ (exclusive)
3282
+ """
3283
+
3284
+ consistency: "FunctionSignatureFinalArgVariadicParameterConsistency" = (
3285
+ betterproto.enum_field(3)
3286
+ )
3287
+ """the type of parameterized type consistency"""
3288
+
3289
+
3290
+ @dataclass(eq=False, repr=False)
3291
+ class FunctionSignatureFinalArgNormal(betterproto.Message):
3292
+ pass
3293
+
3294
+
3295
+ @dataclass(eq=False, repr=False)
3296
+ class FunctionSignatureScalar(betterproto.Message):
3297
+ arguments: List["FunctionSignatureArgument"] = betterproto.message_field(2)
3298
+ name: List[str] = betterproto.string_field(3)
3299
+ description: "FunctionSignatureDescription" = betterproto.message_field(4)
3300
+ deterministic: bool = betterproto.bool_field(7)
3301
+ session_dependent: bool = betterproto.bool_field(8)
3302
+ output_type: "DerivationExpression" = betterproto.message_field(9)
3303
+ variadic: "FunctionSignatureFinalArgVariadic" = betterproto.message_field(
3304
+ 10, group="final_variable_behavior"
3305
+ )
3306
+ normal: "FunctionSignatureFinalArgNormal" = betterproto.message_field(
3307
+ 11, group="final_variable_behavior"
3308
+ )
3309
+ implementations: List[
3310
+ "FunctionSignatureImplementation"
3311
+ ] = betterproto.message_field(12)
3312
+
3313
+
3314
+ @dataclass(eq=False, repr=False)
3315
+ class FunctionSignatureAggregate(betterproto.Message):
3316
+ arguments: List["FunctionSignatureArgument"] = betterproto.message_field(2)
3317
+ name: str = betterproto.string_field(3)
3318
+ description: "FunctionSignatureDescription" = betterproto.message_field(4)
3319
+ deterministic: bool = betterproto.bool_field(7)
3320
+ session_dependent: bool = betterproto.bool_field(8)
3321
+ output_type: "DerivationExpression" = betterproto.message_field(9)
3322
+ variadic: "FunctionSignatureFinalArgVariadic" = betterproto.message_field(
3323
+ 10, group="final_variable_behavior"
3324
+ )
3325
+ normal: "FunctionSignatureFinalArgNormal" = betterproto.message_field(
3326
+ 11, group="final_variable_behavior"
3327
+ )
3328
+ ordered: bool = betterproto.bool_field(14)
3329
+ max_set: int = betterproto.uint64_field(12)
3330
+ intermediate_type: "Type" = betterproto.message_field(13)
3331
+ implementations: List[
3332
+ "FunctionSignatureImplementation"
3333
+ ] = betterproto.message_field(15)
3334
+
3335
+
3336
+ @dataclass(eq=False, repr=False)
3337
+ class FunctionSignatureWindow(betterproto.Message):
3338
+ arguments: List["FunctionSignatureArgument"] = betterproto.message_field(2)
3339
+ name: List[str] = betterproto.string_field(3)
3340
+ description: "FunctionSignatureDescription" = betterproto.message_field(4)
3341
+ deterministic: bool = betterproto.bool_field(7)
3342
+ session_dependent: bool = betterproto.bool_field(8)
3343
+ intermediate_type: "DerivationExpression" = betterproto.message_field(9)
3344
+ output_type: "DerivationExpression" = betterproto.message_field(10)
3345
+ variadic: "FunctionSignatureFinalArgVariadic" = betterproto.message_field(
3346
+ 16, group="final_variable_behavior"
3347
+ )
3348
+ normal: "FunctionSignatureFinalArgNormal" = betterproto.message_field(
3349
+ 17, group="final_variable_behavior"
3350
+ )
3351
+ ordered: bool = betterproto.bool_field(11)
3352
+ max_set: int = betterproto.uint64_field(12)
3353
+ window_type: "FunctionSignatureWindowWindowType" = betterproto.enum_field(14)
3354
+ implementations: List[
3355
+ "FunctionSignatureImplementation"
3356
+ ] = betterproto.message_field(15)
3357
+
3358
+
3359
+ @dataclass(eq=False, repr=False)
3360
+ class FunctionSignatureDescription(betterproto.Message):
3361
+ language: str = betterproto.string_field(1)
3362
+ body: str = betterproto.string_field(2)
3363
+
3364
+
3365
+ @dataclass(eq=False, repr=False)
3366
+ class FunctionSignatureImplementation(betterproto.Message):
3367
+ type: "FunctionSignatureImplementationType" = betterproto.enum_field(1)
3368
+ uri: str = betterproto.string_field(2)
3369
+
3370
+
3371
+ @dataclass(eq=False, repr=False)
3372
+ class FunctionSignatureArgument(betterproto.Message):
3373
+ name: str = betterproto.string_field(1)
3374
+ value: "FunctionSignatureArgumentValueArgument" = betterproto.message_field(
3375
+ 2, group="argument_kind"
3376
+ )
3377
+ type: "FunctionSignatureArgumentTypeArgument" = betterproto.message_field(
3378
+ 3, group="argument_kind"
3379
+ )
3380
+ enum: "FunctionSignatureArgumentEnumArgument" = betterproto.message_field(
3381
+ 4, group="argument_kind"
3382
+ )
3383
+
3384
+
3385
+ @dataclass(eq=False, repr=False)
3386
+ class FunctionSignatureArgumentValueArgument(betterproto.Message):
3387
+ type: "ParameterizedType" = betterproto.message_field(1)
3388
+ constant: bool = betterproto.bool_field(2)
3389
+
3390
+
3391
+ @dataclass(eq=False, repr=False)
3392
+ class FunctionSignatureArgumentTypeArgument(betterproto.Message):
3393
+ type: "ParameterizedType" = betterproto.message_field(1)
3394
+
3395
+
3396
+ @dataclass(eq=False, repr=False)
3397
+ class FunctionSignatureArgumentEnumArgument(betterproto.Message):
3398
+ options: List[str] = betterproto.string_field(1)
3399
+ optional: bool = betterproto.bool_field(2)