示例#1
0
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param Mana_Db_Model_Formula_Expr[] $args
  * @throws Mana_Db_Exception_Formula
  * @throws Exception
  * @return Mana_Db_Model_Formula_Expr
  */
 public function select($context, $args)
 {
     if (count($args) != 3) {
         throw new Mana_Db_Exception_Formula($this->__("Function '%s' expects three parameters", $this->getName()));
     }
     if ($args[0]->getIsAggregate()) {
         throw new Mana_Db_Exception_Formula($this->__("You can only use aggregate function on aggregate fields"));
     }
     /* @var $helper Mana_Db_Helper_Formula_Selector */
     $helper = $context->getHelper();
     /* @var $formulaHelper Mana_Db_Helper_Formula */
     $formulaHelper = Mage::helper('mana_db/formula');
     $condition = $args[0]->getExpr();
     switch ($formulaHelper->getType($args[0]->getType())) {
         case 'string':
             $condition .= "<> ''";
             break;
         case 'int':
             $condition .= "<> 0";
             break;
         case 'bool':
             break;
         default:
             throw new Exception('Not implemented');
     }
     $helper->binaryCast($args[1], $args[2]);
     return $helper->expr()->setExpr("IF({$condition}, {$args[1]->getExpr()}, {$args[2]->getExpr()})")->setType($args[1]->getType());
 }
示例#2
0
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param Mana_Db_Model_Formula_Entity $entity
  */
 public function select($context, $entity)
 {
     switch ($context->getMode()) {
         default:
             $context->setMode($this->getName())->setEntityHelper($this);
             $context->setEntity($entity->getEntity())->setProcessor($entity->getProcessor())->setAlias($entity->getAlias());
             break;
     }
 }
示例#3
0
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param Mana_Db_Model_Formula_Node_Field $formula
  * @param Mana_Db_Model_Formula_Expr $expr
  */
 public function selectField($context, $formula, $expr)
 {
     foreach ($context->getSelect()->getPart(Varien_Db_Select::COLUMNS) as $column) {
         if ($column[2] == $expr->getFieldName()) {
             $expr->setExpr($column[1]);
             return;
         }
     }
     throw new Mana_Db_Exception_Formula($this->__("Field '%s' referenced in field '%s' is not defined.", $expr->getFieldName(), $context->getField()->getName()));
 }
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param Mana_Db_Model_Formula_Expr[] $args
  * @throws Mana_Db_Exception_Formula
  * @return Mana_Db_Model_Formula_Expr
  */
 public function select($context, $args)
 {
     if (count($args) != 1) {
         throw new Mana_Db_Exception_Formula($this->__("Function '%s' expects one parameter", $this->getName()));
     }
     if ($args[0]->getIsAggregate()) {
         throw new Mana_Db_Exception_Formula($this->__("You can only use aggregate function on aggregate fields"));
     }
     $helper = $context->getHelper();
     return $helper->expr()->setExpr("LOWER({$helper->cast($args[0], 'varchar(255)')->getExpr()})")->setType('varchar(255)');
 }
