|
1 |
| -from itertools import zip_longest |
2 |
| - |
3 | 1 | from django.db.models import Func, Value
|
4 | 2 | from django.utils.itercompat import is_iterable
|
5 | 3 |
|
@@ -133,31 +131,31 @@ def __init__(
|
133 | 131 | ):
|
134 | 132 | assert (
|
135 | 133 | order_by is not None or primary_key is not None
|
136 |
| - ), "order_by or primary_key is missing." |
| 134 | + ), "At least one of order_by or primary_key must be provided" |
137 | 135 | self.order_by = order_by
|
138 | 136 | self.primary_key = primary_key
|
139 | 137 | self.partition_by = partition_by
|
140 | 138 |
|
141 |
| - if order_by is not None: |
142 |
| - if isinstance(order_by, str) or not is_iterable(order_by): |
143 |
| - self.order_by = [order_by] |
144 |
| - if any(o is None for o in self.order_by): |
145 |
| - raise ValueError("None is not allowed in order_by") |
146 |
| - |
147 |
| - if primary_key is not None: |
148 |
| - if isinstance(primary_key, str) or not is_iterable(primary_key): |
149 |
| - self.primary_key = [primary_key] |
150 |
| - if any(o is None for o in self.primary_key): |
151 |
| - raise ValueError("None is not allowed in primary_key") |
| 139 | + for key in ["order_by", "primary_key", "partition_by"]: |
| 140 | + value = getattr(self, key) |
| 141 | + if value is not None: |
| 142 | + if isinstance(value, str) or not is_iterable(value): |
| 143 | + value = (value,) |
| 144 | + setattr(self, key, value) |
| 145 | + elif not isinstance(value, tuple): |
| 146 | + value = tuple(value) |
| 147 | + setattr(self, key, value) |
| 148 | + if any(i is None for i in value): |
| 149 | + raise ValueError(f"None is not allowed in {key}") |
152 | 150 |
|
153 | 151 | # https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree#choosing-a-primary-key-that-differs-from-the-sorting-key
|
154 | 152 | # primary key expression tuple must be a prefix of the sorting key expression tuple.
|
155 |
| - if self.order_by is not None and self.primary_key is not None: |
156 |
| - for o, p in zip_longest(self.order_by, self.primary_key): |
157 |
| - if p is None: |
158 |
| - break |
159 |
| - if p != o: |
160 |
| - raise ValueError("primary_key must be a prefix of order_by") |
| 153 | + if ( |
| 154 | + self.order_by is not None |
| 155 | + and self.primary_key is not None |
| 156 | + and self.order_by[: len(self.primary_key)] != self.primary_key |
| 157 | + ): |
| 158 | + raise ValueError("primary_key must be a prefix of order_by") |
161 | 159 |
|
162 | 160 | super().__init__(*expressions, **settings)
|
163 | 161 |
|
|
0 commit comments