Author: sevein
Date: Thu May  3 16:23:58 2012
New Revision: 11622

Log:
Build actor browse page based in ES + facets

Modified:
   branches/2.0/apps/qubit/modules/actor/actions/browseAction.class.php
   branches/2.0/apps/qubit/modules/actor/templates/browseSuccess.php

Modified: branches/2.0/apps/qubit/modules/actor/actions/browseAction.class.php
==============================================================================
--- branches/2.0/apps/qubit/modules/actor/actions/browseAction.class.php        
Thu May  3 16:23:08 2012        (r11621)
+++ branches/2.0/apps/qubit/modules/actor/actions/browseAction.class.php        
Thu May  3 16:23:58 2012        (r11622)
@@ -29,6 +29,11 @@
  */
 class ActorBrowseAction extends DefaultBrowseAction
 {
+  // Arrays not allowed in class constants
+  public static
+    $FACETS = array(
+      'entityTypeId');
+
   public function execute($request)
   {
     if (!isset($request->limit))
@@ -45,68 +50,130 @@
       $this->sortSetting = sfConfig::get('app_sort_browser_anonymous');
     }
 
-    $criteria = new Criteria;
-    $criteria->add(QubitActor::PARENT_ID, QubitActor::ROOT_ID);
+    $queryBool = new Elastica_Query_Bool();
+    $queryBool->addMust(new Elastica_Query_MatchAll());
 
-    // Add criteria to exclude actors that are users or repository objects
-    $criteria = QubitActor::addGetOnlyActorsCriteria($criteria);
+    $this->filters = array();
+    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;
+
+            $queryBool->addMust(new Elastica_Query_Term(array(
+              strtr($param, '_', '.') => $facetValue)));
+          }
+        }
+      }
+    }
 
-    $fallbackTable = 'QubitActor';
+    $query = new Elastica_Query();
+    $query->setLimit($request->limit);
+    $query->setQuery($queryBool);
 
     switch ($request->sort)
     {
       case 'nameDown':
-        $criteria->addDescendingOrderByColumn('authorized_form_of_name');
+        $query->setSort(array('slug' => 'desc', '_score' => 'desc'));
 
         break;
 
       case 'nameUp':
-        $criteria->addAscendingOrderByColumn('authorized_form_of_name');
+        $query->setSort(array('slug' => 'asc', '_score' => 'desc'));
 
       break;
 
-      case 'typeDown':
-        $fallbackTable = 'QubitTerm';
-        $criteria->addJoin(QubitActor::ENTITY_TYPE_ID, QubitTerm::ID, 
Criteria::LEFT_JOIN);
-        $criteria->addDescendingOrderByColumn('name');
-
-        break;
-
-      case 'typeUp':
-        $fallbackTable = 'QubitTerm';
-        $criteria->addJoin(QubitActor::ENTITY_TYPE_ID, QubitTerm::ID, 
Criteria::LEFT_JOIN);
-        $criteria->addAscendingOrderByColumn('name');
-
-        break;
-
       case 'updatedDown':
-        $criteria->addDescendingOrderByColumn(QubitObject::UPDATED_AT);
+        $query->setSort(array('updatedAt' => 'desc', '_score' => 'desc'));
 
         break;
 
       case 'updatedUp':
-        $criteria->addAscendingOrderByColumn(QubitObject::UPDATED_AT);
+        $query->setSort(array('updatedAt' => 'asc', '_score' => 'desc'));
 
         break;
 
       default:
         if ('alphabetic' == $this->sortSetting)
         {
-          $criteria->addAscendingOrderByColumn('authorized_form_of_name');
+          $query->setSort(array('slug' => 'asc', '_score' => 'desc'));
         }
         else if ('lastUpdated' == $this->sortSetting)
         {
-          $criteria->addDescendingOrderByColumn(QubitObject::UPDATED_AT);
+          // $criteria->addDescendingOrderByColumn(QubitObject::UPDATED_AT);
         }
     }
 
