Author: sevein
Date: Tue Jun  5 18:03:22 2012
New Revision: 11737

Log:
Add facets to advanced search extending search/index action

Modified:
   branches/2.0/apps/qubit/modules/search/actions/advancedAction.class.php
   branches/2.0/apps/qubit/modules/search/actions/indexAction.class.php
   branches/2.0/apps/qubit/modules/search/templates/advancedSuccess.php
   branches/2.0/lib/QubitSearchPager.class.php

Modified: 
branches/2.0/apps/qubit/modules/search/actions/advancedAction.class.php
==============================================================================
--- branches/2.0/apps/qubit/modules/search/actions/advancedAction.class.php     
Tue Jun  5 13:44:10 2012        (r11736)
+++ branches/2.0/apps/qubit/modules/search/actions/advancedAction.class.php     
Tue Jun  5 18:03:22 2012        (r11737)
@@ -17,7 +17,7 @@
  * along with Qubit Toolkit.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-class SearchAdvancedAction extends sfAction
+class SearchAdvancedAction extends SearchIndexAction
 {
   public static
     $NAMES = array(
@@ -193,264 +193,120 @@
     }
   }
 
-  public function execute($request)
+  protected function parseQuery()
   {
-    if ('print' == $request->getGetParameter('media'))
-    {
-      $this->getResponse()->addStylesheet('print-preview', 'last');
-    }
-
-    if (!isset($request->limit))
-    {
-      $request->limit = sfConfig::get('app_hits_per_page');
-    }
+    $queryBool = new Elastica_Query_Bool();
 
-    $this->form = new sfForm;
-    $this->form->getValidatorSchema()->setOption('allow_extra_fields', true);
-
-    foreach ($this::$NAMES as $name)
+    if (!isset($this->request->searchFields))
     {
-      $this->addField($name);
+      throw new Exception('Search is empty');
     }
 
-    $this->form->bind($request->getRequestParameters() + 
$request->getGetParameters() + $request->getPostParameters());
-
-    if ($this->form->isValid())
+    // Iterate over search fields
+    foreach ($this->request->searchFields as $key => $item)
     {
-      $query = new Elastica_Query;
-      $queryBool = new Elastica_Query_Bool();
-
-      // Process filters passing $queryBool
-      $this->hasFilters = false;
-      foreach ($this->form as $field)
+      if (empty($item['query']))
       {
-        if (isset($this->request[$field->getName()]))
-        {
-          $this->processField($field, $queryBool);
-        }
+        continue;
       }
 
-      if (!is_array($request->searchFields))
-      {
-        $request->searchFields = array($request->searchFields);
-      }
-
-      $hasAnySearchField = false;
-      foreach ($request->searchFields as $key => $item)
-      {
-        if (empty($item['query']))
-        {
-          continue;
-        }
-
-        $hasAnySearchField = true;
-
-        $queryText = new Elastica_Query_Text();
-
-        switch ($item['field'])
-        {
-          case 'identifier':
-            $queryText->setFieldQuery('identifier', $item['query']);
-
-            break;
-
-          case 'title':
-            $queryText->setFieldQuery('i18n.title', $item['query']);
-
-            break;
-
-          case 'scopeAndContent':
-            $queryText->setFieldQuery('i18n.scopeAndContet', $item['query']);
-
-            break;
-
-          case 'archivalHistory':
-            $queryText->setFieldQuery('i18n.archivalHistory', $item['query']);
-
-            break;
-
-          case 'extentAndMedium':
-            $queryText->setFieldQuery('i18n.extentAndMedium', $item['query']);
+      $hasAnySearchField = true;
 
-            break;
+      $queryText = new Elastica_Query_Text();
 
-          case 'creatorHistory':
-            $queryText->setFieldQuery('', $item['query']);
+      switch ($item['field'])
+      {
+        case 'identifier':
+          $queryText->setFieldQuery('identifier', $item['query']);
 
-            break;
+          break;
 
-          case 'subject':
-            $queryText->setFieldQuery('', $item['query']);
+        case 'title':
+          $queryText->setFieldQuery('i18n.title', $item['query']);
 
-            break;
+          break;
 
-          case 'name':
-            $queryText->setFieldQuery('', $item['query']);
+        case 'scopeAndContent':
+          $queryText->setFieldQuery('i18n.scopeAndContet', $item['query']);
 
-            break;
+          break;
 
-          case 'place':
-            $queryText->setFieldQuery('', $item['query']);
+        case 'archivalHistory':
+          $queryText->setFieldQuery('i18n.archivalHistory', $item['query']);
 
-            break;
+          break;
 
-          default:
-            $queryText->setFieldQuery('_all', $item['query']);
+        case 'extentAndMedium':
+          $queryText->setFieldQuery('i18n.extentAndMedium', $item['query']);
 
-            break;
-        }
+          break;
 
-        if (0 == $key)
-        {
-          $item['operator'] == 'add';
-        }
+        case 'creatorHistory':
+          $queryText->setFieldQuery('', $item['query']);
 
-        switch ($item['operator'])
-        {
-          case 'not':
-            $queryBool->addMustNot($queryText);
+          break;
 
-            break;
+        case 'subject':
+          $queryText->setFieldQuery('', $item['query']);
 
-          case 'or':
-            $queryBool->addShould($queryText);
+          break;
 
-            break;
+        case 'name':
+          $queryText->setFieldQuery('', $item['query']);
 
-          case 'add':
-          default:
-            $queryBool->addMust($queryText);
+          break;
 
-            break;
-        }
-      }
+        case 'place':
+          $queryText->setFieldQuery('', $item['query']);
 
-      // Interrupt execution because inexistence of search fields
-      if (!$hasAnySearchField)
-      {
-        return;
-      }
+          break;
 
-      $query->setQuery($queryBool);
+        default:
+          $queryText->setFieldQuery('_all', $item['query']);
 
-      // Add facets to list related items
-      foreach (array('repository.id', 'digitalObject.mediaTypeId') as $field)
-      {
-        $facet = new Elastica_Facet_Terms($field);
-        $facet->setField($field);
-        $facet->setSize(50);
-        $query->addFacet($facet);
+          break;
       }
 
-      $resultSet = 
QubitSearch::getInstance()->index->getType('QubitInformationObject')->search($query);
-
-      $this->pager = new QubitSearchPager($resultSet);
-      $this->pager->setPage($request->page ? $request->page : 1);
-
-      if ('print' != $request->getGetParameter('media'))
+      if (0 == $key)
       {
-        $this->pager->setMaxPerPage($request->limit);
-      }
-      else
-      {
-        $this->pager->setMaxPerPage(500);
+        $item['operator'] == 'add';
       }
 
-      if ($this->pager->hasResults())
+      switch ($item['operator'])
       {
-        $facets = array();
+        case 'not':
+          $queryBool->addMustNot($queryText);
 
-        // build lookup tables for I18nized values
-        foreach ($resultSet->getFacets() as $name => $facet)
-        {
-          if (isset($facet['terms']))
-          {
-            $ids = array();
-            foreach ($facet['terms'] as $term)
-            {
-              $ids[$term['term']] = $term['count'];
-            }
-          }
-
-          switch ($name)
-          {
-            // NB: this is actually used as a lookup table, not a facet
-            // it could alternately be done by iterating over the result 
documents
-            // for a potential performance increase
-            case 'repository.id':
-              $criteria = new Criteria;
-              $criteria->add(QubitRepository::ID, array_keys($ids), 
Criteria::IN);
-
-              $repos = QubitRepository::get($criteria);
-
-              foreach ($repos as $repo)
-              {
-                $reponames[$repo->id] = 
$repo->getAuthorizedFormOfName(array('cultureFallback' => true));
-              }
-
-              foreach ($facet['terms'] as $term)
-              {
-                $facets[strtr($name, '.', '_')]['terms'][$term['term']] = 
array(
-                  'count' => $term['count'],
-                  'term' => $reponames[$term['term']]);
-              }
-
-              break;
-
-            case 'digitalObject.mediaTypeId':
-              $criteria = new Criteria;
-              $criteria->add(QubitTerm::ID, array_keys($ids), Criteria::IN);
-
-              $mediaTypes = QubitTerm::get($criteria);
-
-              foreach ($mediaTypes as $mediaType)
-              {
-                $mediaTypeNames[$mediaType->id] = 
$mediaType->getName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
-              }
-
-              foreach ($facet['terms'] as $term)
-              {
-                $facets[strtr($name, '.', '_')]['terms'][$term['term']] = 
array(
-                  'count' => $term['count'],
-                  'term' => $mediaTypeNames[$term['term']]);
-              }
+          break;
 
-              break;
-          }
-        }
+        case 'or':
+          $queryBool->addShould($queryText);
 
-        $ancestorsIds = array();
-        foreach ($this->pager->getResults() as $hit)
-        {
-          $doc = $hit->getData();
-          foreach ($doc['ancestors'] as $item)
-          {
-            if (in_array($item, $ancestorsIds))
-            {
-              continue;
-            }
+          break;
 
-            $ancestorsIds[] = $item;
-          }
-        }
+        case 'add':
+        default:
+          $queryBool->addMust($queryText);
 
-        $sql = 'SELECT
-            io.id,
-            o.slug,
-            io.title
-          FROM '.QubitInformationObjectI18n::TABLE_NAME.' AS io
-          LEFT JOIN '.QubitSlug::TABLE_NAME.' AS o ON (o.object_id = io.id AND 
io.culture = ?)
-          WHERE o.object_id IN ('.implode(',', $ancestorsIds).')';
-        $this->pager->ancestors = array();
-        foreach (QubitPdo::fetchAll($sql, 
array($this->context->user->getCulture())) as $ancestor)
-        {
-          $this->pager->ancestors[$ancestor->id] = array(
-            'slug' => $ancestor->slug,
-            'title' => $ancestor->title);
-        }
+          break;
+      }
+    }
 
-        $this->pager->facets = $facets;
+    // Process filters passing $queryBool
+    $this->hasFilters = false;
+    foreach ($this->form as $field)
+    {
+      if (isset($this->request[$field->getName()]))
+      {
+        $this->processField($field, $queryBool);
       }
     }
+
+    return $queryBool;
+  }
+
+  public function execute($request)
+  {
+    parent::execute($request);
   }
 }

