Example #1
0
 /**
  * Builds SQL from filters (WHERE or HAVING parts)
  *
  * @param array     $filters        Array of Ucc\Data\Filter\Filter objects
  * @param array     $fieldMap       Array representing filed map
  * @param boolean   $singleTable    Marker to indicate single table queries.
  * @return  string
  */
 public static function getFilterSql($filters = array(), $fieldMap = array(), $singleTable = false)
 {
     $ret = array('paramiters' => array());
     $havingFilters = array();
     $whereFilters = array();
     $table = '';
     // Check if filters is a single filter
     if (is_a($filters, 'Ucc\\Data\\Filter\\Filter')) {
         $filters = array($filters);
     }
     foreach ($filters as $i => $filter) {
         // get Criterions
         $criterions = $filter->getCriterions();
         $havingFilter = new Data_Filter();
         $whereFilter = new Data_Filter();
         foreach ($criterions as $criterion) {
             if (isset($fieldMap[$criterion->key()])) {
                 // Get table name from field map
                 $table = $fieldMap[$criterion->key()];
                 // Check for wildecard
             } elseif (isset($fieldMap['*'])) {
                 $table = $fieldMap['*'];
             }
             if (!$singleTable || $singleTable === $table) {
                 // Allow pseudo tables 'HAVING'
                 if ($table == 'having') {
                     $havingFilter->addCriterion($criterion);
                 } else {
                     $whereFilter->addCriterion($criterion);
                 }
             }
         }
         $havingCriterions = $havingFilter->getCriterions();
         if (!empty($havingCriterions)) {
             $havingFilters[$i] = $havingFilter;
         }
         $whereFilters[$i] = $whereFilter;
     }
     $where = Filter::filtersToSqlClause($whereFilters, $fieldMap);
     $having = Filter::filtersToSqlClause($havingFilters, $fieldMap);
     $whereStatemet = $where->getStatement();
     $havingStatement = $having->getStatement();
     if (!empty($whereStatemet) && $whereStatemet != '()') {
         $ret['where'] = 'WHERE ' . $whereStatemet;
         $ret['paramiters'] = array_merge($ret['paramiters'], $where->getParameters());
     }
     if (!empty($havingStatement)) {
         $ret['having'] = 'HAVING ' . $havingStatement;
         $ret['paramiters'] = array_merge($ret['paramiters'], $having->getParameters());
     }
     return $ret;
 }
Example #2
0
 /**
  * @dataProvider criterionToSqlClauseProvider
  */
 public function testCriterionToSqlClause($criterion, $expected)
 {
     $result = Db_Filter::criterionToSqlClause($criterion);
     $this->assertEquals($expected, $result);
 }