Datatables.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <?php
  2. class Application_Model_Datatables
  3. {
  4. private static function buildWhereClauseForAdvancedSearch($dbname2searchTerm)
  5. {
  6. $where = array();
  7. $where['clause'] = array();
  8. $where['params'] = array();
  9. foreach ($dbname2searchTerm as $dbname=>$term) {
  10. $isRange = false;
  11. if (strstr($term, '~')) {
  12. $info = explode('~', $term);
  13. if ($dbname == 'utime' || $dbname == 'mtime' || $dbname == 'lptime') {
  14. $input1 = ($info[0] != "") ? Application_Common_DateHelper::UserTimezoneStringToUTCString($info[0]) : null;
  15. $input2 = ($info[1] != "") ? Application_Common_DateHelper::UserTimezoneStringToUTCString($info[1]) : null;
  16. } else if($dbname == 'bit_rate' || $dbname == 'sample_rate') {
  17. $input1 = isset($info[0])?doubleval($info[0]) * 1000:null;
  18. $input2 = isset($info[1])?doubleval($info[1]) * 1000:null;
  19. } else {
  20. $input1 = isset($info[0])?$info[0]:null;
  21. $input2 = isset($info[1])?$info[1]:null;
  22. }
  23. $isRange = true;
  24. } else {
  25. $input1 = $term;
  26. }
  27. if ($isRange) {
  28. $sub = array();
  29. if ($input1 != null) {
  30. $sub[] = $dbname." >= :" . $dbname . "1";
  31. }
  32. if ($input2 != null) {
  33. $sub[] = $dbname." <= :" . $dbname . "2";
  34. }
  35. if (!empty($sub)) {
  36. $where['clause'][$dbname] = "(".implode(' AND ', $sub).")";
  37. if ($input1 != null) {
  38. $where['params'][$dbname."1"] = $input1;
  39. }
  40. if ($input2 != null) {
  41. $where['params'][$dbname."2"] = $input2;
  42. }
  43. }
  44. } else {
  45. if (trim($input1) !== "") {
  46. $where['clause'][$dbname] = $dbname." ILIKE :" . $dbname."1";
  47. $where['params'][$dbname."1"] = "%".$input1."%";
  48. }
  49. }
  50. }
  51. return $where;
  52. }
  53. /*
  54. * query used to return data for a paginated/searchable datatable.
  55. */
  56. public static function findEntries($con, $displayColumns, $fromTable,
  57. $data, $dataProp = "aaData")
  58. {
  59. $where = array();
  60. /* Holds the parameters for binding after the statement has been
  61. prepared */
  62. $params = array();
  63. if (isset($data['advSearch']) && $data['advSearch'] === 'true') {
  64. $librarySetting =
  65. Application_Model_Preference::getCurrentLibraryTableColumnMap();
  66. //$displayColumns[] = 'owner';
  67. // map that maps original column position to db name
  68. $current2dbname = array();
  69. // array of search terms
  70. $orig2searchTerm = array();
  71. foreach ($data as $key => $d) {
  72. if (strstr($key, "mDataProp_")) {
  73. list($dump, $index) = explode("_", $key);
  74. $current2dbname[$index] = $d;
  75. } elseif (strstr($key, "sSearch_")) {
  76. list($dump, $index) = explode("_", $key);
  77. $orig2searchTerm[$index] = $d;
  78. }
  79. }
  80. // map that maps dbname to searchTerm
  81. $dbname2searchTerm = array();
  82. foreach ($current2dbname as $currentPos => $dbname) {
  83. $new_index = $librarySetting($currentPos);
  84. // TODO : Fix this retarded hack later. Just a band aid for
  85. // now at least we print some warnings so that we don't
  86. // forget about this -- cc-4462
  87. if ( array_key_exists($new_index, $orig2searchTerm) ) {
  88. $dbname2searchTerm[$dbname] = $orig2searchTerm[$new_index];
  89. } else {
  90. Logging::warn("Trying to reorder to unknown index
  91. printing as much debugging as possible...");
  92. $debug = array(
  93. '$new_index' => $new_index,
  94. '$currentPos' => $currentPos,
  95. '$orig2searchTerm' => $orig2searchTerm);
  96. Logging::warn($debug);
  97. }
  98. }
  99. $advancedWhere = self::buildWhereClauseForAdvancedSearch($dbname2searchTerm);
  100. if (!empty($advancedWhere['clause'])) {
  101. $where[] = join(" AND ", $advancedWhere['clause']);
  102. $params = $advancedWhere['params'];
  103. }
  104. }
  105. if ($data["sSearch"] !== "") {
  106. $searchTerms = explode(" ", $data["sSearch"]);
  107. }
  108. $selectorCount = "SELECT COUNT(*) ";
  109. $selectorRows = "SELECT ".join(",", $displayColumns)." ";
  110. $sql = $selectorCount." FROM ".$fromTable;
  111. $sqlTotalRows = $sql;
  112. if (isset($searchTerms)) {
  113. $searchCols = array();
  114. for ($i = 0; $i < $data["iColumns"]; $i++) {
  115. if ($data["bSearchable_".$i] == "true") {
  116. $searchCols[] = $data["mDataProp_{$i}"];
  117. }
  118. }
  119. $outerCond = array();
  120. $simpleWhere = array();
  121. foreach ($searchTerms as $term) {
  122. foreach ($searchCols as $col) {
  123. $simpleWhere['clause']["simple_".$col] = "{$col}::text ILIKE :simple_".$col;
  124. $simpleWhere['params']["simple_".$col] = "%".$term."%";
  125. }
  126. $outerCond[] = "(".implode(" OR ", $simpleWhere['clause']).")";
  127. }
  128. $where[] = "(" .implode(" AND ", $outerCond). ")";
  129. $params = array_merge($params, $simpleWhere['params']);
  130. }
  131. // End Where clause
  132. // Order By clause
  133. $orderby = array();
  134. for ($i = 0; $i < $data["iSortingCols"]; $i++) {
  135. $num = $data["iSortCol_".$i];
  136. $orderby[] = $data["mDataProp_{$num}"]." ".$data["sSortDir_".$i];
  137. }
  138. $orderby[] = "id";
  139. $orderby = join("," , $orderby);
  140. // End Order By clause
  141. $displayLength = intval($data["iDisplayLength"]);
  142. $needToBind = false;
  143. if (count($where) > 0) {
  144. $needToBind = true;
  145. $where = join(" OR ", $where);
  146. $sql = $selectorCount." FROM ".$fromTable." WHERE ".$where;
  147. $sqlTotalDisplayRows = $sql;
  148. $sql = $selectorRows." FROM ".$fromTable." WHERE ".$where." ORDER BY ".$orderby;
  149. }
  150. else {
  151. $sql = $selectorRows." FROM ".$fromTable." ORDER BY ".$orderby;
  152. }
  153. //limit the results returned.
  154. if ($displayLength !== -1) {
  155. $sql .= " OFFSET ".$data["iDisplayStart"]." LIMIT ".$displayLength;
  156. }
  157. try {
  158. //Logging::info($sqlTotalRows);
  159. $r = $con->query($sqlTotalRows);
  160. $totalRows = $r->fetchColumn(0);
  161. if (isset($sqlTotalDisplayRows)) {
  162. //Logging::info("sql is set");
  163. //Logging::info($sqlTotalDisplayRows);
  164. $totalDisplayRows = Application_Common_Database::prepareAndExecute($sqlTotalDisplayRows, $params, 'column');
  165. }
  166. else {
  167. //Logging::info("sql is not set.");
  168. $totalDisplayRows = $totalRows;
  169. }
  170. //TODO
  171. if ($needToBind) {
  172. $results = Application_Common_Database::prepareAndExecute($sql, $params);
  173. }
  174. else {
  175. $stmt = $con->query($sql);
  176. $stmt->setFetchMode(PDO::FETCH_ASSOC);
  177. $results = $stmt->fetchAll();
  178. }
  179. }
  180. catch (Exception $e) {
  181. Logging::info($e->getMessage());
  182. }
  183. return array(
  184. "sEcho" => intval($data["sEcho"]),
  185. "iTotalDisplayRecords" => intval($totalDisplayRows),
  186. "iTotalRecords" => intval($totalRows),
  187. $dataProp => $results
  188. );
  189. }
  190. }