/includes/search.php

https://github.com/archoo/electionleaflets · PHP · 214 lines · 143 code · 45 blank · 26 comment · 18 complexity · c86245bac8e437f2de7e87ead1af2e45 MD5 · raw file

  1. <?php
  2. require_once('cache.php');
  3. //basic search wrapper for DB_DataObjects
  4. class searcher {
  5. //search cached
  6. public function search_cached ($class_name, $where_clauses, $clause_join = 'AND', $joins = null, $order_clauses = null,
  7. $number=null, $start=null) {
  8. $return = false;
  9. //build up the cache key
  10. $key = $class_name . print_r($where_clauses, true) . $clause_join . print_r($joins, true) .
  11. print_r($order_clauses, true) . $number . $start;
  12. //check the cache
  13. $cache = cache::factory();
  14. $cached = $cache->get($key, "search");
  15. //if we have something in the cache, grab that, if not do the query as normal
  16. if (isset($cached) && $cached !== false) {
  17. $return = $cached;
  18. }else{
  19. $return = $this->search($class_name, $where_clauses, $clause_join, $joins, $order_clauses, $number, $start);
  20. }
  21. //cache
  22. $cached = $cache->set($key, $return, "search");
  23. if($cached == false){
  24. trigger_error("Failed to cache database call");
  25. }
  26. //return
  27. return $return;
  28. }
  29. //Search
  30. public function search($class_name, $where_clauses, $clause_join = 'AND', $joins = null, $order_clauses = null,
  31. $number=null, $start=null) {
  32. //get the basic search object
  33. $search_object = $this->get_basic_search_object($class_name, $where_clauses, $clause_join, $joins, $order_clauses, $number, $start);
  34. return $this->handle_result($search_object);
  35. }
  36. //Proximity search (Km)
  37. public function search_proximity ($class_name, $where_clauses, $lng, $lat, $distance_km = null, $clause_join = 'AND', $joins = null, $order_clauses = null,
  38. $number=null, $start=null, $lng_field = 'lng', $lat_field = 'lat') {
  39. //create search object
  40. $search_object = $this->get_basic_search_object($class_name, $where_clauses, $clause_join, $joins, $order_clauses, $number, $start);
  41. //calculate distance field
  42. $search_object->selectAdd("((ACOS(SIN(" . $search_object->escape($lat) . " * PI() / 180) * SIN(" . $search_object->escape($lat_field) . " * PI() / 180) + COS(" . $lat . " * PI() / 180) * COS(" . $search_object->escape($lat_field) . " * PI() / 180) * COS((" . $search_object->escape($lng) . " - " . $search_object->escape($lng_field) . ") * PI() / 180)) * 180 / PI()) * 60 * 1.1515) as distance");
  43. //add distance having clause
  44. if(isset($distance_km)){
  45. $search_object->having("distance < " . $search_object->escape($distance_km));
  46. }
  47. return $this->handle_result($search_object);
  48. }
  49. //custom query
  50. public function query($class_name, $sql){
  51. //create search object
  52. $search_object = factory::create($class_name);
  53. $search_object->query($sql);
  54. return $this->handle_result($search_object);
  55. }
  56. public function query_cached($class_name, $sql){
  57. $return = false;
  58. //check the cache
  59. $cache = cache::factory();
  60. $cached = $cache->get($sql, "search");
  61. //try and get from cache, if not, get from database
  62. if (isset($cached) && $cached !== false) {
  63. $return = $cached;
  64. }else{
  65. $return = $this->query($class_name, $sql);
  66. //cache
  67. $cached = $cache->set($sql, $return, "search");
  68. if($cached == false){
  69. trigger_error("Failed to cache database call");
  70. }
  71. }
  72. return $return;
  73. }
  74. //handle search results (convert into objects)
  75. private function handle_result($search_object){
  76. $return = array();
  77. //get search count
  78. $search_count = $search_object->find();
  79. //grab any objects
  80. $found_objects = array();
  81. if($search_count > 0){
  82. while($search_object->fetch()){
  83. array_push($found_objects, clone($search_object));
  84. }
  85. $return = $found_objects;
  86. }
  87. return $return;
  88. }
  89. //get the basic search object search
  90. private function get_basic_search_object ($class_name, $where_clauses, $clause_join = 'AND', $joins = null, $order_clauses = null,
  91. $number=null, $start=null) {
  92. //create search object
  93. $search_object = factory::create($class_name);
  94. //create where clauses
  95. foreach($where_clauses as $where_clause) {
  96. $quote = "'";
  97. if(is_numeric($where_clause[2])){
  98. $quote = "";
  99. }
  100. if(isset($where_clause[3])){
  101. $clause_join = $where_clause[3];
  102. }
  103. $search_object->whereAdd( $where_clause[0] . " " . $where_clause[1] . " " . $quote .
  104. $search_object->escape($where_clause[2]) . $quote, $clause_join);
  105. }
  106. //joins
  107. if(isset($joins) && sizeof($joins) > 0){
  108. $search_object->selectAs();
  109. foreach ($joins as $join) {
  110. //make join object
  111. $join_object = factory::create($join[0]);
  112. //check if it has any joins of its own?
  113. if($join[3]){
  114. $secondary_join_object = factory::create($join[3][0]);
  115. if($join[3][3]){
  116. $tertiary_join_object = factory::create($join[3][3][0]);
  117. $secondary_join_object->joinAdd ($tertiary_join_object, $join[3][3][1], $join[3][3][0], $join[3][3][2]);
  118. $search_object->selectAs($tertiary_join_object, $join[3][3][0] . '_%s', $join[3][3][0]);
  119. }
  120. $join_object->joinAdd ($secondary_join_object, $join[3][1], $join[3][0], $join[3][2]);
  121. $search_object->selectAs($secondary_join_object, $join[3][0] . '_%s', $join[3][0]);
  122. }
  123. //add to search object
  124. $override_link_field = isset($join[2]);
  125. if($override_link_field){
  126. $search_object->joinAdd ($join_object, $join[1], $join[0], $join[2]);
  127. }else{
  128. $search_object->joinAdd ($join_object, $join[1], $join[0]);
  129. }
  130. $search_object->selectAs($join_object, $join[0] . '_%s', $join[0]);
  131. }
  132. }
  133. //create order by's
  134. if(isset($order_clauses)){
  135. foreach($order_clauses as $order_clause) {
  136. $search_object->orderBy($order_clause[0] . " " . $order_clause[1]);
  137. }
  138. }
  139. //Limit / paging
  140. if (isset($number) && isset($start) && is_numeric($number) && is_numeric($start)) {
  141. $search_object->limit($start, $number);
  142. }elseif (isset($number) && is_numeric($number)) {
  143. $search_object->limit($number);
  144. }
  145. return $search_object;
  146. }
  147. //get by ID
  148. public function get_by_id($class_name, $id){
  149. $return = false;
  150. $search = factory::create('search');
  151. $search_object = factory::create($class_name);
  152. $keys = $search_object->keys();
  153. $result = $search->search($class_name, array(array($keys[0], '=', $id)));
  154. if(sizeof($result) == 1){
  155. $return = $result[0];
  156. }
  157. return $return;
  158. }
  159. }
  160. ?>