示例#5
0
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param Mana_Db_Model_Formula_Expr[] $args
  * @throws Mana_Db_Exception_Formula
  * @return Mana_Db_Model_Formula_Expr
  */
 public function select($context, $args)
 {
     if (count($args) != 1) {
         throw new Mana_Db_Exception_Formula($this->__("Function '%s' expects one parameter", $this->getName()));
     }
     if ($args[0]->getIsAggregate()) {
         throw new Mana_Db_Exception_Formula($this->__("You can only use aggregate function on aggregate fields"));
     }
     $helper = $context->getHelper();
     $urlConstant = str_replace('\'', '\\\'', substr($args[0]->getExpr(), 1, strlen($args[0]->getExpr())));
     return $helper->expr()->setExpr("'{{= {$this->getName()}(\\'{$urlConstant}\\')'")->setType('varchar(255)');
 }
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param Mana_Db_Model_Formula_Entity $entity
  */
 public function select($context, $entity)
 {
     switch ($context->getMode()) {
         default:
             if (!$context->hasAlias($entity->getAlias()->asString(0))) {
                 /* @var $resource Mana_Db_Resource_Formula */
                 $resource = Mage::getResourceSingleton('mana_db/formula');
                 /* @var $dbHelper Mana_Db_Helper_Data */
                 $dbHelper = Mage::helper('mana_db');
                 /* @var $joinClosure Mana_Db_Model_Formula_Closure_ForeignJoinEnd */
                 $joinClosure = Mage::getModel('mana_db/formula_closure_foreignJoinEnd', compact('context', 'entity'));
                 $context->getAlias()->each($joinClosure);
             }
             $context->setEntity($entity->getEntity())->setProcessor($entity->getProcessor())->setAlias($entity->getAlias())->setEntityHelper($this);
             break;
     }
 }
示例#7
0
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param Mana_Db_Model_Formula_Expr[] $args
  * @throws Mana_Db_Exception_Formula
  * @return Mana_Db_Model_Formula_Expr
  */
 public function select($context, $args)
 {
     /* @var $formulaHelper Mana_Db_Helper_Formula */
     $formulaHelper = Mage::helper('mana_db/formula');
     if (count($args) < 2 || count($args) > 3) {
         throw new Mana_Db_Exception_Formula($this->__("Function '%s' expects 2 or 3 parameters", $this->getName()));
     }
     if (!$args[0]->getIsAggregate()) {
         throw new Mana_Db_Exception_Formula($this->__("Function '%s' expects 1 parameter to be a field of aggregate entity", $this->getName()));
     }
     $helper = $context->getHelper();
     $sep = $helper->cast($args[1], 'varchar (255)')->getExpr();
     $lastSep = count($args) == 3 ? $helper->cast($args[2], 'varchar (255)')->getExpr() : '';
     if ($args[0]->getSubSelect()) {
         $field = $helper->cast($args[0], 'varchar (255)')->getFieldExpr();
         if (count($args) == 3) {
             $expr = "IF (COUNT({$args[0]->getFieldExpr()}) > 1, " . "REPLACE(CONCAT(" . "SUBSTRING_INDEX(GROUP_CONCAT({$field} SEPARATOR '{$this->_separator}'), " . "'{$this->_separator}', COUNT({$field}) - 1), " . "{$lastSep}, " . "SUBSTRING_INDEX(GROUP_CONCAT({$field} SEPARATOR '{$this->_separator}'), " . "'{$this->_separator}', -1)" . "), '{$this->_separator}', {$sep}), " . "GROUP_CONCAT({$field} SEPARATOR {$sep})" . ")";
         } else {
             $expr = "GROUP_CONCAT({$field} SEPARATOR {$sep})";
         }
         return $helper->expr()->setExpr("({$args[0]->getSubSelect()->columns($expr)})")->setType('varchar(255)');
     } else {
         $expr = '';
         $fieldExpr = $args[0]->getFieldExpr();
         foreach ($fieldExpr as $index => $field) {
             $nextField = isset($fieldExpr[$index + 1]) ? $fieldExpr[$index + 1] : '';
             if ($expr) {
                 if (count($args) == 3) {
                     if ($nextField) {
                         $expr .= ", IF ({$field} IS NULL, '', CONCAT(IF ({$nextField} IS NULL, {$lastSep}, {$sep}), {$field}))";
                     } else {
                         $expr .= ", IF ({$field} IS NULL, '', CONCAT({$lastSep}, {$field}))";
                     }
                 } else {
                     $expr .= ", IF ({$field} IS NULL, '', CONCAT({$sep}, {$field}))";
                 }
             } else {
                 $expr .= "COALESCE({$helper->cast($args[0]->setExpr($field), 'varchar (255)')->getExpr()}, '')";
             }
         }
         $expr = "CONCAT({$expr})";
         return $helper->expr()->setExpr($expr)->setType('varchar(255)');
     }
 }
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param Mana_Db_Model_Formula_Expr[] $args
  * @throws Mana_Db_Exception_Formula
  * @return Mana_Db_Model_Formula_Expr
  */
 public function select($context, $args)
 {
     if (count($args) != 1) {
         throw new Mana_Db_Exception_Formula($this->__("Function '%s' expects one parameter", $this->getName()));
     }
     if (!$args[0]->getIsAggregate()) {
         throw new Mana_Db_Exception_Formula($this->__("Function '%s' expects 1 parameter to be a field of aggregate entity", $this->getName()));
     }
     $helper = $context->getHelper();
     if ($args[0]->getSubSelect()) {
         $expr = "COUNT({$args[0]->getFieldExpr()})";
         return $helper->expr()->setExpr("({$args[0]->getSubSelect()->columns($expr)})")->setType('int');
     } else {
         $expr = '';
         $fieldExpr = $args[0]->getFieldExpr();
         foreach ($fieldExpr as $field) {
             if ($expr) {
                 $expr .= " + ";
             }
             $expr .= "IF ({$field} IS NULL, 0, 1)";
         }
         return $helper->expr()->setExpr($expr)->setType('int');
     }
 }
 /**
  *
  * @param Mana_Db_Model_Formula_Context $context
  * @param Mana_Db_Model_Formula_Entity $entity
  */
 public function select($context, $entity)
 {
     switch ($context->getMode()) {
         default:
             $context->setMode($this->getName())->setEntityHelper($this);
             /* @var $resource Mana_Db_Resource_Formula */
             $resource = Mage::getResourceSingleton('mana_db/formula');
             /* @var $dbHelper Mana_Db_Helper_Data */
             $dbHelper = Mage::helper('mana_db');
             foreach ($entity->getAggregateFields() as $field) {
                 if (!$context->hasAlias($field['alias'])) {
                     $context->getSelect()->joinLeft(array($context->registerAlias($field['alias']) => $resource->getTable($dbHelper->getScopedName($field['entity']))), $context->resolveAliases($field['join']), null);
                 }
             }
             $context->setEntity($entity->getEntity())->setProcessor($entity->getProcessor())->setAlias($entity->getAlias());
             break;
     }
 }
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param string $expr
  * @return string | string[]
  */
 public function expr($context, $expr)
 {
     $result = array();
     foreach ($this->getAliases() as $index => $alias) {
         $result[$index] = $context->resolveAliases($expr, true, $index);
     }
     return $result;
 }
