jFڣeddlmZddlmZmZddlmZmZmZmZm Z ddlm Z ddl m Z ddl mZmZmZmZmZddlmZddlmZmZmZdd lmZdd lmZd Zd ZGd deZdS))ceil)Integerdesc)and_selectfunccasecast)or_) uidconverter)gm_datetime_to_unixtimestamp gm_to_localunixtimestamp_to_gm_datetime local_to_gmround_1m)OutputFormatter)convert_to_listenumerate_duplicate_columnsadd_labes_to_column)dyn_time_unit_groups) history_govc&tj|ddtj|ddztj|ddzS)z :param sqlalchemy.orm.attributes.InstrumentedAttribute cause_of_restrict: :return sqlalchemy.sql.elements.BinaryExpression: &)rmaxopcause_of_restricts /builddir/build/BUILDROOT/lve-stats-4.3.2-1.el9.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/lvestats/lib/lveinfolib_gov.pyget_bitwise_restrictr"s *"%%c**1--.. (,$'',,Q// 0 0 1 (,$'',,Q// 0 0 1c t|dkdf|dkdf|dkdf|dkdf|d kd f|d kd f|d kdfgdS)zv :param sqlalchemy.sql.elements.BinaryExpression cause_of_restrict: :return sqlalchemy.sql.elements.Case: rCrRCRrWCWRWCRW)else_)r rs r!get_cause_of_restrictr2(s  ! #S ) ! #S ) ! #T * ! #S ) ! #T * ! #T * ! #U +     r#cheZdZdZ ddZdZdZd Zd Zd Z d Z d Z ddZ ddZ dS)HistoryShowDBGovtsN localhostF?c| |_| |_||_||_||_||_||_||_||_||_ | pddi|_ | dkrd|_ n| |_ | |_ dS)a? :param bool reverse: :param sqlalchemy.engine.base.Engine dbengine: :param datetime.datetime period_from: :param datetime.datetime period_to: :param int|None uid: :param str server_id: :param str|list|tuple|None show_columns: :param str order_by: :param int|None limit: :param dict|None cfg: :param int|None time_unit: :param bool reverse: :param list[str]|str|None by_usage: :param float by_usage_percentage: value in range [0..1] :return list: server_idr6N) by_usage_percentageby_usagedbengine period_from period_touidr9requested_columnsorder_bylimitcfg time_unitreverse)selfr=r>r?r@r9 show_columnsrBrCrDrErFr<r;s r!__init__zHistoryShowDBGov.__init__>sB$7     &""!-   4; 4 ??!DNN&DN r#cV|jgS||j\}}ttt |t|j}t tt |t|j}t|}t|}g}tt||D]L\}}}t||_t||_||_ || z }M|S)zT Show dbgov statistics with dynamic time-unit. :rtype: list )r@_get_min_max_tsrrrr>minr?rreversedrrrEhistory_dbgov_show) rGmax_tsmin_tsr>r?rowst_fromt_torEs r!history_dbgov_show_dynamicz+HistoryShowDBGov.history_dbgov_show_dynamicps 8 I--dh77+&B6&J&JKK[Y]YiMjMjkk  $@$H$HII;W[WeKfKfgg {++ Y'' '/0D[R[0\0\']'] . . #FD)*622D (..DN&DN D++-- -DD r#cVjtks jgkrgSj.tjttfs jdkrgSt j}t j}jpd}||} |} |}ttj ||tjjk}|}tjt"rt%t'|t|tjjk|} j5| |tj|} n#| |tjtj|} nt%t'|||} tjttfrD| tjtj} | tjtj|} jr(| |} j| } t?j | !dgfdfgddfgddfg } | "| #S) zM Show statistics from history_gov table :rtype: list NrUSERcvtjt|jdjjS)Nr9)r uid_to_usernameintrDr9r=)uid_rGs r!z5HistoryShowDBGov.history_dbgov_show..s.!=D 48K#8$.$-""r#)CPUREADWRITEcD||ntt|dS)Nr.)roundfloatxs r!r[z5HistoryShowDBGov.history_dbgov_show..s !)QQuUVxxYZI[I[r#)TSFROMTOlCPUlREADlWRITECONc(||nt|SN)rYrbs r!r[z5HistoryShowDBGov.history_dbgov_show..sXYXaSTSTgjklgmgmr#)fieldsrQorders)$r@tuple isinstancelistr r>r?rC_get_table_aggregate_info_get_columns_for_select_get_order_by_queryrrr5betweenr9 round_timerYrrwhererBrEgroup_byr in_r<having_get_by_usage_queryr=executerrAfetchallcloseget_corrected_list) rGrRrSrCtable_aggregate_infocolumns_to_selectorder_by_query where_querygroup_by_time_queryqueryrQresultss ` r!rNz#HistoryShowDBGov.history_dbgov_shows; 8uww  $(b..I 8  48dE](K(K PTPX\]P]P]I-d.>??+DN;; "d $==fdKK!889MNN112FGG;>11&$??AVZ^ZhAhii #oof55 dh $ $ 23DEEFFtKDH)DEEFF.))  ~)':KOLLRRSXYY':KO[Mjkkqqrwxx67HIIJJPPQ\]]ffguvvE$(T5M22 I KO$7$7TX$G$GHHNN%eEll  = QLL!9!9:N!O!OPPE}$$U++")H *))+[+[\GGGImImn      ))+++r#cg}t|jD]/}|||0|S)z Return list of columns that should be selected from table. :param table_aggregate_info: dict from _get_table_aggregate_info :return: query for each column :rtype: list )rrAappendlower)rGrr column_names r!rsz(HistoryShowDBGov._get_columns_for_selectsU*4+ABB P PK  $ $%9+:K:K:M:M%N O O O O  r#c|jt|jtr|||z }n|}|S)z Returns dictionary: { column_name: aggregate_query } Ignores t_from and t_to if self.uid is not None; :type t_from: int :type t_to: int :rtype: dict )r@rprqget_history_gov_all_users_func)rGrRrS columns_infos r!rrz*HistoryShowDBGov._get_table_aggregate_infosM 8 z$(D99 >>tf}MMLL>>@@Lr#cHttjtjtjtjgtj|k}|j | d\}}||fS)z^ Get min and max timestamp for given user id. :rtype: tuple(int, int) r) rrrLrr5rrwr@r=r|r})rGr@rrPrOs r!rKz HistoryShowDBGov._get_min_max_tssz 00$(;>2J2JKLLRRS^SbfiSijj..u55>>@@Cv~r#c|j |jdkr |j|_|jdkr|jd|_||j}|jdvr|jrt |}|S)zt Create order_by query :param history_gov_aggregate_func: :return: sqlalchemy query Nconr5id)rrr5)rB DEFAULT_ORDERr@rrFr)rGhistory_gov_aggregate_funcrs r!rtz$HistoryShowDBGov._get_order_by_querys} = DMU$:$: .DM =D TX%5 DM3DM4G4G4I4IJ = 3 3 3 3!.11Nr#cxg}t|jD]}|dkr.||d|dz |jkH|dkr.||d|dz |jkt t |S)z Get by_usage query. :param table_aggregate_info: dict from _get_table_aggregate_info :return: cpulcpuiolio)rr<rrr;NotImplementedErrorr )rGr filter_list by_usage_items r!r{z$HistoryShowDBGov._get_by_usage_query s  ,T];; , ,M""$$--"")%03G3OOSWSkk$$&&$.."")$/2Fu2MMQUQii*+++K  r#ct|j}||dtjt j}||dtjt j}|p|j}|Pt||t jt j t j tj t j tj t j tj t jtjt jt j ztj t jt jzdtj t jtj t jtj t jt't jd}nt+t-|dz }t||tj t jt j t j tj t j |z tj t j |z tj t j|z dtj t jt j z|z tj t jt jztj t jtj t jtj t jt't/t jd}|S)z= :type time_period: int :rtype: dict r)offsetts_queryrN)fromtor5ruserrreadwriterrrrlreadlwriterestrictgN@)rrr5rrrrrrrrrrrr)r r>rvrrLrr5rErr@rsum_cpusumsum_read sum_writeavglimit_write_on_period_endlimit_read_on_period_endlimit_cpu_on_period_endr2r rYrr")rG time_periodrRnormalized_from normalized_to time_interval column_labelsminutes_passeds r!rz/HistoryShowDBGov.get_history_gov_all_users_func sZ .d.>??//&TXknE]E]/^^q48KNC[C[\\ #5t~  /+'%.%/'O8K$788 H[%9::!Xk&;<<(;#8;;O#OPP8K$IKLp$pqq H[%HII!Xk&JKK"h{'LMM 5k6S T TMM(!md&:!;!;<22%/'O8K$788>I H[%9::^K!Xk&;<<~M(;#8;;O#OPPSaa8K$IKLp$pqq H[%HII!Xk&JKK"h{'LMM 56J;Kh6i6i j jM&r#rc| tj}|jrp|jjjdkr.t ||z |jz |zt|jz|zStj ||z |jz |z|jz|zS|S)a Round time depending on time_unit. Returns query, that returns nearest (N * time_unit + time_from) for current ts. :param ts_query: custom column :type time_from: int :type offset: int :return: Nsqlite) rr5rEr=url drivernamer rrfloor)rG time_fromrrs r!rvzHistoryShowDBGov.round_timeWs  "~H > } +x77h2dnDvMPWXX[_[iiluuuz8i#74>"IF"RSSVZVddgpppOr#) Nr6NNNNNFNr7rl)rN)__name__ __module__ __qualname__rrIrTrNrsrrrKrtr{rrvr#r!r4r4;sM  0000d2I,I,I,V ! ! !$"!!!(5555nr#r4N)mathr sqlalchemyrrrrrr r r lvestats.libr lvestats.lib.commons.dateutilr rrrrlvestats.lib.lveinfolibrrrrr lvestats.ormrr"r2objectr4rr#r!rsw$$$$$$$$55555555555555%%%%%%433333eeeeeeeeee888888$$$$$$   &pppppvpppppr#