-    // Do source culture fallback
-    $criteria = QubitCultureFallback::addFallbackCriteria($criteria, 
$fallbackTable);
+    if (!empty($request->page))
+    {
+      $query->setFrom(($request->page - 1) * $request->limit);
+    }
+
+    foreach (self::$FACETS as $item)
+    {
+      $facet = new Elastica_Facet_Terms($item);
+      $facet->setField($item);
+      $facet->setSize(50);
+      $query->addFacet($facet);
+    }
+
+    try
+    {
+      $resultSet = 
QubitSearch::getInstance()->index->getType('QubitActor')->search($query);
+    }
+    catch (Exception $e)
+    {
+      $this->error = $e->getMessage();
+
+      return;
+    }
 
-    // Page results
-    $this->pager = new QubitPager('QubitActor');
-    $this->pager->setCriteria($criteria);
+    $this->pager = new QubitSearchPager($resultSet);
+    $this->pager->setPage($request->page ? $request->page : 1);
     $this->pager->setMaxPerPage($request->limit);
-    $this->pager->setPage($request->page);
+
+    if ($this->pager->hasResults())
+    {
+      $facets = array();
+      foreach ($resultSet->getFacets() as $name => $facet)
+      {
+        if (isset($facet['terms']))
+        {
+          $ids = array();
+          foreach ($facet['terms'] as $item)
+          {
+            $ids[$item['term']] = $item['count'];
+          }
+        }
+
+        switch ($name)
+        {
+          case 'entityTypeId':
+            $criteria = new Criteria;
+            $criteria->add(QubitTerm::ID, array_keys($ids), Criteria::IN);
+
+            foreach (QubitTerm::get($criteria) as $item)
+            {
+              $types[$item->id] = $item->name;
+            }
+
+            foreach ($facet['terms'] as $term)
+            {
+              $facets[strtr($name, '.', '_')]['terms'][$term['term']] = array(
+                'count' => $term['count'],
+                'term' => $types[$term['term']]);
+            }
+
+            break;
+        }
+      }
+
+      $this->pager->facets = $facets;
+    }
   }
 }

Modified: branches/2.0/apps/qubit/modules/actor/templates/browseSuccess.php
==============================================================================
--- branches/2.0/apps/qubit/modules/actor/templates/browseSuccess.php   Thu May 
 3 16:23:08 2012        (r11621)
+++ branches/2.0/apps/qubit/modules/actor/templates/browseSuccess.php   Thu May 
 3 16:23:58 2012        (r11622)
@@ -1,11 +1,34 @@
 <?php use_helper('Date') ?>
 
-<div class="section tabs">
+<div class="row">
 
-  <h2 class="element-invisible"><?php echo __('Actor browse options') ?></h2>
+  <div class="span12">
+    <h1>
+      <?php echo 
image_tag('/plugins/qtDominionPlugin/images/icons-large/icon-people.png', 
array('width' => '42', 'height' => '42')) ?>
+      <?php echo __('Browse %1% %2%', array(
+        '%1%' => $pager->getNbResults(),
+        '%2%' => sfConfig::get('app_ui_label_actor'))) ?>
+    </h1>
+  </div>
+
+</div>
+
+<div class="row">
+
+  <div class="span3" id="facets">
+
+    <?php echo get_partial('search/facet', array(
+      'target' => '#facet-type',
+      'label' => __('Type'),
+      'facet' => 'entityTypeId',
+      'pager' => $pager,
+      'filters' => $filters)) ?>
+
+  </div>
+
+  <div class="span9" id="main-column">
 
-  <div class="content">
-    <ul class="clearfix links">
+    <ul class="nav nav-tabs">
       <?php if ('lastUpdated' == $sortSetting): ?>
         <li<?php if ('nameDown' != $sf_request->sort && 'nameUp' != 
$sf_request->sort): ?> class="active"<?php endif; ?>><?php echo 
link_to(__('Recent changes'), array('sort' => 'updatedDown') + 
$sf_request->getParameterHolder()->getAll(), array('title' => __('Sort'))) 
?></li>
         <li<?php if ('nameDown' == $sf_request->sort || 'nameUp' == 
$sf_request->sort): ?> class="active"<?php endif; ?>><?php echo 
link_to(__('Alphabetic'), array('sort' => 'nameUp') + 
$sf_request->getParameterHolder()->getAll(), array('title' => __('Sort'))) 
?></li>
@@ -14,71 +37,78 @@
         <li<?php if ('updatedDown' != $sf_request->sort && 'updatedUp' != 
$sf_request->sort): ?> class="active"<?php endif; ?>><?php echo 
link_to(__('Alphabetic'), array('sort' => 'nameUp') + 
$sf_request->getParameterHolder()->getAll(), array('title' => __('Sort'))) 
?></li>
       <?php endif; ?>
     </ul>
