pyoq-sql 1.0.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.
- pyoq/__init__.py +10 -0
- pyoq/__main__.py +5 -0
- pyoq/_native.pyi +5 -0
- pyoq/cli/__init__.py +5 -0
- pyoq/cli/commands.py +270 -0
- pyoq/cli/defaults.py +98 -0
- pyoq/cli/services.py +97 -0
- pyoq/config/__init__.py +31 -0
- pyoq/config/connection.py +161 -0
- pyoq/config/loader.py +289 -0
- pyoq/config/models.py +245 -0
- pyoq/config/values.py +142 -0
- pyoq/descriptors.py +165 -0
- pyoq/diagnostics/__init__.py +68 -0
- pyoq/diagnostics/budget.py +136 -0
- pyoq/diagnostics/events.py +137 -0
- pyoq/diagnostics/fingerprint.py +267 -0
- pyoq/diagnostics/instrumented.py +237 -0
- pyoq/diagnostics/metrics.py +61 -0
- pyoq/diagnostics/observation.py +227 -0
- pyoq/diagnostics/scoped.py +103 -0
- pyoq/django/__init__.py +15 -0
- pyoq/django/apps.py +17 -0
- pyoq/django/execution.py +317 -0
- pyoq/django/generation.py +59 -0
- pyoq/django/management/__init__.py +0 -0
- pyoq/django/management/commands/__init__.py +0 -0
- pyoq/django/management/commands/makemigrations.py +53 -0
- pyoq/django/management/commands/pyoq_codegen.py +75 -0
- pyoq/django/parameters.py +101 -0
- pyoq/django/schema.py +379 -0
- pyoq/django/settings.py +87 -0
- pyoq/django/timeouts.py +105 -0
- pyoq/dsl/__init__.py +64 -0
- pyoq/dsl/aio/__init__.py +31 -0
- pyoq/dsl/aio/context.py +295 -0
- pyoq/dsl/aio/queries.py +335 -0
- pyoq/dsl/aio/writes.py +368 -0
- pyoq/dsl/context.py +326 -0
- pyoq/dsl/entry.py +37 -0
- pyoq/dsl/labels.py +36 -0
- pyoq/dsl/queries.py +339 -0
- pyoq/dsl/result.py +164 -0
- pyoq/dsl/writes.py +360 -0
- pyoq/errors.py +317 -0
- pyoq/fastapi/__init__.py +32 -0
- pyoq/fastapi/dependencies.py +167 -0
- pyoq/fastapi/lifespan.py +119 -0
- pyoq/fetching/__init__.py +55 -0
- pyoq/fetching/collections.py +136 -0
- pyoq/fetching/execution.py +587 -0
- pyoq/fetching/joined.py +79 -0
- pyoq/fetching/nesting.py +183 -0
- pyoq/fetching/plans.py +541 -0
- pyoq/fetching/select_in.py +149 -0
- pyoq/fetching/tables.py +110 -0
- pyoq/generation/__init__.py +54 -0
- pyoq/generation/cleanup.py +44 -0
- pyoq/generation/contracts.py +248 -0
- pyoq/generation/drift.py +169 -0
- pyoq/generation/lock.py +33 -0
- pyoq/generation/manifest.py +114 -0
- pyoq/generation/model.py +1001 -0
- pyoq/generation/pipeline.py +119 -0
- pyoq/generation/rendering/__init__.py +5 -0
- pyoq/generation/rendering/domains.py +51 -0
- pyoq/generation/rendering/enums.py +29 -0
- pyoq/generation/rendering/exports.py +70 -0
- pyoq/generation/rendering/imports.py +63 -0
- pyoq/generation/rendering/package.py +56 -0
- pyoq/generation/rendering/relations.py +133 -0
- pyoq/generation/rendering/routines.py +396 -0
- pyoq/generation/rendering/rows.py +79 -0
- pyoq/generation/rendering/source.py +121 -0
- pyoq/generation/rendering/tables.py +300 -0
- pyoq/generation/rendering/writes.py +514 -0
- pyoq/generation/validation.py +27 -0
- pyoq/generation/writer.py +184 -0
- pyoq/hydration/__init__.py +24 -0
- pyoq/hydration/engine.py +155 -0
- pyoq/hydration/identity.py +194 -0
- pyoq/hydration/plan.py +116 -0
- pyoq/migrations/__init__.py +9 -0
- pyoq/migrations/alembic.py +106 -0
- pyoq/migrations/hooks.py +75 -0
- pyoq/naming.py +261 -0
- pyoq/policies/__init__.py +47 -0
- pyoq/policies/bypass.py +122 -0
- pyoq/policies/governed.py +430 -0
- pyoq/policies/model.py +242 -0
- pyoq/policies/rewriting.py +263 -0
- pyoq/py.typed +1 -0
- pyoq/query/__init__.py +312 -0
- pyoq/query/aggregates.py +172 -0
- pyoq/query/arrays.py +65 -0
- pyoq/query/binding.py +52 -0
- pyoq/query/capabilities.py +317 -0
- pyoq/query/casts.py +73 -0
- pyoq/query/choices.py +185 -0
- pyoq/query/decoding.py +360 -0
- pyoq/query/documents.py +56 -0
- pyoq/query/execution/__init__.py +63 -0
- pyoq/query/execution/aio/__init__.py +31 -0
- pyoq/query/execution/aio/operations.py +228 -0
- pyoq/query/execution/aio/pooling.py +233 -0
- pyoq/query/execution/aio/streaming.py +161 -0
- pyoq/query/execution/aio/transactions.py +105 -0
- pyoq/query/execution/batch.py +96 -0
- pyoq/query/execution/binding_style.py +30 -0
- pyoq/query/execution/compilation.py +48 -0
- pyoq/query/execution/context.py +61 -0
- pyoq/query/execution/control.py +50 -0
- pyoq/query/execution/operations.py +224 -0
- pyoq/query/execution/planning.py +107 -0
- pyoq/query/execution/pooling.py +279 -0
- pyoq/query/execution/results.py +36 -0
- pyoq/query/execution/streaming.py +178 -0
- pyoq/query/execution/transactions.py +95 -0
- pyoq/query/expressions.py +1200 -0
- pyoq/query/fields.py +60 -0
- pyoq/query/mysql/__init__.py +59 -0
- pyoq/query/mysql/aio/__init__.py +38 -0
- pyoq/query/mysql/aio/commands.py +389 -0
- pyoq/query/mysql/aio/driver.py +196 -0
- pyoq/query/mysql/aio/executor.py +123 -0
- pyoq/query/mysql/aio/factory.py +26 -0
- pyoq/query/mysql/aio/operations.py +38 -0
- pyoq/query/mysql/aio/pool.py +53 -0
- pyoq/query/mysql/aio/transactions.py +313 -0
- pyoq/query/mysql/commands.py +354 -0
- pyoq/query/mysql/compiler.py +134 -0
- pyoq/query/mysql/context.py +20 -0
- pyoq/query/mysql/executor.py +126 -0
- pyoq/query/mysql/expressions.py +244 -0
- pyoq/query/mysql/factory.py +46 -0
- pyoq/query/mysql/health.py +66 -0
- pyoq/query/mysql/identifiers.py +9 -0
- pyoq/query/mysql/model.py +79 -0
- pyoq/query/mysql/operations.py +43 -0
- pyoq/query/mysql/parameters.py +69 -0
- pyoq/query/mysql/planning.py +20 -0
- pyoq/query/mysql/pool.py +67 -0
- pyoq/query/mysql/transactions.py +331 -0
- pyoq/query/mysql/writes.py +73 -0
- pyoq/query/nodes.py +750 -0
- pyoq/query/postgres/__init__.py +48 -0
- pyoq/query/postgres/aio/__init__.py +25 -0
- pyoq/query/postgres/aio/bulk.py +56 -0
- pyoq/query/postgres/aio/commands.py +264 -0
- pyoq/query/postgres/aio/executor.py +152 -0
- pyoq/query/postgres/aio/factory.py +26 -0
- pyoq/query/postgres/aio/operations.py +26 -0
- pyoq/query/postgres/aio/pool.py +40 -0
- pyoq/query/postgres/aio/transactions.py +295 -0
- pyoq/query/postgres/bulk.py +62 -0
- pyoq/query/postgres/commands.py +238 -0
- pyoq/query/postgres/compiler.py +114 -0
- pyoq/query/postgres/context.py +20 -0
- pyoq/query/postgres/executor.py +147 -0
- pyoq/query/postgres/expressions.py +311 -0
- pyoq/query/postgres/factory.py +24 -0
- pyoq/query/postgres/health.py +24 -0
- pyoq/query/postgres/identifiers.py +9 -0
- pyoq/query/postgres/model.py +81 -0
- pyoq/query/postgres/operations.py +25 -0
- pyoq/query/postgres/parameters.py +71 -0
- pyoq/query/postgres/planning.py +20 -0
- pyoq/query/postgres/pool.py +52 -0
- pyoq/query/postgres/transactions.py +295 -0
- pyoq/query/postgres/writes.py +37 -0
- pyoq/query/projections.py +105 -0
- pyoq/query/raw.py +90 -0
- pyoq/query/recursion.py +265 -0
- pyoq/query/rendering/__init__.py +1 -0
- pyoq/query/rendering/expressions.py +913 -0
- pyoq/query/rendering/identifiers.py +40 -0
- pyoq/query/rendering/projections.py +63 -0
- pyoq/query/rendering/queries.py +334 -0
- pyoq/query/rendering/sources.py +66 -0
- pyoq/query/rendering/writes.py +176 -0
- pyoq/query/results.py +459 -0
- pyoq/query/routines.py +196 -0
- pyoq/query/rows.py +156 -0
- pyoq/query/select.py +793 -0
- pyoq/query/select_nodes.py +277 -0
- pyoq/query/sources.py +236 -0
- pyoq/query/sqlite/__init__.py +43 -0
- pyoq/query/sqlite/commands.py +201 -0
- pyoq/query/sqlite/compiler.py +139 -0
- pyoq/query/sqlite/context.py +20 -0
- pyoq/query/sqlite/executor.py +119 -0
- pyoq/query/sqlite/expressions.py +224 -0
- pyoq/query/sqlite/factory.py +32 -0
- pyoq/query/sqlite/health.py +28 -0
- pyoq/query/sqlite/identifiers.py +9 -0
- pyoq/query/sqlite/model.py +73 -0
- pyoq/query/sqlite/operations.py +36 -0
- pyoq/query/sqlite/parameters.py +50 -0
- pyoq/query/sqlite/planning.py +20 -0
- pyoq/query/sqlite/pool.py +50 -0
- pyoq/query/sqlite/streaming.py +13 -0
- pyoq/query/sqlite/transactions.py +274 -0
- pyoq/query/sqlite/writes.py +35 -0
- pyoq/query/statements.py +27 -0
- pyoq/query/values.py +23 -0
- pyoq/query/vendor.py +162 -0
- pyoq/query/windows.py +424 -0
- pyoq/query/write_nodes.py +174 -0
- pyoq/query/writes.py +628 -0
- pyoq/relations/__init__.py +66 -0
- pyoq/relations/batching.py +219 -0
- pyoq/relations/derivation.py +111 -0
- pyoq/relations/fetching.py +355 -0
- pyoq/relations/graph.py +245 -0
- pyoq/relations/loading.py +74 -0
- pyoq/relations/model.py +75 -0
- pyoq/relations/planning.py +206 -0
- pyoq/runtime/__init__.py +9 -0
- pyoq/runtime/kernels.py +25 -0
- pyoq/runtime/python.py +43 -0
- pyoq/runtime/selection.py +73 -0
- pyoq/sanic/__init__.py +32 -0
- pyoq/sanic/scope.py +197 -0
- pyoq/sanic/workers.py +129 -0
- pyoq/schema/__init__.py +108 -0
- pyoq/schema/codec.py +711 -0
- pyoq/schema/models.py +604 -0
- pyoq/schema/mysql/__init__.py +16 -0
- pyoq/schema/mysql/connection.py +73 -0
- pyoq/schema/mysql/dsn.py +72 -0
- pyoq/schema/mysql/records.py +354 -0
- pyoq/schema/mysql/reflection.py +309 -0
- pyoq/schema/mysql/source.py +30 -0
- pyoq/schema/mysql/sql.py +128 -0
- pyoq/schema/mysql/types.py +105 -0
- pyoq/schema/postgres/__init__.py +13 -0
- pyoq/schema/postgres/connection.py +63 -0
- pyoq/schema/postgres/records.py +384 -0
- pyoq/schema/postgres/reflection.py +466 -0
- pyoq/schema/postgres/source.py +30 -0
- pyoq/schema/postgres/sql.py +246 -0
- pyoq/schema/postgres/types.py +98 -0
- pyoq/schema/registry.py +45 -0
- pyoq/schema/source.py +15 -0
- pyoq/schema/sqlite/__init__.py +6 -0
- pyoq/schema/sqlite/connection.py +54 -0
- pyoq/schema/sqlite/records.py +167 -0
- pyoq/schema/sqlite/reflection.py +393 -0
- pyoq/schema/sqlite/source.py +30 -0
- pyoq/schema/sqlite/sql.py +254 -0
- pyoq/schema/sqlite/types.py +74 -0
- pyoq/serving/__init__.py +23 -0
- pyoq/serving/databases.py +107 -0
- pyoq/serving/opening.py +331 -0
- pyoq/snapshots/__init__.py +20 -0
- pyoq/snapshots/drift.py +312 -0
- pyoq/snapshots/files.py +96 -0
- pyoq/snapshots/routing.py +40 -0
- pyoq/snapshots/source.py +33 -0
- pyoq/tracing/__init__.py +5 -0
- pyoq/tracing/spans.py +89 -0
- pyoq/unset.py +14 -0
- pyoq_sql-1.0.2.dist-info/METADATA +3050 -0
- pyoq_sql-1.0.2.dist-info/RECORD +267 -0
- pyoq_sql-1.0.2.dist-info/WHEEL +4 -0
- pyoq_sql-1.0.2.dist-info/entry_points.txt +3 -0
- pyoq_sql-1.0.2.dist-info/licenses/LICENSE +373 -0
pyoq/query/rows.py
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"""Comparing several values as one.
|
|
2
|
+
|
|
3
|
+
A composite key is one key, and asking whether a row is among a set of them
|
|
4
|
+
should read that way. A row value puts columns side by side and compares them
|
|
5
|
+
against tuples of values in one predicate, instead of spelling out an OR of
|
|
6
|
+
ANDs that a reader has to reassemble.
|
|
7
|
+
|
|
8
|
+
The tuples are checked against the columns by position, so a value of the
|
|
9
|
+
wrong type in the wrong place is refused where it is written.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from typing import TYPE_CHECKING, Generic, TypeVar, TypeVarTuple, cast, overload
|
|
15
|
+
|
|
16
|
+
from pyoq.query.expressions import Condition, Expression, operand
|
|
17
|
+
from pyoq.query.nodes import (
|
|
18
|
+
BinaryNode,
|
|
19
|
+
BinaryOperator,
|
|
20
|
+
RowValueNode,
|
|
21
|
+
VariadicNode,
|
|
22
|
+
VariadicOperator,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from pyoq.query.raw import NodeProvider
|
|
27
|
+
|
|
28
|
+
Values = TypeVarTuple("Values")
|
|
29
|
+
Value1 = TypeVar("Value1")
|
|
30
|
+
Value2 = TypeVar("Value2")
|
|
31
|
+
Value3 = TypeVar("Value3")
|
|
32
|
+
Value4 = TypeVar("Value4")
|
|
33
|
+
Value5 = TypeVar("Value5")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class RowValue(Generic[*Values]):
|
|
37
|
+
"""Columns compared together, as wide as the tuples compared against them."""
|
|
38
|
+
|
|
39
|
+
__slots__ = ("_families", "_node")
|
|
40
|
+
|
|
41
|
+
def __init__(self, expressions: tuple[Expression[object], ...]) -> None:
|
|
42
|
+
self._families = tuple(expression.family for expression in expressions)
|
|
43
|
+
self._node = RowValueNode(tuple(expression.node for expression in expressions))
|
|
44
|
+
|
|
45
|
+
def in_(self, *rows: tuple[*Values]) -> Condition:
|
|
46
|
+
"""Whether these columns together match any of these rows."""
|
|
47
|
+
return self._membership(VariadicOperator.IN, rows)
|
|
48
|
+
|
|
49
|
+
def not_in(self, *rows: tuple[*Values]) -> Condition:
|
|
50
|
+
"""Whether these columns together match none of these rows."""
|
|
51
|
+
return self._membership(VariadicOperator.NOT_IN, rows)
|
|
52
|
+
|
|
53
|
+
def eq(self, values: tuple[*Values], /) -> Condition:
|
|
54
|
+
return self._compared(BinaryOperator.EQUAL, values)
|
|
55
|
+
|
|
56
|
+
def ne(self, values: tuple[*Values], /) -> Condition:
|
|
57
|
+
return self._compared(BinaryOperator.NOT_EQUAL, values)
|
|
58
|
+
|
|
59
|
+
def gt(self, values: tuple[*Values], /) -> Condition:
|
|
60
|
+
return self._compared(BinaryOperator.GREATER_THAN, values)
|
|
61
|
+
|
|
62
|
+
def ge(self, values: tuple[*Values], /) -> Condition:
|
|
63
|
+
return self._compared(BinaryOperator.GREATER_OR_EQUAL, values)
|
|
64
|
+
|
|
65
|
+
def lt(self, values: tuple[*Values], /) -> Condition:
|
|
66
|
+
return self._compared(BinaryOperator.LESS_THAN, values)
|
|
67
|
+
|
|
68
|
+
def le(self, values: tuple[*Values], /) -> Condition:
|
|
69
|
+
return self._compared(BinaryOperator.LESS_OR_EQUAL, values)
|
|
70
|
+
|
|
71
|
+
def _membership(
|
|
72
|
+
self,
|
|
73
|
+
operator: VariadicOperator,
|
|
74
|
+
rows: tuple[tuple[object, ...], ...],
|
|
75
|
+
) -> Condition:
|
|
76
|
+
operands = (self._node, *(self._row(row) for row in rows))
|
|
77
|
+
return Condition(VariadicNode(operator, operands))
|
|
78
|
+
|
|
79
|
+
def _compared(
|
|
80
|
+
self,
|
|
81
|
+
operator: BinaryOperator,
|
|
82
|
+
values: tuple[object, ...],
|
|
83
|
+
) -> Condition:
|
|
84
|
+
return Condition(BinaryNode(operator, self._node, self._row(values)))
|
|
85
|
+
|
|
86
|
+
def _row(self, values: tuple[object, ...]) -> RowValueNode:
|
|
87
|
+
if len(values) != len(self._families):
|
|
88
|
+
message = (
|
|
89
|
+
f"a row of {len(self._families)} columns takes "
|
|
90
|
+
f"{len(self._families)} values, not {len(values)}"
|
|
91
|
+
)
|
|
92
|
+
raise ValueError(message)
|
|
93
|
+
return RowValueNode(
|
|
94
|
+
tuple(
|
|
95
|
+
operand(value, family)
|
|
96
|
+
for value, family in zip(values, self._families, strict=True)
|
|
97
|
+
)
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@overload
|
|
102
|
+
def row(
|
|
103
|
+
first: Expression[Value1],
|
|
104
|
+
second: Expression[Value2],
|
|
105
|
+
/,
|
|
106
|
+
) -> RowValue[Value1, Value2]: ...
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@overload
|
|
110
|
+
def row(
|
|
111
|
+
first: Expression[Value1],
|
|
112
|
+
second: Expression[Value2],
|
|
113
|
+
third: Expression[Value3],
|
|
114
|
+
/,
|
|
115
|
+
) -> RowValue[Value1, Value2, Value3]: ...
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@overload
|
|
119
|
+
def row(
|
|
120
|
+
first: Expression[Value1],
|
|
121
|
+
second: Expression[Value2],
|
|
122
|
+
third: Expression[Value3],
|
|
123
|
+
fourth: Expression[Value4],
|
|
124
|
+
/,
|
|
125
|
+
) -> RowValue[Value1, Value2, Value3, Value4]: ...
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
@overload
|
|
129
|
+
def row(
|
|
130
|
+
first: Expression[Value1],
|
|
131
|
+
second: Expression[Value2],
|
|
132
|
+
third: Expression[Value3],
|
|
133
|
+
fourth: Expression[Value4],
|
|
134
|
+
fifth: Expression[Value5],
|
|
135
|
+
/,
|
|
136
|
+
) -> RowValue[Value1, Value2, Value3, Value4, Value5]: ...
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
@overload
|
|
140
|
+
def row(*expressions: NodeProvider) -> RowValue[*tuple[object, ...]]: ...
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def row(*expressions: object) -> RowValue[*tuple[object, ...]]:
|
|
144
|
+
"""Several columns compared as one, the way a composite key is one key."""
|
|
145
|
+
typed = tuple(_expression(expression) for expression in expressions)
|
|
146
|
+
return RowValue[*tuple[object, ...]](typed)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _expression(value: object) -> Expression[object]:
|
|
150
|
+
if isinstance(value, Expression):
|
|
151
|
+
return cast("Expression[object]", value)
|
|
152
|
+
message = "a row value is built from typed expressions"
|
|
153
|
+
raise TypeError(message)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
__all__ = ("RowValue", "row")
|