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