private static function _evaluateExprForRowset($rowset, Kwf_Model_Select_Expr_Interface $expr)
 {
     if ($expr instanceof Kwf_Model_Select_Expr_Count) {
         if ($expr->getField() != '*') {
             $f = $expr->getField();
             $values = array();
             foreach ($rowset as $r) {
                 if (!is_null($r->{$f})) {
                     $values[] = $r->{$f};
                 }
             }
             if ($expr->getDistinct()) {
                 $values = array_unique($values);
             }
             return count($values);
         } else {
             return $rowset->count();
         }
     } else {
         if ($expr instanceof Kwf_Model_Select_Expr_Sum) {
             $f = $expr->getField();
             $ret = 0;
             foreach ($rowset as $r) {
                 $ret += $r->{$f};
             }
             return $ret;
         } else {
             if ($expr instanceof Kwf_Model_Select_Expr_Max) {
                 $f = $expr->getField();
                 $ret = $rowset->current()->{$f};
                 foreach ($rowset as $r) {
                     $ret = max($ret, $r->{$f});
                 }
                 return $ret;
             } else {
                 if ($expr instanceof Kwf_Model_Select_Expr_Min) {
                     $f = $expr->getField();
                     $ret = $rowset->current()->{$f};
                     foreach ($rowset as $r) {
                         $ret = min($ret, $r->{$f});
                     }
                     return $ret;
                 } else {
                     if ($expr instanceof Kwf_Model_Select_Expr_GroupConcat) {
                         $f = $expr->getField();
                         $ret = array();
                         foreach ($rowset as $r) {
                             $ret[] = $r->{$f};
                         }
                         return implode($expr->getSeparator(), $ret);
                     } else {
                         if ($expr instanceof Kwf_Model_Select_Expr_Field) {
                             if (!count($rowset)) {
                                 return null;
                             }
                             $f = $expr->getField();
                             return $rowset->current()->{$f};
                         } else {
                             throw new Kwf_Exception_NotYetImplemented("support for " . get_class($expr) . " is not yet implemented");
                         }
                     }
                 }
             }
         }
     }
 }
 private static function _evaluateExprForRowset($rowset, Kwf_Model_Select_Expr_Interface $expr)
 {
     if ($expr instanceof Kwf_Model_Select_Expr_Count) {
         if ($expr->getField() != '*') {
             $f = $expr->getField();
             $values = array();
             foreach ($rowset as $r) {
                 if (!is_null($r->{$f})) {
                     $values[] = $r->{$f};
                 }
             }
             if ($expr->getDistinct()) {
                 $values = array_unique($values);
             }
             return count($values);
         } else {
             return $rowset->count();
         }
     } else {
         if ($expr instanceof Kwf_Model_Select_Expr_Sum) {
             $f = $expr->getField();
             $ret = 0;
             foreach ($rowset as $r) {
                 $ret += $r->{$f};
             }
             return $ret;
         } else {
             if ($expr instanceof Kwf_Model_Select_Expr_Max) {
                 $f = $expr->getField();
                 if (!count($rowset)) {
                     return null;
                 }
                 $ret = $rowset->current()->{$f};
                 foreach ($rowset as $r) {
                     $ret = max($ret, $r->{$f});
                 }
                 return $ret;
             } else {
                 if ($expr instanceof Kwf_Model_Select_Expr_Min) {
                     $f = $expr->getField();
                     if (!count($rowset)) {
                         return null;
                     }
                     $ret = $rowset->current()->{$f};
                     foreach ($rowset as $r) {
                         $ret = min($ret, $r->{$f});
                     }
                     return $ret;
                 } else {
                     if ($expr instanceof Kwf_Model_Select_Expr_GroupConcat) {
                         $f = $expr->getField();
                         $orderField = $expr->getOrderField();
                         $ret = array();
                         if ($orderField) {
                             $orderFieldValue = $orderField['field'];
                             $orderFieldDirection = $orderField['direction'] == 'DESC' ? SORT_DESC : SORT_ASC;
                             $rowData = array();
                             foreach ($rowset as $r) {
                                 $rowData[] = array($f => $r->{$f}, $orderFieldValue => $r->{$orderFieldValue});
                             }
                             $orderFieldValues = array();
                             foreach ($rowData as $key => $data) {
                                 $orderFieldValues[$key] = $data[$orderFieldValue];
                             }
                             array_multisort($orderFieldValues, $orderFieldDirection, $rowData);
                             foreach ($rowData as $r) {
                                 $ret[] = $r[$f];
                             }
                         } else {
                             foreach ($rowset as $r) {
                                 $ret[] = $r->{$f};
                             }
                         }
                         return implode($expr->getSeparator(), $ret);
                     } else {
                         if ($expr instanceof Kwf_Model_Select_Expr_Field) {
                             if (!count($rowset)) {
                                 return null;
                             }
                             $f = $expr->getField();
                             return $rowset->current()->{$f};
                         } else {
                             throw new Kwf_Exception_NotYetImplemented("support for " . get_class($expr) . " is not yet implemented");
                         }
                     }
                 }
             }
         }
     }
 }