o
    "i                     @   s   d Z ddlmZmZmZmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZmZ G dd de	eeef ZG d	d
 d
e	eddf ZeeZeeZdS )z
CRUD operations for metadata
    )ListOptionalDictAny)Session)CRUDBase)KnowledgeMetadataFieldDocumentMetadataValue)MetadataFieldCreateMetadataFieldUpdatec                	   @   s   e Zd ZdZdededee fddZdedede	de
e fdd	Zded
ededefddZdedeee	ef  defddZdS )CRUDMetadataFieldz#CRUD operations for metadata fieldsdbknowledge_base_idreturnc                C   s$   | | jtj|ktj S )z,Get all metadata fields for a knowledge base)querymodelfilterr   r   order_by
sort_orderall)selfr   r    r   9/lsinfo/ai/hellotax_ai/base_platform/app/crud/metadata.pyget_by_knowledge_base   s
   
z'CRUDMetadataField.get_by_knowledge_base	field_keyc                C   $   | | jtj|ktj|k S )z7Get a metadata field by its key within a knowledge base)r   r   r   r   r   r   first)r   r   r   r   r   r   r   get_by_field_key      
z"CRUDMetadataField.get_by_field_keyobj_inc                C   s   | tjtj|ktj  }|r|d d nd}t||j|j	|j
|j|j|j|j|d	}|| |  || |S )z,Create a metadata field for a knowledge baser      )	r   
field_namer   
field_typefield_optionsdefault_valueis_requireddescriptionr   )r   r   r   r   r   r   descr   r!   r   r"   r#   r$   r%   r&   addcommitrefresh)r   r   r   r   	max_order
next_orderdb_objr   r   r   create_with_knowledge_base&   s*   


z,CRUDMetadataField.create_with_knowledge_basereorder_datac                C   sB   |D ]}| | j| jj|d kd|d i q|  dS )z"Batch update sort order for fieldsfield_idr   T)r   r   r   idupdater)   )r   r   r/   itemr   r   r   batch_reorderC   s   zCRUDMetadataField.batch_reorderN)__name__
__module____qualname____doc__r   intr   r   r   strr   r   r
   r.   r   boolr4   r   r   r   r   r      sD    


r   c                
   @   s   e Zd ZdZdededee fddZdededede	e fdd	Z
dededed
e	e def
ddZdedededefddZdededefddZdededeee	e f dee fddZdS )CRUDDocumentMetadataValuez,CRUD operations for document metadata valuesr   document_idr   c                C   s   | | jtj|k S )z&Get all metadata values for a document)r   r   r   r	   r=   r   )r   r   r=   r   r   r   get_by_documentR   s   
z)CRUDDocumentMetadataValue.get_by_documentr0   c                C   r   )zGet a specific metadata value)r   r   r   r	   r=   r0   r   )r   r   r=   r0   r   r   r   get_by_document_and_field\   r   z3CRUDDocumentMetadataValue.get_by_document_and_fieldvaluec                C   sJ   | j |||d}|r||_nt|||d}|| |  || |S )zSet or update a metadata valuer=   r0   r=   r0   r@   )r?   r@   r	   r(   r)   r*   )r   r   r=   r0   r@   r-   r   r   r   	set_valuei   s   

z#CRUDDocumentMetadataValue.set_valuec                C   s.   | j |||d}|r|| |  dS dS )zDelete a metadata valuerA   TF)r?   deleter)   )r   r   r=   r0   r-   r   r   r   delete_by_document_and_field   s   
z6CRUDDocumentMetadataValue.delete_by_document_and_fieldc                C   s(   | | jtj|k }|  |S )z7Delete all metadata values for a field (cascade delete))r   r   r   r	   r0   rD   r)   )r   r   r0   countr   r   r   delete_by_field   s   z)CRUDDocumentMetadataValue.delete_by_fieldmetadatac                C   sX   g }|  D ]#\}}|du s|dkr| j|||d q| j||||d}|| q|S )z+Batch update metadata values for a documentN rA   rB   )itemsrE   rC   append)r   r   r=   rH   resultsr0   r@   resultr   r   r   batch_update_document_metadata   s   z8CRUDDocumentMetadataValue.batch_update_document_metadataN)r5   r6   r7   r8   r   r9   r   r	   r>   r   r?   r:   rC   r;   rE   rG   r   rN   r   r   r   r   r<   O   sl    






r<   N)r8   typingr   r   r   r   sqlalchemy.ormr   app.crud.baser   app.models.knowledge_baser   r	   app.schemas.metadatar
   r   r   r<   metadata_fielddocument_metadata_valuer   r   r   r   <module>   s    D^