%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/main/lib/orm/query/ |
Current File : //home/bitrix/www/bitrix/modules/main/lib/orm/query/nosqlprimaryselector.php |
<?php /** * Bitrix Framework * @package bitrix * @subpackage main * @copyright 2001-2012 Bitrix */ namespace Bitrix\Main\ORM\Query; use Bitrix\Main\ORM\Fields\ExpressionField; /** * Class description * @package bitrix * @subpackage main */ class NosqlPrimarySelector { /** * @param \Bitrix\Main\Data\Connection $connection * @param Query $query * * @return bool */ public static function checkQuery(\Bitrix\Main\Data\Connection $connection, Query $query) { // check interface if (!($connection instanceof INosqlPrimarySelector)) { return false; } // no expressions in select foreach ($query->getSelectChains() as $selectChain) { if ($selectChain->getLastElement()->getValue() instanceof ExpressionField) { return false; } } // skip empty select - useless case for nosql api if (!count($query->getSelect())) { return false; } // if empty joinmap, group, order and simple filter if (!count($query->getJoinMap()) && !count($query->getGroupChains()) && !count($query->getOrderChains()) && !count($query->getHavingChains())) { $entityPrimary = $query->getEntity()->getPrimary(); // check for primary singularity if (!is_array($entityPrimary)) { // check if only primary is in filter if (count($query->getFilterChains()) == 1 && key($query->getFilterChains()) === $entityPrimary) { $passFilter = true; // check if only equality operations & 1-level filter foreach ($query->getFilter() as $filterElement => $filterValue) { if (is_numeric($filterElement) && is_array($filterValue)) { // filter has subfilters. not ok $passFilter = false; break; } // no multiple values for HSPHP if (is_array($filterValue)) { $passFilter = false; break; } // skip system keys if ($filterElement === 'LOGIC') { continue; } $operation = substr($filterElement, 0, 1); if ($operation !== '=') { // only equal operation allowed. not ok $passFilter = false; break; } } // fine! if ($passFilter) { return true; } } } } return false; } public static function relayQuery(\Bitrix\Main\Data\Connection $connection, Query $query) { // prepare select $select = array(); foreach ($query->getSelectChains() as $selectChain) { $select[] = $selectChain->getLastElement()->getValue()->getName(); } // prepare filter $filter = array(); foreach ($query->getFilter() as $filterElem) { if (is_array($filterElem)) { $filter = array_merge($filter, $filterElem); } else { $filter[] = $filterElem; } } $result = $connection->getEntityByPrimary($query->getEntity(), $filter, $select); return $result; } }