示例#11
0
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param Mana_Db_Model_Formula_Node_Field $formula
  * @param Mana_Db_Model_Formula_Expr $expr
  */
 public function selectField($context, $formula, $expr)
 {
     $expr->setIsAggregate(true)->setSubSelect($context->getAggregateContext()->getSelect());
 }
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param string $expr
  * @return string | string[]
  */
 public function expr($context, $expr)
 {
     return $context->resolveAliases($expr);
 }
示例#13
0
 public function resolveAlias($fieldExpr, $quoteFieldsAndEntities = true, $aliasIndex = null)
 {
     self::$_quoteFieldsAndEntities = $quoteFieldsAndEntities;
     self::$_aliasIndex = $aliasIndex;
     return $this->_doResolveAlias($fieldExpr);
 }
示例#14
0
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param string $defaultExpr
  * @return string
  */
 protected function _getOverriddenValueExpr($context, $defaultExpr)
 {
     if (($no = $context->getField()->getNo()) !== null) {
         $overriddenExpr = "`p`.`{$context->getField()->getName()}`";
         if ($overriddenExpr != $defaultExpr) {
             /* @var $db Mana_Db_Helper_Data */
             $db = Mage::helper('mana_db');
             $condition = "`p`.`default_mask{$db->getMaskIndex($no)}` & {$db->getMask($no)} = {$db->getMask($no)}";
             return "IF ({$condition}, {$overriddenExpr}, {$defaultExpr})";
         } else {
             return $overriddenExpr;
         }
     } else {
         return $defaultExpr;
     }
 }
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param SimpleXMLElement $selectXml
  * @return Varien_Db_Select
  */
 public function createSelect($context, $selectXml)
 {
     /* @var $dbHelper Mana_Db_Helper_Data */
     $dbHelper = Mage::helper('mana_db');
     /* @var $resource Mana_Db_Resource_Formula */
     $resource = Mage::getResourceSingleton('mana_db/formula');
     $select = $context->getSelect();
     /* @var $fromXml SimpleXMLElement */
     /** @noinspection PhpUndefinedFieldInspection */
     $fromXml = $selectXml->from;
     foreach ($fromXml->children() as $alias => $definition) {
         $entity = $alias == 'primary' ? $context->getPrimaryEntity() : (string) $definition->entity;
         $select->from(array($context->registerAlias($alias) => $resource->getTable($dbHelper->getScopedName($entity))), null);
     }
     if (isset($selectXml->join)) {
         $joinXml = $selectXml->join;
         /* @var $joinXml SimpleXMLElement */
         foreach ($joinXml->children() as $alias => $definition) {
             $method = isset($definition->type) ? 'join' . ucfirst($definition->type) : 'joinInner';
             $entity = $alias == 'primary' ? $context->getPrimaryEntity() : (string) $definition->entity;
             $select->{$method}(array($context->registerAlias($alias) => $resource->getTable($dbHelper->getScopedName($entity))), $context->resolveAliases((string) $definition->on), null);
         }
     }
     if (isset($selectXml->order)) {
         $select->order($context->resolveAliases((string) $selectXml->order, false));
     }
     if (isset($selectXml->where)) {
         $select->where($context->resolveAliases((string) $selectXml->where));
     }
     if ($formula = $context->getOption('entity_filter_formula')) {
         /* @var $selector Mana_Db_Helper_Formula_Selector */
         $selector = Mage::helper('mana_db/formula_selector');
         $selector->filterFormula($context, $this->parse($formula), $context->getOption('entity_filter_id'));
     }
     return $select;
 }
