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.
Files changed (53) hide show
  1. mongo_aggro/__init__.py +400 -0
  2. mongo_aggro/accumulators.py +30 -12
  3. mongo_aggro/base.py +49 -9
  4. mongo_aggro/expressions/__init__.py +396 -0
  5. mongo_aggro/expressions/arithmetic.py +329 -0
  6. mongo_aggro/expressions/array.py +425 -0
  7. mongo_aggro/expressions/base.py +180 -0
  8. mongo_aggro/expressions/bitwise.py +84 -0
  9. mongo_aggro/expressions/comparison.py +161 -0
  10. mongo_aggro/expressions/conditional.py +117 -0
  11. mongo_aggro/expressions/date.py +665 -0
  12. mongo_aggro/expressions/encrypted.py +116 -0
  13. mongo_aggro/expressions/logical.py +72 -0
  14. mongo_aggro/expressions/object.py +122 -0
  15. mongo_aggro/expressions/set.py +150 -0
  16. mongo_aggro/expressions/size.py +48 -0
  17. mongo_aggro/expressions/string.py +365 -0
  18. mongo_aggro/expressions/trigonometry.py +283 -0
  19. mongo_aggro/expressions/type.py +205 -0
  20. mongo_aggro/expressions/variable.py +73 -0
  21. mongo_aggro/expressions/window.py +327 -0
  22. mongo_aggro/operators/__init__.py +65 -0
  23. mongo_aggro/operators/array.py +41 -0
  24. mongo_aggro/operators/base.py +15 -0
  25. mongo_aggro/operators/bitwise.py +81 -0
  26. mongo_aggro/operators/comparison.py +82 -0
  27. mongo_aggro/operators/element.py +32 -0
  28. mongo_aggro/operators/geo.py +171 -0
  29. mongo_aggro/operators/logical.py +111 -0
  30. mongo_aggro/operators/misc.py +102 -0
  31. mongo_aggro/operators/regex.py +25 -0
  32. mongo_aggro/stages/__init__.py +110 -0
  33. mongo_aggro/stages/array.py +69 -0
  34. mongo_aggro/stages/change.py +109 -0
  35. mongo_aggro/stages/core.py +170 -0
  36. mongo_aggro/stages/geo.py +93 -0
  37. mongo_aggro/stages/group.py +154 -0
  38. mongo_aggro/stages/join.py +221 -0
  39. mongo_aggro/stages/misc.py +45 -0
  40. mongo_aggro/stages/output.py +136 -0
  41. mongo_aggro/stages/search.py +315 -0
  42. mongo_aggro/stages/session.py +111 -0
  43. mongo_aggro/stages/stats.py +152 -0
  44. mongo_aggro/stages/transform.py +136 -0
  45. mongo_aggro/stages/window.py +139 -0
  46. mongo_aggro-0.2.2.dist-info/METADATA +193 -0
  47. mongo_aggro-0.2.2.dist-info/RECORD +49 -0
  48. {mongo_aggro-0.1.0.dist-info → mongo_aggro-0.2.2.dist-info}/WHEEL +1 -1
  49. mongo_aggro/operators.py +0 -247
  50. mongo_aggro/stages.py +0 -990
  51. mongo_aggro-0.1.0.dist-info/METADATA +0 -537
  52. mongo_aggro-0.1.0.dist-info/RECORD +0 -9
  53. {mongo_aggro-0.1.0.dist-info → mongo_aggro-0.2.2.dist-info}/licenses/LICENSE +0 -0
