Qj"UdZddlZddlmZddlmZ ddlmZn#e$rddl Z e j e ZYnwxYwda e ed<ejZded efd Zd ed ed dfd Zdded ed dfdZdS)u= gemma_unified_builder.py ======================== Costruisce/aggiorna gemma_unified.db — DB SQLite che fonde: - gemma.parquet (sorgente Gemma) - LINKER_VALUTAZIONE in linker.db (sinottico utente) Usato da: - app/main.py → build in background all'avvio dell'app - database_logic.py → build lazy al primo accesso MediaTrack - linker_db.py → invalida il file dopo salva_valutazioni() Struttura di gemma_unified.db: - tabella `gemma` : copia 1:1 di gemma.parquet - tabella `valutazioni_unified`: una riga per IMDB, con GEM_SIN='G'|'S' N) defaultdict)Path)logger _built_mtimedate_strreturnc|pd}t|dkr:|ddkr.|ddkr"|ddd|ddd|d dS|S) zMNormalizza data a YYYY-MM-DD per confronto. Gestisce DD/MM/YYYY e YYYY-MM-DD. /-r)striplen)rds ;C:\PYTHON\MyICR_Suite\launcher_src\gemma_unified_builder.py_to_isor!sw R  A 1vv||! ! AbD'--AacF--QqsV--- Hgemma_db linker_dbcddl}|t|} |d}t t }|D]+}|dr!||d|,i}|D]\}} t| dd} t | d} | ddD]>}tddD]+} | |  | | d kr|| d vr || | | <,?t| ||<i} |r| r|t|} |d }n#t$rg}YnwxYw|n#|wxYw|D]1}|d|d pd }}|| vs|| |d pd kr|| |<2|d |dt|t| z}gg}}|D]j}||}| |}|rt#|d nd }|rt#|dnd }|duo |dup||k}|rt|||dd|d|d|d|d|d|d|d|d|d|d|dd|d f|||d|d|d |d|d|d|d|d|d|d|d|d|d|d|d|dfl|d|d||d||d|dS#|wxYw) uP Crea la tabella valutazioni_unified dentro gemma_db. Per ogni IMDB: coalesce i campi non-NULL tra tutte le righe Gemma (ordinate per A_DATA DESC), poi confronta con la riga sinottica più recente in LINKER_VALUTAZIONE. La sinottica vince solo se la sua DATA è più recente di A_DATA Gemma per lo stesso IMDB. rNzSELECT A_COD_IMDB, A_DISTRIBUTORE, V_RDA, V_C5, V_I1, V_R4, V_LA5, V_I2, V_IRIS, V_TOP, V_FOC, V_C20, V_CI34, V_C27, A_SUPPORTO, A_DATA FROM gemmac,t|dS)N)r)rs rz,_build_valutazioni_unified..CsWQrU^^rT)keyreverser )Nr zSELECT COD_IMDB, FORNITORE, DATA, C5, I1, R4, LA5, I2, IRIS, TOPCRIME, FOCUS, C20, CINE34, TWENTYSEVEN FROM LINKER_VALUTAZIONE WHERE COD_IMDB IS NOT NULLr z(DROP TABLE IF EXISTS valutazioni_unifiedae CREATE TABLE valutazioni_unified ( A_COD_IMDB TEXT, A_DISTRIBUTORE TEXT, V_RDA TEXT, V_C5 TEXT, V_I1 TEXT, V_R4 TEXT, V_LA5 TEXT, V_I2 TEXT, V_IRIS TEXT, V_TOP TEXT, V_FOC TEXT, V_C20 TEXT, V_CI34 TEXT, V_C27 TEXT, A_SUPPORTO TEXT, A_DATA TEXT, GEM_SIN TEXT ) rrrr r BEGINzLINSERT INTO valutazioni_unified VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,'S')zLINSERT INTO valutazioni_unified VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,'G')COMMIT)sqlite3connectstrexecutefetchallrlistappenditemssortedrangetupleexists Exceptionclosesetgetr executemany)rr_slcon all_gemma imdb_groupsrow gemma_bestimdbrows rows_sortedmergedi sinot_bestlcon sinot_rowsdata all_imbdsrows_srows_ggss_dateg_date sinot_winss r_build_valutazioni_unifiedrV)s ++c(mm $ $CGKK X   (**  (--  0 0C1v 0CF#**3/// %++-- - -JD$ +C+CTRRRK+a.))F"122 + +q"++Aq )VAY"__#a&PZBZBZ$'Fq + %V}}Jt    +))++ +;;s9~~..D !\\I(**         ! + + VSV\rdz))TZ5Ea5H5NB-O-O'*Jt$ >???      OOc*oo5 R Q QDt$$At$$A&'/WQqT]]]RF'(0WQrU^^^bF$JAI,I69IJ Q tQqT41qtQqT1Q41qQRt !!aeQrUAbE1R5$!NOOOO qtQqT1Q41qtQqT1Q41qQRt !!aeQrUAbE1R5!B%2PQQQ G fhnooo fhnooo H  sCEP.+'FF: F"F:!F""F:%P.:GIP..Q parquet_dirc |dz }|dz }|sdS|j}|r-|r|jnd}t||}t|kr3|r|jdkrdS|r>|jdkr!|j|kr|adSt 5t|kr?|r+|jdkr ddddS|rJ|jdkr-|j|kr|a ddddS|dD]'} |#t$rY$wxYwtj dddl }ddl } ddl} ||jdd \} } | | t%| } ddl}ddl}| }|}|d |d }|tjd t5|d| |z dd| }|t7| } |d|ddd|jD}|d|d|dddt5|jz}|d|d|d|| dj!"|d|n#|wxYwtjd| |z ddtG| || $||atj d| |z ddnV#t$rI} | d !n#t$rYnwxYwtj%d"|Yd}~nd}~wwxYwddddS#1swxYwYdS)#u Assicura che gemma_unified.db sia aggiornato rispetto a gemma.parquet e LINKER_VALUTAZIONE. Operazione idempotente: non fa nulla se il file è già aggiornato. Chiamabile da qualsiasi modulo. z gemma.parquetzgemma_unified.dbNrrzgemma_unified_*.tmpz!Rigenerazione gemma_unified.db...z.tmpgemma_unified_)dirsuffixprefixzSELECT * FROM read_parquet('z')zgemma_unified: parquet letto (z righe) in z.1frRzPRAGMA journal_mode=OFFzPRAGMA synchronous=OFFz, c3"K|] }d|dV dS)"z" TEXTN).0cs r z'ensure_gemma_unified..s*$G$Gq]]]]$G$G$G$G$G$GrzDROP TABLE IF EXISTS gemmazCREATE TABLE gemma ()?r,zINSERT INTO gemma VALUES ()otherr-z*gemma_unified: write SQLite completato in zgemma_unified.db pronto in z s totali.T) missing_okzErrore build gemma_unified.db: )&r9statst_mtimemaxrst_size _build_lockglobunlinkr:rinfotempfileostimemkstempparentr;rduckdbr. monotonicr/r1dfdebugrr0joincolumnsr>wherenotnavaluestolistrVreplaceerror)rWr gemma_parquetgemma_unified_db parquet_mtime linker_mtime src_mtime_stale_tf_os_time_fd_tmp_strtmp_ddb_sl2_t0_duckrv_t1_tconcol_defs placeholderses rensure_gemma_unifiedrs["O3M"%77    ! !!&&((1M1:Zy?O?O?Q?QZINN$$--WZL |44Iy  %5%<%<%>%> CSCXCXCZCZCbefCfCf  %5%:%:%<%<%Dq%H%HM]MbMbMdMdMmqzMzMz  :@:@ 9 $ $)9)@)@)B)B $GWG\G\G^G^GfijGjGj :@:@:@:@:@:@:@:@  " " $ $ )9)>)>)@)@)H1)L)LQaQfQfQhQhQqu~Q~Q~$L  :@:@:@:@:@:@:@:@"&&'<==  F        7888888888888888 (8(?Wg hh X #8nn% @ ! ! ! ! " " " "//##CLLNNEOmOOOPPSSUUB KKMMM Lj#b''jjeooN_N_`cNcjjjj k k k//##CLLS**E  7888 677799$G$GBJ$G$G$GGG :;;; @X@@@AAA#yys2:)>??  g&&&!!@@@@HHRXXZZtH44;BBDD h'''  LbeooFWFWX[F[bbbb c c c &sI 6 6 6 KK( ) ) )$L KZeoo6G6G6KZZZZ [ [ [ [ @ @ @  d ++++     L>1>> ? ? ? ? ? ? ? ?  @k:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@s>U>AU>;U>G('U>( G52U>4G55A'U>C#TD(Q>)T>RBTU> U.&T=<U)= U U) U  U)$U>)U..U>>VV)N)__doc__ threading collectionsrpathlibrlogurur ImportErrorlogging getLogger__name__rfloat__annotations__Lockrkr0rrVrr_rrrsZ"######))))NNN W x ( (FFF)  ein  c c    SS$S4SSSSlR@R@dR@tR@tR@R@R@R@R@R@s 88