| 1388 | |
| 1389 | |
| 1390 | class ColPairs(Expression): |
| 1391 | def __init__(self, alias, targets, sources, output_field): |
| 1392 | super().__init__(output_field=output_field) |
| 1393 | self.alias = alias |
| 1394 | self.targets = targets |
| 1395 | self.sources = sources |
| 1396 | |
| 1397 | def __len__(self): |
| 1398 | return len(self.targets) |
| 1399 | |
| 1400 | def __iter__(self): |
| 1401 | return iter(self.get_cols()) |
| 1402 | |
| 1403 | def __repr__(self): |
| 1404 | return ( |
| 1405 | f"{self.__class__.__name__}({self.alias!r}, {self.targets!r}, " |
| 1406 | f"{self.sources!r}, {self.output_field!r})" |
| 1407 | ) |
| 1408 | |
| 1409 | def get_cols(self): |
| 1410 | return [ |
| 1411 | Col(self.alias, target, source) |
| 1412 | for target, source in zip(self.targets, self.sources) |
| 1413 | ] |
| 1414 | |
| 1415 | def get_source_expressions(self): |
| 1416 | return self.get_cols() |
| 1417 | |
| 1418 | def set_source_expressions(self, exprs): |
| 1419 | assert all(isinstance(expr, Col) and expr.alias == self.alias for expr in exprs) |
| 1420 | self.targets = [col.target for col in exprs] |
| 1421 | self.sources = [col.field for col in exprs] |
| 1422 | |
| 1423 | def as_sql(self, compiler, connection): |
| 1424 | cols_sql = [] |
| 1425 | cols_params = [] |
| 1426 | cols = self.get_cols() |
| 1427 | |
| 1428 | for col in cols: |
| 1429 | sql, params = col.as_sql(compiler, connection) |
| 1430 | cols_sql.append(sql) |
| 1431 | cols_params.extend(params) |
| 1432 | |
| 1433 | return ", ".join(cols_sql), tuple(cols_params) |
| 1434 | |
| 1435 | def relabeled_clone(self, relabels): |
| 1436 | return self.__class__( |
| 1437 | relabels.get(self.alias, self.alias), self.targets, self.sources, self.field |
| 1438 | ) |
| 1439 | |
| 1440 | def resolve_expression(self, *args, **kwargs): |
| 1441 | return self |
| 1442 | |
| 1443 | def select_format(self, compiler, sql, params): |
| 1444 | return sql, params |
| 1445 | |
| 1446 | |
| 1447 | class Ref(Expression): |
no outgoing calls