/** * * @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; }
/** * @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; }