mongo_aggro/operators.py DELETED
@@ -1,247 +0,0 @@
1
- """Query and expression operators for MongoDB aggregation."""
2
-
3
- from typing import Any
4
-
5
- from pydantic import BaseModel, ConfigDict, Field
6
-
7
-
8
- class QueryOperator(BaseModel):
9
- """Base class for query operators used in $match and other stages."""
10
-
11
- model_config = ConfigDict(
12
- populate_by_name=True,
13
- extra="forbid",
14
- )
15
-
16
-
17
- class And(QueryOperator):
18
- """
19
- Logical AND operator for combining multiple conditions.
20
-
21
- Example:
22
- >>> And(conditions=[
23
- ... {"status": "active"},
24
- ... {"age": {"$gt": 18}}
25
- ... ]).model_dump()
26
- {"$and": [{"status": "active"}, {"age": {"$gt": 18}}]}
27
- """
28
-
29
- conditions: list[dict[str, Any]] = Field(
30
- ..., description="List of conditions to AND together"
31
- )
32
-
33
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
34
- return {"$and": self.conditions}
35
-
36
-
37
- class Or(QueryOperator):
38
- """
39
- Logical OR operator for combining multiple conditions.
40
-
41
- Example:
42
- >>> Or(conditions=[
43
- ... {"status": "active"},
44
- ... {"status": "pending"}
45
- ... ]).model_dump()
46
- {"$or": [{"status": "active"}, {"status": "pending"}]}
47
- """
48
-
49
- conditions: list[dict[str, Any]] = Field(
50
- ..., description="List of conditions to OR together"
51
- )
52
-
53
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
54
- return {"$or": self.conditions}
55
-
56
-
57
- class Not(QueryOperator):
58
- """
59
- Logical NOT operator for negating a condition.
60
-
61
- Example:
62
- >>> Not(condition={"$regex": "^test"}).model_dump()
63
- {"$not": {"$regex": "^test"}}
64
- """
65
-
66
- condition: dict[str, Any] = Field(..., description="Condition to negate")
67
-
68
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
69
- return {"$not": self.condition}
70
-
71
-
72
- class Nor(QueryOperator):
73
- """
74
- Logical NOR operator - matches documents that fail all conditions.
75
-
76
- Example:
77
- >>> Nor(conditions=[
78
- ... {"price": {"$gt": 1000}},
79
- ... {"rating": {"$lt": 3}}
80
- ... ]).model_dump()
81
- {"$nor": [{"price": {"$gt": 1000}}, {"rating": {"$lt": 3}}]}
82
- """
83
-
84
- conditions: list[dict[str, Any]] = Field(
85
- ..., description="List of conditions to NOR together"
86
- )
87
-
88
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
89
- return {"$nor": self.conditions}
90
-
91
-
92
- class Expr(QueryOperator):
93
- """
94
- $expr operator for using aggregation expressions in queries.
95
-
96
- Example:
97
- >>> Expr(expression={"$eq": ["$field1", "$field2"]}).model_dump()
98
- {"$expr": {"$eq": ["$field1", "$field2"]}}
99
- """
100
-
101
- expression: dict[str, Any] = Field(
102
- ..., description="Aggregation expression"
103
- )
104
-
105
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
106
- return {"$expr": self.expression}
107
-
108
-
109
- # Comparison operators
110
- class Eq(QueryOperator):
111
- """$eq comparison operator."""
112
-
113
- value: Any = Field(..., description="Value to compare")
114
-
115
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
116
- return {"$eq": self.value}
117
-
118
-
119
- class Ne(QueryOperator):
120
- """$ne (not equal) comparison operator."""
121
-
122
- value: Any = Field(..., description="Value to compare")
123
-
124
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
125
- return {"$ne": self.value}
126
-
127
-
128
- class Gt(QueryOperator):
129
- """$gt (greater than) comparison operator."""
130
-
131
- value: Any = Field(..., description="Value to compare")
132
-
133
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
134
- return {"$gt": self.value}
135
-
136
-
137
- class Gte(QueryOperator):
138
- """$gte (greater than or equal) comparison operator."""
139
-
140
- value: Any = Field(..., description="Value to compare")
141
-
142
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
143
- return {"$gte": self.value}
144
-
145
-
146
- class Lt(QueryOperator):
147
- """$lt (less than) comparison operator."""
148
-
149
- value: Any = Field(..., description="Value to compare")
150
-
151
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
152
- return {"$lt": self.value}
153
-
154
-
155
- class Lte(QueryOperator):
156
- """$lte (less than or equal) comparison operator."""
157
-
158
- value: Any = Field(..., description="Value to compare")
159
-
160
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
161
- return {"$lte": self.value}
162
-
163
-
164
- class In(QueryOperator):
165
- """$in operator - matches any value in the array."""
166
-
167
- values: list[Any] = Field(..., description="List of values to match")
168
-
169
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
170
- return {"$in": self.values}
171
-
172
-
173
- class Nin(QueryOperator):
174
- """$nin operator - matches none of the values in the array."""
175
-
176
- values: list[Any] = Field(..., description="List of values to exclude")
177
-
178
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
179
- return {"$nin": self.values}
180
-
181
-
182
- class Regex(QueryOperator):
183
- """$regex operator for pattern matching."""
184
-
185
- pattern: str = Field(..., description="Regular expression pattern")
186
- options: str | None = Field(
187
- default=None, description="Regex options (i, m, x, s)"
188
- )
189
-
190
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
191
- result: dict[str, Any] = {"$regex": self.pattern}
192
- if self.options:
193
- result["$options"] = self.options
194
- return result
195
-
196
-
197
- class Exists(QueryOperator):
198
- """$exists operator - matches documents where field exists/doesn't."""
199
-
200
- exists: bool = Field(
201
- default=True, description="True if field should exist"
202
- )
203
-
204
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
205
- return {"$exists": self.exists}
206
-
207
-
208
- class Type(QueryOperator):
209
- """$type operator - matches documents where field is of specified type."""
210
-
211
- bson_type: str | int | list[str | int] = Field(
212
- ..., description="BSON type(s) to match"
213
- )
214
-
215
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
216
- return {"$type": self.bson_type}
217
-
218
-
219
- class ElemMatch(QueryOperator):
220
- """$elemMatch operator - matches array elements."""
221
-
222
- conditions: dict[str, Any] = Field(
223
- ..., description="Conditions for array elements"
224
- )
225
-
226
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
227
- return {"$elemMatch": self.conditions}
228
-
229
-
230
- class Size(QueryOperator):
231
- """$size operator - matches arrays with specific length."""
232
-
233
- size: int = Field(..., description="Array size to match")
234
-
235
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
236
- return {"$size": self.size}
237
-
238
-
239
- class All(QueryOperator):
240
- """$all operator - matches arrays containing all specified elements."""
241
-
242
- values: list[Any] = Field(
243
- ..., description="Values that must all be present"
244
- )
245
-
246
- def model_dump(self, **kwargs: Any) -> dict[str, Any]:
247
- return {"$all": self.values}