§
    ÔŸ’jÜ  ã                  ót   — d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z
 ddlmZ ddlmZ  G d	„ d
¦  «        ZdS )z;Qdrant vector store helpers for DSCons knowledge retrieval.é    )ÚannotationsN)ÚAny)ÚQdrantClient)Úmodels)ÚSettings)ÚEmbeddingServicec                  ó�   — e Zd ZdZd(d„Zed)d
„¦   «         Zd*d„Zdddœd+d„Zd,d„Z		 d-ddddœd.d"„Z
d#dd$œd/d%„Zed0d'„¦   «         ZdS )1ÚQdrantStorezFSmall wrapper around qdrant-client for collection, upsert, and search.Úsettingsr   Úembedding_servicer   ÚreturnÚNonec                ón   — || _         || _        t          |j        ¬¦  «        | _        |j        | _        dS )z4Initialize the store client and collection metadata.)ÚurlN)Ú	_settingsÚ_embedding_servicer   Ú
qdrant_urlÚ_clientÚqdrant_collectionÚ_collection_name)Úselfr   r   s      ú/C:\Projects\DSCons\app\services\qdrant_store.pyÚ__init__zQdrantStore.__init__   s7   € à!ˆŒØ"3ˆÔÝ#¨Ô(;Ð<Ñ<Ô<ˆŒØ (Ô :ˆÔÐÐó    Ústrc                ó   — | j         S )z&Return the configured collection name.)r   )r   s    r   Úcollection_namezQdrantStore.collection_name   s   € ð Ô$Ð$r   c                óê  — | j                              ¦   «         j        }| j        j        }|D ]�}|j        | j        k    ro	 | j                              | j        ¬¦  «        }|j        j	        j
        j        |k    r dS | j                              | j        ¬¦  «         Œq# t          $ r Y Œ}w xY wŒ‚| j                              | j        t          j        |t          j        j        ¬¦  «        ¬¦  «         dS )z>Create the configured collection if it does not already exist.)r   N)ÚsizeÚdistance)r   Úvectors_config)r   Úget_collectionsÚcollectionsr   Úvector_sizeÚnamer   Úget_collectionÚconfigÚparamsÚvectorsr   Údelete_collectionÚ	ExceptionÚcreate_collectionÚqdrant_modelsÚVectorParamsÚDistanceÚCOSINE)r   r#   Útarget_sizeÚcolÚinfos        r   Úensure_collectionzQdrantStore.ensure_collection   s+  € à”l×2Ò2Ñ4Ô4Ô@ˆØÔ-Ô9ˆàð 	ð 	ˆCØŒx˜4Ô0Ò0Ð0ð
