
    g8,                         d dl Z d dlZd dlmZ d dlmZ d dlmZ  G d de      Zg fdZg g g fdZg fd	Z	g g g fd
Z
dg g fdZddZy)    N)database)helpers)loggerc                   6    e Zd ZdZd Zddg g g g g g g g g dfdZy)
DataTablesz/
    Server side processing for Datatables
    c                 6    t        j                         | _        y N)r   MonitorDatabasessp_db)selfs    "/opt/Tautulli/plexpy/datatables.py__init__zDataTables.__init__   s    ..0    Nc                    |st        j                  d       y |j                  d      r&t        j                  |j                  d            }nt        j                  d       y t        |      }t        |	|
|      }t        |      }t        |      \  }}t        |d   |d   |d         }t        |d	   d
   |d   |d         \  }}|r7t        |      }t        |      }t        |      \  }}d|d   d|d|d|}nd}g }||z   |z   }d|d   d|d|d|d|d|d|d|}| j                  j                  ||      }|D cg c]%  }t        d |j                         D              r$|' }}| j                  j                  d|z        d   d   }t        |d         } ||d   |d   |d   z    }!|!| t!        |      |d}"|"S c c}w )Nz.Tautulli DataTables :: No table name received.	json_data)json_kwargszjTautulli DataTables :: Parameters for Datatables must be sent as a serialised json object named json_data.)columnsordercolumn_namedr   searchvaluezUNION SELECT column_stringz FROM   zSELECT * FROM (SELECT z) )argsc              3   $   K   | ]  }|d u  
 y wr	    ).0vs     r   	<genexpr>z'DataTables.ssp_query.<locals>.<genexpr>^   s     6WQqDy6Ws   z'SELECT COUNT(id) as total_count from %sr   total_countdrawstartlength)resultr"   filteredCount
totalCount)r   errorgetr   process_json_kwargsextract_columns
build_joinbuild_groupingbuild_custom_wherebuild_orderbuild_wherer   selectallvaluesintlen)#r   
table_nametable_name_unionr   columns_unioncustom_wherecustom_where_uniongroup_bygroup_by_union
join_typesjoin_tables
join_evalskwargs
parametersextracted_columnsjoingroupc_wherecw_argsr   wherew_argsextracted_columns_uniongroup_u	c_where_ucwu_argsunionr   queryfilteredrow
totalcountdraw_counterr%   outputs#                                      r   	ssp_queryzDataTables.ssp_query    s    LLIJ ::k" 44KAXYJLL , -+G<*k:>x(-l;Jw/!2>!B!+I!68 $Jx$8$A):>)J)3I)>@v
 &5m&L#$^4G"45G"HIx7N7_7G7@7>@E
 EH!F* %_5z4RWY^`egln ;;%%e$%7 $,XC36W#**,6W3WCXX [[''(QT^(^_`abcpq
 :f-. *W-z'/BZPXEY/Y["&#&x= *,
 ! Ys   %G3G)__name__
__module____qualname____doc__r   rT   r   r   r   r   r      s8    1 "#' "!%'!# Nr   r   c                 T    d}| D ]
  }||dz   z  } |rd|j                  d      z   }|S )Nr   , z	GROUP BY )rstrip)r;   rD   gs      r   r-   r-   q   s?    E Tell400Lr   c           	         d}t        |       D ]|  \  }}|j                         dk(  r|d||   d||   d   d||   d   dz  }8|j                         d	k(  s|j                         d
k(  s_|d||   d||   d   d||   d   dz  }~ |S )Nr   zLEFT OUTER JOINzLEFT OUTER JOIN z ON r   z =    r   JOINz
INNER JOINzJOIN )	enumerateupper)r=   r>   r?   rC   i	join_types         r   r,   r,   }   s    D!*- a9?? 11A
STVWHXZdefZghiZjkkD__&(IOO,=,M[^Z]1=MzZ[}]^O_``D	a Kr   c                 @   d}g }| D ]  }|d   j                  d      rdnd}|d   j                  d      |d<   t        |d   t        t        f      rt        |d         r|dz  }|d   D ]  }|||d   d	z   z  }nt        |      j                  d
      r ||d   dz   z  }|j                  |dd         na|d   j                  d      s|d   j                  d      r||d   dz   z  }|j                  |       n||d   dz   z  }|j                  |       |dz  } |j                  d      dz   |z   }0|d   ||d   d	z   z  }nt        |d         j                  d
      r#||d   dz   z  }|j                  |d   dd         ng|d   j                  d      s|d   j                  d      r ||d   dz   z  }|j                  |d          n||d   dz   z  }|j                  |d          ||z  } |r#d|j                  d      j                  d      z   }||fS )Nr   r   OR OR z AND z ORr^   (z IS NULLzLIKE z LIKE ?   <>z= ?z = ?)WHERE )	endswithr[   