Modified: branches/2.0/apps/qubit/modules/search/actions/indexAction.class.php
==============================================================================
--- branches/2.0/apps/qubit/modules/search/actions/indexAction.class.php        
Tue Jun  5 13:44:10 2012        (r11736)
+++ branches/2.0/apps/qubit/modules/search/actions/indexAction.class.php        
Tue Jun  5 18:03:22 2012        (r11737)
@@ -20,6 +20,10 @@
 class SearchIndexAction extends sfAction
 {
   public static
+    $NAMES = array(
+      );
+
+  public static
     $FACETS = array(
       'repository.id',
       'subjects.id',
@@ -27,37 +31,96 @@
       'places.id',
       'names.id');
 
-  public function execute($request)
+  protected function addField($name)
   {
-    if ('print' == $request->getGetParameter('media'))
+  }
+
+  protected function parseQuery()
+  {
+    // if querystring is empty, use match_all
+    if ('' == preg_replace('/[\s\t\r\n]*/', '', $this->request->query))
     {
-      $this->getResponse()->addStylesheet('print-preview', 'last');
+      return new Elastica_Query_MatchAll();
     }
 
-    if (!isset($request->limit))
+    try
     {
-      $request->limit = sfConfig::get('app_hits_per_page');
+      // Parse query string, Elastica_Query_QueryString
+      $query = QubitSearch::getInstance()->parse($this->request->query);
     }
+    catch (Exception $e)
+    {
+      $this->error = $e->getMessage();
+
+      return null;
+    }
+
+    return $query;
+  }
 
-    if (isset($request->query))
+  protected function filterQuery($query)
+  {
+    $this->filters = array();
+
+    $queryTerm = new Elastica_Query_Term();
+    $queryBool = new Elastica_Query_Bool();
+
+    if ($query instanceof Elastica_Query_QueryString)
     {
-      $this->title = $this->context->i18n->__('Search for [%1%]', array('%1%' 
=> $request->query));
-      $this->response->setTitle("{$this->title} - 
{$this->response->getTitle()}");
+      $queryBool->addMust($query);
     }
 
-    $queryParsed = $this->parseQuery(); // Elastica_Query_MatchAll or 
Elastica_Query_QueryString
+    foreach ($this->request->getGetParameters() as $param => $value)
+    {
+      if (in_array(strtr($param, '_', '.'), self::$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));
+          }
+        }
+      }
+    }
 
