
    E&jWC                     8    d dl   G d de      Z G d d      Zy)    )*c                       e Zd Zd Zy)CmfCacheClusterOutdatedc                     || _         y N)cluster_name)selfr   s      ./cmf/util/cache_cluster_calc.py__init__z CmfCacheClusterOutdated.__init__   s
    (    N)__name__
__module____qualname__r    r   r
   r   r      s    )r   r   c                       e Zd ZdZedd       Zedd       Zed        Zed        Zedd       Z	ed        Z
ed	        Zed
        Zy)CmfCacheClusterCalcu  
    Кеш 2.0
    https://bcrm.carbonsoft.ru/project/Document/DOC-016279#spec-cach-ev2-0
    Один на APP

    # TODO1: авто-поля
        # Авто-загружаемые поля
        for field_name, field in model.fields.items():
            if field.load_mode == 'always' and field_name not in obj_fields:
                obj_fields.append(field_name)
    
    # TODO0: sget/slist
    Nc	           	          | j                  ||||||      }	t        j                  }
|r)t        |	D cg c]  }| j	                  ||       c}      }	|	D ]  }||
v st        |       t        |	      S c c}w )N)
obj_fields
obj_filterobj_order_byobj_group_by)_calc_query_clustersgdeferred_cache2_inc_versionsset_bucket_hashr   sorted)clsuse_bucketsbucket_sizemodeloperater   r   r   r   resdirty_clusterskr   s                r
   calc_query_clustersz'CmfCacheClusterCalc.calc_query_clusters   s    &&ug*2<<4@ ' B 77EAs'';7EFC 	<L~--l;;	< c{	 Fs   A4c           	      ~   ddl }t               }| j                  ||      }	|dv r$|j                  | j	                  ||g|	             |dk(  r|	D ]#  }
|j                  |
 d|j                   d       % |D cg c]  }|j                  d      d    c}D ]  }|dk(  r	|d	k(  s
|d
k(  s|dk(  rt        ||d      }|st        d|j                   d|        D|dk(  rJ|j                  d      rt        ||dd d      }|r|}|dd }|	D ]%  }
|j                  |
 d|j                   d|        '  |S c c}w )u1   
        Расчет кластеров
        r   N)listcount)r   
model_listcachecluster_listr(   ..insdel--	ui_moduleui_namecode_prefixU   WARNING! В запросе запрошено несуществующее поле: id_id)
cmf.fieldsr    _cachecluster_values_from_filterupdate_clusters_from_filteradd
class_name	partitiongetattrprintendswith)r   r!   r"   r   r   r   r   cmfr#   r+   cacheclusterf
field_namefield	rel_fields                  r
   r   z(CmfCacheClusterCalc._calc_query_clusters'   s   
 	e@@
S''JJs00JTYSZn0  A  Bf 1 E<.%*:*:);7CDE
 =GGqq{{3/2G O
%,
i0G:YfKfz48qrw  sC  sC  rD  DE  FP  EQ  R  S% &&u- 'z#2 EI  )%/_
$5 OLGG|nAe.>.>-?qMNO)O0 
1 Hs   :D:c           	          dd l }	 | j                  |||||      }
|r)t        |
D cg c]  }| j                  ||       c}      }
t        j                  }|
D ]  }||v st        |       t        |
      S c c}w )Nr   )r   r   )cProfilelenProfile_calc_query_clusters_with_dataprint_statsr   r   r   r   r   r   )r   r   r    r!   r"   
query_datar   r   rG   prr#   r%   r$   r   s                 r
   calc_query_clusters_with_dataz1CmfCacheClusterCalc.calc_query_clusters_with_dataV   s     44UGZCMZd 5 fCEAs'';7EFC77 	<L~--l;;	< c{ Fs   A8c                     dd l }t               }| j                  ||      }|dk(  r,|s*|D ]#  }	|j                  |	 d|j                   d       % |S |dv r |r|dk(  r!|j                  d|j
                          |g}|D ]  }
|D cg c]  }|j                  d      d    c}D ]  }|dk(  r
|dk(  s
|d	k(  s|d
k(  rt        ||d       }|st        d|j                   d|        E	 t        ||j                  j                        rFt        |
|      }|sut        |d      r|j                  r|j                  d|j
                          t        ||j                  j                        rMt        |
|      }|s|D ]9  }t        |d      r|j                  r|j                  d|j
                          ; t        ||j                  j                         s;t        |
|      }t#        |t$              s|j&                  se|si|D ]9  }t        |d      r|j                  r|j                  d|j
                          ;   |S |dk(  r	 |S t        d|       c c}w # t        $ r}t        |       |d }~ww xY w)Nr   getr,   r-   )rP   r(   zID.r.   r/   r0   r1   r2   is_ellipsis_idobjr(   u&   Неизвестный ператор )r6   r   r7   r:   r;   r3   r<   r=   r>   
issubclassfieldsCmfRelationBasehasattrrQ   	Exception
CmfM2MBaseCmfBackrefBase
isinstancer(   
is_defined)r   r!   r"   rL   r   r   r@   r#   r+   rA   objrB   rC   rD   subobjesubobj_lists                    r
   rJ   z2CmfCacheClusterCalc._calc_query_clusters_with_datai   s   e@@
S eJ 1 E<.%*:*:);7CDE J o%*%#jmm_-.(\
! 77 AK"K11;;s#3A#6"K 17J!T) ![0J)4Kz]jOj #E:t<E  uv{  wG  wG  vH  HI  JT  IU  V  W  #E3::+E+EF!(j!9%$"6+>?FD\D\$#fii[ 12
 "%)>)>?&-c:&>*$&1 7F&v/BCH`H` (GGc&))$56	7 "%)B)BC '.c:&>)+t<[E[E[$*$&1 7F&v/BCH`H` (GGc&))$56	7[1777r Jf 
 DWINOOq #L( %  a s*   
