/** * Translates a query an manipulates given query object * * @param Tx_PtExtlist_Domain_QueryObject_Criteria $criteria Criteria to be translated * @param \TYPO3\CMS\Extbase\Persistence\Generic\Query $extbaseQuery Query to add criteria to * @param \TYPO3\CMS\Extbase\Persistence\Repository $extbaseRepository Associated repository * @throws Exception * @return \TYPO3\CMS\Extbase\Persistence\Generic\Query */ public static function translateCriteria(Tx_PtExtlist_Domain_QueryObject_Criteria $criteria, \TYPO3\CMS\Extbase\Persistence\Generic\Query $extbaseQuery, \TYPO3\CMS\Extbase\Persistence\Repository $extbaseRepository) { if (!is_a($criteria, 'Tx_PtExtlist_Domain_QueryObject_OrCriteria')) { throw new Exception('Given criteria is not of type Tx_PtExtlist_Domain_QueryObject_Criteria --> cannot be translated by or criteria translator! 1326466193'); } /** * This is a little ugly here: * * As we do not create Extbase criterias from our generic pt_extlist criterias * but set the criterias directly on the created extbase query, we have to cheat * here and generate two helper queries, whenever a OR query has to be translated. * * After having translated the two criterias of the generic OR criteria, we * put them together again in a single extbase query. */ $tmpQuery1 = $extbaseRepository->createQuery(); $tmpQuery2 = $extbaseRepository->createQuery(); // translate first OR criteria by creating a new extbase query $tmpQuery1 = Tx_PtExtlist_Domain_DataBackend_ExtBaseDataBackend_ExtBaseInterpreter_ExtBaseInterpreter::setCriteriaOnExtBaseQueryByCriteria($criteria->getFirstCriteria(), $tmpQuery1, $extbaseRepository); // translate second OR criteria by creating a new extbase query $tmpQuery2 = Tx_PtExtlist_Domain_DataBackend_ExtBaseDataBackend_ExtBaseInterpreter_ExtBaseInterpreter::setCriteriaOnExtBaseQueryByCriteria($criteria->getSecondCriteria(), $tmpQuery2, $extbaseRepository); // put both translated criterias together again in a single extbase query if ($extbaseQuery->getConstraint()) { $extbaseQuery->matching($extbaseQuery->logicalAnd($extbaseQuery->getConstraint(), $extbaseQuery->logicalOr($tmpQuery1->getConstraint(), $tmpQuery2->getConstraint()))); } else { $extbaseQuery->matching($extbaseQuery->logicalOr($tmpQuery1->getConstraint(), $tmpQuery2->getConstraint())); } return $extbaseQuery; }
/** * Translates a query an manipulates given query object * * @param Tx_PtExtlist_Domain_QueryObject_Criteria $criteria Criteria to be translated * @param \TYPO3\CMS\Extbase\Persistence\Generic\Query $extbaseQuery Query to add criteria to * @param \TYPO3\CMS\Extbase\Persistence\Repository $extbaseRepository Associated repository * @return \TYPO3\CMS\Extbase\Persistence\Generic\Query */ public static function translateCriteria(Tx_PtExtlist_Domain_QueryObject_Criteria $criteria, \TYPO3\CMS\Extbase\Persistence\Generic\Query $extbaseQuery, \TYPO3\CMS\Extbase\Persistence\Repository $extbaseRepository) { // translate NOT criteria by creating a new extbase query $tmpQuery = Tx_PtExtlist_Domain_DataBackend_ExtBaseDataBackend_ExtBaseInterpreter_ExtBaseInterpreter::setCriteriaOnExtBaseQueryByCriteria($criteria->getCriteria(), $extbaseRepository->createQuery(), $extbaseRepository); // put translated criteria together again in a single extbase query if ($extbaseQuery->getConstraint()) { $extbaseQuery->matching($extbaseQuery->logicalAnd($extbaseQuery->getConstraint(), $extbaseQuery->logicalNot($tmpQuery->getConstraint()))); } else { $extbaseQuery->matching($extbaseQuery->logicalNot($tmpQuery->getConstraint())); } return $extbaseQuery; }
public function testSetAllCriteriasOnExtBaseQueryByQuery() { $this->markTestSkipped('It seems not possible to use a mock as constraint. We need a solution here'); $repositoryMock = $this->getMock('\\TYPO3\\CMS\\Extbase\\Persistence\\Repository', array(), array(), '', false); $criteria1 = new Tx_PtExtlist_Domain_QueryObject_SimpleCriteria('field1', 'value1', '='); $criteria2 = new Tx_PtExtlist_Domain_QueryObject_SimpleCriteria('field2', 'value2', '>'); $queryMock = $this->getMock('Tx_PtExtlist_Domain_QueryObject_Query', array(), array(), '', false); $queryMock->expects($this->once())->method('getCriterias')->will($this->returnValue(array($criteria1, $criteria2))); $extbaseQueryMock = $this->getMock('\\TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Query', array(), array(), '', false); $extbaseQueryMock->expects($this->any())->method('matching'); $extbaseQueryMock->expects($this->once())->method('equals')->with('field1', 'value1')->will($this->returnValue($this->getMock('\\TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Qom\\Comparison', array(), array(), '', false))); $extbaseQueryMock->expects($this->once())->method('greaterThan')->with('field2', 'value2')->will($this->returnValue($this->getMock('\\TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Qom\\Comparison', array(), array(), '', false))); $extbaseQueryMock->expects($this->any())->method('getConstraint')->will($this->returnValue(null)); Tx_PtExtlist_Domain_DataBackend_ExtBaseDataBackend_ExtBaseInterpreter_ExtBaseInterpreter::setAllCriteriasOnExtBaseQueryByQueryObject($queryMock, $extbaseQueryMock, $repositoryMock); }
/** * Builds ExtBase query object without regarding pager * * @return \TYPO3\CMS\Extbase\Persistence\Generic\Query */ protected function buildExtBaseQueryWithoutPager() { $extbaseQuery = Tx_PtExtlist_Domain_DataBackend_ExtBaseDataBackend_ExtBaseInterpreter_ExtBaseInterpreter::interpretQueryByRepository($this->buildGenericQueryWithoutPager(), $this->repository); /* @var $extbaseQuery \TYPO3\CMS\Extbase\Persistence\Generic\Query */ if ($this->backendConfiguration->getSettings('respectStoragePage') == 0) { $extbaseQuery->getQuerySettings()->setRespectStoragePage(false); } return $extbaseQuery; }