-    if (!empty($this->error))
+    return $query;
+  }
+
+  protected function facetQuery($query)
+  {
+    foreach (self::$FACETS as $field)
     {
-      return;
+      $facet = new Elastica_Facet_Terms($field);
+      $facet->setField($field);
+      $facet->setSize(50);
+      $query->addFacet($facet);
     }
 
-    $queryFiltered = $this->filterQuery($queryParsed); // Elastica_Query_Bool
+    $facet = new Elastica_Facet_Range('dates.startDate');
+    $facet->setField('dates.startDate');
+    $facet->addRange(null, null);
+    $query->addFacet($facet);
 
-    $query = new Elastica_Query($queryFiltered);       // Elastica_Query
-    $query = $this->facetQuery($query);                // Elastica_Query
+    return $query;
+  }
+
+  protected function buildQuery()
+  {
+    // Parse query string - Elastica_Query_{MatchAll,QueryString}
+    $query = $this->parseQuery();
+
+    // Filter by selected facets - Elastica_Query_Bool
+    $query = $this->filterQuery($query);
+
+    // Elastica_Query
+    $query = new Elastica_Query($query);
+
+    // Add facets - Elastica_Query
+    $query = $this->facetQuery($query);
 
-    // tie-break sort on slug (ie. alphanumeric sort), eg. for match_all
     $query->setSort(array('_score' => 'desc', 'slug' => 'asc'));
     $query->setLimit($request->limit);
 
@@ -71,273 +134,239 @@
       $query->setQuery(new Elastica_Query_Term(array('repository._id' => 
$request->realm)));
     }
 
