summaryrefslogtreecommitdiff
path: root/ishtar_common/models_common.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models_common.py')
-rw-r--r--ishtar_common/models_common.py47
1 files changed, 33 insertions, 14 deletions
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py
index 403c020dc..7b84b4dbd 100644
--- a/ishtar_common/models_common.py
+++ b/ishtar_common/models_common.py
@@ -975,6 +975,9 @@ class FullSearch(models.Model):
:param save: True if you want to save the object immediately
:return: True if modified
"""
+ if getattr(self, "_search_vector_updated", None):
+ return
+ self._search_vector_updated = True
if not hasattr(self, "search_vector"):
return
if not self.pk:
@@ -1005,23 +1008,38 @@ class FullSearch(models.Model):
# many to many have to be queried one by one otherwise only one is fetch
for m2m_search_vector in self.M2M_SEARCH_VECTORS:
- key = m2m_search_vector.key.split("__")[0]
+ key_splitted = m2m_search_vector.key.split("__")
+ key = key_splitted[0]
rel_key = getattr(self, key)
- for item in rel_key.values("pk").all():
- query_dct = {key + "__pk": item["pk"]}
- q = copy.copy(base_q).filter(**query_dct)
+ if len(key_splitted) == 2:
+ attr = key_splitted[1]
if m2m_search_vector.language == "raw":
- q = q.values_list(m2m_search_vector.key, flat=True)
- search_vectors += self._update_raw_search_field(q.all()[0])
- continue
- query_dct = {key + "__pk": item["pk"]}
- q = copy.copy(base_q).filter(**query_dct)
- q = q.annotate(
- search=SearchVector(
- m2m_search_vector.key, config=m2m_search_vector.language
+ values = list(rel_key.values_list(attr, flat=True))
+ else:
+ values = list(
+ rel_key.annotate(
+ search=SearchVector(
+ attr, config=m2m_search_vector.language
+ )).values_list("search", flat=True)
)
- ).values("search")
- search_vectors.append(q.all()[0]["search"])
+ for value in values:
+ search_vectors += self._update_raw_search_field(value)
+ else:
+ for item in rel_key.values("pk").all():
+ query_dct = {key + "__pk": item["pk"]}
+ q = copy.copy(base_q).filter(**query_dct)
+ if m2m_search_vector.language == "raw":
+ q = q.values_list(m2m_search_vector.key, flat=True)
+ search_vectors += self._update_raw_search_field(q.all()[0])
+ continue
+ query_dct = {key + "__pk": item["pk"]}
+ q = copy.copy(base_q).filter(**query_dct)
+ q = q.annotate(
+ search=SearchVector(
+ m2m_search_vector.key, config=m2m_search_vector.language
+ )
+ ).values("search")
+ search_vectors.append(q.all()[0]["search"])
# int/float are not well managed by the SearchVector
for int_search_vector in self.INT_SEARCH_VECTORS:
@@ -1117,6 +1135,7 @@ class FullSearch(models.Model):
cursor.execute("SELECT to_tsvector(%s, %s)", [lang, d])
row = cursor.fetchone()
search_vectors.append(row[0])
+ # TODO - performance: could be very slow -> cf. DGM CD17
new_search_vector = merge_tsvectors(search_vectors)
changed = old_search != new_search_vector
self.search_vector = new_search_vector