mongo-aggro 0.1.0__py3-none-any.whl → 0.2.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mongo_aggro/__init__.py +400 -0
- mongo_aggro/accumulators.py +30 -12
- mongo_aggro/base.py +49 -9
- mongo_aggro/expressions/__init__.py +396 -0
- mongo_aggro/expressions/arithmetic.py +329 -0
- mongo_aggro/expressions/array.py +425 -0
- mongo_aggro/expressions/base.py +180 -0
- mongo_aggro/expressions/bitwise.py +84 -0
- mongo_aggro/expressions/comparison.py +161 -0
- mongo_aggro/expressions/conditional.py +117 -0
- mongo_aggro/expressions/date.py +665 -0
- mongo_aggro/expressions/encrypted.py +116 -0
- mongo_aggro/expressions/logical.py +72 -0
- mongo_aggro/expressions/object.py +122 -0
- mongo_aggro/expressions/set.py +150 -0
- mongo_aggro/expressions/size.py +48 -0
- mongo_aggro/expressions/string.py +365 -0
- mongo_aggro/expressions/trigonometry.py +283 -0
- mongo_aggro/expressions/type.py +205 -0
- mongo_aggro/expressions/variable.py +73 -0
- mongo_aggro/expressions/window.py +327 -0
- mongo_aggro/operators/__init__.py +65 -0
- mongo_aggro/operators/array.py +41 -0
- mongo_aggro/operators/base.py +15 -0
- mongo_aggro/operators/bitwise.py +81 -0
- mongo_aggro/operators/comparison.py +82 -0
- mongo_aggro/operators/element.py +32 -0
- mongo_aggro/operators/geo.py +171 -0
- mongo_aggro/operators/logical.py +111 -0
- mongo_aggro/operators/misc.py +102 -0
- mongo_aggro/operators/regex.py +25 -0
- mongo_aggro/stages/__init__.py +110 -0
- mongo_aggro/stages/array.py +69 -0
- mongo_aggro/stages/change.py +109 -0
- mongo_aggro/stages/core.py +170 -0
- mongo_aggro/stages/geo.py +93 -0
- mongo_aggro/stages/group.py +154 -0
- mongo_aggro/stages/join.py +221 -0
- mongo_aggro/stages/misc.py +45 -0
- mongo_aggro/stages/output.py +136 -0
- mongo_aggro/stages/search.py +315 -0
- mongo_aggro/stages/session.py +111 -0
- mongo_aggro/stages/stats.py +152 -0
- mongo_aggro/stages/transform.py +136 -0
- mongo_aggro/stages/window.py +139 -0
- mongo_aggro-0.2.2.dist-info/METADATA +193 -0
- mongo_aggro-0.2.2.dist-info/RECORD +49 -0
- {mongo_aggro-0.1.0.dist-info → mongo_aggro-0.2.2.dist-info}/WHEEL +1 -1
- mongo_aggro/operators.py +0 -247
- mongo_aggro/stages.py +0 -990
- mongo_aggro-0.1.0.dist-info/METADATA +0 -537
- mongo_aggro-0.1.0.dist-info/RECORD +0 -9
- {mongo_aggro-0.1.0.dist-info → mongo_aggro-0.2.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
"""MongoDB expression operators for aggregation pipelines.
|
|
2
|
+
|
|
3
|
+
This package provides expression operators organized by category:
|
|
4
|
+
- arithmetic: Math operators ($add, $subtract, $multiply, etc.)
|
|
5
|
+
- array: Array manipulation ($size, $slice, $filter, $map, etc.)
|
|
6
|
+
- bitwise: Bitwise operations ($bitAnd, $bitOr, $bitXor, $bitNot)
|
|
7
|
+
- comparison: Comparisons ($eq, $ne, $gt, $gte, $lt, $lte, $cmp)
|
|
8
|
+
- conditional: Conditionals ($cond, $ifNull, $switch)
|
|
9
|
+
- date: Date operations ($dateAdd, $year, $month, etc.)
|
|
10
|
+
- encrypted: Encrypted string operations
|
|
11
|
+
- logical: Boolean logic ($and, $or, $not)
|
|
12
|
+
- object: Object manipulation ($mergeObjects, $getField, etc.)
|
|
13
|
+
- set: Set operations ($setUnion, $setIntersection, etc.)
|
|
14
|
+
- size: Data size ($bsonSize, $binarySize)
|
|
15
|
+
- string: String operations ($concat, $split, $toLower, etc.)
|
|
16
|
+
- trigonometry: Trig functions ($sin, $cos, $tan, etc.)
|
|
17
|
+
- type: Type conversion ($toString, $toInt, $type, etc.)
|
|
18
|
+
- variable: Variables ($let, $literal, $rand)
|
|
19
|
+
- window: Window functions ($rank, $shift, etc.)
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
# Base classes
|
|
23
|
+
# Arithmetic operators
|
|
24
|
+
from mongo_aggro.expressions.arithmetic import (
|
|
25
|
+
AbsExpr,
|
|
26
|
+
AddExpr,
|
|
27
|
+
CeilExpr,
|
|
28
|
+
DivideExpr,
|
|
29
|
+
ExpExpr,
|
|
30
|
+
FloorExpr,
|
|
31
|
+
LnExpr,
|
|
32
|
+
Log10Expr,
|
|
33
|
+
LogExpr,
|
|
34
|
+
ModExpr,
|
|
35
|
+
MultiplyExpr,
|
|
36
|
+
PowExpr,
|
|
37
|
+
RoundExpr,
|
|
38
|
+
SqrtExpr,
|
|
39
|
+
SubtractExpr,
|
|
40
|
+
TruncExpr,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Array operators
|
|
44
|
+
from mongo_aggro.expressions.array import (
|
|
45
|
+
ArrayElemAtExpr,
|
|
46
|
+
ArraySizeExpr,
|
|
47
|
+
ConcatArraysExpr,
|
|
48
|
+
FilterExpr,
|
|
49
|
+
FirstNExpr,
|
|
50
|
+
InArrayExpr,
|
|
51
|
+
IndexOfArrayExpr,
|
|
52
|
+
IsArrayExpr,
|
|
53
|
+
LastNExpr,
|
|
54
|
+
MapExpr,
|
|
55
|
+
MaxNExpr,
|
|
56
|
+
MinNExpr,
|
|
57
|
+
RangeExpr,
|
|
58
|
+
ReduceExpr,
|
|
59
|
+
ReverseArrayExpr,
|
|
60
|
+
SliceExpr,
|
|
61
|
+
SortArrayExpr,
|
|
62
|
+
)
|
|
63
|
+
from mongo_aggro.expressions.base import ExpressionBase, F, Field
|
|
64
|
+
|
|
65
|
+
# Bitwise operators
|
|
66
|
+
from mongo_aggro.expressions.bitwise import (
|
|
67
|
+
BitAndExpr,
|
|
68
|
+
BitNotExpr,
|
|
69
|
+
BitOrExpr,
|
|
70
|
+
BitXorExpr,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# Comparison operators
|
|
74
|
+
from mongo_aggro.expressions.comparison import (
|
|
75
|
+
CmpExpr,
|
|
76
|
+
EqExpr,
|
|
77
|
+
GteExpr,
|
|
78
|
+
GtExpr,
|
|
79
|
+
LteExpr,
|
|
80
|
+
LtExpr,
|
|
81
|
+
NeExpr,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Conditional operators
|
|
85
|
+
from mongo_aggro.expressions.conditional import (
|
|
86
|
+
CondExpr,
|
|
87
|
+
IfNullExpr,
|
|
88
|
+
SwitchBranch,
|
|
89
|
+
SwitchExpr,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Date operators
|
|
93
|
+
from mongo_aggro.expressions.date import (
|
|
94
|
+
DateAddExpr,
|
|
95
|
+
DateDiffExpr,
|
|
96
|
+
DateFromPartsExpr,
|
|
97
|
+
DateFromStringExpr,
|
|
98
|
+
DateSubtractExpr,
|
|
99
|
+
DateToPartsExpr,
|
|
100
|
+
DateToStringExpr,
|
|
101
|
+
DateTruncExpr,
|
|
102
|
+
DayOfMonthExpr,
|
|
103
|
+
DayOfWeekExpr,
|
|
104
|
+
DayOfYearExpr,
|
|
105
|
+
HourExpr,
|
|
106
|
+
IsoDayOfWeekExpr,
|
|
107
|
+
IsoWeekExpr,
|
|
108
|
+
IsoWeekYearExpr,
|
|
109
|
+
MillisecondExpr,
|
|
110
|
+
MinuteExpr,
|
|
111
|
+
MonthExpr,
|
|
112
|
+
SecondExpr,
|
|
113
|
+
ToDateExpr,
|
|
114
|
+
WeekExpr,
|
|
115
|
+
YearExpr,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# Encrypted string operators
|
|
119
|
+
from mongo_aggro.expressions.encrypted import (
|
|
120
|
+
EncStrContainsExpr,
|
|
121
|
+
EncStrEndsWithExpr,
|
|
122
|
+
EncStrNormalizedEqExpr,
|
|
123
|
+
EncStrStartsWithExpr,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# Logical operators
|
|
127
|
+
from mongo_aggro.expressions.logical import AndExpr, NotExpr, OrExpr
|
|
128
|
+
|
|
129
|
+
# Object operators
|
|
130
|
+
from mongo_aggro.expressions.object import (
|
|
131
|
+
ArrayToObjectExpr,
|
|
132
|
+
GetFieldExpr,
|
|
133
|
+
MergeObjectsExpr,
|
|
134
|
+
ObjectToArrayExpr,
|
|
135
|
+
SetFieldExpr,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
# Set operators
|
|
139
|
+
from mongo_aggro.expressions.set import (
|
|
140
|
+
AllElementsTrueExpr,
|
|
141
|
+
AnyElementTrueExpr,
|
|
142
|
+
SetDifferenceExpr,
|
|
143
|
+
SetEqualsExpr,
|
|
144
|
+
SetIntersectionExpr,
|
|
145
|
+
SetIsSubsetExpr,
|
|
146
|
+
SetUnionExpr,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
# Size operators
|
|
150
|
+
from mongo_aggro.expressions.size import BinarySizeExpr, BsonSizeExpr
|
|
151
|
+
|
|
152
|
+
# String operators
|
|
153
|
+
from mongo_aggro.expressions.string import (
|
|
154
|
+
ConcatExpr,
|
|
155
|
+
LTrimExpr,
|
|
156
|
+
RegexFindAllExpr,
|
|
157
|
+
RegexFindExpr,
|
|
158
|
+
RegexMatchExpr,
|
|
159
|
+
ReplaceAllExpr,
|
|
160
|
+
ReplaceOneExpr,
|
|
161
|
+
RTrimExpr,
|
|
162
|
+
SplitExpr,
|
|
163
|
+
StrCaseCmpExpr,
|
|
164
|
+
StrLenCPExpr,
|
|
165
|
+
SubstrCPExpr,
|
|
166
|
+
ToLowerExpr,
|
|
167
|
+
ToUpperExpr,
|
|
168
|
+
TrimExpr,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
# Trigonometry operators
|
|
172
|
+
from mongo_aggro.expressions.trigonometry import (
|
|
173
|
+
AcosExpr,
|
|
174
|
+
AcoshExpr,
|
|
175
|
+
AsinExpr,
|
|
176
|
+
AsinhExpr,
|
|
177
|
+
Atan2Expr,
|
|
178
|
+
AtanExpr,
|
|
179
|
+
AtanhExpr,
|
|
180
|
+
CosExpr,
|
|
181
|
+
CoshExpr,
|
|
182
|
+
DegreesToRadiansExpr,
|
|
183
|
+
RadiansToDegreesExpr,
|
|
184
|
+
SinExpr,
|
|
185
|
+
SinhExpr,
|
|
186
|
+
TanExpr,
|
|
187
|
+
TanhExpr,
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
# Type operators
|
|
191
|
+
from mongo_aggro.expressions.type import (
|
|
192
|
+
ConvertExpr,
|
|
193
|
+
IsNumberExpr,
|
|
194
|
+
ToBoolExpr,
|
|
195
|
+
ToDecimalExpr,
|
|
196
|
+
ToDoubleExpr,
|
|
197
|
+
ToIntExpr,
|
|
198
|
+
ToLongExpr,
|
|
199
|
+
ToObjectIdExpr,
|
|
200
|
+
ToStringExpr,
|
|
201
|
+
TypeExpr,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
# Variable operators
|
|
205
|
+
from mongo_aggro.expressions.variable import LetExpr, LiteralExpr, RandExpr
|
|
206
|
+
|
|
207
|
+
# Window operators
|
|
208
|
+
from mongo_aggro.expressions.window import (
|
|
209
|
+
BottomExpr,
|
|
210
|
+
BottomNWindowExpr,
|
|
211
|
+
CovariancePopExpr,
|
|
212
|
+
CovarianceSampExpr,
|
|
213
|
+
DenseRankExpr,
|
|
214
|
+
DerivativeExpr,
|
|
215
|
+
DocumentNumberExpr,
|
|
216
|
+
ExpMovingAvgExpr,
|
|
217
|
+
IntegralExpr,
|
|
218
|
+
LinearFillExpr,
|
|
219
|
+
LocfExpr,
|
|
220
|
+
RankExpr,
|
|
221
|
+
ShiftExpr,
|
|
222
|
+
TopExpr,
|
|
223
|
+
TopNWindowExpr,
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
__all__ = [
|
|
227
|
+
# Base
|
|
228
|
+
"Field",
|
|
229
|
+
"F",
|
|
230
|
+
"ExpressionBase",
|
|
231
|
+
# Comparison
|
|
232
|
+
"EqExpr",
|
|
233
|
+
"NeExpr",
|
|
234
|
+
"GtExpr",
|
|
235
|
+
"GteExpr",
|
|
236
|
+
"LtExpr",
|
|
237
|
+
"LteExpr",
|
|
238
|
+
"CmpExpr",
|
|
239
|
+
# Logical
|
|
240
|
+
"AndExpr",
|
|
241
|
+
"OrExpr",
|
|
242
|
+
"NotExpr",
|
|
243
|
+
# Arithmetic
|
|
244
|
+
"AddExpr",
|
|
245
|
+
"SubtractExpr",
|
|
246
|
+
"MultiplyExpr",
|
|
247
|
+
"DivideExpr",
|
|
248
|
+
"AbsExpr",
|
|
249
|
+
"ModExpr",
|
|
250
|
+
"CeilExpr",
|
|
251
|
+
"FloorExpr",
|
|
252
|
+
"RoundExpr",
|
|
253
|
+
"TruncExpr",
|
|
254
|
+
"SqrtExpr",
|
|
255
|
+
"PowExpr",
|
|
256
|
+
"ExpExpr",
|
|
257
|
+
"LnExpr",
|
|
258
|
+
"Log10Expr",
|
|
259
|
+
"LogExpr",
|
|
260
|
+
# Conditional
|
|
261
|
+
"CondExpr",
|
|
262
|
+
"IfNullExpr",
|
|
263
|
+
"SwitchBranch",
|
|
264
|
+
"SwitchExpr",
|
|
265
|
+
# String
|
|
266
|
+
"ConcatExpr",
|
|
267
|
+
"SplitExpr",
|
|
268
|
+
"ToLowerExpr",
|
|
269
|
+
"ToUpperExpr",
|
|
270
|
+
"TrimExpr",
|
|
271
|
+
"LTrimExpr",
|
|
272
|
+
"RTrimExpr",
|
|
273
|
+
"ReplaceOneExpr",
|
|
274
|
+
"ReplaceAllExpr",
|
|
275
|
+
"RegexMatchExpr",
|
|
276
|
+
"RegexFindExpr",
|
|
277
|
+
"RegexFindAllExpr",
|
|
278
|
+
"SubstrCPExpr",
|
|
279
|
+
"StrLenCPExpr",
|
|
280
|
+
"StrCaseCmpExpr",
|
|
281
|
+
# Array
|
|
282
|
+
"ArraySizeExpr",
|
|
283
|
+
"SliceExpr",
|
|
284
|
+
"FilterExpr",
|
|
285
|
+
"MapExpr",
|
|
286
|
+
"ReduceExpr",
|
|
287
|
+
"ArrayElemAtExpr",
|
|
288
|
+
"ConcatArraysExpr",
|
|
289
|
+
"InArrayExpr",
|
|
290
|
+
"IndexOfArrayExpr",
|
|
291
|
+
"IsArrayExpr",
|
|
292
|
+
"ReverseArrayExpr",
|
|
293
|
+
"SortArrayExpr",
|
|
294
|
+
"RangeExpr",
|
|
295
|
+
"FirstNExpr",
|
|
296
|
+
"LastNExpr",
|
|
297
|
+
"MaxNExpr",
|
|
298
|
+
"MinNExpr",
|
|
299
|
+
# Date
|
|
300
|
+
"DateAddExpr",
|
|
301
|
+
"DateSubtractExpr",
|
|
302
|
+
"DateDiffExpr",
|
|
303
|
+
"DateToStringExpr",
|
|
304
|
+
"DateFromStringExpr",
|
|
305
|
+
"ToDateExpr",
|
|
306
|
+
"YearExpr",
|
|
307
|
+
"MonthExpr",
|
|
308
|
+
"DayOfMonthExpr",
|
|
309
|
+
"DayOfWeekExpr",
|
|
310
|
+
"DayOfYearExpr",
|
|
311
|
+
"HourExpr",
|
|
312
|
+
"MinuteExpr",
|
|
313
|
+
"SecondExpr",
|
|
314
|
+
"MillisecondExpr",
|
|
315
|
+
"WeekExpr",
|
|
316
|
+
"IsoWeekExpr",
|
|
317
|
+
"IsoWeekYearExpr",
|
|
318
|
+
"IsoDayOfWeekExpr",
|
|
319
|
+
"DateFromPartsExpr",
|
|
320
|
+
"DateToPartsExpr",
|
|
321
|
+
"DateTruncExpr",
|
|
322
|
+
# Type
|
|
323
|
+
"ToStringExpr",
|
|
324
|
+
"ToIntExpr",
|
|
325
|
+
"ToDoubleExpr",
|
|
326
|
+
"ToBoolExpr",
|
|
327
|
+
"ToObjectIdExpr",
|
|
328
|
+
"ToLongExpr",
|
|
329
|
+
"ToDecimalExpr",
|
|
330
|
+
"ConvertExpr",
|
|
331
|
+
"TypeExpr",
|
|
332
|
+
"IsNumberExpr",
|
|
333
|
+
# Set
|
|
334
|
+
"SetUnionExpr",
|
|
335
|
+
"SetIntersectionExpr",
|
|
336
|
+
"SetDifferenceExpr",
|
|
337
|
+
"SetEqualsExpr",
|
|
338
|
+
"SetIsSubsetExpr",
|
|
339
|
+
"AnyElementTrueExpr",
|
|
340
|
+
"AllElementsTrueExpr",
|
|
341
|
+
# Object
|
|
342
|
+
"MergeObjectsExpr",
|
|
343
|
+
"ObjectToArrayExpr",
|
|
344
|
+
"ArrayToObjectExpr",
|
|
345
|
+
"GetFieldExpr",
|
|
346
|
+
"SetFieldExpr",
|
|
347
|
+
# Variable
|
|
348
|
+
"LetExpr",
|
|
349
|
+
"LiteralExpr",
|
|
350
|
+
"RandExpr",
|
|
351
|
+
# Trigonometry
|
|
352
|
+
"SinExpr",
|
|
353
|
+
"CosExpr",
|
|
354
|
+
"TanExpr",
|
|
355
|
+
"AsinExpr",
|
|
356
|
+
"AcosExpr",
|
|
357
|
+
"AtanExpr",
|
|
358
|
+
"Atan2Expr",
|
|
359
|
+
"SinhExpr",
|
|
360
|
+
"CoshExpr",
|
|
361
|
+
"TanhExpr",
|
|
362
|
+
"AsinhExpr",
|
|
363
|
+
"AcoshExpr",
|
|
364
|
+
"AtanhExpr",
|
|
365
|
+
"DegreesToRadiansExpr",
|
|
366
|
+
"RadiansToDegreesExpr",
|
|
367
|
+
# Bitwise
|
|
368
|
+
"BitAndExpr",
|
|
369
|
+
"BitOrExpr",
|
|
370
|
+
"BitXorExpr",
|
|
371
|
+
"BitNotExpr",
|
|
372
|
+
# Size
|
|
373
|
+
"BsonSizeExpr",
|
|
374
|
+
"BinarySizeExpr",
|
|
375
|
+
# Window
|
|
376
|
+
"RankExpr",
|
|
377
|
+
"DenseRankExpr",
|
|
378
|
+
"DocumentNumberExpr",
|
|
379
|
+
"ShiftExpr",
|
|
380
|
+
"ExpMovingAvgExpr",
|
|
381
|
+
"DerivativeExpr",
|
|
382
|
+
"IntegralExpr",
|
|
383
|
+
"CovariancePopExpr",
|
|
384
|
+
"CovarianceSampExpr",
|
|
385
|
+
"LinearFillExpr",
|
|
386
|
+
"LocfExpr",
|
|
387
|
+
"TopExpr",
|
|
388
|
+
"BottomExpr",
|
|
389
|
+
"TopNWindowExpr",
|
|
390
|
+
"BottomNWindowExpr",
|
|
391
|
+
# Encrypted
|
|
392
|
+
"EncStrContainsExpr",
|
|
393
|
+
"EncStrStartsWithExpr",
|
|
394
|
+
"EncStrEndsWithExpr",
|
|
395
|
+
"EncStrNormalizedEqExpr",
|
|
396
|
+
]
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
"""Arithmetic expression operators for MongoDB aggregation."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from pydantic import model_serializer
|
|
6
|
+
|
|
7
|
+
from mongo_aggro.base import serialize_value
|
|
8
|
+
from mongo_aggro.expressions.base import ExpressionBase
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class AddExpr(ExpressionBase):
|
|
12
|
+
"""
|
|
13
|
+
$add expression operator - adds numbers or dates.
|
|
14
|
+
|
|
15
|
+
Example:
|
|
16
|
+
>>> AddExpr(operands=[F("price"), F("tax")]).model_dump()
|
|
17
|
+
{"$add": ["$price", "$tax"]}
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
operands: list[Any]
|
|
21
|
+
|
|
22
|
+
@model_serializer
|
|
23
|
+
def serialize(self) -> dict[str, Any]:
|
|
24
|
+
"""Serialize to MongoDB $add expression."""
|
|
25
|
+
return {"$add": [serialize_value(o) for o in self.operands]}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class SubtractExpr(ExpressionBase):
|
|
29
|
+
"""
|
|
30
|
+
$subtract expression operator - subtracts two numbers or dates.
|
|
31
|
+
|
|
32
|
+
Example:
|
|
33
|
+
>>> SubtractExpr(left=F("total"), right=F("discount")).model_dump()
|
|
34
|
+
{"$subtract": ["$total", "$discount"]}
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
left: Any
|
|
38
|
+
right: Any
|
|
39
|
+
|
|
40
|
+
@model_serializer
|
|
41
|
+
def serialize(self) -> dict[str, Any]:
|
|
42
|
+
"""Serialize to MongoDB $subtract expression."""
|
|
43
|
+
return {
|
|
44
|
+
"$subtract": [
|
|
45
|
+
serialize_value(self.left),
|
|
46
|
+
serialize_value(self.right),
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class MultiplyExpr(ExpressionBase):
|
|
52
|
+
"""
|
|
53
|
+
$multiply expression operator - multiplies numbers.
|
|
54
|
+
|
|
55
|
+
Example:
|
|
56
|
+
>>> MultiplyExpr(operands=[F("price"), F("qty")]).model_dump()
|
|
57
|
+
{"$multiply": ["$price", "$qty"]}
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
operands: list[Any]
|
|
61
|
+
|
|
62
|
+
@model_serializer
|
|
63
|
+
def serialize(self) -> dict[str, Any]:
|
|
64
|
+
"""Serialize to MongoDB $multiply expression."""
|
|
65
|
+
return {"$multiply": [serialize_value(o) for o in self.operands]}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class DivideExpr(ExpressionBase):
|
|
69
|
+
"""
|
|
70
|
+
$divide expression operator - divides two numbers.
|
|
71
|
+
|
|
72
|
+
Example:
|
|
73
|
+
>>> DivideExpr(dividend=F("total"), divisor=F("count")).model_dump()
|
|
74
|
+
{"$divide": ["$total", "$count"]}
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
dividend: Any
|
|
78
|
+
divisor: Any
|
|
79
|
+
|
|
80
|
+
@model_serializer
|
|
81
|
+
def serialize(self) -> dict[str, Any]:
|
|
82
|
+
"""Serialize to MongoDB $divide expression."""
|
|
83
|
+
return {
|
|
84
|
+
"$divide": [
|
|
85
|
+
serialize_value(self.dividend),
|
|
86
|
+
serialize_value(self.divisor),
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class AbsExpr(ExpressionBase):
|
|
92
|
+
"""
|
|
93
|
+
$abs expression operator - returns absolute value.
|
|
94
|
+
|
|
95
|
+
Example:
|
|
96
|
+
>>> AbsExpr(value=F("balance")).model_dump()
|
|
97
|
+
{"$abs": "$balance"}
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
value: Any
|
|
101
|
+
|
|
102
|
+
@model_serializer
|
|
103
|
+
def serialize(self) -> dict[str, Any]:
|
|
104
|
+
"""Serialize to MongoDB $abs expression."""
|
|
105
|
+
return {"$abs": serialize_value(self.value)}
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class ModExpr(ExpressionBase):
|
|
109
|
+
"""
|
|
110
|
+
$mod expression operator - returns remainder of division.
|
|
111
|
+
|
|
112
|
+
Example:
|
|
113
|
+
>>> ModExpr(dividend=F("num"), divisor=2).model_dump()
|
|
114
|
+
{"$mod": ["$num", 2]}
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
dividend: Any
|
|
118
|
+
divisor: Any
|
|
119
|
+
|
|
120
|
+
@model_serializer
|
|
121
|
+
def serialize(self) -> dict[str, Any]:
|
|
122
|
+
"""Serialize to MongoDB $mod expression."""
|
|
123
|
+
return {
|
|
124
|
+
"$mod": [
|
|
125
|
+
serialize_value(self.dividend),
|
|
126
|
+
serialize_value(self.divisor),
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class CeilExpr(ExpressionBase):
|
|
132
|
+
"""
|
|
133
|
+
$ceil expression operator - rounds up to nearest integer.
|
|
134
|
+
|
|
135
|
+
Example:
|
|
136
|
+
>>> CeilExpr(input=F("value")).model_dump()
|
|
137
|
+
{"$ceil": "$value"}
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
input: Any
|
|
141
|
+
|
|
142
|
+
@model_serializer
|
|
143
|
+
def serialize(self) -> dict[str, Any]:
|
|
144
|
+
"""Serialize to MongoDB $ceil expression."""
|
|
145
|
+
return {"$ceil": serialize_value(self.input)}
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class FloorExpr(ExpressionBase):
|
|
149
|
+
"""
|
|
150
|
+
$floor expression operator - rounds down to nearest integer.
|
|
151
|
+
|
|
152
|
+
Example:
|
|
153
|
+
>>> FloorExpr(input=F("value")).model_dump()
|
|
154
|
+
{"$floor": "$value"}
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
input: Any
|
|
158
|
+
|
|
159
|
+
@model_serializer
|
|
160
|
+
def serialize(self) -> dict[str, Any]:
|
|
161
|
+
"""Serialize to MongoDB $floor expression."""
|
|
162
|
+
return {"$floor": serialize_value(self.input)}
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class RoundExpr(ExpressionBase):
|
|
166
|
+
"""
|
|
167
|
+
$round expression operator - rounds to specified decimal place.
|
|
168
|
+
|
|
169
|
+
Example:
|
|
170
|
+
>>> RoundExpr(input=F("value"), place=2).model_dump()
|
|
171
|
+
{"$round": ["$value", 2]}
|
|
172
|
+
"""
|
|
173
|
+
|
|
174
|
+
input: Any
|
|
175
|
+
place: int = 0
|
|
176
|
+
|
|
177
|
+
@model_serializer
|
|
178
|
+
def serialize(self) -> dict[str, Any]:
|
|
179
|
+
"""Serialize to MongoDB $round expression."""
|
|
180
|
+
return {"$round": [serialize_value(self.input), self.place]}
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
class TruncExpr(ExpressionBase):
|
|
184
|
+
"""
|
|
185
|
+
$trunc expression operator - truncates to specified decimal place.
|
|
186
|
+
|
|
187
|
+
Example:
|
|
188
|
+
>>> TruncExpr(input=F("value"), place=2).model_dump()
|
|
189
|
+
{"$trunc": ["$value", 2]}
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
input: Any
|
|
193
|
+
place: int = 0
|
|
194
|
+
|
|
195
|
+
@model_serializer
|
|
196
|
+
def serialize(self) -> dict[str, Any]:
|
|
197
|
+
"""Serialize to MongoDB $trunc expression."""
|
|
198
|
+
return {"$trunc": [serialize_value(self.input), self.place]}
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class SqrtExpr(ExpressionBase):
|
|
202
|
+
"""
|
|
203
|
+
$sqrt expression operator - calculates square root.
|
|
204
|
+
|
|
205
|
+
Example:
|
|
206
|
+
>>> SqrtExpr(input=F("value")).model_dump()
|
|
207
|
+
{"$sqrt": "$value"}
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
input: Any
|
|
211
|
+
|
|
212
|
+
@model_serializer
|
|
213
|
+
def serialize(self) -> dict[str, Any]:
|
|
214
|
+
"""Serialize to MongoDB $sqrt expression."""
|
|
215
|
+
return {"$sqrt": serialize_value(self.input)}
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
class PowExpr(ExpressionBase):
|
|
219
|
+
"""
|
|
220
|
+
$pow expression operator - raises number to exponent.
|
|
221
|
+
|
|
222
|
+
Example:
|
|
223
|
+
>>> PowExpr(base=F("value"), exponent=2).model_dump()
|
|
224
|
+
{"$pow": ["$value", 2]}
|
|
225
|
+
"""
|
|
226
|
+
|
|
227
|
+
base: Any
|
|
228
|
+
exponent: Any
|
|
229
|
+
|
|
230
|
+
@model_serializer
|
|
231
|
+
def serialize(self) -> dict[str, Any]:
|
|
232
|
+
"""Serialize to MongoDB $pow expression."""
|
|
233
|
+
return {
|
|
234
|
+
"$pow": [
|
|
235
|
+
serialize_value(self.base),
|
|
236
|
+
serialize_value(self.exponent),
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
class ExpExpr(ExpressionBase):
|
|
242
|
+
"""
|
|
243
|
+
$exp expression operator - raises e to the specified exponent.
|
|
244
|
+
|
|
245
|
+
Example:
|
|
246
|
+
>>> ExpExpr(input=F("value")).model_dump()
|
|
247
|
+
{"$exp": "$value"}
|
|
248
|
+
"""
|
|
249
|
+
|
|
250
|
+
input: Any
|
|
251
|
+
|
|
252
|
+
@model_serializer
|
|
253
|
+
def serialize(self) -> dict[str, Any]:
|
|
254
|
+
"""Serialize to MongoDB $exp expression."""
|
|
255
|
+
return {"$exp": serialize_value(self.input)}
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
class LnExpr(ExpressionBase):
|
|
259
|
+
"""
|
|
260
|
+
$ln expression operator - calculates natural logarithm.
|
|
261
|
+
|
|
262
|
+
Example:
|
|
263
|
+
>>> LnExpr(input=F("value")).model_dump()
|
|
264
|
+
{"$ln": "$value"}
|
|
265
|
+
"""
|
|
266
|
+
|
|
267
|
+
input: Any
|
|
268
|
+
|
|
269
|
+
@model_serializer
|
|
270
|
+
def serialize(self) -> dict[str, Any]:
|
|
271
|
+
"""Serialize to MongoDB $ln expression."""
|
|
272
|
+
return {"$ln": serialize_value(self.input)}
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
class Log10Expr(ExpressionBase):
|
|
276
|
+
"""
|
|
277
|
+
$log10 expression operator - calculates log base 10.
|
|
278
|
+
|
|
279
|
+
Example:
|
|
280
|
+
>>> Log10Expr(input=F("value")).model_dump()
|
|
281
|
+
{"$log10": "$value"}
|
|
282
|
+
"""
|
|
283
|
+
|
|
284
|
+
input: Any
|
|
285
|
+
|
|
286
|
+
@model_serializer
|
|
287
|
+
def serialize(self) -> dict[str, Any]:
|
|
288
|
+
"""Serialize to MongoDB $log10 expression."""
|
|
289
|
+
return {"$log10": serialize_value(self.input)}
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
class LogExpr(ExpressionBase):
|
|
293
|
+
"""
|
|
294
|
+
$log expression operator - calculates log with specified base.
|
|
295
|
+
|
|
296
|
+
Example:
|
|
297
|
+
>>> LogExpr(input=F("value"), base=2).model_dump()
|
|
298
|
+
{"$log": ["$value", 2]}
|
|
299
|
+
"""
|
|
300
|
+
|
|
301
|
+
input: Any
|
|
302
|
+
base: Any
|
|
303
|
+
|
|
304
|
+
@model_serializer
|
|
305
|
+
def serialize(self) -> dict[str, Any]:
|
|
306
|
+
"""Serialize to MongoDB $log expression."""
|
|
307
|
+
return {
|
|
308
|
+
"$log": [serialize_value(self.input), serialize_value(self.base)]
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
__all__ = [
|
|
313
|
+
"AddExpr",
|
|
314
|
+
"SubtractExpr",
|
|
315
|
+
"MultiplyExpr",
|
|
316
|
+
"DivideExpr",
|
|
317
|
+
"AbsExpr",
|
|
318
|
+
"ModExpr",
|
|
319
|
+
"CeilExpr",
|
|
320
|
+
"FloorExpr",
|
|
321
|
+
"RoundExpr",
|
|
322
|
+
"TruncExpr",
|
|
323
|
+
"SqrtExpr",
|
|
324
|
+
"PowExpr",
|
|
325
|
+
"ExpExpr",
|
|
326
|
+
"LnExpr",
|
|
327
|
+
"Log10Expr",
|
|
328
|
+
"LogExpr",
|
|
329
|
+
]
|