Coverage for functions \ flipdare \ search \ factory \ user_search_factory.py: 100%
38 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-05-08 12:22 +1000
« prev ^ index » next coverage.py v7.13.0, created at 2026-05-08 12:22 +1000
1#!/usr/bin/env python
2# Copyright (c) 2026 Flipdare Pty Ltd. All rights reserved.
3#
4# This file is part of Flipdare's proprietary software and contains
5# confidential and copyrighted material. Unauthorised copying,
6# modification, distribution, or use of this file is strictly
7# prohibited without prior written permission from Flipdare Pty Ltd.
8#
9# This software includes third-party components licensed under MIT,
10# BSD, and Apache 2.0 licences. See THIRD_PARTY_NOTICES for details.
11#
14from typing import Any, override
15from flipdare.app_log import LOG
16from flipdare.constants import IS_DEBUG
17from flipdare.core.tokenizer import Tokenizer
18from flipdare.generated.shared.search.search_obj_type import SearchObjType
19from flipdare.search.core.search_score import SearchScore
20from flipdare.search.doc._search_document import SearchDocument
21from flipdare.search.doc.general_document import GeneralDocument
22from flipdare.search.factory._search_document_factory import SearchDocumentFactory
23from flipdare.util.time_util import TypesenseTime
24from flipdare.wrapper import UserWrapper
26__all__ = ["UserSearchFactory"]
29class UserSearchFactory(SearchDocumentFactory):
31 def __init__(self, user: UserWrapper, tokenizer: Tokenizer | None = None) -> None:
32 self.user = user
33 super().__init__(tokenizer=tokenizer)
35 @property
36 @override
37 def obj_type(self) -> SearchObjType:
38 return SearchObjType.USER
40 @override
41 def get_documents(self) -> list[SearchDocument[Any]] | None:
42 user = self.user
44 user_id = user.doc_id
45 creator_id = user_id
46 obj_id = user_id
47 obj_type = self.obj_type
49 views = user.model.view_stats.views
50 score = SearchScore.score_user(user)
52 values = user.model.searchable_values
53 created_at = TypesenseTime.from_firestore(user.created_at_db)
54 updated_at = TypesenseTime.from_firestore(user.updated_at_db)
56 token_result = self.tokenizer.create_tokens(values)
57 token_score = token_result.token_score.score
58 tag_score = token_score * score
60 if IS_DEBUG:
61 LOG().debug(
62 f"Creating UserSearchFactory document for user_id={user_id} with "
63 f"score={score}, token_score={token_score}, tag_score={tag_score}"
64 f"\nvalues={values}\ntokens={token_result.tokens}",
65 )
67 return [
68 GeneralDocument.create(
69 obj_id=obj_id,
70 uid=creator_id,
71 obj_type=obj_type,
72 keywords=values,
73 score=score,
74 views=views,
75 created_at=created_at,
76 updated_at=updated_at,
77 tags=token_result.tokens,
78 tag_score=tag_score,
79 ),
80 ]