Øœ<×6Ò6Ø(,Ô(=ð 7ñ ô �Dð ”{Ô)Ô1Ô6¸+ÒEÐEØ˜˜Ø”L×2Ò2Ø(,Ô(=ð 3ñ ô ð ð øõ !ð ð ð Ø�Dðøøøð 1ð 	Œ×&Ò&Ø Ô1Ý(Ô5Ø Ý&Ô/Ô6ðñ ô ð 	'ñ 	
ô 	
ð 	
ð 	
ð 	
s   Á :BÁ= BÂ
B+Â*B+N)Ú	metadatasÚidsÚtextsú	list[str]r5   úlist[dict[str, Any]] | Noner6   úlist[str] | NoneÚintc               ó\  ‡‡‡‡— ‰sdS |                       ¦   «          | j                             ‰¦  «        Š|pd„ ‰D ¦   «         Š|pd„ ‰D ¦   «         Šˆˆˆˆfd„t          t	          ‰¦  «        ¦  «        D ¦   «         }| j                             | j        |¬¦  «         t	          |¦  «        S )z#Embed and upsert texts into Qdrant.r   c                ó   — g | ]}i ‘ŒS © r>   ©Ú.0Ú_s     r   ú
<listcomp>z,QdrantStore.upsert_texts.<locals>.<listcomp>F   s   € Ð 3Ð 3Ð 3¨ Ð 3Ð 3Ð 3r   c                óN   — g | ]"}t          t          j        ¦   «         ¦  «        ‘Œ#S r>   )r   ÚuuidÚuuid4r?   s     r   rB   z,QdrantStore.upsert_texts.<locals>.<listcomp>G   s&   € Ð=Ð=Ð=°!�C¥¤
¡¤Ñ-Ô-Ð=Ð=Ð=r   c           	     ót   •— g | ]4}t          j        ‰|         ‰|         ‰|         ‰|         d œ¬¦  «        ‘Œ5S ))ÚtextÚmetadata©ÚidÚvectorÚpayload)r-   ÚPointStruct)r@   ÚindexÚpayloadsÚ	point_idsr7   r)   s     €€€€r   rB   z,QdrantStore.upsert_texts.<locals>.<listcomp>I   s_   ø€ ð 
ð 
ð 
ð õ Ô%Ø˜UÔ#Ø˜u”~Ø!& u¤¸8ÀE¼?ÐKÐKðñ ô ð
ð 
ð 
r   ©r   Úpoints)r4   r   Úembed_textsÚrangeÚlenr   Úupsertr   )r   r7   r5   r6   rR   rO   rP   r)   s    `   @@@r   Úupsert_textszQdrantStore.upsert_texts9   sâ   øøøø€ ð ð 	Ø�1à×ÒÑ Ô Ð ØÔ)×5Ò5°eÑ<Ô<ˆØÐ3Ð 3Ð 3¨UÐ 3Ñ 3Ô 3ˆØÐ=Ð=Ð=°uÐ=Ñ=Ô=ˆ	ð
ð 
ð 
ð 
ð 
ð 
ð 
õ �s 5™zœzÑ*Ô*ð
ñ 
ô 
ˆð 	Œ×Ò¨DÔ,AÈ&ÐÑQÔQÐQÝ�6‰{Œ{Ðr   rR   úlist[dict[str, Any]]c              ƒ  ó®   K  — |sdS |                       ¦   «          d„ |D ¦   «         }| j                             | j        |¬¦  «         t	          |¦  «        S )z$Upsert pre-built points into Qdrant.r   c                óÔ   — g | ]e}t          j        |                     d t          t	          j        ¦   «         ¦  «        ¦  «        |d         |                     di ¦  «        ¬¦  «        ‘ŒfS )rJ   rK   rL   rI   )r-   rM   Úgetr   rD   rE   )r@   Úpoints     r   rB   z&QdrantStore.upsert.<locals>.<listcomp>Z   ss   € ð 
ð 
ð 
ð õ Ô%Ø—9’9˜T¥3¥t¤z¡|¤|Ñ#4Ô#4Ñ5Ô5Ø˜X”ØŸ	š	 )¨RÑ0Ô0ðñ ô ð
ð 
ð 
r   rQ   )r4   r   rV   r   rU   )r   rR   Úqdrant_pointss      r   rV   zQdrantStore.upsertT   ss   è è € àð 	Ø�1à×ÒÑ Ô Ð ð
ð 
ð  ð
ñ 
ô 
ˆð 	Œ×Ò¨DÔ,AÈ-ÐÑXÔXÐXÝ�=Ñ!Ô!Ð!r   é   )Úquery_vectorÚlimitÚfiltersÚqueryú
str | Noner_   úlist[float] | Noner`   ra   údict[str, Any] | Nonec               óÒ  — |                       ¦   «          |}|€+|€t          d¦  «        ‚| j                             |¦  «        }|                      |¦  «        }t          | j        dd¦  «        }t          |¦  «        r' || j        ||d|¬¦  «        }t          |d|¦  «        }	nIt          | j        dd¦  «        }
t          |
¦  «        st          d¦  «        ‚ |
| j        ||d|¬	¦  «        }	g }|	D ]t}|j
        pi }|                     t          |j        ¦  «        t          |j        ¦  «        ||                     d
d¦  «        |                     di ¦  «        pi dœ¦  «         Œu|S )z6Search the collection for chunks related to the query.Nz.Either query or query_vector must be provided.Úquery_pointsT)r   rb   r`   Úwith_payloadÚquery_filterrR   Úsearchz6Qdrant client does not support query_points or search.)r   r_   r`   rh   ri   rG   Ú rH   ©rJ   ÚscorerL   rG   rH   )r4   Ú
ValueErrorr   Úembed_queryÚ_build_query_filterÚgetattrr   Úcallabler   ÚAttributeErrorrL   Úappendr   rJ   Úfloatrm   r[   )r   rb   r_   r`   ra   rK   ri   rg   ÚresponseÚresultsÚsearch_methodÚitemsÚresultrL   s                 r   rj   zQdrantStore.searche   s¯  € ð 	×ÒÑ Ô Ð àˆØˆ>Øˆ}Ý Ð!QÑRÔRÐRØÔ,×8Ò8¸Ñ?Ô?ˆFà×/Ò/°Ñ8Ô8ˆå˜tœ|¨^¸TÑBÔBˆÝ�LÑ!Ô!ð 	Ø#�|Ø $Ô 5ØØØ!Ø)ðñ ô ˆHõ ˜h¨°(Ñ;Ô;ˆGˆGå# D¤L°(¸DÑAÔAˆMÝ˜MÑ*Ô*ð Ý$ØLñô ð ð $�mØ $Ô 5Ø#ØØ!Ø)ðñ ô ˆGð ')ˆØð 
	ð 
	ˆFØ”nÐ*¨ˆGØ�LŠLå˜fœi™.œ.Ý" 6¤<Ñ0Ô0Ø&Ø#ŸKšK¨°Ñ3Ô3Ø '§¢¨J¸Ñ ;Ô ;Ð A¸rðð ñô ð ð ð ˆr   éd   )r`   ra   c               ó„  — |                       ¦   «          |                      |¦  «        }d}g }	 | j                             | j        |dd||¬¦  «        \  }}|D ]b}|j        pi }|                     t          |j        ¦  «        d|| 	                    dd¦  «        | 	                    di ¦  «        pi d	œ¦  «         Œc|€nŒ‘|S )
