The Gitlab instance will be restarted on Monday April 28th at 2AM. There will be a short interruption of service.

Skip to content
Snippets Groups Projects
Commit ad7167b9 authored by Demian Katz's avatar Demian Katz
Browse files

Added tag filtering to favorites.

parent 50bf1324
No related merge requests found
......@@ -45,16 +45,19 @@ class Gateway extends AbstractTableGateway
* Constructor
*
* @param string $table Name of database table to interface with
* @param string $rowClass Name of class used to represent rows
* @param string $rowClass Name of class used to represent rows (null for
* default)
*/
public function __construct($table, $rowClass)
public function __construct($table, $rowClass = null)
{
$this->table = $table;
$this->featureSet = new FeatureSet();
$this->featureSet->addFeature(new GlobalAdapterFeature());
$this->initialize();
$resultSetPrototype = $this->getResultSetPrototype();
$resultSetPrototype
->setArrayObjectPrototype(new $rowClass($this->getAdapter()));
if (!is_null($rowClass)) {
$resultSetPrototype = $this->getResultSetPrototype();
$resultSetPrototype
->setArrayObjectPrototype(new $rowClass($this->getAdapter()));
}
}
}
......@@ -167,21 +167,18 @@ class Resource extends Gateway
// Adjust for tags if necessary:
if (!empty($tags)) {
/* TODO:
$linkingTable = new ResourceTags();
foreach ($tags as $tag) {
$subSelect = $this->select();
$subSelect->setIntegrityCheck(false)
->distinct()
->from(array('rt' => 'resource_tags'), 'rt.resource_id')
->join(array('t' => 'tags'), 'rt.tag_id = t.id', array())
->where('t.tag = ?', $tag)
->where('rt.user_id = ?', $userId);
if (!is_null($listId)) {
$subSelect->where('rt.list_id = ?', $listId);
}
$select->where('r.id in ?', $subSelect);
$matches
= $linkingTable->getResourcesForTag($tag, $userId, $listId);
$select->where->in(
'resource.id',
array_map(
function ($i) { return $i['resource_id']; },
$matches->toArray()
)
);
}
*/
}
// Apply sorting, if necessary:
......
<?php
/**
* Table Definition for resource_tags
*
* PHP version 5
*
* Copyright (C) Villanova University 2010.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* @category VuFind2
* @package DB_Models
* @author Demian Katz <demian.katz@villanova.edu>
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License
* @link http://vufind.org Main Site
*/
namespace VuFind\Db\Table;
use Zend\Db\Sql\Expression;
/**
* Table Definition for resource_tags
*
* @category VuFind2
* @package DB_Models
* @author Demian Katz <demian.katz@villanova.edu>
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License
* @link http://vufind.org Main Site
*/
class ResourceTags extends Gateway
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct('resource_tags', 'VuFind\Db\Row\Resource');
}
/**
* Look up a row for the specified resource.
*
* @param string $resource_id ID of resource to link up
* @param string $tag_id ID of tag to link up
* @param string $user_id ID of user creating link (optional but recommended)
* @param string $list_id ID of list to link up (optional)
*
* @return void
*/
public function createLink($resource_id, $tag_id, $user_id = null,
$list_id = null
) {
/* TODO
$select = $this->select();
$select->where('resource_id = ?', $resource_id)
->where('tag_id = ?', $tag_id);
if (!is_null($list_id)) {
$select->where('list_id = ?', $list_id);
} else {
$select->where('list_id is null');
}
if (!is_null($user_id)) {
$select->where('user_id = ?', $user_id);
} else {
$select->where('user_id is null');
}
$result = $this->fetchRow($select);
// Only create row if it does not already exist:
if (is_null($result)) {
$result = $this->createRow();
$result->resource_id = $resource_id;
$result->tag_id = $tag_id;
if (!is_null($list_id)) {
$result->list_id = $list_id;
}
if (!is_null($user_id)) {
$result->user_id = $user_id;
}
$result->save();
}
*/
}
/**
* Check whether or not the specified tags are present in the table.
*
* @param array $ids IDs to check.
*
* @return array Associative array with two keys: present and missing
*/
public function checkForTags($ids)
{
/* TODO
// Set up return arrays:
$retVal = array('present' => array(), 'missing' => array());
// Look up IDs in the table:
$select = $this->select()->distinct()->from($this->_name, 'tag_id');
foreach ($ids as $current) {
$select->orWhere('tag_id = ?', $current);
}
$results = $this->fetchAll($select);
// Record all IDs that are present:
foreach ($results as $current) {
$retVal['present'][] = $current->tag_id;
}
// Detect missing IDs:
foreach ($ids as $current) {
if (!in_array($current, $retVal['present'])) {
$retVal['missing'][] = $current;
}
}
// Send back the results:
return $retVal;
*/
}
/**
* Get resources associated with a particular tag.
*
* @param string $tag Tag to match
* @param string $userId ID of user owning favorite list
* @param string $listId ID of list to retrieve (null for all favorites)
*
* @return Zend_Db_Table_Rowset
*/
public function getResourcesForTag($tag, $userId, $listId = null)
{
$callback = function ($select) use ($tag, $userId, $listId) {
$select->columns(
array(
'resource_id' => new Expression(
'DISTINCT(?)', array('resource_tags.resource_id'),
array(Expression::TYPE_IDENTIFIER)
)
)
);
$select->join(
array('t' => 'tags'), 'resource_tags.tag_id = t.id', array()
);
$select->where->equalTo('t.tag', $tag)
->where->equalTo('resource_tags.user_id', $userId);
if (!is_null($listId)) {
$select->where->equalTo('resource_tags.list_id', $listId);
}
};
return $this->select($callback);
}
/**
* Unlink rows for the specified resource.
*
* @param string|array $resource_id ID (or array of IDs) of resource(s) to
* unlink (null for ALL matching resources)
* @param string $user_id ID of user removing links
* @param string $list_id ID of list to unlink (null for ALL matching
* lists, 'none' for tags not in a list)
* @param string $tag_id ID of tag to unlink (null for ALL matching
* tags)
*
* @return void
*/
public function destroyLinks($resource_id, $user_id, $list_id = null,
$tag_id = null
) {
/* TODO
$db = $this->getAdapter();
$where = $db->quoteInto('user_id = ?', $user_id);
if (!is_null($resource_id)) {
if (is_array($resource_id)) {
$resourceSQL = array();
foreach ($resource_id as $current) {
$resourceSQL[] = $db->quoteInto('resource_id = ?', $current);
}
$where .= ' AND (' . implode(' OR ', $resourceSQL) . ')';
} else {
$where .= $db->quoteInto(' AND resource_id = ?', $resource_id);
}
}
if (!is_null($list_id)) {
if ($list_id != 'none') {
$where .= $db->quoteInto(' AND list_id = ?', $list_id);
} else {
// special case -- if $list_id is set to the string "none", we
// want to delete tags that are not associated with lists.
$where .= ' AND list_id is null';
}
}
if (!is_null($tag_id)) {
$where .= $db->quoteInto(' AND tag_id = ?', $tag_id);
}
// Get a list of all tag IDs being deleted; we'll use these for
// orphan-checking:
$select = $this->select()->distinct()->from($this->_name, 'tag_id')
->where($where);
$potentialOrphans = $this->fetchAll($select);
// Now delete the unwanted rows:
$this->delete($where);
// Check for orphans:
if (count($potentialOrphans) > 0) {
$ids = array();
foreach ($potentialOrphans as $current) {
$ids[] = $current->tag_id;
}
$checkResults = $this->checkForTags($ids);
if (count($checkResults['missing']) > 0) {
$tagTable = new VuFind_Model_Db_Tags();
$tagTable->deleteByIdArray($checkResults['missing']);
}
}
*/
}
/**
* Assign anonymous tags to the specified user ID.
*
* @param int $id User ID to own anonymous tags.
*
* @return void
*/
public function assignAnonymousTags($id)
{
/* TODO
$this->update(array('user_id' => $id), 'user_id IS NULL');
*/
}
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment