/** * Searches tags according to filter and paging * The Current user needs to have the given right, unless $_ignoreAcl is true * * @param Tinebase_Model_TagFilter $_filter * @param Tinebase_Model_Pagination $_paging * @return Tinebase_Record_RecordSet Set of Tinebase_Model_Tag */ public function searchTags($_filter, $_paging) { $select = $_filter->getSelect(); Tinebase_Model_TagRight::applyAclSql($select, $_filter->grant); $_paging->appendPaginationSql($select); return new Tinebase_Record_RecordSet('Tinebase_Model_Tag', $this->_db->fetchAssoc($select)); }
/** * Appends pagination statements to a given select object * * @param Zend_Db_Select * @return void */ public function appendPaginationSql($_select) { if ($this->isValid()) { if (!empty($this->sort) && !empty($this->dir) && $this->sort == 'due') { $dir = $this->dir == 'ASC' ? 'DESC' : 'ASC'; $_select->order('is_due' . ' ' . $dir); } } parent::appendPaginationSql($_select); }
/** * Searches tags according to filter and paging * The Current user needs to have the given right, unless $_ignoreAcl is true * * @param Tinebase_Model_TagFilter $_filter * @param Tinebase_Model_Pagination $_paging * @return Tinebase_Record_RecordSet Set of Tinebase_Model_Tag */ public function searchTags($_filter, $_paging = NULL) { $select = $_filter->getSelect(); Tinebase_Model_TagRight::applyAclSql($select, $_filter->grant); if (isset($_filter->application)) { $app = Tinebase_Application::getInstance()->getApplicationByName($_filter->application); $this->_filterSharedOnly($select, $app->getId()); } if ($_paging !== NULL) { $_paging->appendPaginationSql($select); } Tinebase_Backend_Sql_Abstract::traitGroup($select); $tags = new Tinebase_Record_RecordSet('Tinebase_Model_Tag', $this->_db->fetchAssoc($select)); return $tags; }
/** * Searches roles according to filter and paging * * @param Tinebase_Model_RoleFilter $_filter * @param Tinebase_Model_Pagination $_paging * @return Tinebase_Record_RecordSet Set of Tinebase_Model_Role */ public function searchRoles($_filter, $_paging) { $select = $_filter->getSelect(); $_paging->appendPaginationSql($select); return new Tinebase_Record_RecordSet('Tinebase_Model_Role', $this->_getDb()->fetchAssoc($select)); }
/** * delete duplicate events defined by an event filter * * @param Calendar_Model_EventFilter $filter * @param boolean $dryrun * @return integer number of deleted events */ public function deleteDuplicateEvents($filter, $dryrun = TRUE) { if ($dryrun && Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' - Running in dry run mode - using filter: ' . print_r($filter->toArray(), true)); } $duplicateFields = array('summary', 'dtstart', 'dtend'); $select = $this->_db->select(); $select->from(array($this->_tableName => $this->_tablePrefix . $this->_tableName), $duplicateFields); $select->where($this->_db->quoteIdentifier($this->_tableName . '.is_deleted') . ' = 0'); $this->_addFilter($select, $filter); $select->group($duplicateFields)->having('count(*) > 1'); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $select); } $rows = $this->_fetch($select, self::FETCH_ALL); if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($rows, TRUE)); } $toDelete = array(); foreach ($rows as $row) { $index = $row['summary'] . ' / ' . $row['dtstart'] . ' - ' . $row['dtend']; $filter = new Calendar_Model_EventFilter(array(array('field' => 'summary', 'operator' => 'equals', 'value' => $row['summary']), array('field' => 'dtstart', 'operator' => 'equals', 'value' => new Tinebase_DateTime($row['dtstart'])), array('field' => 'dtend', 'operator' => 'equals', 'value' => new Tinebase_DateTime($row['dtend'])))); $pagination = new Tinebase_Model_Pagination(array('sort' => array($this->_tableName . '.last_modified_time', $this->_tableName . '.creation_time'))); $select = $this->_db->select(); $select->from(array($this->_tableName => $this->_tablePrefix . $this->_tableName)); $select->where($this->_db->quoteIdentifier($this->_tableName . '.is_deleted') . ' = 0'); $this->_addFilter($select, $filter); $pagination->appendPaginationSql($select); $rows = $this->_fetch($select, self::FETCH_ALL); $events = $this->_rawDataToRecordSet($rows); if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($events->toArray(), TRUE)); } $deleteIds = $events->getArrayOfIds(); // keep the first array_shift($deleteIds); if (!empty($deleteIds)) { $deleteContainerIds = $events->container_id; $origContainer = array_shift($deleteContainerIds); if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Deleting ' . count($deleteIds) . ' duplicates of: ' . $index . ' in container_ids ' . implode(',', $deleteContainerIds) . ' (origin container: ' . $origContainer . ')'); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($deleteIds, TRUE)); } $toDelete = array_merge($toDelete, $deleteIds); } else { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' No duplicates found for ' . $index); } } } if (empty($toDelete)) { if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' No duplicates found.'); } $result = 0; } else { $result = $dryrun ? count($toDelete) : $this->delete($toDelete); } return $result; }
/** * Calendar optimized search function * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param Tinebase_Model_Pagination $_pagination * @param boolean $_onlyIds * @param bool $_getDeleted * @return Tinebase_Record_RecordSet|array */ public function search(Tinebase_Model_Filter_FilterGroup $_filter = NULL, Tinebase_Model_Pagination $_pagination = NULL, $_onlyIds = FALSE, $_getDeleted = FALSE) { if ($_pagination === NULL) { $_pagination = new Tinebase_Model_Pagination(); } // we use a an extra select to reduce data amount where grants etc. have to be computed for. // the exdate is already appended here, to reduce virtual row numbers later $subselect = $this->_getSelectSimple('id', $_getDeleted); $subselect->joinLeft(array('exdate' => $this->_tablePrefix . 'cal_exdate'), $this->_db->quoteIdentifier('exdate.cal_event_id') . ' = ' . $this->_db->quoteIdentifier($this->_tableName . '.id'), array('exdate' => Tinebase_Backend_Sql_Command::getAggregateFunction($this->_db, $this->_db->quoteIdentifier('exdate.exdate')))); // this attendee join has nothing to do with grants but is here for attendee/status/... filters $subselect->joinLeft(array('attendee' => $this->_tablePrefix . 'cal_attendee'), $this->_db->quoteIdentifier('attendee.cal_event_id') . ' = ' . $this->_db->quoteIdentifier('cal_events.id'), array()); if (!$_getDeleted) { $subselect->joinLeft(array('dispcontainer' => $this->_tablePrefix . 'container'), $this->_db->quoteIdentifier('dispcontainer.id') . ' = ' . $this->_db->quoteIdentifier('attendee.displaycontainer_id'), array()); $subselect->where($this->_db->quoteIdentifier('dispcontainer.is_deleted') . ' = 0 OR ' . $this->_db->quoteIdentifier('dispcontainer.is_deleted') . 'IS NULL'); } // remove grantsfilter here as we need it in the main select $grantsFilter = $_filter->getFilter('grants'); if ($grantsFilter) { $_filter->removeFilter('grants'); } $this->_addFilter($subselect, $_filter); $_pagination->appendPaginationSql($subselect); $subselect->group($this->_tableName . '.' . 'id'); $stmt = $this->_db->query($subselect); $rows = (array) $stmt->fetchAll(Zend_Db::FETCH_ASSOC); $ids = array(); $exdates = array(); foreach ($rows as $row) { $ids[] = $row['id']; $exdates[$row['id']] = $row['exdate']; } $select = $this->_getSelectSimple('*', $_getDeleted); $select->where($this->_db->quoteInto("{$this->_db->quoteIdentifier('cal_events.id')} IN (?)", !empty($ids) ? $ids : ' ')); $_pagination->appendPaginationSql($select); // append grants filters : only take limited set of attendee into account for grants computation $attenderFilter = $_filter->getFilter('attender'); if (!$attenderFilter) { // if a container filter is set, take owners of personal containers (solve secretary scenario) $containerFilter = $_filter->getFilter('container_id'); if ($containerFilter && $containerFilter instanceof Calendar_Model_CalendarFilter) { $attenderFilter = $containerFilter->getRelatedAttendeeFilter(); } else { $attenderFilter = new Calendar_Model_AttenderFilter('attender', 'equals', array('user_type' => Calendar_Model_Attender::USERTYPE_USER, 'user_id' => Tinebase_Core::getUser()->contact_id)); } } $this->_appendEffectiveGrantCalculationSql($select, $attenderFilter); if ($grantsFilter) { $grantsFilter->appendFilterSql($select, $this); } $select->group($this->_tableName . '.' . 'id'); $this->_traitGroup($select); $stmt = null; // solve PHP bug @see {http://bugs.php.net/bug.php?id=35793} $stmt = $this->_db->query($select); $rows = (array) $stmt->fetchAll(Zend_Db::FETCH_ASSOC); if ($_onlyIds) { $identifier = is_bool($_onlyIds) ? $this->_getRecordIdentifier() : $_onlyIds; $result = array(); foreach ($rows as $row) { $result[] = $row[$identifier]; } } else { foreach ($rows as &$row) { $row['exdate'] = $exdates[$row[$this->_getRecordIdentifier()]]; } $result = $this->_rawDataToRecordSet($rows); } return $result; }
/** * search for notes * * @param Tinebase_Model_NoteFilter $_filter * @param Tinebase_Model_Pagination $_pagination * @param boolean $ignoreACL * @return Tinebase_Record_RecordSet subtype Tinebase_Model_Note */ public function searchNotes(Tinebase_Model_NoteFilter $_filter, Tinebase_Model_Pagination $_pagination = NULL, $ignoreACL = true) { $select = $this->_db->select()->from(array('notes' => SQL_TABLE_PREFIX . 'notes'))->where($this->_db->quoteIdentifier('is_deleted') . ' = 0'); if (!$ignoreACL) { $this->_checkFilterACL($_filter); } Tinebase_Backend_Sql_Filter_FilterGroup::appendFilters($select, $_filter, $this); if ($_pagination !== NULL) { $_pagination->appendPaginationSql($select); } $stmt = $this->_db->query($select); $rows = $stmt->fetchAll(Zend_Db::FETCH_ASSOC); $result = new Tinebase_Record_RecordSet('Tinebase_Model_Note', $rows, true); return $result; }
/** * search for notes * * @param Tinebase_Model_NoteFilter $_filter * @param Tinebase_Model_Pagination $_pagination * @return Tinebase_Record_RecordSet subtype Tinebase_Model_Note */ public function searchNotes(Tinebase_Model_NoteFilter $_filter, Tinebase_Model_Pagination $_pagination = NULL) { $select = $this->_db->select()->from(array('notes' => SQL_TABLE_PREFIX . 'notes')); Tinebase_Backend_Sql_Filter_FilterGroup::appendFilters($select, $_filter, $this); if ($_pagination !== NULL) { $_pagination->appendPaginationSql($select); } //if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $select->__toString()); $rows = $this->_db->fetchAssoc($select); $result = new Tinebase_Record_RecordSet('Tinebase_Model_Note', $rows, true); return $result; }