-    try
-    {
-      $resultSet = 
QubitSearch::getInstance()->index->getType('QubitInformationObject')->search($query);
-    }
-    catch (Exception $e)
-    {
-      $this->error = $e->getMessage();
+    return $query;
+  }
 
-      return;
+  protected function populateFacets()
+  {
+    if (!$this->pager->hasFacets())
+    {
+      return false;
     }
 
-    // mock up a QubitPager for partial template backward compatibility
-    $this->pager = new QubitSearchPager($resultSet);
-    $this->pager->setPage($request->page ? $request->page : 1);
+    $facets = array();
 
-    if ('print' != $request->getGetParameter('media'))
+    foreach ($this->pager->getFacets() as $name => $facet)
     {
-      $this->pager->setMaxPerPage($request->limit);
-    }
-    else
-    {
-      $this->pager->setMaxPerPage(500); // force for print
-    }
+      if (isset($facet['terms']))
+      {
+        $ids = array();
+        foreach ($facet['terms'] as $term)
+        {
+          $ids[$term['term']] = $term['count'];
+        }
+      }
 
-    if ($this->pager->hasResults())
-    {
-      // Pre-populate some lookup tables for multilingual values
-      if ($resultSet->hasFacets())
+      switch ($name)
       {
-        $facets = array();
+        case 'repository.id':
+          $criteria = new Criteria;
+          $criteria->add(QubitRepository::ID, array_keys($ids), Criteria::IN);
 
-        foreach ($resultSet->getFacets() as $name => $facet)
-        {
-          if (isset($facet['terms']))
+          $repos = QubitRepository::get($criteria);
+
+          foreach ($repos as $repo)
           {
-            $ids = array();
-            foreach ($facet['terms'] as $term)
-            {
-              $ids[$term['term']] = $term['count'];
-            }
+            $reponames[$repo->id] = 
$repo->getAuthorizedFormOfName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
           }
 
-          switch ($name)
+          foreach ($facet['terms'] as $term)
           {
-            case 'repository.id':
-              $criteria = new Criteria;
-              $criteria->add(QubitRepository::ID, array_keys($ids), 
Criteria::IN);
-
-              $repos = QubitRepository::get($criteria);
-
-              foreach ($repos as $repo)
-              {
-                $reponames[$repo->id] = 
$repo->getAuthorizedFormOfName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
-              }
-
-              foreach ($facet['terms'] as $term)
-              {
-                $facets[strtr($name, '.', '_')]['terms'][$term['term']] = 
array(
-                  'count' => $term['count'],
-                  'term' => $reponames[$term['term']]);
-              }
-
-              break;
-
-            case 'subjects.id':
-              $criteria = new Criteria;
-              $criteria->add(QubitTerm::ID, array_keys($ids), Criteria::IN);
+            $facets[strtr($name, '.', '_')]['terms'][$term['term']] = array(
+              'count' => $term['count'],
+              'term' => $reponames[$term['term']]);
+          }
 
-              $subjectAPs = QubitTerm::get($criteria);
+          break;
 
-              foreach ($subjectAPs as $subjectAP)
-              {
-                $subjectAPnames[$subjectAP->id] = 
$subjectAP->getName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
-              }
+        case 'subjects.id':
+          $criteria = new Criteria;
+          $criteria->add(QubitTerm::ID, array_keys($ids), Criteria::IN);
 
-              foreach ($facet['terms'] as &$term)
-              {
-                $facets[strtr($name, '.', '_')]['terms'][$term['term']] = 
array(
-                  'count' => $term['count'],
-                  'term' => $subjectAPnames[$term['term']]);
-              }
+          $subjectAPs = QubitTerm::get($criteria);
 
-              break;
+          foreach ($subjectAPs as $subjectAP)
+          {
+            $subjectAPnames[$subjectAP->id] = 
$subjectAP->getName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
+          }
 
-            case 'digitalObject.mediaTypeId':
-              $criteria = new Criteria;
-              $criteria->add(QubitTerm::ID, array_keys($ids), Criteria::IN);
+          foreach ($facet['terms'] as &$term)
+          {
+            $facets[strtr($name, '.', '_')]['terms'][$term['term']] = array(
+              'count' => $term['count'],
+              'term' => $subjectAPnames[$term['term']]);
+          }
 
-              $mediaTypes = QubitTerm::get($criteria);
+          break;
 
-              foreach ($mediaTypes as $mediaType)
-              {
-                $mediaTypeNames[$mediaType->id] = 
$mediaType->getName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
-              }
+        case 'digitalObject.mediaTypeId':
+          $criteria = new Criteria;
+          $criteria->add(QubitTerm::ID, array_keys($ids), Criteria::IN);
 
-              foreach ($facet['terms'] as $term)
-              {
-                $facets[strtr($name, '.', '_')]['terms'][$term['term']] = 
array(
-                  'count' => $term['count'],
-                  'term' => $mediaTypeNames[$term['term']]);
-              }
+          $mediaTypes = QubitTerm::get($criteria);
 
-              break;
+          foreach ($mediaTypes as $mediaType)
+          {
+            $mediaTypeNames[$mediaType->id] = 
$mediaType->getName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
+          }
 
-            case 'dates.startDate':
-              $facets[strtr($name, '.', '_')] = $facet['ranges'][0];  // 
FIXME: is this the best way?
+          foreach ($facet['terms'] as $term)
+          {
+            $facets[strtr($name, '.', '_')]['terms'][$term['term']] = array(
+              'count' => $term['count'],
+              'term' => $mediaTypeNames[$term['term']]);
+          }
 
-              break;
+          break;
 
-            case 'places.id':
-              $criteria = new Criteria;
-              $criteria->add(QubitTerm::ID, array_keys($ids), Criteria::IN);
+        case 'dates.startDate':
+          $facets[strtr($name, '.', '_')] = $facet['ranges'][0];  // FIXME: is 
this the best way?
 
-              $placeAPs = QubitTerm::get($criteria);
+          break;
 
-              foreach ($placeAPs as $placeAP)
-              {
-                $placeAPnames[$placeAP->id] = 
$placeAP->getName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
-              }
+        case 'places.id':
+          $criteria = new Criteria;
+          $criteria->add(QubitTerm::ID, array_keys($ids), Criteria::IN);
 
-              foreach ($facet['terms'] as &$term)
-              {
-                $facets[strtr($name, '.', '_')]['terms'][$term['term']] = 
array(
-                  'count' => $term['count'],
-                  'term' => $placeAPnames[$term['term']]);
-              }
+          $placeAPs = QubitTerm::get($criteria);
 
-              break;
+          foreach ($placeAPs as $placeAP)
+          {
+            $placeAPnames[$placeAP->id] = 
$placeAP->getName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
+          }
 
-            case 'names.id':
-              $criteria = new Criteria;
-              $criteria->add(QubitActor::ID, array_keys($ids), Criteria::IN);
+          foreach ($facet['terms'] as &$term)
+          {
+            $facets[strtr($name, '.', '_')]['terms'][$term['term']] = array(
+              'count' => $term['count'],
+              'term' => $placeAPnames[$term['term']]);
+          }
 
-              $nameAPs = QubitActor::get($criteria);
+          break;
 
-              foreach ($nameAPs as $nameAP)
-              {
-                $nameAPnames[$nameAP->id] = 
$nameAP->getAuthorizedFormOfName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
-              }
+        case 'names.id':
+          $criteria = new Criteria;
+          $criteria->add(QubitActor::ID, array_keys($ids), Criteria::IN);
 
-              foreach ($facet['terms'] as &$term)
-              {
-                $facets[strtr($name, '.', '_')]['terms'][$term['term']] = 
array(
-                  'count' => $term['count'],
-                  'term' => $nameAPnames[$term['term']]);
-              }
+          $nameAPs = QubitActor::get($criteria);
 
-              break;
+          foreach ($nameAPs as $nameAP)
+          {
+            $nameAPnames[$nameAP->id] = 
$nameAP->getAuthorizedFormOfName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
+          }
 
+          foreach ($facet['terms'] as &$term)
+          {
+            $facets[strtr($name, '.', '_')]['terms'][$term['term']] = array(
+              'count' => $term['count'],
+              'term' => $nameAPnames[$term['term']]);
           }
-        }
 
-        $this->pager->facets = $facets;
-      }
+          break;
 
-      $this->pager->levelsOfDescription = array();
-      foreach (QubitTerm::getLevelsOfDescription() as $lod)
-      {
-        $this->pager->levelsOfDescription[$lod->id] = 
$lod->getName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
       }
 
-      $ancestorsIds = array();
-      foreach ($this->pager->getResults() as $hit)
+      $this->pager->facets = $facets;
+    }
+
+    // Populate level of descriptions
+    $this->pager->levelsOfDescription = array();
+    foreach (QubitTerm::getLevelsOfDescription() as $lod)
+    {
+      $this->pager->levelsOfDescription[$lod->id] = 
$lod->getName(array('cultureFallback' => true, 'culture' => 
$this->context->user->getCulture()));
+    }
+
+    // Populate ancestors
+    $ancestorsIds = array();
+    foreach ($this->pager->getResults() as $hit)
+    {
+      $doc = $hit->getData();
+      foreach ($doc['ancestors'] as $item)
       {
-        $doc = $hit->getData();
-        foreach ($doc['ancestors'] as $item)
+        if (in_array($item, $ancestorsIds))
         {
-          if (in_array($item, $ancestorsIds))
-          {
-            continue;
-          }
-
-          $ancestorsIds[] = $item;
+          continue;
         }
-      }
 
-      $sql = 'SELECT
-          io.id,
-          o.slug,
-          io.title
-        FROM '.QubitInformationObjectI18n::TABLE_NAME.' AS io
-        LEFT JOIN '.QubitSlug::TABLE_NAME.' AS o ON (o.object_id = io.id AND 
io.culture = ?)
-        WHERE o.object_id IN ('.implode(',', $ancestorsIds).')';
-      $this->pager->ancestors = array();
-      foreach (QubitPdo::fetchAll($sql, 
array($this->context->user->getCulture())) as $ancestor)
-      {
-        $this->pager->ancestors[$ancestor->id] = array(
-          'slug' => $ancestor->slug,
-          'title' => $ancestor->title);
+        $ancestorsIds[] = $item;
       }
     }
-    else if (empty($this->error))
-    {
-      // no error, must be empty result set
-      $this->error = $this->context->i18n->__('No results found.');
+
+    $sql = 'SELECT
+        io.id,
+        o.slug,
+        io.title
+      FROM '.QubitInformationObjectI18n::TABLE_NAME.' AS io
+      LEFT JOIN '.QubitSlug::TABLE_NAME.' AS o ON (o.object_id = io.id AND 
io.culture = ?)
+      WHERE o.object_id IN ('.implode(',', $ancestorsIds).')';
+    $this->pager->ancestors = array();
+    foreach (QubitPdo::fetchAll($sql, 
array($this->context->user->getCulture())) as $ancestor)
+    {
+      $this->pager->ancestors[$ancestor->id] = array(
+        'slug' => $ancestor->slug,
+        'title' => $ancestor->title);
     }
   }
 
-  public function parseQuery()
+  public function execute($request)
   {
-    // if querystring is empty, use match_all
-    if ('' == preg_replace('/[\s\t\r\n]*/', '', $this->request->query))
+    if ('print' == $request->getGetParameter('media'))
     {
-      return new Elastica_Query_MatchAll();
+      $this->getResponse()->addStylesheet('print-preview', 'last');
     }
 
-    try
+    if (!isset($request->limit))
     {
-      // Parse query string
-      $queryParsed = QubitSearch::getInstance()->parse($this->request->query); 
// Elastica_Query_QueryString
+      $request->limit = sfConfig::get('app_hits_per_page');
     }
-    catch (Exception $e)
-    {
-      $this->error = $e->getMessage();
 
-      return null;
+    $this->form = new sfForm;
+    $this->form->getValidatorSchema()->setOption('allow_extra_fields', true);
+
+    foreach ($this::$NAMES as $name)
+    {
+      $this->addField($name);
     }
 
-    return $queryParsed;
-  }
+    $this->form->bind($request->getGetParameters());
 
-  public function facetQuery($query)
-  {
-    foreach (self::$FACETS as $field)
+    if ($this->form->isValid())
     {
-      $facet = new Elastica_Facet_Terms($field);
-      $facet->setField($field);
-      $facet->setSize(50);
-      $query->addFacet($facet);
-    }
+      try
+      {
+        $query = $this->buildQuery();
 
-    $facet = new Elastica_Facet_Range('dates.startDate');
-    $facet->setField('dates.startDate');
-    $facet->addRange(null, null);
-    $query->addFacet($facet);
+        $resultSet = 
QubitSearch::getInstance()->index->getType('QubitInformationObject')->search($query);
+      }
+      catch (Exception $e)
+      {
+        $this->error = $e->getMessage();
 
-    return $query;
-  }
+        return;
+      }
 
-  public function filterQuery($query)
-  {
-    $this->filters = array();
-    $this->facets = array();
-    $queryTerm = new Elastica_Query_Term();
-    $queryBool = new Elastica_Query_Bool();
+      // Build pager
+      $this->pager = new QubitSearchPager($resultSet);
+      $this->pager->setPage($request->page ? $request->page : 1);
 
-    if ($query instanceof Elastica_Query_QueryString)
-    {
-      $queryBool->addMust($query);
-    }
+      if ('print' != $request->getGetParameter('media'))
+      {
+        $this->pager->setMaxPerPage($request->limit);
+      }
+      else
+      {
+        $this->pager->setMaxPerPage(500);
+      }
 
-    foreach ($this->request->getGetParameters() as $param => $value)
-    {
-      if (in_array(strtr($param, '_', '.'), array($this->facets)))
+      if ($this->pager->hasResults())
       {
-        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));
-          }
-        }
+        // Populate facets
+        $this->populateFacets();
+      }
+      else if (empty($this->error))
+      {
+        $this->error = $this->context->i18n->__('No results found.');
       }
     }
