Skip to content

Commit b749b60

Browse files
authored
Merge pull request #49 from nitr0man/main
fix pkey name overflow in _drop_primary_key
2 parents a6a1dec + 096b296 commit b749b60

File tree

5 files changed

+31
-3
lines changed

5 files changed

+31
-3
lines changed

timescale/db/backends/postgis/schema.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ def _drop_primary_key(self, model):
7878
"""
7979
db_table = model._meta.db_table
8080
table = self.quote_name(db_table)
81-
pkey = self.quote_name(f'{db_table}_pkey')
81+
pkey_length = self.connection.ops.max_name_length()
82+
pkey = self.quote_name(f'{db_table[:pkey_length - 5]}_pkey')
8283

8384
sql = self.sql_drop_primary_key.format(table=table, pkey=pkey)
8485

timescale/db/backends/postgresql/schema.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ def _drop_primary_key(self, model):
7878
"""
7979
db_table = model._meta.db_table
8080
table = self.quote_name(db_table)
81-
pkey = self.quote_name(f'{db_table}_pkey')
81+
pkey_length = self.connection.ops.max_name_length()
82+
pkey = self.quote_name(f'{db_table[:pkey_length - 5]}_pkey')
8283

8384
sql = self.sql_drop_primary_key.format(table=table, pkey=pkey)
8485

timescale/db/models/aggregates.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,20 @@ def __init__(self, expression, min_value, max_value, bucket):
2222
super().__init__(expression, min_value, max_value, bucket)
2323

2424

25+
class LTTB(models.Func):
26+
function = 'lttb'
27+
name = 'lttb'
28+
output_field = models.DateTimeField()
29+
30+
def __init__(self, time, value, count, field):
31+
self.fieldname = field
32+
super().__init__(time, value, count)
33+
34+
def as_sql(self, compiler, connection, **extra_context):
35+
sql, params = super().as_sql(compiler, connection, **extra_context)
36+
return f'(unnest({sql})).{self.fieldname}', params
37+
38+
2539
class Last(models.Aggregate):
2640
function = 'last'
2741
name = 'last'

timescale/db/models/managers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,6 @@ def time_bucket_gapfill(self, field: str, interval: str, start: datetime, end: d
2323

2424
def histogram(self, field: str, min_value: float, max_value: float, num_of_buckets: int = 5):
2525
return self.get_queryset().histogram(field, min_value, max_value, num_of_buckets)
26+
27+
def lttb(self, time: str, value: str, num_of_counts: int = 20):
28+
return self.get_queryset().lttb(time, value, num_of_counts)

timescale/db/models/querysets.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.db import models
22
from timescale.db.models.expressions import TimeBucket, TimeBucketGapFill, TimeBucketNG
3-
from timescale.db.models.aggregates import Histogram
3+
from timescale.db.models.aggregates import Histogram, LTTB
44
from typing import Dict, Optional
55
from datetime import datetime
66

@@ -35,6 +35,15 @@ def histogram(self, field: str, min_value: float, max_value: float, num_of_bucke
3535
"""
3636
return self.values(histogram=Histogram(field, min_value, max_value, num_of_buckets))
3737

38+
def lttb(self, time: str, value: str, num_of_counts: int = 20):
39+
"""
40+
Wraps the TimescaleDB toolkit lttb function into a queryset method.
41+
"""
42+
return self.values(
43+
lttb_t=LTTB(time, value, num_of_counts, time),
44+
lttb_v=LTTB(time, value, num_of_counts, value)
45+
)
46+
3847
def to_list(self, normalise_datetimes: bool = False):
3948
if normalise_datetimes:
4049
normalised = []

0 commit comments

Comments
 (0)