I-..I2I26I22	J;JJc           	      .   dd l }t               }|s|S t        |d   t              s,|D ]%  }|j	                  | j                  |||             ' |S |d   dv r/|dd  D ]%  }|j	                  | j                  |||             ' |S |d   }|d   }|j                  d      \  }	}
}|D ]  }t        ||	d       }|st        d       |s|	j                  d      rt        ||	d d d       }|r|}|	d d }	|D ]%  }|j                  | d|j                   d|	        ' |d	k(  r3|j	                  | j                  |d
   |j                                      t        ||j                  j                        r*|D ]%  }|j                  | d|j                   d|	        ' t        ||j                  j                         rt#        d      t        ||j                  j$                        rp|j&                  }|j(                  }|j                  d      \  }}
}
|j                  d| d|        |j                  d| d       |j                  d| d|        |j	                  | j                  |g|dd  |j                                       |S )Nr   )r+   )ORAND   r,   uO   WARNING! В запросе указано несуществующее полеr4   r5   EXISTS   )r*   TODOzALL.r-   )r6   r   rY   strr8   r9   r<   r=   r>   r?   r:   r;   related_modelsrR   rS   rT   rW   rV   rX   r!   backref)r   r   r*   r+   r@   r#   i
field_pathoprC   _field_right_pathr!   rD   rE   rA   b_model_nameb_back_field_nameb_filter_field_names                      r
   r9   z)CmfCacheClusterCalc._clusters_from_filter   s   eJ*Q-- j

344Q
Vg4hijJa=M)^ j

344Q
Vg4hijJ]
]*4*>*>s*C'
A' 0	zEE:t4Egi#&&u- 'z#2 EI  )%/_
$5 OLGG|nAe.>.>-?qMNO
 >JJs88ASXSgSgSi8jk%!;!;<$5 OLGG|nAe.>.>-?qMNO %!6!67''%!:!:;${{$)MM!,<,F,Fs,K)#Q $|nA.?-@AB $|nG45 $|nA.A-BCDJJs002B1TZPQPR^1Tafauauaw0xya0	zf 
r   c                     dg|j                   }| j                  ||      }|sdgS t        |j                               }||   S )u=   
        Кеш-кластера из запроса
        parentALL)cache_cluster_fields$_cachecluster_values_from_filter_rawmaxkeys)r   r!   r   rt   datamax_cluster_weights         r
   r7   z4CmfCacheClusterCalc._cachecluster_values_from_filter  sR    
 !)F5+E+EF778LjY7N -&''r   c                   
 dd l 
i t              D ci c]  \  }}||
 c}}
fd}fd}|sy t        |d   t              s!|D ]  } || j	                  |              S |d   dv ry |d   dv r$|dd  D ]  } || j	                  |              S t        |      dk(  r)|\  }}}	|dvry |d	v r
 |||	g       |d
k(  r	 |||	       S t        d|       c c}}w )Nr   c                 ^   | j                  d      r| d d } | vry |    }|vrt               |<   g }|D ]`  }t        |j                  j                        r|j
                  }t        |d      rt        |j                        }|j                  |       b |   j                  |       y )Nr4   r5   r3   )r?   r   rY   rS   CmfTypevaluerU   rf   r3   appendr8   )	rC   field_value_listweightnormalize_field_value_listvrt   r@   field_weightsr#   s	        r
   add_cluster_fieldzSCmfCacheClusterCalc._cachecluster_values_from_filter_raw.<locals>.add_cluster_field  s    ""5)'_
!55":.FS !eF)+&% 5a!3!34A1d#ADD	A*11!45 K9:r   c                     | sy | j                         D ]*  \  }}|vrt               |<   |   j                  |       , y r   )itemsr   r8   )res2wclistr#   s      r
   __mergezICmfCacheClusterCalc._cachecluster_values_from_filter_raw.<locals>.__merge0  sD     JJL %5C< UCFAe$%r   )r`   )ra   rb      )===IN)r   r   r   zUnknown filter: )r6   	enumeraterY   rf   ru   rH   rV   )r   rt   r   r   rC   r   _CmfCacheClusterCalc__mergeri   rk   field_valuer@   r   r#   s    `        @@@r
   ru   z8CmfCacheClusterCalc._cachecluster_values_from_filter_raw  s.   ENOcEde/AvzF*e	;&	% *Q-- [@@AUWXYZ[Ja=F"a=G#^ [@@AUWXYZ[Jz?a*4'JK**[ !*{m<Tz!*k:J*:,788q fs   C&c                    g }| j                  d      D ]  }d|v r|j                  d      \  }}t        |      dk7  rt        d|       |j                  d      r|dd  }t	        |j                  dd      d	      |z  }|j                  | d|d
t        t        |             d       |j                  |        dj                  |      S )Nr,   :$   u6   Двойной рассчет _bucket_hash для key=Hrb   -    z0>)	splitrH   rV   
startswithintreplacer~   rf   join)keyr    r#   part
model_nameuuidhshs          r
   r   z CmfCacheClusterCalc._bucket_hashU  s     IIcN 	Dd{#'::c? 
Dt9?#&]Y\X^$_``??3'8D$,,sB/4{B

j\3r#c+6F2G1H .H*IJKJJt	 xx}r   )NN)NN)rs   )r   r   r   __doc__classmethodr&   r   rN   rJ   r9   r7   ru   staticmethodr   r   r   r
   r   r      s     
 
 , ,\  $ T Tl H HT 	( 	( ;9 ;9z  r   r   N)cmf.includerV   r   r   r   r   r
   <module>r      s     
)i )
a ar   