-
-    return $query;
   }
 }

Modified: branches/2.0/apps/qubit/modules/search/templates/advancedSuccess.php
==============================================================================
--- branches/2.0/apps/qubit/modules/search/templates/advancedSuccess.php        
Tue Jun  5 13:44:10 2012        (r11736)
+++ branches/2.0/apps/qubit/modules/search/templates/advancedSuccess.php        
Tue Jun  5 18:03:22 2012        (r11737)
@@ -47,7 +47,7 @@
 
   <?php if (isset($pager)): ?>
 
-    <?php echo get_partial('search/searchResults', array('pager' => $pager)) ?>
+    <?php echo get_partial('search/searchResults', array('pager' => $pager, 
'filters' => $filters)) ?>
 
   <?php endif; ?>
 

Modified: branches/2.0/lib/QubitSearchPager.class.php
==============================================================================
--- branches/2.0/lib/QubitSearchPager.class.php Tue Jun  5 13:44:10 2012        
(r11736)
+++ branches/2.0/lib/QubitSearchPager.class.php Tue Jun  5 18:03:22 2012        
(r11737)
@@ -88,4 +88,9 @@
   {
     return $this->resultSet->getFacets();
   }
+
+  public function hasFacets()
+  {
+    return $this->resultSet->hasFacets();
+  }
 }

-- 
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