§
    šŠtj  ã                   óŠ   — d dl Z d dlZd dlmZmZmZmZmZmZ d dl	m
Z
 d dlmZ  ej        e¦  «        Z G d„ de¦  «        ZdS )é    N)ÚAsyncIteratorÚDictÚIteratorÚListÚOptionalÚSequence)ÚDocument)Ú
BaseLoaderc                   ó2  — e Zd ZdZdddddœdedededee         d	eee                  d
eee                  deddfd„Z	de
e         fd„Zdee         fd„Zdee         fd„Zde
e         fd„Zdedefd„Zdee         fd„Z	 ddedee         dedefd„ZdS )ÚMongodbLoaderzLoad MongoDB documents.NT)Úfilter_criteriaÚfield_namesÚmetadata_namesÚ!include_db_collection_in_metadataÚconnection_stringÚdb_nameÚcollection_namer   r   r   r   Úreturnc                ó¼  — 	 ddl m} n"# t          $ r}	t          d¦  «        |	‚d}	~	ww xY w|st          d¦  «        ‚|st          d¦  «        ‚|st          d¦  «        ‚ ||¦  «        | _        || _        || _        |pg | _        |pi | _        |pg | _	        || _
        | j                             |¦  «        | _        | j                             |¦  «        | _        dS )a±  
        Initializes the MongoDB loader with necessary database connection
        details and configurations.

        Args:
            connection_string (str): MongoDB connection URI.
            db_name (str):Name of the database to connect to.
            collection_name (str): Name of the collection to fetch documents from.
            filter_criteria (Optional[Dict]): MongoDB filter criteria for querying
            documents.
            field_names (Optional[Sequence[str]]): List of field names to retrieve
            from documents.
            metadata_names (Optional[Sequence[str]]): Additional metadata fields to
            extract from documents.
            include_db_collection_in_metadata (bool): Flag to include database and
            collection names in metadata.

        Raises:
            ImportError: If the motor library is not installed.
            ValueError: If any necessary argument is missing.
        r   )ÚAsyncIOMotorClientzBCannot import from motor, please install with `pip install motor`.Nz#connection_string must be provided.zdb_name must be provided.z!collection_name must be provided.)Úmotor.motor_asyncior   ÚImportErrorÚ
ValueErrorÚclientr   r   r   r   r   r   Úget_databaseÚdbÚget_collectionÚ
collection)
Úselfr   r   r   r   r   r   r   r   Úes
             új/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/document_loaders/mongodb.pyÚ__init__zMongodbLoader.__init__   s   € ð@	Ø>Ð>Ð>Ð>Ð>Ð>Ð>øÝð 	ð 	ð 	ÝØTñô àðøøøøð	øøøð
 !ð 	DÝÐBÑCÔCÐCàð 	:ÝÐ8Ñ9Ô9Ð9àð 	BÝÐ@ÑAÔAÐAà(Ð(Ð):Ñ;Ô;ˆŒØˆŒØ.ˆÔØ&Ð,¨"ˆÔØ.Ð4°"ˆÔØ,Ð2°ˆÔØ1RˆÔ.à”+×*Ò*¨7Ñ3Ô3ˆŒØœ'×0Ò0°ÑAÔAˆŒˆˆs   ‚	 ‰
(“#£(c                 óN   — t          j        |                      ¦   «         ¦  «        S )a‡  Load data into Document objects.

        Attention:

        This implementation starts an asyncio event loop which
        will only work if running in a sync env. In an async env, it should
        fail since there is already an event loop running.

        This code should be updated to kick off the event loop from a separate
        thread if running within an async context.
        )ÚasyncioÚrunÚaload)r   s    r!   ÚloadzMongodbLoader.loadJ   s   € õ Œ{˜4Ÿ:š:™<œ<Ñ(Ô(Ð(ó    c              #   óF  K  — 	 t          j        ¦   «         }n7# t          $ r* t          j        ¦   «         }t          j        |¦  «         Y nw xY w|                      ¦   «         }	 	 |                     |                     ¦   «         ¦  «        }|V — n# t          $ r Y dS w xY wŒ?)aÚ  A lazy loader for MongoDB documents.

        Attention:

        This implementation starts an asyncio event loop which
        will only work if running in a sync env. In an async env, it should
        fail since there is already an event loop running.

        This code should be updated to kick off the event loop from a separate
        thread if running within an async context.

        Yields:
            Document: A document from the MongoDB collection.
        TN)	r$   Úget_running_loopÚRuntimeErrorÚnew_event_loopÚset_event_loopÚ
alazy_loadÚrun_until_completeÚ	__anext__ÚStopAsyncIteration)r   Ú
event_loopÚasync_generatorÚdocuments       r!   Ú	lazy_loadzMongodbLoader.lazy_loadX   sÇ   è è € ð	/Ý Ô1Ñ3Ô3ˆJˆJøÝð 	/ð 	/ð 	/Ý Ô/Ñ1Ô1ˆJÝÔ" :Ñ.Ô.Ð.Ð.Ð.ð	/øøøð Ÿ/š/Ñ+Ô+ˆð	ðØ%×8Ò8¸×9RÒ9RÑ9TÔ9TÑUÔU�Ø����øÝ%ð ð ð Ø��ðøøøð		s!   „ ˜1AÁAÁ%+B Â
BÂBc                ó´   K  — |                       ¦   «         }| j                             | j        |¦  «        2 3 d{V —†}|                      |¦  «        W V — Œ 6 dS )z�Asynchronously yields Document objects one at a time.

        Yields:
            Document: A document from the MongoDB collection.
        N)Ú_construct_projectionr   Úfindr   Ú_process_document)r   Ú
projectionÚdocs      r!   r.   zMongodbLoader.alazy_loadv   s‚   è è € ð ×/Ò/Ñ1Ô1ˆ
àœ×-Ò-¨dÔ.BÀJÑOÔOð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.�#Ø×(Ò(¨Ñ-Ô-Ð-Ð-Ð-Ð-Ð-ð PÐOÐOs   ·Ac              ƒ   ó¤  K  — g }| j                              | j        ¦  «        ƒ d{V —†}|                      ¦   «         }| j                              | j        |¦  «        2 3 d{V —†}|                     |                      |¦  «        ¦  «         Œ06 t          |¦  «        |k    r.t           	                    dt          |¦  «        › d|› d�¦  «         |S )z0Asynchronously loads data into Document objects.Nz6Only partial collection of documents returned. Loaded z docs, expected ú.)
r   Úcount_documentsr   r7   r8   Úappendr9   ÚlenÚloggerÚwarning)r   ÚresultÚ
total_docsr:   r;   s        r!   r&   zMongodbLoader.aload�   s  è è € àˆØœ?×:Ò:¸4Ô;OÑPÔPÐPÐPÐPÐPÐPÐPˆ
à×/Ò/Ñ1Ô1ˆ
àœ×-Ò-¨dÔ.BÀJÑOÔOð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7�#Ø�MŠM˜$×0Ò0°Ñ5Ô5Ñ6Ô6Ð6Ð6ð Põ ˆv‰;Œ;˜*Ò$Ð$Ý�NŠNðEÝ˜f™+œ+ðEð EØ7AðEð Eð Eñô ð ð
 ˆs   ÁBr;   c                 ó~  — |                       || j        d¬¦  «        }| j        r"|                     | j        | j        dœ¦  «         | j        �Q|                       || j        d¬¦  «        }d„ |                     ¦   «         D ¦   «         }d                     |¦  «        }nt          |¦  «        }t          ||¬¦  «        S )z¥Process a single MongoDB document into a Document object.

        Args:
            doc: The MongoDB document dictionary to process into a Document object.
        Ú )Údefault)Údatabaser   Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS © )Ústr)Ú.0Úvalues     r!   ú