示例#16
0
 /**
  * @param Mana_Db_Model_Formula_Context $context
  * @param Varien_Simplexml_Element $xml
  * @param string $entity
  * @param string $mode
  * @return Mana_Db_Model_Formula_Entity
  */
 protected function _selectEntityBasedOnXml($context, $xml, $entity, $mode)
 {
     if (isset($xml->{$entity})) {
         /* @var $formulaHelper Mana_Db_Helper_Formula */
         $formulaHelper = Mage::helper('mana_db/formula');
         /* @var $entityXml Varien_Simplexml_Element */
         /** @noinspection PhpUndefinedFieldInspection */
         $entityXml = $xml->{$entity};
         /* @var $result Mana_Db_Model_Formula_Entity */
         $result = Mage::getModel('mana_db/formula_entity');
         if ($entity == 'primary') {
             /* @var $dbConfig Mana_Db_Helper_Config */
             $dbConfig = Mage::helper('mana_db/config');
             $scopeXml = $dbConfig->getScopeXml($context->getEntity());
             /** @noinspection PhpUndefinedFieldInspection */
             $entityName = (string) $scopeXml->flattens;
         } else {
             /** @noinspection PhpUndefinedFieldInspection */
             $entityName = (string) $entityXml->entity;
         }
         $data = $entityXml->asArray();
         $alias = $context->getAlias()->child($formulaHelper->createAlias($entity));
         return $result->setHelper($mode)->setAlias($alias)->setEntity($entityName)->setProcessor($this->getProcessor($entityName))->addData($data ? $data : array());
     } else {
         return false;
     }
 }