first import
[projectpier.git] / application / models / searchable_objects / SearchableObjects.class.php
blob86a02a29b3716625259abcdda0129691652df20c
1 <?php
3 /**
4 * SearchableObjects, generated on Tue, 13 Jun 2006 12:15:44 +0200 by
5 * DataObject generation tool
7 * @http://www.projectpier.org/
8 */
9 class SearchableObjects extends BaseSearchableObjects {
11 /**
12 * Search for specific search string ($search_for) in specific project
14 * @param string $search_for Search string
15 * @param Project $project Search in this project
16 * @param boolean $include_private
17 * @return array
19 static function search($search_for, Project $project, $include_private = false) {
20 return SearchableObjects::doSearch(SearchableObjects::getSearchConditions($search_for, $project, $include_private));
21 } // search
23 /**
24 * Search paginated
26 * @param string $search_for Search string
27 * @param Project $project Search in this project
28 * @param boolean $include_private
29 * @param integer $items_per_page
30 * @param integer $current_page
31 * @return array
33 static function searchPaginated($search_for, Project $project, $include_private = false, $items_per_page = 10, $current_page = 1) {
34 $conditions = SearchableObjects::getSearchConditions($search_for, $project, $include_private);
35 $pagination = new DataPagination(SearchableObjects::countUniqueObjects($conditions), $items_per_page, $current_page);
37 $items = SearchableObjects::doSearch($conditions, $pagination->getItemsPerPage(), $pagination->getLimitStart());
38 return array($items, $pagination);
39 } // searchPaginated
41 /**
42 * Prepare search conditions string based on input params
44 * @param string $search_for Search string
45 * @param Project $project Search in this project
46 * @return array
48 function getSearchConditions($search_for, Project $project, $include_private = false) {
49 if($include_private) {
50 return DB::prepareString('MATCH (`content`) AGAINST (? IN BOOLEAN MODE) AND `project_id` = ?', array($search_for, $project->getId()));
51 } else {
52 return DB::prepareString('MATCH (`content`) AGAINST (? IN BOOLEAN MODE) AND `project_id` = ? AND `is_private` = ?', array($search_for, $project->getId(), false));
53 } // if
54 } // getSearchConditions
56 /**
57 * Do the search
59 * @param string $conditions
60 * @param integer $limit
61 * @param integer $offset
62 * @return array
64 function doSearch($conditions, $limit = null, $offset = null) {
65 $table_name = SearchableObjects::instance()->getTableName(true);
67 $limit_string = '';
68 if((integer) $limit > 0) {
69 $offset = (integer) $offset > 0 ? (integer) $offset : 0;
70 $limit_string = " LIMIT $offset, $limit";
71 } // if
73 $where = '';
74 if(trim($conditions) <> '') $where = "WHERE $conditions";
76 $sql = "SELECT `rel_object_manager`, `rel_object_id` FROM $table_name $where $limit_string";
77 $result = DB::executeAll($sql);
79 if(!is_array($result)) return null;
81 $loaded = array();
82 $objects = array();
83 foreach($result as $row) {
84 $manager_class = array_var($row, 'rel_object_manager');
85 $object_id = array_var($row, 'rel_object_id');
87 if(!isset($loaded[$manager_class . '-' . $object_id]) || !($loaded[$manager_class . '-' . $object_id])) {
88 if(class_exists($manager_class)) {
89 $object = get_object_by_manager_and_id($object_id, $manager_class);
90 if($object instanceof ProjectDataObject) {
91 $loaded[$manager_class . '-' . $object_id] = true;
92 $objects[] = $object;
93 } // if
94 } // if
95 } // if
96 } // foreach
98 return count($objects) ? $objects : null;
99 } // doSearch
102 * Return number of unique objects
104 * @param string $conditions
105 * @return integer
107 function countUniqueObjects($conditions) {
108 $table_name = SearchableObjects::instance()->getTableName(true);
109 $where = '';
110 if(trim($conditions <> '')) $where = "WHERE $conditions";
112 $sql = "SELECT `rel_object_manager`, `rel_object_id` FROM $table_name $where";
113 $result = DB::executeAll($sql);
114 if(!is_array($result) || !count($result)) return 0;
116 $counted = array();
117 $counter = 0;
118 foreach($result as $row) {
119 if(!isset($counted[array_var($row, 'rel_object_manager') . array_var($row, 'rel_object_id')])) {
120 $counted[array_var($row, 'rel_object_manager') . array_var($row, 'rel_object_id')] = true;
121 $counter++;
122 } // if
123 } // foreach
125 return $counter;
126 } // countUniqueObjects
129 * Drop all content from table related to $object
131 * @param ProjectDataObject $object
132 * @return boolean
134 static function dropContentByObject(ProjectDataObject $object) {
135 return SearchableObjects::delete(array('`rel_object_manager` = ? AND `rel_object_id` = ?', get_class($object->manager()), $object->getObjectId()));
136 } // dropContentByObject
138 } // SearchableObjects