-  </div>
 
-</div>
+    <div id="content">
+
+      <div class="section">
+
+        <table class="table table-bordered sticky-enabled">
+          <thead>
+            <tr>
+              <th>
+                <?php echo __('Name') ?>
+                <?php if ('lastUpdated' == $sortSetting): ?>
+                  <?php if ('nameDown' == $sf_request->sort): ?>
+                    <?php echo link_to(image_tag('up.gif'), array('sort' => 
'nameUp') + $sf_request->getParameterHolder()->getAll(), array('title' => 
__('Sort'))) ?>
+                  <?php elseif ('nameUp' == $sf_request->sort): ?>
+                    <?php echo link_to(image_tag('down.gif'), array('sort' => 
'nameDown') + $sf_request->getParameterHolder()->getAll(), array('title' => 
__('Sort'))) ?>
+                  <?php endif; ?>
+                <?php else: ?>
+                  <?php if (('nameDown' != $sf_request->sort && 'updatedDown' 
!= $sf_request->sort && 'updatedUp' != $sf_request->sort) || ('nameUp' == 
$sf_request->sort)): ?>
+                    <?php echo link_to(image_tag('down.gif'), array('sort' => 
'nameDown') + $sf_request->getParameterHolder()->getAll(), array('title' => 
__('Sort'))) ?>
+                  <?php endif; ?>
+                  <?php if ('nameDown' == $sf_request->sort): ?>
+                    <?php echo link_to(image_tag('up.gif'), array('sort' => 
'nameUp') + $sf_request->getParameterHolder()->getAll(), array('title' => 
__('Sort'))) ?>
+                  <?php endif; ?>
+                <?php endif; ?>
+              </th>
+              <?php if ('lastUpdated' == $sortSetting || 'updatedDown' == 
$sf_request->sort || 'updatedUp' == $sf_request->sort): ?>
+                <th>
+                  <?php echo __('Updated') ?>
+                  <?php if ('updatedUp' == $sf_request->sort): ?>
+                    <?php echo link_to(image_tag('up.gif'), array('sort' => 
'updatedDown') + $sf_request->getParameterHolder()->getAll(), array('title' => 
__('Sort'))) ?>
+                  <?php else: ?>
+                    <?php echo link_to(image_tag('down.gif'), array('sort' => 
'updatedUp') + $sf_request->getParameterHolder()->getAll(), array('title' => 
__('Sort'))) ?>
+                  <?php endif; ?>
+                </th>
+              <?php endif; ?>
+            </tr>
+          </thead><tbody>
+
+            <?php foreach ($pager->getResults() as $item): ?>
+
+              <?php $doc = build_i18n_doc($item) ?>
+              <tr class="<?php echo 0 == @++$row % 2 ? 'even' : 'odd' ?>">
+                <td>
+                  <?php echo 
link_to($doc[$sf_user->getCulture()]['authorizedFormOfName'], array('module' => 
'actor', 'slug' => $doc['slug'])) ?>
+                </td>
+                <?php if ('lastUpdated' == $sortSetting || 'updatedDown' == 
$sf_request->sort || 'updatedUp' == $sf_request->sort): ?>
+                  <td>
+                    <?php echo format_date($doc['updatedAt'], 'f') ?>
+                  </td>
+                <?php endif; ?>
+              </tr>
+
+            <?php endforeach; ?>
+
+          </tbody>
+        </table>
 
-<h1><?php echo __('Browse %1%', array('%1%' => 
sfConfig::get('app_ui_label_actor'))) ?></h1>
+      </div>
 
