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.

Reply via email to