Exemplo n.º 1
0
 /**
  * 
  * @param Dkplus_Model_Criteria_Interface $crit
  * @return Zend_Db_Table_Select
  */
 protected function _critToQuery(Dkplus_Model_Criteria_Interface $crit)
 {
     $sel = $this->_getDbTable()->select();
     //Where
     if (count($crit->getWheres()) > 0) {
         $arrWherePart = array();
         $adapter = $this->_getDbTable()->getAdapter();
         foreach ($crit->getWheres() as $arrWhere) {
             //Alias umwandeln
             if ($this->_hasAlias($arrWhere['col'])) {
                 $arrWhere['col'] = $this->_transformAlias($arrWhere['col']);
             }
             //Zusammenfügen, wenn der Haupt-Connektor wieder Auftritt
             if ($arrWhere['connector'] == $crit->getWhereConnector()) {
                 if ($crit->getWhereConnector() == Dkplus_Model_Criteria::WHERE_OR) {
                     $sel->orWhere(' ( ' . implode(' AND ', $arrWherePart) . ' ) ');
                 } else {
                     $sel->where(' ( ' . implode(' OR ', $arrWherePart) . ' ) ');
                 }
                 $arrWherePart = array();
             }
             //Hinzufügen einer Bedingung
             if (is_array($arrWhere['value'])) {
                 switch ($arrWhere['type']) {
                     case Dkplus_Model_Criteria::WHERE_IS:
                         $strCrit = ' IN(?)';
                         break;
                     case Dkplus_Model_Criteria::WHERE_IS_NOT:
                         $strCrit = ' NOT IN(?)';
                         break;
                 }
             } else {
                 switch ($arrWhere['type']) {
                     case Dkplus_Model_Criteria::WHERE_IS:
                         if (is_null($arrWhere['value'])) {
                             $strCrit = ' IS NULL';
                             break;
                         }
                         $strCrit = ' = ?';
                         break;
                     case Dkplus_Model_Criteria::WHERE_IS_NOT:
                         if (is_null($arrWhere['value'])) {
                             $strCrit = ' IS NOT NULL';
                             break;
                         }
                         $strCrit = ' != ?';
                         break;
                     case Dkplus_Model_Criteria::WHERE_LIKE:
                         if (is_null($arrWhere['value'])) {
                             $strCrit = ' IS NULL';
                             break;
                         }
                         $strCrit = ' LIKE ?';
                         $arrWhere['value'] = '%' . strToLower($arrWhere['value']) . '%';
                         break;
                     case Dkplus_Model_Criteria::WHERE_NOT_LIKE:
                         if (is_null($arrWhere['value'])) {
                             $strCrit = ' IS NOT NULL';
                             break;
                         }
                         $strCrit = ' NOT LIKE ?';
                         $arrWhere['value'] = '%' . strToLower($arrWhere['value']) . '%';
                         break;
                     case Dkplus_Model_Criteria::WHERE_BIGGER:
                         $strCrit = ' > ?';
                         $arrWhere['value'] = strToLower($arrWhere['value']);
                         break;
                     case Dkplus_Model_Criteria::WHERE_SMALLER:
                         $strCrit = ' < ?';
                         $arrWhere['value'] = strToLower($arrWhere['value']);
                         break;
                 }
             }
             $arrWherePart[] = is_null($arrWhere['value']) ? $arrWhere['col'] . $strCrit : $adapter->quoteInto($arrWhere['col'] . $strCrit, $arrWhere['value']);
         }
         //Hinzufügen der letzten Bedingung
         if ($crit->getWhereConnector() == Dkplus_Model_Criteria::WHERE_OR) {
             $sel->orWhere(' ( ' . implode(' AND ', $arrWherePart) . ' ) ');
         } else {
             $sel->where(' ( ' . implode(' OR ', $arrWherePart) . ' ) ');
         }
     }
     //Order-Part der Query:
     foreach ($crit->getOrders() as $col => $order) {
         $col = $this->_hasAlias($col) ? $this->_transformAlias($col) : $col;
         $sel->order($col . ' ' . ($order == Dkplus_Model_Criteria::ORDER_ASC ? 'ASC' : 'DESC'));
     }
     //Hinzufügen der Limit-Klausel
     if (!is_null($crit->getLimitCount())) {
         $sel->limit($crit->getLimitCount(), $crit->getLimitStart());
     }
     return $sel;
 }