-<table class="sticky-enabled">
-  <thead>
-    <tr>
-      <th>
-        <?php echo __('Name') ?>
-        <?php if ('lastUpdated' == $sortSetting): ?>
-          <?php if ('nameDown' == $sf_request->sort): ?>
-            <?php echo link_to(image_tag('up.gif'), array('sort' => 'nameUp') 
+ $sf_request->getParameterHolder()->getAll(), array('title' => __('Sort'))) ?>
-          <?php elseif ('nameUp' == $sf_request->sort): ?>
-            <?php echo link_to(image_tag('down.gif'), array('sort' => 
'nameDown') + $sf_request->getParameterHolder()->getAll(), array('title' => 
__('Sort'))) ?>
-          <?php endif; ?>
-        <?php else: ?>
-          <?php if (('nameDown' != $sf_request->sort && 'updatedDown' != 
$sf_request->sort && 'updatedUp' != $sf_request->sort) || ('nameUp' == 
$sf_request->sort)): ?>
-            <?php echo link_to(image_tag('down.gif'), array('sort' => 
'nameDown') + $sf_request->getParameterHolder()->getAll(), array('title' => 
__('Sort'))) ?>
-          <?php endif; ?>
-          <?php if ('nameDown' == $sf_request->sort): ?>
-            <?php echo link_to(image_tag('up.gif'), array('sort' => 'nameUp') 
+ $sf_request->getParameterHolder()->getAll(), array('title' => __('Sort'))) ?>
-          <?php endif; ?>
-        <?php endif; ?>
-      </th><th>
-        <?php if ('nameDown' == $sf_request->sort || 'nameUp' == 
$sf_request->sort || ('lastUpdated' != $sortSetting && 'updatedDown' != 
$sf_request->sort && 'updatedUp' != $sf_request->sort)): ?>
-          <?php echo __('Type') ?>
-          <?php if ('typeDown' == $sf_request->sort): ?>
-            <?php echo link_to(image_tag('up.gif'), array('sort' => 'typeUp') 
+ $sf_request->getParameterHolder()->getAll(), array('title' => __('Sort'))) ?>
-          <?php elseif ('typeUp' == $sf_request->sort): ?>
-            <?php echo link_to(image_tag('down.gif'), array('sort' => 
'typeDown') + $sf_request->getParameterHolder()->getAll(), array('title' => 
__('Sort'))) ?>
-          <?php endif; ?>
-        <?php else: ?>
-          <?php echo __('Updated') ?>
-          <?php if ('updatedUp' == $sf_request->sort): ?>
-            <?php echo link_to(image_tag('up.gif'), array('sort' => 
'updatedDown') + $sf_request->getParameterHolder()->getAll(), array('title' => 
__('Sort'))) ?>
-          <?php else: ?>
-            <?php echo link_to(image_tag('down.gif'), array('sort' => 
'updatedUp') + $sf_request->getParameterHolder()->getAll(), array('title' => 
__('Sort'))) ?>
-          <?php endif; ?>
-        <?php endif; ?>
-      </th>
-    </tr>
-  </thead><tbody>
-    <?php foreach ($pager->getResults() as $item): ?>
-      <tr class="<?php echo 0 == @++$row % 2 ? 'even' : 'odd' ?>">
-        <td>
-          <?php echo link_to(render_title($item), array($item, 'module' => 
'actor')) ?>
-        </td><td>
-          <?php if ('nameDown' == $sf_request->sort || 'nameUp' == 
$sf_request->sort || ('lastUpdated' != $sortSetting && 'updatedDown' != 
$sf_request->sort && 'updatedUp' != $sf_request->sort) ): ?>
-            <?php echo $item->entityType ?>
-          <?php else: ?>
-            <?php echo format_date($item->updatedAt, 'f') ?>
-          <?php endif; ?>
-        </td>
-      </tr>
-    <?php endforeach; ?>
-  </tbody>
-</table>
+      <?php echo get_partial('default/pager', array('pager' => $pager)) ?>
 
-<?php echo get_partial('default/pager', array('pager' => $pager)) ?>
+    </div>
+
+  </div>
+
+</div>
 
+<!--
 <div class="search">
   <form action="<?php echo url_for(array('module' => 'actor', 'action' => 
'list')) ?>">
     <input name="subquery" value="<?php echo 
esc_entities($sf_request->subquery) ?>"/>
     <input class="form-submit" type="submit" value="<?php echo __('Search 
%1%', array('%1%' => sfConfig::get('app_ui_label_actor'))) ?>"/>
   </form>
 </div>
+-->

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