mirror of
https://gitlab.com/bramw/baserow.git
synced 2025-03-17 14:02:43 +00:00
Resolve "Can't create an index to sort tables order/group by a duration field"
This commit is contained in:
parent
4eac879643
commit
9c6c7e1238
4 changed files with 18 additions and 8 deletions
backend/src/baserow/contrib/database
changelog/entries/unreleased/bug
|
@ -1,6 +1,7 @@
|
|||
from dataclasses import dataclass
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from django.db.models import F
|
||||
from django.db.models.expressions import OrderBy
|
||||
|
||||
|
||||
|
@ -29,13 +30,16 @@ class OptionallyAnnotatedOrderBy:
|
|||
of the OrderBy order.
|
||||
|
||||
OrderBy expression for a field is always F(field_expression) or
|
||||
Collate(F(field_expression)).
|
||||
Collate(F(field_expression)) or a django Expression that can be
|
||||
stringified.
|
||||
"""
|
||||
|
||||
if self.collation:
|
||||
return self.order.expression.source_expressions[0].name
|
||||
else:
|
||||
elif isinstance(self.order.expression, F):
|
||||
return self.order.expression.name
|
||||
else:
|
||||
return str(self.order.expression)
|
||||
|
||||
@property
|
||||
def order_bys(self) -> List[OrderBy]:
|
||||
|
|
|
@ -46,7 +46,7 @@ from django.db.models import (
|
|||
Window,
|
||||
)
|
||||
from django.db.models.fields.related import ManyToManyField
|
||||
from django.db.models.functions import Coalesce, Extract, RowNumber
|
||||
from django.db.models.functions import Coalesce, RowNumber
|
||||
|
||||
from dateutil import parser
|
||||
from dateutil.parser import ParserError
|
||||
|
@ -2028,7 +2028,7 @@ class DurationFieldType(FieldType):
|
|||
setattr(row, field_name, value)
|
||||
|
||||
def get_sortable_column_expression(self, field_name: str) -> Expression | F:
|
||||
return Extract(F(f"{field_name}"), "epoch")
|
||||
return F(f"{field_name}")
|
||||
|
||||
|
||||
class LinkRowFieldType(
|
||||
|
|
|
@ -15,7 +15,7 @@ from django.core.exceptions import FieldDoesNotExist, ValidationError
|
|||
from django.db import connection
|
||||
from django.db import models as django_models
|
||||
from django.db.models import Count, Q
|
||||
from django.db.models.expressions import F, OrderBy
|
||||
from django.db.models.expressions import OrderBy
|
||||
from django.db.models.query import QuerySet
|
||||
|
||||
import jwt
|
||||
|
@ -290,7 +290,7 @@ class ViewIndexingHandler(metaclass=baserow_trace_methods(tracer)):
|
|||
|
||||
@classmethod
|
||||
def get_index(
|
||||
cls, view: View, model: Optional[GeneratedTableModel]
|
||||
cls, view: View, model: Optional[GeneratedTableModel] = None
|
||||
) -> Optional[django_models.Index]:
|
||||
"""
|
||||
Returns the model and the best possible index for the requested view.
|
||||
|
@ -1859,8 +1859,7 @@ class ViewHandler(metaclass=baserow_trace_methods(tracer)):
|
|||
for fob in field_order_bys:
|
||||
order_by.append(fob)
|
||||
|
||||
order_by.append(F("order").asc(nulls_first=True))
|
||||
order_by.append(F("id").asc(nulls_first=True))
|
||||
order_by.extend(("order", "id"))
|
||||
|
||||
return order_by, queryset
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"type": "bug",
|
||||
"message": "Fix a bug that prevent a database index to be created when sorting/grouping by a duration field.",
|
||||
"issue_number": 3296,
|
||||
"bullet_points": [],
|
||||
"created_at": "2024-12-18"
|
||||
}
|
Loading…
Reference in a new issue