/** * @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()); }
/** * @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; } }
/** * @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)'); }
/** * @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; } }
/** * @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; }
/** * @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); }
public function resolveAlias($fieldExpr, $quoteFieldsAndEntities = true, $aliasIndex = null) { self::$_quoteFieldsAndEntities = $quoteFieldsAndEntities; self::$_aliasIndex = $aliasIndex; return $this->_doResolveAlias($fieldExpr); }
/** * @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; }
/** * @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; } }