Author: mj
Date: Tue Mar 27 15:13:12 2012
New Revision: 11289
Log:
Issue 2289. Facet links work and filters use ES boolean query instead of ES
filters to match expected faceting behaviour.
Modified:
trunk/plugins/qtDominionPlugin/modules/search/actions/autocompleteAction.class.php
trunk/plugins/qtDominionPlugin/modules/search/actions/indexAction.class.php
trunk/plugins/qtDominionPlugin/modules/search/templates/_searchResults.php
trunk/plugins/qtDominionPlugin/modules/search/templates/indexSuccess.php
Modified:
trunk/plugins/qtDominionPlugin/modules/search/actions/autocompleteAction.class.php
==============================================================================
---
trunk/plugins/qtDominionPlugin/modules/search/actions/autocompleteAction.class.php
Tue Mar 27 13:04:43 2012 (r11288)
+++
trunk/plugins/qtDominionPlugin/modules/search/actions/autocompleteAction.class.php
Tue Mar 27 15:13:12 2012 (r11289)
@@ -20,9 +20,17 @@
{
public function execute($request)
{
+ $this->setLayout(false);
+
// remove wildcard characters so we have a clean term query
$querystring = strtr($this->request->query, array('*' => '', '?' => ''));
+ // if querystring is empty, don't query
+ if ('' == preg_replace('/[\s\t\r\n]*/', '', $querystring))
+ {
+ exit; // FIXME: 'return' still renders part of the template
+ }
+
$query = new Elastica_Query();
$query->setLimit(3);
@@ -43,7 +51,5 @@
$query->setFields(array('slug', 'i18n'));
$query->setQuery(new Elastica_Query_Wildcard('i18n.name', $querystring .
'*'));
$this->subjects =
QubitSearch::getInstance()->index->getType('QubitTerm')->search($query->setFilter($filter->setTerm('taxonomyId',
QubitTaxonomy::SUBJECT_ID)));
-
- $this->setLayout(false);
}
}
\ No newline at end of file
Modified:
trunk/plugins/qtDominionPlugin/modules/search/actions/indexAction.class.php
==============================================================================
--- trunk/plugins/qtDominionPlugin/modules/search/actions/indexAction.class.php
Tue Mar 27 13:04:43 2012 (r11288)
+++ trunk/plugins/qtDominionPlugin/modules/search/actions/indexAction.class.php
Tue Mar 27 15:13:12 2012 (r11289)
@@ -18,6 +18,8 @@
class SearchIndexAction extends sfAction
{
+ public $facets = array('ancestors', 'repository.id', 'subjects.id',
'digitalObject.mediaTypeId', 'places.id', 'names.id', 'i18n.culture');
+
public function execute($request)
{
if ('print' == $request->getGetParameter('media'))
@@ -37,20 +39,17 @@
$this->response->setTitle("{$this->title} -
{$this->response->getTitle()}");
}
- $queryParsed = $this->parseQuery(); // Elastica_Query_QueryString
+ $queryParsed = $this->parseQuery(); // Elastica_Query_MatchAll or
Elastica_Query_QueryString
if (!empty($this->error))
{
return;
}
- $query = new Elastica_Query($queryParsed);
-
- //TODO: if ($request->isXmlHttpRequest()) ...
- // for autocomplete multi-index workflow
+ $queryFiltered = $this->filterQuery($queryParsed); // Elastica_Query_Bool
- $query = $this->facetQuery($query);
- $query = $this->filterQuery($query);
+ $query = new Elastica_Query($queryFiltered); // Elastica_Query
+ $query = $this->facetQuery($query); // Elastica_Query
// set paging for request
$query->setLimit($this->request->limit);
@@ -97,13 +96,18 @@
if ($resultSet->hasFacets())
{
+ $facets = array();
+
// build lookup tables for I18nized values
foreach ($resultSet->getFacets() as $name => $facet)
{
- $ids = array();
- foreach ($facet['terms'] as $term)
+ if (isset($facet['terms']))
{
- $ids[$term['term']] = $term['count'];
+ $ids = array();
+ foreach ($facet['terms'] as $term)
+ {
+ $ids[$term['term']] = $term['count'];
+ }
}
switch ($name)
@@ -244,10 +248,16 @@
public function parseQuery()
{
+ // if querystring is empty, use match_all
+ if ('' == preg_replace('/[\s\t\r\n]*/', '', $this->request->query))
+ {
+ return new Elastica_Query_MatchAll();
+ }
+
try
{
// Parse query string
- $queryParsed = QubitSearch::getInstance()->parse($this->request->query);
+ $queryParsed = QubitSearch::getInstance()->parse($this->request->query);
// Elastica_Query_QueryString
}
catch (Exception $e)
{
@@ -261,7 +271,7 @@
public function facetQuery($query)
{
- foreach (array('ancestors', 'repository.id', 'subjects.id',
'digitalObject.mediaTypeId', 'places.id', 'names.id', 'i18n.culture') as $field)
+ foreach ($this->facets as $field)
{
$facet = new Elastica_Facet_Terms($field);
$facet->setField($field);
@@ -279,24 +289,31 @@
public function filterQuery($query)
{
-/*
- // Limit search to current culture and info. objects
-//
$query->addSubquery(QubitSearch::getInstance()->addTerm('QubitInformationObject',
'className'), true);
-
$query->addSubquery(QubitSearch::getInstance()->addTerm($this->context->user->getCulture(),
'culture'), true);
+ $this->filters = array();
+ $queryTerm = new Elastica_Query_Term();
+ $queryBool = new Elastica_Query_Bool();
- $query = QubitAcl::searchFilterByRepository($query, 'read');
- $query = QubitAcl::searchFilterDrafts($query);
+ if ($query instanceof Elastica_Query_QueryString)
+ {
+ $queryBool->addMust($query);
+ }
- // Limit to a repository if in context
- if (isset($this->getRoute()->resource) && $this->getRoute()->resource
instanceof QubitRepository)
+ foreach ($this->request->getParameterHolder()->getAll() as $param =>
$value)
{
-
$query->addSubquery(QubitSearch::getInstance()->addTerm($this->getRoute()->resource->id,
'repositoryId'), true);
- $this->title .= $this->context->i18n->__(' in %1%', array('%1%' =>
$this->getRoute()->resource->authorizedFormOfName));
+ if (in_array(strtr($param, '_', '.'), $this->facets))
+ {
+ foreach (explode(',', $value) as $facetValue)
+ {
+ // don't include empty filters (querystring sanitization)
+ if ('' != preg_replace('/[\s\t\r\n]*/', '', $facetValue))
+ {
+ $this->filters[$param][] = $facetValue;
+ $query = $queryBool->addMust($queryTerm->setTerm(strtr($param,
'_', '.'), $facetValue));
+ }
+ }
+ }
}
-// $query = new Elastica_Query_Bool();
-// $query->addMust($queryParsed);
-*/
return $query;
}
}
\ No newline at end of file
Modified:
trunk/plugins/qtDominionPlugin/modules/search/templates/_searchResults.php
==============================================================================
--- trunk/plugins/qtDominionPlugin/modules/search/templates/_searchResults.php
Tue Mar 27 13:04:43 2012 (r11288)
+++ trunk/plugins/qtDominionPlugin/modules/search/templates/_searchResults.php
Tue Mar 27 15:13:12 2012 (r11289)
@@ -65,11 +65,11 @@
<div class="scrollable" id="subjects">
<ul>
- <li class="active"><?php echo link_to(__('All'),
array('subjects_id' => null, 'page' => null) +
$sf_request->getParameterHolder()->getAll()); ?></li>
+ <li <?php if ('' == $sf_request->getParameter('subjects_id')) echo
'class="active"'; ?>><?php echo link_to(__('All'), array('subjects_id' => null,
'page' => null) + $sf_request->getParameterHolder()->getAll()); ?></li>
<?php foreach($pager->facets['subjects_id']['terms'] as $id =>
$term): ?>
- <li><?php echo
link_to(__($term['term']).'<span>'.$term['count'].'</span>',
array('subjects_id' => $id, 'page' => null) +
$sf_request->getParameterHolder()->getAll()); ?></li>
+ <li <?php if (in_array($id, $filters['subjects_id'])) echo
'class="active"'; ?>><?php echo
link_to(__($term['term']).'<span>'.$term['count'].'</span>',
array('subjects_id' => ($filters['subjects_id'] ? implode(',',
array_diff(array_merge($filters['subjects_id'], array($id)),
array_intersect($filters['subjects_id'], array($id)))) : $id), 'page' => null)
+ $sf_request->getParameterHolder()->getAll()); ?></li>
<?php endforeach; ?>
@@ -84,11 +84,11 @@
<div class="scrollable" id="mediatypes">
<ul>
- <li class="active"><?php echo link_to(__('All'),
array('digitalObject_mediaTypeId' => null, 'page' => null) +
$sf_request->getParameterHolder()->getAll()); ?></li>
+ <li <?php if ('' ==
$sf_request->getParameter('digitalObject_mediaTypeId')) echo 'class="active"';
?>><?php echo link_to(__('All'), array('digitalObject_mediaTypeId' => null,
'page' => null) + $sf_request->getParameterHolder()->getAll()); ?></li>
<?php foreach($pager->facets['digitalObject_mediaTypeId']['terms']
as $id => $term): ?>
- <li><?php echo
link_to(__($term['term']).'<span>'.$term['count'].'</span>',
array('digitalObject_mediaTypeId' => $id, 'page' => null) +
$sf_request->getParameterHolder()->getAll()); ?></li>
+ <li <?php if (in_array($id,
$filters['digitalObject_mediaTypeId'])) echo 'class="active"'; ?>><?php echo
link_to(__($term['term']).'<span>'.$term['count'].'</span>',
array('digitalObject_mediaTypeId' => ($filters['digitalObject_mediaTypeId'] ?
implode(',', array_diff(array_merge($filters['digitalObject_mediaTypeId'],
array($id)), array_intersect($filters['digitalObject_mediaTypeId'],
array($id)))) : $id), 'page' => null) +
$sf_request->getParameterHolder()->getAll()); ?></li>
<?php endforeach; ?>
@@ -114,11 +114,11 @@
<div class="scrollable" id="places">
<ul>
- <li class="active"><?php echo link_to(__('All'), array('places_id'
=> null, 'page' => null) + $sf_request->getParameterHolder()->getAll()); ?></li>
+ <li <?php if ('' == $sf_request->getParameter('places_id')) echo
'class="active"'; ?>><?php echo link_to(__('All'), array('places_id' => null,
'page' => null) + $sf_request->getParameterHolder()->getAll()); ?></li>
<?php foreach($pager->facets['places_id']['terms'] as $id =>
$term): ?>
- <li><?php echo
link_to(__($term['term']).'<span>'.$term['count'].'</span>', array('places_id'
=> $id, 'page' => null) + $sf_request->getParameterHolder()->getAll()); ?></li>
+ <li <?php if (in_array($id, $filters['places_id'])) echo
'class="active"'; ?>><?php echo
link_to(__($term['term']).'<span>'.$term['count'].'</span>', array('places_id'
=> ($filters['places_id'] ? implode(',',
array_diff(array_merge($filters['places_id'], array($id)),
array_intersect($filters['places_id'], array($id)))) : $id), 'page' => null) +
$sf_request->getParameterHolder()->getAll()); ?></li>
<?php endforeach; ?>
@@ -134,11 +134,11 @@
<div class="scrollable" id="names">
<ul>
- <li class="active"><?php echo link_to(__('All'), array('names_id'
=> null, 'page' => null) + $sf_request->getParameterHolder()->getAll()); ?></li>
+ <li <?php if ('' == $sf_request->getParameter('names_id')) echo
'class="active"'; ?>><?php echo link_to(__('All'), array('names_id' => null,
'page' => null) + $sf_request->getParameterHolder()->getAll()); ?></li>
<?php foreach($pager->facets['names_id']['terms'] as $id =>
$term): ?>
- <li><?php echo
link_to(__($term['term']).'<span>'.$term['count'].'</span>', array('names_id'
=> $id, 'page' => null) + $sf_request->getParameterHolder()->getAll()); ?></li>
+ <li <?php if (in_array($id, $filters['names_id'])) echo
'class="active"'; ?>><?php echo
link_to(__($term['term']).'<span>'.$term['count'].'</span>', array('names_id'
=> ($filters['names_id'] ? implode(',',
array_diff(array_merge($filters['names_id'], array($id)),
array_intersect($filters['names_id'], array($id)))) : $id), 'page' => null) +
$sf_request->getParameterHolder()->getAll()); ?></li>
<?php endforeach; ?>
@@ -153,11 +153,11 @@
<div class="scrollable" id="languages">
<ul>
- <li class="active"><?php echo link_to(__('All'),
array('i18n_culture' => null, 'page' => null) +
$sf_request->getParameterHolder()->getAll()); ?></li>
+ <li <?php if ('' == $sf_request->getParameter('i18n_culture'))
echo 'class="active"'; ?>><?php echo link_to(__('All'), array('i18n_culture' =>
null, 'page' => null) + $sf_request->getParameterHolder()->getAll()); ?></li>
<?php foreach($pager->facets['i18n_culture']['terms'] as $id =>
$term): ?>
- <li><?php echo
link_to(__($term['term']).'<span>'.$term['count'].'</span>',
array('i18n_culture' => $id, 'page' => null) +
$sf_request->getParameterHolder()->getAll()); ?></li>
+ <li <?php if (in_array($id, $filters['i18n_culture'])) echo
'class="active"'; ?>><?php echo
link_to(__($term['term']).'<span>'.$term['count'].'</span>',
array('i18n_culture' => ($filters['i18n_culture'] ? implode(',',
array_diff(array_merge($filters['i18n_culture'], array($id)),
array_intersect($filters['i18n_culture'], array($id)))) : $id), 'page' => null)
+ $sf_request->getParameterHolder()->getAll()); ?></li>
<?php endforeach; ?>
@@ -244,11 +244,13 @@
<p><?php echo
link_to($doc[$sf_user->getCulture()]['scopeAndContent'] ?:
$doc[$doc['sourceCulture']]['scopeAndContent'], array('module' =>
'informationobject', 'slug' => $doc['slug']), array('title' =>
$doc[$sf_user->getCulture()]['title'] ?: $doc[$doc['sourceCulture']]['title']))
?>
</p>
- <p><?php if ('' != Qubit::renderDateStartEnd(null,
$doc['dates'][0]['start'], $doc['dates'][0]['end']) ||
!empty($doc[$sf_user->getCulture()]['creator'][0]['name']) ||
!empty($doc[$doc['sourceCulture']]['creator'][0]['name'])): ?>
- <?php echo __('%1% by %2%', // FIXME: ARRAY ENUMERATION
- array('%1%' => Qubit::renderDateStartEnd(null,
$doc['dates'][0]['start'], $doc['dates'][0]['end']),
- '%2%' =>
$doc[$sf_user->getCulture()]['creator'][0]['name'] ?:
$doc[$doc['sourceCulture']]['creator'][0]['name'])); ?></p>
- <?php endif; ?>
+ <p>
+ <?php echo Qubit::renderDateStartEnd(null,
$doc['dates'][0]['start'], $doc['dates'][0]['end']); ?>
+ <?php if
(!empty($doc[$doc['sourceCulture']]['creator'][0]['name'])): ?>
+ <?php echo __('by %1%', // FIXME: ARRAY ENUMERATION
+ array('%1%' =>
$doc[$sf_user->getCulture()]['creator'][0]['name'] ?:
$doc[$doc['sourceCulture']]['creator'][0]['name'])); ?>
+ <?php endif; ?>
+ </p>
</div><!-- /.result -->
<?php endforeach; ?>
Modified:
trunk/plugins/qtDominionPlugin/modules/search/templates/indexSuccess.php
==============================================================================
--- trunk/plugins/qtDominionPlugin/modules/search/templates/indexSuccess.php
Tue Mar 27 13:04:43 2012 (r11288)
+++ trunk/plugins/qtDominionPlugin/modules/search/templates/indexSuccess.php
Tue Mar 27 15:13:12 2012 (r11289)
@@ -1,3 +1,3 @@
<?php use_helper('Text') ?>
-<?php echo get_partial('search/searchResults', array('pager' => $pager)) ?>
+<?php echo get_partial('search/searchResults', array('pager' => $pager,
'filters' => $filters)) ?>
--
You received this message because you are subscribed to the Google Groups
"Qubit Toolkit Commits" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/qubit-commits?hl=en.