<listcomp>z3MongodbLoader._process_document.<locals>.<listcomp>§   s   € Ð=Ð=Ð= E•S˜‘Z”ZÐ=Ð=Ð=r(   ú )Úpage_contentÚmetadata)Ú_extract_fieldsr   r   Úupdater   r   r   ÚvaluesÚjoinrK   r	   )r   r;   rQ   ÚfieldsÚtextsÚtexts         r!   r9   zMongodbLoader._process_document“   sË   € ð ×'Ò'¨¨TÔ-@È"Ð'ÑMÔMˆð Ô1ð 	Ø�OŠOà $¤Ø"&Ô"6ðð ñô ð ð ÔÐ'Ø×)Ò)¨#¨tÔ/?ÈÐ)ÑLÔLˆFØ=Ð=¨V¯]ª]©_¬_Ð=Ñ=Ô=ˆEØ—8’8˜E‘?”?ˆDˆDå�s‘8”8ˆDå T°HÐ=Ñ=Ô=Ð=r(   c                 ó„   — t          | j        ¦  «        pg }t          | j        ¦  «        pg }||z   }|rd„ |D ¦   «         ndS )zuConstructs the projection dictionary for MongoDB query based
        on the specified field names and metadata names.c                 ó   — i | ]}|d “ŒS )é   rJ   )rL   Úfields     r!   ú
<dictcomp>z7MongodbLoader._construct_projection.<locals>.<dictcomp>´   s   € Ð1Ð1Ð1˜U��qÐ1Ð1Ð1r(   N)Úlistr   r   )r   r   r   Ú
all_fieldss       r!   r7   z#MongodbLoader._construct_projection®   sW   € õ ˜4Ô+Ñ,Ô,Ð2°ˆÝ˜dÔ1Ñ2Ô2Ð8°bˆØ  >Ñ1ˆ
Ø5?ÐIÐ1Ð1 jÐ1Ñ1Ô1Ð1ÀTÐIr(   rF   r4   rV   rG   c                 ó¾   — i }|pg D ]U}|}|                      d¦  «        D ] }|                     ||¦  «        }||k    r nŒ!|                     dd¦  «        }|||<   ŒV|S )zAExtracts and returns values for specified fields from a document.r=   Ú_)ÚsplitÚgetÚreplace)	r   r4   rV   rG   Ú	extractedr\   rM   ÚkeyÚnew_field_names	            r!   rR   zMongodbLoader._extract_fields¶   sŠ   € ð ˆ	Ø�\˜rð 	.ð 	.ˆEØˆEØ—{’{ 3Ñ'Ô'ð ð �ØŸ	š	 # wÑ/Ô/�Ø˜GÒ#Ð#Ø�Eð $à"Ÿ]š]¨3°Ñ4Ô4ˆNØ(-ˆI�nÑ%Ð%ØÐr(   )rF   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rK   r   r   r   Úboolr"   r   r	   r'   r   r5   r   r.   r&   r9   r7   rR   rJ   r(   r!   r   r      sÅ  € € € € € Ø!Ð!ð +/Ø/3Ø26Ø26ð9Bð 9Bð 9Bàð9Bð ð9Bð ð	9Bð " $œð9Bð ˜h sœmÔ,ð9Bð ! ¨#¤Ô/ð9Bð ,0ð9Bð 
ð9Bð 9Bð 9Bð 9Bðv)�d˜8”nð )ð )ð )ð )ð˜8 HÔ-ð ð ð ð ð<	. -°Ô"9ð 	.ð 	.ð 	.ð 	.ð˜T (œ^ð ð ð ð ð$> Tð >¨hð >ð >ð >ð >ð6J x°¤~ð Jð Jð Jð Jð ð	ð àðð ˜”ðð ð	ð
 
ðð ð ð ð ð r(   r   )r$   ÚloggingÚtypingr   r   r   r   r   r   Úlangchain_core.documentsr	   Ú)langchain_community.document_loaders.baser
   Ú	getLoggerrh   rA   r   rJ   r(   r!   ú<module>rr      s»   ðØ €€€Ø €€€Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ Jà -Ð -Ð -Ð -Ð -Ð -à @Ð @Ð @Ð @Ð @Ð @à	ˆÔ	˜8Ñ	$Ô	$€ðzð zð zð zð z�Jñ zô zð zð zð zr(   