Ejemplo n.º 1
0
 /**
  * Funkce pro připravení entity nového datového zdroje podle DbConnection
  *
  * @param DbConnection $dbConnection
  * @return Datasource
  */
 public static function newFromDbConnection(DbConnection $dbConnection)
 {
     $datasource = new Datasource();
     $datasource->type = $dbConnection->type;
     $datasource->dbName = $dbConnection->dbName;
     $datasource->dbServer = $dbConnection->dbServer;
     $datasource->dbApi = $dbConnection->dbApi;
     if (!empty($dbConnection->dbPort)) {
         $datasource->dbPort = $dbConnection->dbPort;
     }
     $datasource->dbUsername = $dbConnection->dbUsername;
     $datasource->setDbPassword($dbConnection->dbPassword);
     return $datasource;
 }
 /**
  * @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 export pole s informacemi z DataDictionary a TransformationDictionary
  * @param Datasource $datasource
  * @param Metasource|null $metasource
  * @return array
  */
 public function exportDictionariesArr(Datasource $datasource, Metasource $metasource = null)
 {
     $this->databasesFacade->openDatabase($datasource->getDbConnection());
     $output = array('dataDictionary' => array(), 'transformationDictionary' => array(), 'recordCount' => $this->databasesFacade->getRowsCount($datasource->dbTable));
     #region datafields
     foreach ($datasource->datasourceColumns as $datasourceColumn) {
         $output['dataDictionary'][$datasourceColumn->name] = $datasourceColumn->type == DatasourceColumn::TYPE_STRING ? 'string' : 'integer';
         //TODO kontrola, jaké má smysl vracet datové typy....
     }
     #endregion datafields
     #region atributy
     if (!empty($metasource) && !empty($metasource->attributes)) {
         $this->databasesFacade->openDatabase($metasource->getDbConnection());
         foreach ($metasource->attributes as $attribute) {
             $valuesArr = array();
             try {
                 $valuesStatistics = $this->databasesFacade->getColumnValuesStatistic($metasource->attributesTable, $attribute->name, true);
                 if (!empty($valuesStatistics->valuesArr)) {
                     foreach ($valuesStatistics->valuesArr as $value => $count) {
                         $valuesArr[] = $value;
                     }
                 }
             } catch (\Exception $e) {
             }
             $output['transformationDictionary'][$attribute->name] = array('choices' => $valuesArr);
         }
     }
     #endregion atributy
     return $output;
 }