/** * optimize query literals to optimize execution time of query * @param unknown $pLogicalJunction * @param integer $pCountMax optimisation will not be executed if there is more literals than $pCountMax * actually, optimization is exponential and it can take more time than request itself */ public static function optimizeLiterals($pLogicalJunction, $pCountMax = 10) { $lFlattenedLiterals = $pLogicalJunction->getFlattenedLiterals("md5"); $lLiteralKeys = array(); foreach ($lFlattenedLiterals as $lKey => $lLiteral) { $lLiteralKeys[] = $lKey; } if (count($lLiteralKeys) > $pCountMax) { return $pLogicalJunction; } $pLogicalJunction = LogicalJunctionOptimizer::logicalJunctionToLiterals($pLogicalJunction); $lLogicalConjunctions = self::_setLogicalConjunctions($pLogicalJunction, $lFlattenedLiterals, $lLiteralKeys); $lEssentialPrimeImplicants = self::_execQuineMcCluskeyAlgorithm($lLogicalConjunctions); $lLiteralsToFactoryze = self::_findLiteralsToFactoryze($lEssentialPrimeImplicants); $lLogicalJunction = self::_setFinalLogicalJunction($lEssentialPrimeImplicants, $lFlattenedLiterals, $lLiteralsToFactoryze, $lLiteralKeys); return $lLogicalJunction; }
private function finalize() { if (is_null($this->mSelectQuery)) { throw new \Exception("query not initialized"); } if ($this->mOptimizeLiterals) { $this->mLogicalJunction = LogicalJunctionOptimizer::optimizeLiterals($this->mLogicalJunction); } $this->mSelectQuery->setWhereLogicalJunction($this->mLogicalJunction); $this->mSelectQuery->setLimit($this->mLoadLength)->setOffset($this->mOffset); $this->mSelectQuery->setFirstTableCurrentTable(); $this->_addColumns(); $this->_addGroupedColumns(); $this->_addOrderColumns(); }