• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Magento Indexes
 

Magento Indexes

on

  • 19,313 views

Presentation from Magento MeetUp on 17th June in Amsterdam

Presentation from Magento MeetUp on 17th June in Amsterdam

Statistics

Views

Total Views
19,313
Views on SlideShare
14,973
Embed Views
4,340

Actions

Likes
14
Downloads
216
Comments
0

19 Embeds 4,340

http://127.0.0.1 2428
http://www.betateste.com.br 734
http://magentomedia.com 302
http://www.ecomus.co.uk 265
http://localhost 194
http://www.realvine.nl 129
http://betateste.com.br 118
http://192.168.0.105 70
http://www2.hsm.com.br 44
http://www.linkedin.com 24
http://www.storknet.nl 16
http://twitter.com 5
https://twimg0-a.akamaihd.net 3
https://twitter.com 2
http://192.168.174.39 2
http://paper.li 1
http://translate.googleusercontent.com 1
https://www.linkedin.com 1
http://www.google.nl 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Magento Indexes Magento Indexes Presentation Transcript

    • Magento Indexers
      Ivan Chepurnyi
      Magento Trainer / Lead Developer
    • Agenda
      Magento Developers Meetup
      Overview of Indexes Functionality
      Creation of own indexes
    • Let Imagine…
      Magento Developers Meetup
      … that Magento doesn’t have indexes:
      The prices in product list are calculated on the fly depending on catalog rules, tier prices for customer groups
      Stock availability for configurable and bundle products can be calculated only after loading the product collection
      Layered navigation data is build in real-time for product attributes information
      Anchor categories recursively collects subcategories for filtering product list
    • It’s all about performance…
      Magento Developers Meetup
      The main goal is minimizing amount of operations to display products to a customer
    • Definitions
      Magento Developers Meetup
      Indexed DataAggregated data for entity representation on the frontend lists.
      Indexer
      Generates index data on event or manual by process.
      Index EventThe moment when entity or related to it information is changed and that affects its index data.
      Index Process
      Wrapper for indexer and contains information about its mode and status
      Main Controller
      Forwards events to Index Process
    • Index Workflow
      Magento Developers Meetup
      Event
      Main Controller
      Event
      Events
      Process
      Manual
      Invoke
      Indexer
      Indexed Data
    • Event Types
      Magento Developers Meetup
      Save
      When indexed entity or related to it information was changed
      Delete
      When indexed entity or related to it one was deleted
      Mass UpdateWhen batch of entities was updated. (Update Attributes on Product Grid)
    • Observed Entities
      Magento Developers Meetup
      Indexed Entities
      Product
      Product Inventory
      Category
      Tag
      Entities Scope
      Customer Group
      Website
      Store Group
      Store View
    • Index Process
      Magento Developers Meetup
      Available Statuses
      Pending
      Indicates that indexer is up to date
      Running
      Index currently in process of full rebuilding index data.
      Require ReindexStatus for notifying admin user, that index is not up to date and should be rebuild.
    • Index Process
      Magento Developers Meetup
      Indexing Modes
      Real-time
      Manual
      Update Index Data
      Event
      Event
      Require Reindex
    • Indexer Flow
      Magento Developers Meetup
      Match Event
      Main Controller
      Index Process
      Register Event Data
      Reindex Data
    • Mage_Index Module
      Magento Developers Meetup
      Main Controller
      Mage_Index_Model_Indexer
      Process
      Mage_Index_Model_Process
      Indexer Base
      Mage_Index_Model_Indexer_Abstract
    • Index Module
      Indexers Modularity
      Magento Developers Meetup
      Mage_Index_Model_Indexer_Abstract
      Catalog Module
      Mage_Catalog_Model_Product_Indexer_Eav
      Mage_Catalog_Model_Product_Indexer_Flat
      Mage_Catalog_Model_Product_Indexer_Price
      Inventory Module
      Mage_CatalogIndex_Model_Indexer_Stock

    • Model
      Mage_Index_Model_Indexer_Abstract
      Indexer Structure
      Magento Developers Meetup
      Resource Model
      Mage_Index_Model_Mysql4_Abstract
      Matches event data and runs appropriate method in resource model for re-indexing
      Works directly with database for generation of the indexed data. Usually all the data operated via MySQL queries.
    • What can you use?
      Magento Developers Meetup
      Mage_Index_Model_Indexer
      getProcessByCode($indexerCode)
      getProcessCollection()
      processEntityAction($entity, $entityType, $eventType)
      Mage_Index_Model_Process
      reindexAll()
      reindexEverything()
      setMode($mode)
    • What you shouldn’t do…
      Magento Developers Meetup
      Invoke reindexAll method from index model/resource model, because it is better to let admin user know when the index was rebuild.
      Process entity events directly with indexer, instead of passing data through the main controller. You never know which index may depend on this event.
    • Creating own indexer
      Magento Developers Meetup
      Defining indexer in configuration
      Designing index data table
      Implementing model
      Implementing resource model
      Applying index on the frontend
    • Featured Products
      Magento Developers Meetup
      There is easier way to create featured products functionality, but it is a simple example on what should be done for creation own indexer.
    • Defining index in configuration
      Magento Developers Meetup
      <config>
      <!-- …. module configurtaions -->
      <global>
      <!-- …. module configurtaions -->
      <index>
      <indexer>
      <featured_products>
      <model>your_module/indexer_featured</model>
      </featured_products>
      </indexer>
      </index>
      </global>
      </config>
      etc/config.xml
      Indexer Code
      Indexer Model
    • Designing index data table
      Magento Developers Meetup
      Adding new attribute to catalog product entity called is_featured
      Creating table that will contain product ids of products that are marked as featured products.
    • Designing index data table
      Magento Developers Meetup
      $this->addAttribute('catalog_product', 'is_featured', array(
      'type' => 'int',
      'label' => 'Is featured',
      'input' => 'select',
      'source' => 'eav/entity_attribute_source_boolean',
      'user_defined' => false,
      'required' => false
      ));
      Setup Script
      Attribute Code
      Yes/No Dropdown
    • Designing index data table
      Magento Developers Meetup
      $table = new Varien_Db_Ddl_Table();
      $table->setName($this->getTable(‘module/featured'));
      $table->addColumn('product_id', Varien_Db_Ddl_Table::TYPE_INTEGER, 11, array(
      'unsigned' => true,
      'nullable' => false,
      'primary' => true
      ));
      $this->getConnection()->createTable($table);
      Setup Script
      Table Alias
      Table Column
    • Designing index data table
      Magento Developers Meetup
      $table = new Varien_Db_Ddl_Table();
      $table->setName($this->getTable(‘module/featured'));
      $table->addColumn('product_id', Varien_Db_Ddl_Table::TYPE_INTEGER, 11, array(
      'unsigned' => true,
      'nullable' => false,
      'primary' => true
      ));
      $this->getConnection()->createTable($table);
      Setup Script
      Table Alias
      Table Column
    • Implementing Model
      Magento Developers Meetup
      class Your_Module_Model_Indexer_Featuredextends Mage_Index_Model_Indexer_Abstract
      {
      protected $_matchedEntities = array(
      Mage_Catalog_Model_Product::ENTITY => array(
      Mage_Index_Model_Event::TYPE_SAVE,
      Mage_Index_Model_Event::TYPE_MASS_ACTION
      )
      );
      }
      Defining Matching Events
      Entity Type
      Event Type
      Event Types
    • Implementing Model
      Magento Developers Meetup
      class Your_Module_Model_Indexer_Featuredextends Mage_Index_Model_Indexer_Abstract
      {
      // … other code
      protected function _construct()
      {
      $this->_init(‘your_module/indexer_featured');
      }
      }
      Defining Indexer Resource Model
      Resource model
    • Implementing Model
      Magento Developers Meetup
      class Your_Module_Model_Indexer_Featuredextends Mage_Index_Model_Indexer_Abstract
      {
      // … other code
      public function getName()
      {
      return Mage::helper(‘your_module')->__('Featured Product');
      }
      public function getDescription()
      {
      return Mage::helper(‘‘your_module')->__('Indexes something');
      }
      }
      Defining Indexer Information
      Indexer Name in the admin
      Indexer Description in the admin
    • Implementing Model
      Magento Developers Meetup
      class Your_Module_Model_Indexer_Featuredextends Mage_Index_Model_Indexer_Abstract
      {
      // … other code
      protected function _registerEvent(Mage_Index_Model_Event $event)
      {
      /* @var $entity Mage_Catalog_Model_Product */
      $entity = $event->getDataObject();
      if ($entity->dataHasChangedFor('is_featured')) {
      $event->setData('product_id', $entity->getId());
      } elseif ($entity->getAttributesData()) {
      $attributeData = $entity->getAttributesData();
      if (isset($attributeData['is_featured'])) {
      $event->setData('product_ids', $entity->getProductIds());
      }
      }
      }
      }
      Register Event for Processing
      Product Save Registering
      Mass Action Registering
    • Implementing Model
      Magento Developers Meetup
      class Your_Module_Model_Indexer_Featuredextends Mage_Index_Model_Indexer_Abstract
      {
      // … other code
      protected function _processEvent(Mage_Index_Model_Event $event)
      {
      if ($event->getData('product_id') || $event->getData('product_ids')) {
      $this->callEventHandler($event);
      }
      }
      }
      Processing Event
      Calling processor in resource model
      Entity Type
      Event Type
      catalogProductSave($event)
      catalogProductMassAction($event)
    • Implementing Resource Model
      Magento Developers Meetup
      class Your_Module_Model_Mysql4_Indexer_Featured extends Mage_Index_Model_Mysql4_Abstract
      {
      protected function _construct()
      {
      $this->_setResource(‘your_module');
      }
      }
      Define resource connection
      Your module resource prefix
    • Implementing Resource Model
      Magento Developers Meetup
      class Your_Module_Model_Mysql4_Indexer_Featured extends Mage_Index_Model_Mysql4_Abstract
      {
      // … other code
      protected function _reindexEntity($productId = null)
      {
      $select = $this->_getReadAdapter()->select();
      /* @var $attribute Mage_Catalog_Model_Resource_Eav_Attribute */
      $attribute = Mage::getSingleton('eav/config')
      ->getAttribute('catalog_product', 'is_featured');
      $select->from($attribute->getBackendTable(), 'entity_id')
      ->where('value = ?', 1)
      ->where('attribute_id = ?', $attribute->getId());
      Indexing Method
      Retrieving only featured product ids
    • Implementing Resource Model
      Magento Developers Meetup
      if ($productId !== null) {
      if (!is_array($productId)) {
      $productId = array($productId);
      }
      $select->where('entity_id IN(?)', $productId);
      $this->_getWriteAdapter()->delete(
      $this->getTable(‘your_module/featured'),
      array(
      'product_id IN(?)' => $productId
      )
      );
      } else {
      $this->_getWriteAdapter()->truncate($this->getTable(‘your_module/featured'));
      }
      Indexing Method
      If it is partial re-index, then delete only related indexed data
      Otherwise clear all indexed data
    • Implementing Resource Model
      Magento Developers Meetup
      $sqlStatement = $select->insertIgnoreFromSelect(
      $this->getTable(‘your_module/featured'),
      array('product_id')
      );
      $this->_getWriteAdapter()->query($sqlStatement);
      }
      }
      Fulfill index data from select we created before
      Indexing Method
    • Implementing Resource Model
      Magento Developers Meetup
      class Your_Module_Model_Mysql4_Indexer_Featured extends Mage_Index_Model_Mysql4_Abstract
      {
      // … other code
      public function reindexAll()
      {
      $this->_reindexEntity();
      }
      }
      Handling Events
      Full index re-build
    • Implementing Resource Model
      Magento Developers Meetup
      class Your_Module_Model_Mysql4_Indexer_Featured extends Mage_Index_Model_Mysql4_Abstract
      {
      // … other code
      public function catalogProductSave($event)
      {
      $this->_reindexEntity($event->getData('product_id'));
      }
      public function catalogProductMassAction($event)
      {
      $this->_reindexEntity($event->getData('product_ids'));
      }
      }
      Reindexing Events
      Single Save Product Event
      Mass Save Product Event
    • Applying Index for the frontend
      Magento Developers Meetup
      Observing and event catalog_product_collection_apply_limitations_after
      Joining index table to product collection select
      Create sub-select filter for collection
    • Liked it?
      Magento Developers Meetup
      Checkout our advanced
      training programs:
      http://www.ecomdev.org/magento-development-training-programs/advanced
      Follow our blog posts:
      http://www.ecomdev.org/blog
    • Questions?