From 9932242a49fa6a79a49edc520d7fafa0465f673f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20H=C3=B6ning?= Date: Fri, 1 Mar 2024 10:50:11 +0100 Subject: [PATCH] add index on timed_beliefs for faster search (#167) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix application of unique index on timed_beliefs, also add index on the same fields so searching is sped up Signed-off-by: Nicolas Höning * flake8 Signed-off-by: Nicolas Höning * the order of the fields matters, has to match the query's order Signed-off-by: Nicolas Höning * add unique constraints separately, as it needs the probability fields as well Signed-off-by: Nicolas Höning * flake8 Signed-off-by: Nicolas Höning * no UNIQUE index - without probability it makes no sense, with is covered by primary key Signed-off-by: Nicolas Höning * remove unused import Signed-off-by: Nicolas Höning * do not include belief_horizon in index, just add as column (we are using min() on it) Signed-off-by: Nicolas Höning * black Signed-off-by: Nicolas Höning * black with version we use in pre-commit Signed-off-by: Nicolas Höning --------- Signed-off-by: Nicolas Höning --- timely_beliefs/beliefs/classes.py | 33 ++++++++++++++++--------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/timely_beliefs/beliefs/classes.py b/timely_beliefs/beliefs/classes.py index c21c4268..ee2bd864 100644 --- a/timely_beliefs/beliefs/classes.py +++ b/timely_beliefs/beliefs/classes.py @@ -30,9 +30,9 @@ ) from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.ext.hybrid import hybrid_method, hybrid_property -from sqlalchemy.orm import Session, backref, has_inherited_table, relationship +from sqlalchemy.orm import Session, backref, declarative_mixin, relationship from sqlalchemy.orm.util import AliasedClass -from sqlalchemy.schema import UniqueConstraint +from sqlalchemy.schema import Index from sqlalchemy.sql.elements import BinaryExpression from sqlalchemy.sql.expression import Selectable @@ -174,6 +174,7 @@ def source_id(self): return None +@declarative_mixin class TimedBeliefDBMixin(TimedBelief): """ Mixin class for a table with beliefs. @@ -182,17 +183,17 @@ class TimedBeliefDBMixin(TimedBelief): @declared_attr def __table_args__(cls): - if has_inherited_table(cls): - return ( - UniqueConstraint( - "event_start", - "belief_horizon", - "sensor_id", - "source_id", - name="_one_belief_by_one_source_uc", - ), - ) - return None + return ( + Index( + f"{cls.__tablename__}_search_session_idx", + "event_start", + "sensor_id", + "source_id", + postgresql_include=[ + "belief_horizon", # we use min() on this + ], + ), + ) event_start = Column(DateTime(timezone=True), primary_key=True, index=True) belief_horizon = Column(Interval(), nullable=False, primary_key=True) @@ -1500,9 +1501,9 @@ def resample_events( column_functions = { "event_value": "mean", "source": "first", # keep the only source - belief_timing_col: "max" - if belief_timing_col == "belief_time" - else "min", # keep only most recent belief + belief_timing_col: ( + "max" if belief_timing_col == "belief_time" else "min" + ), # keep only most recent belief "cumulative_probability": "mean", # we just have one point on each CDF } df = downsample_beliefs_data_frame(