
    +j!                    l   d dl mZ d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZmZmZmZmZmZmZmZmZ d dlmZ erd d	lmZ  G d
 de
          Z G d de
          Z G d de
          Z G d de
          Z G d de
          Ze G d d                      Z 	 d!d"dZ!d#d Z"dS )$    )annotationsN)	dataclass)datetime)TYPE_CHECKINGAny	TypedDict)Session)	bulk_insert_assets'bulk_insert_references_ignore_conflictsbulk_insert_tags_and_metadelete_assets_by_idsget_existing_asset_idsget_reference_ids_by_ids%get_references_by_paths_and_asset_ids#get_unreferenced_unhashed_asset_idsrestore_references_by_paths)get_utc_now)ExtractedMetadatac                  x    e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   dS )SeedAssetSpecz*Spec for seeding an asset from filesystem.strabs_pathint
size_bytesmtime_ns	info_namez	list[str]tagsfnamezExtractedMetadata | Nonemetadata
str | Nonehash	mime_typejob_idN__name__
__module____qualname____doc____annotations__     ?/home/wildlama/comfy/ComfyUI/app/assets/services/bulk_ingest.pyr   r      s~         44MMMOOOMMMNNNOOOJJJ&&&&r+   r   c                  F    e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   dS )AssetRowz Row data for inserting an Asset.r   idr    r!   r   r   r"   r   
created_atNr$   r*   r+   r,   r.   r.   +   sN         **GGGOOOr+   r.   c                      e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   d
ed<   ded<   ded<   ded<   dS )ReferenceRowz)Row data for inserting an AssetReference.r   r/   asset_id	file_pathr   r   owner_idnamer    
preview_iddict[str, Any] | Noneuser_metadatar#   r   r0   
updated_atlast_access_timeNr$   r*   r+   r,   r2   r2   5   s         33GGGMMMNNNMMMMMMIII((((r+   r2   c                  <    e Zd ZU dZded<   ded<   ded<   ded<   dS )	TagRowzRow data for inserting a Tag.r   asset_reference_idtag_nameoriginr   added_atNr$   r*   r+   r,   r=   r=   F   sB         ''MMMKKKr+   r=   c                  Z    e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   dS )MetadataRowz&Row data for inserting asset metadata.r   r>   keyr   ordinalr    val_strzfloat | Noneval_numzbool | Noneval_boolr8   val_jsonNr$   r*   r+   r,   rC   rC   O   sf         00HHHLLL######r+   rC   c                  2    e Zd ZU dZded<   ded<   ded<   dS )BulkInsertResultzResult of bulk asset insertion.r   inserted_refs	won_paths
lost_pathsNr$   r*   r+   r,   rK   rK   [   s4         ))NNNOOOOOr+   rK    sessionr	   specslist[SeedAssetSpec]r5   r   returnc                   |st          ddd          S t                      }g }g }i i g }|D ]c}t          j                            |d                   }t          t          j                              }	t          t          j                              }
|                    |           |	|<   |	                    d          }|                    |	|	                    d          |d         ||d           |	                    d          }|r|
                                }n|d	         rd
|d	         i}nd}|                    |
|	||d         ||d         d||	                    d          |||d           |
|d         |d	         |d|	<   et          | |           t          | d |D                       fd|D             }t          | |           t          | |           t          |           }fd|D             }||z
  }fd|D             }|rt!          | |           |st          ddt#          |                    S fd|D             }t%          | |          }g }g }|r|D ]}|         }	|	         }|d         }||vr|d         D ]}|                    ||d|d           |	                    d          }|r)|                    |                    |                     |d
         r#|                    |d
