/**
  * Построение дополнительного фильтра
  * Здесь учитываются ключи фильтра вида #*
  *
  * @param array $aFilter Фильтр
  * @param EntityORM $oEntitySample Объект сущности
  * @return array
  */
 public function BuildFilterMore($aFilter, $oEntitySample)
 {
     // Сортировка
     $sOrder = '';
     if (isset($aFilter['#order'])) {
         if (!is_array($aFilter['#order'])) {
             $aFilter['#order'] = array($aFilter['#order']);
         }
         foreach ($aFilter['#order'] as $key => $value) {
             if (is_numeric($key)) {
                 $key = $value;
                 $value = 'asc';
             } elseif (!in_array($value, array('asc', 'desc'))) {
                 $value = 'asc';
             }
             if (substr($key, 0, 1) == '#') {
                 /**
                  * Используем "как есть"
                  */
                 $key = ltrim($key, '#');
             } else {
                 /**
                  * Проверяем на простые выражения: field1 + field2 * field3
                  */
                 $aKeyPath = preg_split("#\\s?([\\-\\+\\*\\\\])\\s?#", $key, -1, PREG_SPLIT_DELIM_CAPTURE);
                 if (count($aKeyPath) > 2) {
                     $key = '';
                     foreach ($aKeyPath as $i => $sKey) {
                         if ($i % 2 == 0) {
                             $key .= 't.' . $this->oDb->escape($oEntitySample->_getField(trim($sKey)), true);
                         } else {
                             $key .= " {$sKey} ";
                         }
                     }
                 } else {
                     /**
                      * Проверяем на FIELD:id -> FIELD(id,?a)
                      */
                     $aKeys = explode(':', $key);
                     if (count($aKeys) == 2) {
                         if (strtolower($aKeys[0]) == 'field' and is_array($aFilter['#order'][$key]) and count($aFilter['#order'][$key])) {
                             $key = 'FIELD(t.' . $this->oDb->escape($oEntitySample->_getField(trim($aKeys[1])), true) . ',' . join(',', $aFilter['#order'][$key]) . ')';
                             $value = '';
                         } else {
                             /**
                              * Неизвестное выражение
                              */
                             continue;
                         }
                     } else {
                         /**
                          * Пропускаем экранирование функций
                          */
                         if (!in_array($key, array('rand()'))) {
                             /**
                              * Проверяем наличие префикса таблицы
                              */
                             if (!strpos($oEntitySample->_getField($key), '.')) {
                                 $key = 't.' . $this->oDb->escape($oEntitySample->_getField($key), true);
                             } else {
                                 $key = $oEntitySample->_getField($key);
                             }
                         }
                     }
                 }
             }
             $sOrder .= " {$key} {$value},";
         }
         $sOrder = trim($sOrder, ',');
         if ($sOrder != '') {
             $sOrder = "ORDER BY {$sOrder}";
         }
     }
     // Постраничность
     if (isset($aFilter['#page']) and is_array($aFilter['#page']) and count($aFilter['#page']) == 2) {
         // array(2,15) - 2 - page, 15 - count
         $aFilter['#limit'] = array(($aFilter['#page'][0] - 1) * $aFilter['#page'][1], $aFilter['#page'][1]);
     }
     // Лимит
     $sLimit = '';
     if (isset($aFilter['#limit'])) {
         // допустимы варианты: limit=10 , limit=array(10) , limit=array(10,15)
         $aLimit = $aFilter['#limit'];
         if (is_numeric($aLimit)) {
             $iBegin = 0;
             $iEnd = $aLimit;
         } elseif (is_array($aLimit)) {
             if (count($aLimit) > 1) {
                 $iBegin = $aLimit[0];
                 $iEnd = $aLimit[1];
             } else {
                 $iBegin = 0;
                 $iEnd = $aLimit[0];
             }
         }
         $sLimit = "LIMIT {$iBegin}, {$iEnd}";
     }
     // Группировка
     $sGroup = '';
     if (isset($aFilter['#group'])) {
         if (!is_array($aFilter['#group'])) {
             $aFilter['#group'] = array($aFilter['#group']);
         }
         foreach ($aFilter['#group'] as $sField) {
             if (substr($sField, 0, 1) == '#') {
                 $sGroup .= ltrim($sField, '#') . ',';
             } else {
                 $sField = $this->oDb->escape($oEntitySample->_getField($sField), true);
                 $sGroup .= " t.{$sField},";
             }
         }
         $sGroup = trim($sGroup, ',');
         if ($sGroup != '') {
             $sGroup = "GROUP BY {$sGroup}";
         }
     }
     // Определение полей в select
     $sSelect = '';
     if (isset($aFilter['#select'])) {
         // todo: добавить экранирование полей с учетом префикса таблицы
         if (!is_array($aFilter['#select'])) {
             $aFilter['#select'] = array($aFilter['#select']);
         }
         $sSelect = join(', ', $aFilter['#select']);
     }
     return array($sOrder, $sLimit, $sGroup, $sSelect);
 }
 /**
  * Построение дополнительного фильтра
  * Здесь учитываются ключи фильтра вида #*
  *
  * @param array $aFilter	Фильтр
  * @param EntityORM $oEntitySample	Объект сущности
  * @return array
  */
 public function BuildFilterMore($aFilter, $oEntitySample)
 {
     // Сортировка
     $sOrder = '';
     if (isset($aFilter['#order'])) {
         if (!is_array($aFilter['#order'])) {
             $aFilter['#order'] = array($aFilter['#order']);
         }
         foreach ($aFilter['#order'] as $key => $value) {
             if (is_numeric($key)) {
                 $key = $value;
                 $value = 'asc';
             } elseif (!in_array($value, array('asc', 'desc'))) {
                 $value = 'asc';
             }
             $key = $this->oDb->escape($oEntitySample->_getField($key), true);
             $sOrder .= " {$key} {$value},";
         }
         $sOrder = trim($sOrder, ',');
         if ($sOrder != '') {
             $sOrder = "ORDER BY {$sOrder}";
         }
     }
     // Постраничность
     if (isset($aFilter['#page']) and is_array($aFilter['#page']) and count($aFilter['#page']) == 2) {
         // array(2,15) - 2 - page, 15 - count
         $aFilter['#limit'] = array(($aFilter['#page'][0] - 1) * $aFilter['#page'][1], $aFilter['#page'][1]);
     }
     // Лимит
     $sLimit = '';
     if (isset($aFilter['#limit'])) {
         // допустимы варианты: limit=10 , limit=array(10) , limit=array(10,15)
         $aLimit = $aFilter['#limit'];
         if (is_numeric($aLimit)) {
             $iBegin = 0;
             $iEnd = $aLimit;
         } elseif (is_array($aLimit)) {
             if (count($aLimit) > 1) {
                 $iBegin = $aLimit[0];
                 $iEnd = $aLimit[1];
             } else {
                 $iBegin = 0;
                 $iEnd = $aLimit[0];
             }
         }
         $sLimit = "LIMIT {$iBegin}, {$iEnd}";
     }
     // Группировка
     $sGroup = '';
     if (isset($aFilter['#group'])) {
         if (!is_array($aFilter['#group'])) {
             $aFilter['#group'] = array($aFilter['#group']);
         }
         foreach ($aFilter['#group'] as $sField) {
             $sField = $this->oDb->escape($oEntitySample->_getField($sField), true);
             $sGroup .= " {$sField},";
         }
         $sGroup = trim($sGroup, ',');
         if ($sGroup != '') {
             $sGroup = "GROUP BY {$sGroup}";
         }
     }
     return array($sOrder, $sLimit, $sGroup);
 }