1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-03-17 05:52:42 +00:00

Resolve "Can't create an index to sort tables order/group by a duration field"

This commit is contained in:
Davide Silvestri 2024-12-19 19:53:38 +00:00 committed by Bram Wiepjes
parent 4eac879643
commit 9c6c7e1238
4 changed files with 18 additions and 8 deletions
backend/src/baserow/contrib/database
changelog/entries/unreleased/bug

View file

@ -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]:

View file

@ -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(

View file

@ -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

View file

@ -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"
}