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