isinstancelisttupler5   str
startswithappend)r9   rE   r   wand_orw_s         r   r.   r.      sB   GD !Q4==.Gt{{5!!adT5M*s1Q4ysNGd ":qtj00GW''0qti//GKK12'qT]]3'1Q4==+=qte|+GKKOqtf},GKKO6!" nnV,s2V;Gt|1Q4*,,QqT%%g.1Q4)++AaDH%1s#qt}}S'91Q4%<'AaD!1Q4&=(AaD!vGC!F W^^G4;;FCCD=r   c                 $   d}| D ]p  d}d   dk(  r|dz  }t        d            d   r4t        fd|D              r|t        d            d   d	|z  z   z  }YZ||t        d            d
z   z  }r |rd|j                  d
      z   }|S )Nr   z COLLATE NOCASEdirdescz DESCcolumndatac              3      K   | ]7  }|j                         t        d             d   j                         k(   9 yw)rz   r{   N)lowerr4   )r   d
dt_columnsos     r   r    zbuild_order.<locals>.<genexpr>   s@      % 779
3q{+; <V D J J LL %s   =A z%s, rZ   z	ORDER BY )r4   anyr[   )order_paramr   r   r   
sort_orderr   s     `  @r   r/   r/      s    E 6&
U8v'!Jc!H+&'/  %#% %C($45f=@SSS  WS8-.55E!6$ ell400Lr   r   c                 4   d}g }| rt        |      D ]j  \  }d   sd   r8t        fd|D              r#|d   dz   z  }|j                  d| z   dz          HI|||   dz   z  }|j                  d| z   dz          l |rd|j                  d      z   }||fS )	Nr   
searchabler{   c              3   f   K   | ](  }|j                         d    j                         k(   * ywr{   Nr}   )r   r~   ss     r   r    zbuild_where.<locals>.<genexpr>   s'     Ka1779&	(99K   .1z LIKE ? OR %rl   rf   )r`   r   rs   r[   )search_paramr   r   rG   r   rb   r   s         @r   r0   r0      s    EDj) 	:DAqV9 K7KK6]!::C,$6$<=  WQZ-77EKKl 2S 89	:  u||F33E$;r   c                    d}g }g }g }| D ]  }t        j                  dt         j                        }t        j                  ||      rt        j                  ||      d   j                  d      d   t        j                  ||      d   }t        j                  ||      d   }	|rQt        fd|D              s||dz   z  }|j                  |       |j                         |j                  |	       ||dz   z  }|j                  |       |j                         |j                  |	       +|j                  d      d   |rSt        fd	|D              sW||dz   z  }|j                  |       |j                         |j                  |       ||dz   z  }|j                  |       |j                         |j                  |        |j                  d      }||||d
}
|
S )Nr   z as r^   .r   c              3   f   K   | ](  }|d    j                         j                         k(   * ywr   r   r   r~   r   s     r   r    z"extract_columns.<locals>.<genexpr>  *     XQqy(L,>,>,@@Xr   rZ   c              3   f   K   | ](  }|d    j                         j                         k(   * ywr   r   r   s     r   r    z"extract_columns.<locals>.<genexpr>  r   r   )r   column_literalr   column_order)	recompile
IGNORECASEr   split
rpartitionr   rs   r[   )r   match_columnscolumns_stringcolumns_literalcolumns_namedcolumns_orderrz   	as_searchr   r   column_datar   s              @r   r+   r+      s   NOMM  - JJvr}}5	99Y'88Iv6q9DDSI"MLXXi8;N88Iv6q9LX-XX"ftm3N#**>:!((6!((6&4-/&&~6$$\2$$\2!,,S1"5LX-XX"ftm3N#**62!((6!((0&4-/&&v.$$\2$$V,A -D $**40N %3%4#0#0K r   )NN)r   plexpyr   r   r   objectr   r-   r,   r.   r/   r0   r+   r   r   r   <module>r      si     
    V Vr  	 " 
 %' +\ r 8   >6r   