Exemplo n.º 2
0
 /**
  * @return Dkplus_Model_Criteria_Executor_Interface
  */
 protected function _whereLimit()
 {
     //Holen der Kriterien
     $wheres = $this->_criteria->getWheres();
     $newData = array();
     //Limit-Daten
     $limitStart = $this->_criteria->getLimitStart();
     $limitCount = is_null($this->_criteria->getLimitCount()) ? null : $this->_criteria->getLimitCount() + $limitStart;
     $i = 0;
     //Haben wir überhaupt Kriterien
     if (count($wheres) > 0) {
         //Kriterien sind in erster Ordnung nach OR unterteilt:
         if ($this->_criteria->getWhereConnector() == Dkplus_Model_Criteria::WHERE_OR) {
             //Durchgehen der Rows
             foreach ($this->_data as $data) {
                 //In PartWheres speichern wir alle AND-Teile der Where-Klausel,
                 //bis wieder ein OR folgt:
                 $partWheres = array();
                 foreach ($wheres as $where) {
                     //Handelt es sich um ein OR?
                     if ($where['connector'] == Dkplus_Model_Criteria::WHERE_OR) {
                         //Wir nehmen uns nun einen OR-Zweig vor und nehmen erstmal an,
                         //dass er richtig ist.
                         $blnWhereIsOk = true;
                         //Nun gehen wir alle Teile durch. Ist ein Teil falsch,
                         //ist der gesamte OR-Teil falsch
                         foreach ($partWheres as $partWhere) {
                             $partWhere['col'] = $this->_transformAlias($partWhere['col']);
                             //Array als Werte
                             if (is_array($partWhere['value'])) {
                                 switch ($partWhere['type']) {
                                     case Dkplus_Model_Criteria::WHERE_IS:
                                         $blnInArray = false;
                                         foreach ($partWhere['value'] as $value) {
                                             if ($value == $data[$partWhere['col']]) {
                                                 $blnInArray = true;
                                                 break;
                                             }
                                         }
                                         if (!$blnInArray) {
                                             $blnWhereIsOk = false;
                                             break 2;
                                         }
                                         break;
                                     case Dkplus_Model_Criteria::WHERE_IS_NOT:
                                         $blnInArray = false;
                                         foreach ($partWhere['value'] as $value) {
                                             if ($value == $data[$partWhere['col']]) {
                                                 $blnInArray = true;
                                                 break;
                                             }
                                         }
                                         if ($blnInArray) {
                                             $blnWhereIsOk = false;
                                             break 2;
                                         }
                                         break;
                                 }
                             } else {
                                 switch ($partWhere['type']) {
                                     case Dkplus_Model_Criteria::WHERE_IS:
                                         if ($data[$partWhere['col']] != $partWhere['value']) {
                                             $blnWhereIsOk = false;
                                             break 2;
                                         }
                                         break;
                                     case Dkplus_Model_Criteria::WHERE_IS_NOT:
                                         if ($data[$partWhere['col']] == $partWhere['value']) {
                                             $blnWhereIsOk = false;
                                             break 2;
                                         }
                                         break;
                                     case Dkplus_Model_Criteria::WHERE_LIKE:
                                         if (!preg_match('/(.*)' . preg_quote($partWhere['value']) . '/iU', $data[$partWhere['col']])) {
                                             $blnWhereIsOk = false;
                                             break 2;
                                         }
                                         break;
                                     case Dkplus_Model_Criteria::WHERE_NOT_LIKE:
                                         if (preg_match('/(.*)' . preg_quote($partWhere['value']) . '/iU', $data[$partWhere['col']])) {
                                             $blnWhereIsOk = false;
                                             break 2;
                                         }
                                         break;
                                 }
                             }
                         }
                         //Ist der OR-Teil immer noch true, fügen wir das ganze hinzu.
                         if ($blnWhereIsOk) {
                             if (is_null($limitStart) || $limitStart <= $i) {
                                 if ($i < $limitCount || is_null($limitCount)) {
                                     $newData[] = $data;
                                 } else {
                                     break;
                                 }
                             }
                             ++$i;
                             break;
                         }
                         //Der nächste Teil wird vorbereitet
                         $partWheres = array($where);
                     } else {
                         $blnWhereIsOk = null;
                         //Der Teil der Where-Klausel wird in $partWheres gespeichert
                         $partWheres[] = $where;
                     }
                 }
                 //Schleife, die die Wheres durchgeht
                 //Wenn es noch nicht hinzugefügt wurde, müssen wir nun
                 //die letzte Klausel prüfen
                 if (!$blnWhereIsOk || is_null($blnWhereIsOk)) {
                     $blnWhereIsOk = true;
                     //Nun gehen wir alle Teile durch. Ist ein Teil falsch,
                     //ist der gesamte OR-Teil falsch
                     foreach ($partWheres as $partWhere) {
                         $partWhere['col'] = $this->_transformAlias($partWhere['col']);
                         //Array als Werte
                         if (is_array($partWhere['value'])) {
                             switch ($partWhere['type']) {
                                 case Dkplus_Model_Criteria::WHERE_IS:
                                     $blnInArray = false;
                                     foreach ($partWhere['value'] as $value) {
                                         if ($value == $data[$partWhere['col']]) {
                                             $blnInArray = true;
                                             break;
                                         }
                                     }
                                     if (!$blnInArray) {
                                         $blnWhereIsOk = false;
                                         break 2;
                                     }
                                     break;
                                 case Dkplus_Model_Criteria::WHERE_IS_NOT:
                                     $blnInArray = false;
                                     foreach ($partWhere['value'] as $value) {
                                         if ($value == $data[$partWhere['col']]) {
                                             $blnInArray = true;
                                             break;
                                         }
                                     }
                                     if ($blnInArray) {
                                         $blnWhereIsOk = false;
                                         break 2;
                                     }
                                     break;
                             }
                         } else {
                             switch ($partWhere['type']) {
                                 case Dkplus_Model_Criteria::WHERE_IS:
                                     if ($data[$partWhere['col']] != $partWhere['value']) {
                                         $blnWhereIsOk = false;
                                         break 2;
                                     }
                                     break;
                                 case Dkplus_Model_Criteria::WHERE_IS_NOT:
                                     if ($data[$partWhere['col']] == $partWhere['value']) {
                                         $blnWhereIsOk = false;
                                         break 2;
                                     }
                                     break;
                                 case Dkplus_Model_Criteria::WHERE_LIKE:
                                     if (!preg_match('/(.*)' . preg_quote($partWhere['value']) . '/iU', $data[$partWhere['col']])) {
                                         $blnWhereIsOk = false;
                                         break 2;
                                     }
                                     break;
                                 case Dkplus_Model_Criteria::WHERE_NOT_LIKE:
                                     if (preg_match('/(.*)' . preg_quote($partWhere['value']) . '/iU', $data[$partWhere['col']])) {
                                         $blnWhereIsOk = false;
                                         break 2;
                                     }
                                     break;
                             }
                         }
                     }
                     //Ist der OR-Teil immer noch true, fügen wir das ganze hinzu.
                     if ($blnWhereIsOk) {
                         if (is_null($limitStart) || $limitStart <= $i) {
                             if ($i < $limitCount || is_null($limitCount)) {
                                 $newData[] = $data;
                             }
                         }
                         ++$i;
                     }
                 }
             }
             //Schleife, die Rows durchgeht
         } else {
             //Durchgehen der Rows
             foreach ($this->_data as $data) {
                 //In PartWheres speichern wir alle OR-Teile der Where-Klausel,
                 //bis wieder ein AND folgt:
                 $partWheres = array();
                 //Hier speichern wir, ob alles true ist.
                 $blnWhereIsOk = true;
                 foreach ($wheres as $where) {
                     //Handelt es sich um ein AND?
                     if ($where['connector'] == Dkplus_Model_Criteria::WHERE_AND) {
                         /*
                          * Durchgehen der einzelnen Teil der $partWheres-Teile
                          * Ist ein einziger Teil true, ist dieser $partWheres
                          * erfüllt.
                          */
                         $blnPartWhereIsOk = false;
                         foreach ($partWheres as $partWhere) {
                             $partWhere['col'] = $this->_transformAlias($partWhere['col']);
                             //Array als Werte
                             if (is_array($partWhere['value'])) {
                                 switch ($partWhere['type']) {
                                     case Dkplus_Model_Criteria::WHERE_IS:
                                         $blnInArray = false;
                                         foreach ($partWhere['value'] as $value) {
                                             if ($value == $data[$partWhere['col']]) {
                                                 $blnInArray = true;
                                                 break;
                                             }
                                         }
                                         if ($blnInArray) {
                                             $blnPartWhereIsOk = true;
                                         }
                                         break;
                                     case Dkplus_Model_Criteria::WHERE_IS_NOT:
                                         $blnInArray = false;
                                         foreach ($partWhere['value'] as $value) {
                                             if ($value == $data[$partWhere['col']]) {
                                                 $blnInArray = true;
                                                 break;
                                             }
                                         }
                                         if (!$blnInArray) {
                                             $blnPartWhereIsOk = true;
                                         }
                                         break;
                                 }
                             } else {
                                 switch ($partWhere['type']) {
                                     case Dkplus_Model_Criteria::WHERE_IS:
                                         if ($data[$partWhere['col']] == $partWhere['value']) {
                                             $blnPartWhereIsOk = true;
                                             break;
                                         }
                                         break;
                                     case Dkplus_Model_Criteria::WHERE_IS_NOT:
                                         if ($data[$partWhere['col']] != $partWhere['value']) {
                                             $blnPartWhereIsOk = true;
                                             break;
                                         }
                                         break;
                                     case Dkplus_Model_Criteria::WHERE_LIKE:
                                         if (preg_match('/(.*)' . preg_quote($partWhere['value']) . '/iU', $data[$partWhere['col']])) {
                                             $blnPartWhereIsOk = true;
                                             break;
                                         }
                                         break;
                                     case Dkplus_Model_Criteria::WHERE_NOT_LIKE:
                                         if (!preg_match('/(.*)' . preg_quote($partWhere['value']) . '/iU', $data[$partWhere['col']])) {
                                             $blnPartWhereIsOk = true;
                                             break;
                                         }
                                         break;
                                 }
                             }
                         }
                         if (!$blnPartWhereIsOk) {
                             $blnWhereIsOk = false;
                             break;
                         }
                         //Der nächste Teil wird vorbereitet
                         $partWheres = array($where);
                     } else {
                         //Der Teil der Where-Klausel wird in $partWheres gespeichert
                         $partWheres[] = $where;
                     }
                 }
                 /**
                  * Durchgehen der letzten And-Where-Klausel, wenn bisher noch alles ok ist
                  */
                 if ($blnWhereIsOk) {
                     $blnPartWhereIsOk = false;
                     foreach ($partWheres as $partWhere) {
                         $partWhere['col'] = $this->_transformAlias($partWhere['col']);
                         //Array als Werte
                         if (is_array($partWhere['value'])) {
                             switch ($partWhere['type']) {
                                 case Dkplus_Model_Criteria::WHERE_IS:
                                     $blnInArray = false;
                                     foreach ($partWhere['value'] as $value) {
                                         if ($value == $data[$partWhere['col']]) {
                                             $blnInArray = true;
                                             break;
                                         }
                                     }
                                     if ($blnInArray) {
                                         $blnPartWhereIsOk = true;
                                     }
                                     break;
                                 case Dkplus_Model_Criteria::WHERE_IS_NOT:
                                     $blnInArray = false;
                                     foreach ($partWhere['value'] as $value) {
                                         if ($value == $data[$partWhere['col']]) {
                                             $blnInArray = true;
                                             break;
                                         }
                                     }
                                     if (!$blnInArray) {
                                         $blnPartWhereIsOk = true;
                                     }
                                     break;
                             }
                         } else {
                             switch ($partWhere['type']) {
                                 case Dkplus_Model_Criteria::WHERE_IS:
                                     if ($data[$partWhere['col']] == $partWhere['value']) {
                                         $blnPartWhereIsOk = true;
                                         break;
                                     }
                                     break;
                                 case Dkplus_Model_Criteria::WHERE_IS_NOT:
                                     if ($data[$partWhere['col']] != $partWhere['value']) {
                                         $blnPartWhereIsOk = true;
                                         break;
                                     }
                                     break;
                                 case Dkplus_Model_Criteria::WHERE_LIKE:
                                     if (preg_match('/(.*)' . preg_quote($partWhere['value']) . '/iU', $data[$partWhere['col']])) {
                                         $blnPartWhereIsOk = true;
                                         break;
                                     }
                                     break;
                                 case Dkplus_Model_Criteria::WHERE_NOT_LIKE:
                                     if (!preg_match('/(.*)' . preg_quote($partWhere['value']) . '/iU', $data[$partWhere['col']])) {
                                         $blnPartWhereIsOk = true;
                                         break;
                                     }
                                     break;
                             }
                         }
                     }
                     if (!$blnPartWhereIsOk) {
                         $blnWhereIsOk = false;
                     }
                 }
                 if ($blnWhereIsOk) {
                     if (is_null($limitStart) || $limitStart <= $i) {
                         if ($i < $limitCount || is_null($limitCount)) {
                             $newData[] = $data;
                         } else {
                             break;
                         }
                     }
                     ++$i;
                 }
             }
         }
     } else {
         foreach ($this->_data as $data) {
             if (is_null($limitStart) || $limitStart <= $i) {
                 if ($i < $limitCount || is_null($limitCount)) {
                     $newData[] = $data;
                 } else {
                     break;
                 }
             }
             ++$i;
         }
     }
     $this->_data = $newData;
 }