/**
  * @param Mage_Catalog_Model_Resource_Product_Collection $productCollection
  * @return mixed
  */
 public function sort(Mage_Catalog_Model_Resource_Product_Collection $productCollection)
 {
     //Pass a small validation
     if (!$this->_getHelper()->isCategorySortingEnable() || $productCollection->getFlag(self::MARKETO_SORTED)) {
         return $productCollection;
     }
     $categoriesList = $this->_getPesonalizeCalculator()->getScoreCategoryParams(HooshMarketing_Marketo_Model_Personalize_Calculator::CATEGORY_ID_AND_SCORE);
     //get List of categories with key -> Category_id and value - Score
     if (!count($categoriesList)) {
         //if we havn`t score categories do nothing
         return $productCollection;
     }
     uasort($categoriesList, function ($f, $s) {
         return $f > $s ? 1 : -1;
         //sort by descending
     });
     //Sort categories in order to show top scored categories first
     $categoriesList = array_keys($categoriesList);
     // get only category ids
     try {
         $productCategoryTable = $this->_getCoreResource()->getTableName("catalog_category_product");
         $productCollection->getSelect()->joinLeft(array("marketo_category_table" => $productCategoryTable), "marketo_category_table.product_id = e.entity_id", array("top_category_id" => "marketo_category_table.category_id"))->group("entity_id")->order("FIELD(top_category_id, " . implode(',', $categoriesList) . ") DESC");
         //order by top
         $productCollection->setFlag(self::MARKETO_SORTED, true);
         //to set order only one time
     } catch (Exception $e) {
         Mage::logException($e);
     }
     return $productCollection;
 }
 /**
  * Add index select in product collection
  *
  * @param Mage_Catalog_Model_Resource_Product_Collection $collection
  * @param int $customerGroupId
  * @return Enterprise_CatalogPermissions_Model_Resource_Permission_Index
  */
 public function addIndexToProductCollection($collection, $customerGroupId)
 {
     $parts = $collection->getSelect()->getPart(Zend_Db_Select::FROM);
     if (isset($parts['perm'])) {
         return $this;
     }
     if ($collection->getFlag('disable_root_category_filter')) {
         $permColumns = $this->_getPermColumns();
     } else {
         $permColumns = array('grant_catalog_category_view', 'grant_catalog_product_price', 'grant_checkout_items');
     }
     $collection->getSelect()->joinLeft(array('perm' => $this->getTable('permission_index')), 'perm.category_id=cat_index.category_id
                     AND perm.customer_group_id= ' . $customerGroupId . ' AND perm.website_id=' . Mage::app()->getStore()->getWebsiteId(), $permColumns);
     if (!Mage::helper('enterprise_catalogpermissions')->isAllowedCategoryView()) {
         $collection->getSelect()->where('perm.grant_catalog_category_view = ?', Enterprise_CatalogPermissions_Model_Permission::PERMISSION_ALLOW);
     } else {
         $collection->getSelect()->where('perm.grant_catalog_category_view != ?' . ' OR perm.grant_catalog_category_view IS NULL', Enterprise_CatalogPermissions_Model_Permission::PERMISSION_DENY);
     }
     $collection->getSelect()->where('cat_index.store_id=' . $collection->getStoreId());
     if ($collection->getFlag('disable_root_category_filter')) {
         $collection->getSelect()->where('cat_index.is_parent=1');
         $collection->getSelect()->group('cat_index.product_id');
     }
     if ($this->_isLinkCollection($collection)) {
         $collection->getSelect()->where('perm.grant_catalog_product_price!=' . Enterprise_CatalogPermissions_Model_Permission::PERMISSION_DENY . ' OR perm.grant_catalog_product_price IS NULL')->where('perm.grant_checkout_items!=' . Enterprise_CatalogPermissions_Model_Permission::PERMISSION_DENY . ' OR perm.grant_checkout_items IS NULL');
     }
     return $this;
 }