diff options
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/models_common.py | 47 |
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 |