streamline selected columns in search CTEs

This commit is contained in:
Sarah Hoffmann
2026-03-02 11:48:09 +01:00
parent 7bbfb4b972
commit 7a8a09ca78
2 changed files with 13 additions and 25 deletions

View File

@@ -155,10 +155,7 @@ class AddressSearch(base.AbstractSearch):
for ranking in self.rankings:
penalty += ranking.sql_penalty(t)
sql = sa.select(t.c.place_id, t.c.address_rank,
t.c.country_code, t.c.centroid,
t.c.name_vector, t.c.nameaddress_vector,
t.c.importance, penalty.label('penalty'))
sql = sa.select(t.c.place_id, penalty.label('penalty'))
for lookup in self.lookups:
sql = sql.where(lookup.sql_condition(t))
@@ -199,9 +196,7 @@ class AddressSearch(base.AbstractSearch):
inner = sql.limit(10000).order_by(sa.desc(sa.text('importance'))).subquery()
sql = sa.select(inner.c.place_id, inner.c.address_rank,
inner.c.country_code, inner.c.centroid, inner.c.importance,
inner.c.penalty)
sql = sa.select(inner.c.place_id, inner.c.penalty)
return sql.cte('searches')
@@ -237,12 +232,12 @@ class AddressSearch(base.AbstractSearch):
else_=1.0)
if details.near is not None:
sql = sql.add_columns((-tsearch.c.centroid.ST_Distance(NEAR_PARAM))
sql = sql.add_columns((-t.c.centroid.ST_Distance(NEAR_PARAM))
.label('importance'))
sql = sql.order_by(sa.desc(sa.text('importance')))
else:
sql = sql.order_by(penalty - tsearch.c.importance)
sql = sql.add_columns(tsearch.c.importance)
sql = sql.order_by(penalty - t.c.importance)
sql = sql.add_columns(t.c.importance)
sql = sql.add_columns(penalty.label('accuracy'))\
.order_by(sa.text('accuracy'))
@@ -250,7 +245,7 @@ class AddressSearch(base.AbstractSearch):
hnr_list = '|'.join(self.housenumbers.values)
if self.has_address_terms:
sql = sql.where(sa.or_(tsearch.c.address_rank < 30,
sql = sql.where(sa.or_(t.c.rank_address < 30,
sa.func.RegexpWord(hnr_list, t.c.housenumber)))
inner = sql.subquery()

View File

@@ -58,10 +58,7 @@ class PlaceSearch(base.AbstractSearch):
for ranking in self.rankings:
penalty += ranking.sql_penalty(t)
sql = sa.select(t.c.place_id, t.c.address_rank,
t.c.country_code, t.c.centroid,
t.c.name_vector, t.c.nameaddress_vector,
t.c.importance)
sql = sa.select(t.c.place_id, t.c.importance)
for lookup in self.lookups:
sql = sql.where(lookup.sql_condition(t))
@@ -115,11 +112,9 @@ class PlaceSearch(base.AbstractSearch):
.order_by(sa.desc(sa.text('importance')))\
.subquery()
sql = sa.select(inner.c.place_id, inner.c.address_rank,
inner.c.country_code, inner.c.centroid, inner.c.importance,
inner.c.penalty)
sql = sa.select(inner.c.place_id, inner.c.importance, inner.c.penalty)
# If the query is not an address search or has a geographic preference,
# If the query has no geographic preference,
# preselect most important items to restrict the number of places
# that need to be looked up in placex.
if (details.viewbox is None or not details.bounded_viewbox)\
@@ -131,9 +126,7 @@ class PlaceSearch(base.AbstractSearch):
inner = sql.subquery()
sql = sa.select(inner.c.place_id, inner.c.address_rank,
inner.c.country_code, inner.c.centroid, inner.c.importance,
inner.c.penalty)\
sql = sa.select(inner.c.place_id, inner.c.penalty)\
.where(inner.c.penalty - inner.c.importance < inner.c.min_penalty + 0.5)
return sql.cte('searches')
@@ -168,12 +161,12 @@ class PlaceSearch(base.AbstractSearch):
penalty += sa.case((t.c.postcode.in_(self.postcodes.values), 0.0), else_=1.0)
if details.near is not None:
sql = sql.add_columns((-tsearch.c.centroid.ST_Distance(NEAR_PARAM))
sql = sql.add_columns((-t.c.centroid.ST_Distance(NEAR_PARAM))
.label('importance'))
sql = sql.order_by(sa.desc(sa.text('importance')))
else:
sql = sql.order_by(penalty - tsearch.c.importance)
sql = sql.add_columns(tsearch.c.importance)
sql = sql.order_by(penalty - t.c.importance)
sql = sql.add_columns(t.c.importance)
if details.min_rank > 0:
sql = sql.where(sa.or_(t.c.rank_address >= MIN_RANK_PARAM,