z:Return points by metadata filter without semantic ranking.NTF)r   Úscroll_filterrh   Úwith_vectorsr`   Úoffsetg        rG   rk   rH   rl   )
r4   rp   r   Úscrollr   rL   rt   r   rJ   r[   )	r   r`   ra   ri   r   ry   ÚrecordsÚrecordrL   s	            r   r€   zQdrantStore.scrollž   sý   € ð 	×ÒÑ Ô Ð Ø×/Ò/°Ñ8Ô8ˆØˆØ&(ˆð	Ø"œl×1Ò1Ø $Ô 5Ø*Ø!Ø"ØØð 2ñ ô ‰OˆG�Vð "ð 
ð 
�Ø œ.Ð.¨B�Ø—’å! &¤)™nœnØ!$Ø#*Ø '§¢¨F°BÑ 7Ô 7Ø$+§K¢K°
¸BÑ$?Ô$?Ð$EÀ2ðð ñô ð ð ð ˆ~Øð+	ð. ˆr   úqdrant_models.Filter | Nonec                ól   — | sdS t          j        d„ |                      ¦   «         D ¦   «         ¬¦  «        S )z:Build a Qdrant metadata filter from plain key/value pairs.Nc                ól   — g | ]1\  }}t          j        d |› �t          j        |¬¦  «        ¬¦  «        ‘Œ2S )z	metadata.)Úvalue)ÚkeyÚmatch)r-   ÚFieldConditionÚ
MatchValue)r@   r‡   r†   s      r   rB   z3QdrantStore._build_query_filter.<locals>.<listcomp>Ì   s\   € ð ð ð ñ
 �C˜õ	 Ô,Ø) CÐ)Ð)Ý'Ô2¸Ð?Ñ?Ô?ðñ ô ðð ð r   )Úmust)r-   ÚFilterry   )ra   s    r   rp   zQdrantStore._build_query_filterÃ   sQ   € ð
 ð 	Ø�4åÔ#ðð ð
 #*§-¢-¡/¤/ðñ ô ð
ñ 
ô 
ð 	
r   )r   r   r   r   r   r   )r   r   )r   r   )r7   r8   r5   r9   r6   r:   r   r;   )rR   rX   r   r;   )N)
rb   rc   r_   rd   r`   r;   ra   re   r   rX   )r`   r;   ra   re   r   rX   )ra   re   r   rƒ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   r4   rW   rV   rj   r€   Ústaticmethodrp   r>   r   r   r
   r
      s  € € € € € ØPÐPð;ð ;ð ;ð ;ð ð%ð %ð %ñ „Xð%ð
ð 
ð 
ð 
ð> 26Ø $ðð ð ð ð ð ð6"ð "ð "ð "ð& !ð7ð ,0ØØ)-ð7ð 7ð 7ð 7ð 7ð 7ðx Ø)-ð	#ð #ð #ð #ð #ð #ðJ ð
ð 
ð 
ñ „\ð
ð 
ð 
r   r
   )r�   Ú
__future__r   rD   Útypingr   Úqdrant_clientr   Úqdrant_client.httpr   r-   Úapp.core.settingsr   Úapp.services.embeddingsr   r
   r>   r   r   ú<module>r™      s¼   ðØ AÐ Aà "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6à &Ð &Ð &Ð &Ð &Ð &Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4ðD
ð D
ð D
ð D
ð D
ñ D
ô D
ð D
ð D
ð D
r   