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

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# 

12 

13 

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 

25 

26__all__ = ["UserSearchFactory"] 

27 

28 

29class UserSearchFactory(SearchDocumentFactory): 

30 

31 def __init__(self, user: UserWrapper, tokenizer: Tokenizer | None = None) -> None: 

32 self.user = user 

33 super().__init__(tokenizer=tokenizer) 

34 

35 @property 

36 @override 

37 def obj_type(self) -> SearchObjType: 

38 return SearchObjType.USER 

39 

40 @override 

41 def get_documents(self) -> list[SearchDocument[Any]] | None: 

42 user = self.user 

43 

44 user_id = user.doc_id 

45 creator_id = user_id 

46 obj_id = user_id 

47 obj_type = self.obj_type 

48 

49 views = user.model.view_stats.views 

50 score = SearchScore.score_user(user) 

51 

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) 

55 

56 token_result = self.tokenizer.create_tokens(values) 

57 token_score = token_result.token_score.score 

58 tag_score = token_score * score 

59 

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 ) 

66 

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 ]