/**
  * @param Task $task
  * @param Datasource $testingDatasource
  * @return ScoringResult
  * @throws \Exception
  */
 public function evaluateTask(Task $task, Datasource $testingDatasource)
 {
     #region sestavení PMML a následné vytvoření scoreru
     $pmml = $this->prepareTaskPmml($task);
     $url = $this->serverUrl . '/scorer';
     try {
         $response = self::curlRequestResponse($url, $pmml, '', ['Content-Type' => 'application/xml; charset=utf-8']);
         $response = Json::decode($response, Json::FORCE_ARRAY);
         if (@$response['code'] == 201 && !empty($response['id'])) {
             $scorerId = $response['id'];
         } else {
             throw new \Exception(@$response['description']);
         }
     } catch (\Exception $e) {
         throw new \Exception('Scorer creation failed!', 500, $e);
     }
     #endregion sestavení PMML a následné vytvoření scoreru
     #region postupné posílání řádků z testovací DB tabulky
     $database = $this->databaseFactory->getDatabaseInstance($testingDatasource->getDbConnection(), $task->miner->user);
     $dbDatasource = $database->getDbDatasource($testingDatasource->dbDatasourceId > 0 ? $testingDatasource->dbDatasourceId : $testingDatasource->dbTable);
     $dbRowsCount = $dbDatasource->size;
     $testedRowsCount = 0;
     /** @var ScoringResult[] $partialResults */
     $partialResults = [];
     $url .= '/' . $scorerId;
     //export jednotlivých řádků z DB a jejich otestování
     while ($testedRowsCount < $dbRowsCount) {
         //připravení JSONu a jeho odeslání
         $dbValuesRows = $database->getDbValuesRows($dbDatasource, $testedRowsCount, self::ROWS_PER_TEST);
         $json = Json::encode($dbValuesRows->getRowsAsArray());
         $response = self::curlRequestResponse($url, $json, '', ['Content-Type' => 'application/json; charset=utf-8']);
         $response = Json::decode($response, Json::FORCE_ARRAY);
         if ($response["code"] != 200) {
             throw new \Exception('Invalid scorer response!');
         }
         //vytvoření objektu s výsledky
         $scoringResult = new EasyMinerScoringResult($response);
         $partialResult = $scoringResult->getScoringConfusionMatrix()->getScoringResult(true);
         $partialResults[] = $partialResult;
         //TODO tady bude v budoucnu možné doplnit zpracování celé kontingenční tabulky
         //připočtení řádků a uvolnění paměti
         unset($scoringResult);
         $testedRowsCount += self::ROWS_PER_TEST;
     }
     #endregion postupné posílání řádků z testovací DB tabulky
     #region sestavení celkového výsledku a jeho vrácení
     return ScoringResult::merge($partialResults);
     #endregion sestavení celkového výsledku a jeho vrácení
 }
 /**
  * @param Task $task
  * @param Datasource $testingDatasource
  * @return ScoringResult
  */
 public function evaluateTask(Task $task, Datasource $testingDatasource)
 {
     $rulesXmlFileName = $task->taskId . '.xml';
     /** @var string $rulesXmlFilePath - cesta souboru s pravidly v XML */
     $rulesXmlFilePath = @$this->params['tempDirectory'] . '/' . $rulesXmlFileName;
     $associationRulesXmlSerializer = new AssociationRulesXmlSerializer($task->rules);
     $rulesXml = $associationRulesXmlSerializer->getXml()->asXML();
     file_put_contents($rulesXmlFilePath, $rulesXml);
     $database = $this->databaseFactory->getDatabaseInstance($testingDatasource->getDbConnection(), $task->miner->user);
     $dbDatasource = $database->getDbDatasource($testingDatasource->dbDatasourceId > 0 ? $testingDatasource->dbDatasourceId : $testingDatasource->dbTable);
     $dbRowsCount = $dbDatasource->size;
     $testedRowsCount = 0;
     /** @var ScoringResult[] $partialResults */
     $partialResults = [];
     //export jednotlivých řádků z DB a jejich otestování
     while ($testedRowsCount < $dbRowsCount) {
         $csv = CsvSerializer::prepareCsvFromDatabase($database, $dbDatasource, $testedRowsCount, self::ROWS_PER_TEST, ';', '"');
         $csvFileName = $testingDatasource->datasourceId . '-' . $testedRowsCount . '-' . self::ROWS_PER_TEST . '.csv';
         /** @var string $csvFilePath - cesta k CSV souboru s částí dat */
         $csvFilePath = @$this->params['tempDirectory'] . '/' . $csvFileName;
         file_put_contents($csvFilePath, $csv);
         $url = $this->serverUrl . '?rulesXml=' . $this->getTempFileUrl($rulesXmlFileName) . '&dataCsv=' . $this->getTempFileUrl($csvFileName);
         //try{
         $response = self::curlRequestResponse($url);
         $xml = simplexml_load_string($response);
         $partialResult = new ScoringResult();
         $partialResult->truePositive = (string) $xml->truePositive;
         $partialResult->falsePositive = (string) $xml->falsePositive;
         $partialResult->rowsCount = (string) $xml->rowsCount;
         $partialResults[] = $partialResult;
         unset($xml);
         //}catch (\Exception $e){
         //  /*ignore error...*/
         //}
         unlink($csvFilePath);
         $testedRowsCount += self::ROWS_PER_TEST;
     }
     //XXX unlink($rulesXmlFilePath);
     //sestavení celkového výsledku
     return ScoringResult::merge($partialResults);
 }
 /**
  * Funkce pro připravení parametrů nového datového zdroje pro daného uživatele...
  * @param string $dbType
  * @param User $user
  * @param bool $ignoreCheck
  * @return Datasource
  */
 public function prepareNewDatasourceForUser($dbType, User $user, $ignoreCheck = false)
 {
     $defaultDbConnection = $this->databaseFactory->getDefaultDbConnection($dbType, $user);
     $datasource = Datasource::newFromDbConnection($defaultDbConnection);
     if ($dbType == DbConnection::TYPE_UNLIMITED) {
         return $datasource;
     }
     if ($ignoreCheck) {
         return $datasource;
     }
     $this->databaseFactory->checkDatabaseAvailability($defaultDbConnection, $user);
     return $datasource;
 }
 /**
  * Funkce pro import CSV souboru
  * @param string $filename
  * @param string $dbType
  * @param User $user
  * @param string $tableName
  * @param string $encoding='utf-8'
  * @param string $delimiter=','
  * @param string $enclosure='"'
  * @param string $escapeCharacter='\\'
  * @param string $nullValue=''
  * @return DbDatasource
  * @throws \Exception
  */
 public function importCsvFile($filename, $dbType, User $user, $tableName, $encoding = 'utf-8', $delimiter = ',', $enclosure = '"', $escapeCharacter = '\\', $nullValue = '')
 {
     $columns = $this->getColsInCSV($filename, $delimiter, $enclosure, $escapeCharacter);
     if (empty($columns)) {
         throw new \Exception('No columns detected!');
     }
     $dataTypes = [];
     foreach ($columns as $column) {
         $dataTypes[] = $column->type == DbField::TYPE_NOMINAL ? 'nominal' : 'numeric';
     }
     $database = $this->databaseFactory->getDatabaseInstanceWithDefaultDbConnection($dbType, $user);
     return $database->importCsvFile($this->getFilePath($filename), $tableName, $encoding, $delimiter, $enclosure, $escapeCharacter, $nullValue, $dataTypes);
 }