d|d
         dddd           t+          | ||           t          t#          |          t#          |          t#          |                    S )a  Seed assets from filesystem specs in batch.

    Each spec is a dict with keys:
      - abs_path: str
      - size_bytes: int
      - mtime_ns: int
      - info_name: str
      - tags: list[str]
      - fname: Optional[str]

    This function orchestrates:
    1. Insert seed Assets (hash=NULL)
    2. Claim references with ON CONFLICT DO NOTHING on file_path
    3. Query to find winners (paths where our asset_id was inserted)
    4. Delete Assets for losers (path already claimed by another asset)
    5. Insert tags and metadata for successfully inserted references

    Returns:
        BulkInsertResult with inserted_refs, won_paths, lost_paths
    r   )rL   rM   rN   r   r"   r!   r   )r/   r!   r   r"   r0   r   r   filenameNr   r   r#   )r/   r3   r4   r   r5   r6   r7   r9   r#   r0   r:   r;   r   )reference_idr   rU   extracted_metadatac                    g | ]
}|d          S r3   r*   ).0rs     r,   
<listcomp>z,batch_insert_seed_assets.<locals>.<listcomp>   s    888A!J-888r+   c                (    g | ]}|d          v |S rY   r*   )rZ   r[   inserted_asset_idss     r,   r\   z,batch_insert_seed_assets.<locals>.<listcomp>   s(    WWWA1Z=DV3V3Va3V3V3Vr+   c                (    h | ]}|         v |S r*   r*   )rZ   pathr^   path_to_asset_ids     r,   	<setcomp>z+batch_insert_seed_assets.<locals>.<setcomp>   s4       D!%777 	777r+   c                     g | ]
}|         S r*   r*   )rZ   r`   ra   s     r,   r\   z,batch_insert_seed_assets.<locals>.<listcomp>   s    FFF&t,FFFr+   c                8    g | ]}|                  d          S )rV   r*   )rZ   r`   asset_id_to_ref_datara   s     r,   r\   z,batch_insert_seed_assets.<locals>.<listcomp>   s9        	-d34^D  r+   rV   	automatic)r>   r?   r@   rA   rW   )r>   rD   rE   rF   rG   rH   rI   )tag_rows	meta_rows)rK   r   osr`   abspathr   uuiduuid4appendgetto_user_metadatar
   r   r   r   r   r   lenr   extendto_meta_rowsr   )rP   rQ   r5   current_time
asset_rowsreference_rowsabsolute_path_listspecabsolute_pathr3   rV   r"   rW   r9   winning_pathsinserted_pathslosing_pathslost_asset_idswinning_ref_idsinserted_ref_idsrg   metadata_rowsr`   ref_dataref_idtagre   r^   ra   s                             @@@r,   batch_insert_seed_assetsr   d   s   2  La1KKKK==L!#J)+N'),.$& 1
 1
Z(899tz||$$4:<<((!!-000*2'HH[))	(("<0&* 	
 	
 	
 "XXj11 	!3E3V3V3X3XMM'] 	!'g7MM M"$* ,$[)"!.((8,,**$0 	
 	
 	
$ )LW"4	*
 *
X&& w
+++ 088888  XWWWWWWN+G^DDD);<<<9'CSTTM    &  N
 "M1LFFFFFFFN 6Wn555 
<((
 
 
 	
    !  O 0IIH')M #! "	 "	D'-H+H5Hn-F---'  .4$'"-$0	     "*.B!C!C! $$%7%D%DV%L%LMMMM*% $$.4)#$#+J#7#'$($( 
 
 
 gMRRRR*++m$$|$$   r+   r   c                @    t          |           }t          | |          S )zHard-delete unhashed assets with no active references.

    This is a destructive operation intended for explicit cleanup.
    Only deletes assets where hash=None and all references are missing.

    Returns:
        Number of assets deleted
    )r   r   )rP   unreferenced_idss     r,   cleanup_unreferenced_assetsr     s#     ;7CC)9:::r+   )rO   )rP   r	   rQ   rR   r5   r   rS   rK   )rP   r	   rS   r   )#
__future__r   ri   rk   dataclassesr   r   typingr   r   r   sqlalchemy.ormr	   app.assets.database.queriesr
   r   r   r   r   r   r   r   r   app.assets.helpersr   $app.assets.services.metadata_extractr   r   r.   r2   r=   rC   rK   r   r   r*   r+   r,   <module>r      sb   " " " " " " 				  ! ! ! ! ! !       0 0 0 0 0 0 0 0 0 0 " " " " " "
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 + * * * * * GFFFFFF    I       y       9   "    Y   	$ 	$ 	$ 	$ 	$) 	$ 	$ 	$         j j j j jZ
; 
; 
; 
; 
; 
;r+   