/**
* Returns a list of stories from the storage backend filtered by
* arbitrary criteria.
* NOTE: $criteria['channel_id'] MUST be set for this method to work.
*
* @param array $criteria
*
* @return array
*
* @see Jonah_Driver#getStories
*/
protected function _getStories($criteria, $order = Jonah::ORDER_PUBLISHED)
{
$sql = 'SELECT stories.story_id AS id, ' . 'stories.channel_id, ' . 'stories.story_author AS author, ' . 'stories.story_title AS title, ' . 'stories.story_desc AS description, ' . 'stories.story_body_type AS body_type, ' . 'stories.story_body AS body, ' . 'stories.story_url AS url, ' . 'stories.story_permalink AS permalink, ' . 'stories.story_published AS published, ' . 'stories.story_updated AS updated, ' . 'stories.story_read AS readcount ' . 'FROM jonah_stories AS stories ' . 'WHERE stories.channel_id=?';
$values = array($criteria['channel_id']);
// Apply date filtering
if (isset($criteria['updated-min'])) {
$sql .= ' AND story_updated >= ?';
$values[] = $criteria['updated-min']->timestamp();
}
if (isset($criteria['updated-max'])) {
$sql .= ' AND story_updated <= ?';
$values[] = $criteria['updated-max']->timestamp();
}
if (isset($criteria['published-min'])) {
$sql .= ' AND story_published >= ?';
$values[] = $criteria['published-min']->timestamp();
}
if (isset($criteria['published-max'])) {
$sql .= ' AND story_published <= ?';
$values[] = $criteria['published-max']->timestamp();
}
if (isset($criteria['published'])) {
$sql .= ' AND story_published IS NOT NULL';
}
// Filter by story author
if (isset($criteria['author'])) {
$sql .= ' AND stories.story_author = ?';
$values[] = $criteria['author'];
}
// Filter stories by keyword
if (isset($criteria['keywords'])) {
foreach ($criteria['keywords'] as $keyword) {
$sql .= ' AND stories.story_body LIKE ?';
$values[] = '%' . $keyword . '%';
}
}
if (isset($criteria['notkeywords'])) {
foreach ($criteria['notkeywords'] as $keyword) {
$sql .= ' AND stories.story_body NOT LIKE ?';
$values[] = '%' . $keyword . '%';
}
}
// Ensure any results are in the following story_id list.
if (!empty($criteria['ids'])) {
$sql .= ' AND stories.story_id IN (' . implode(',', array_map(function ($v) {
return '?';
}, $criteria['ids'])) . ')';
$values = array_merge($values, $criteria['ids']);
}
switch ($order) {
case Jonah::ORDER_PUBLISHED:
$sql .= ' ORDER BY story_published DESC';
break;
case Jonah::ORDER_READ:
$sql .= ' ORDER BY story_read DESC';
break;
case Jonah::ORDER_COMMENTS:
//@TODO
break;
}
$limit = 0;
if (isset($criteria['limit'])) {
$limit = $criteria['limit'];
}
if (isset($criteria['startnumber']) && isset($criteria['endnumber'])) {
$limit = min($criteria['endnumber'] - $criteria['startnumber'], $criteria['limit']);
}
$start = isset($criteria['startnumber']) ? $criteria['startnumber'] : 0;
Horde::log('SQL Query by Jonah_Driver_sql::_getStories(): ' . $sql, 'DEBUG');
if ($limit || $start != 0) {
$sql = $this->_db->addLimitOffset($sql, array('limit' => $limit, 'offset' => $start));
}
try {
$results = $this->_db->selectAll($sql, $values);
} catch (Horde_Db_Exception $e) {
throw new Jonah_Exception($e);
}
$channel = $this->_getChannel($criteria['channel_id']);
foreach ($results as &$row) {
$row['link'] = (string) $this->getStoryLink($channel, $row);
$row['tags'] = $GLOBALS['injector']->getInstance('Jonah_Tagger')->getTags($row['id'], Jonah_Tagger::TYPE_STORY);
}
return $results;
}