/**
  * 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;
 }
 /**
  * Formulář pro vytvoření nového formátu
  * @return Form
  */
 protected function createComponentNewFormatForm()
 {
     $form = new Form();
     $form->addHidden('datasource');
     $form->addHidden('column');
     $metaAttribute = $form->addHidden('metaAttribute');
     $form->addText('metaAttributeName', 'Meta-attribute:')->setAttribute('readonly', 'readonly')->setAttribute('class', 'normalWidth');
     $formatName = $form->addText('formatName', 'Format name:')->setRequired()->setAttribute('class', 'normalWidth');
     $formatName->addRule(Form::MIN_LENGTH, 'Min length of format name is %s characters!', 3);
     $formatName->addRule(function (TextInput $control) use($metaAttribute) {
         try {
             $format = $this->metaAttributesFacade->findFormatByName($metaAttribute->value, $control->value);
             ///XXX
             if ($format instanceof Format) {
                 return false;
             }
         } catch (\Exception $e) {
             /*chybu ignorujeme (nenalezený metaatribut je OK)*/
         }
         return true;
     }, 'Format with this name already exists!');
     $form->addCheckbox('formatShared', 'Create shared (standard) format');
     $form->addSelect('formatType', 'Values range:', array('interval' => 'Continuous values (interval)', 'values' => 'Distinct values (enumeration)'))->setAttribute('class', 'normalWidth')->setDefaultValue('values');
     $submit = $form->addSubmit('create', 'Create format');
     $submit->setValidationScope(array($formatName));
     $submit->onClick[] = function (SubmitButton $button) {
         $values = $button->form->values;
         try {
             $datasourceColumn = $this->datasourcesFacade->findDatasourceColumn($values->datasource, $values->column);
             $metaAttribute = $this->metaAttributesFacade->findMetaAttribute($values->metaAttribute);
             $datasource = $this->datasourcesFacade->findDatasource($values->datasource);
             $this->databasesFacade->openDatabase($datasource->getDbConnection());
             $datasourceColumnValuesStatistic = $this->databasesFacade->getColumnValuesStatistic($datasource->dbTable, $datasourceColumn->name);
             $format = $this->metaAttributesFacade->createFormatFromDatasourceColumn($metaAttribute, $values->formatName, $datasourceColumn, $datasourceColumnValuesStatistic, @$values->formatType, @$values->formatShared);
             $datasourceColumn->format = $format;
             $this->datasourcesFacade->saveDatasourceColumn($datasourceColumn);
         } catch (\Exception $e) {
             $this->flashMessage($this->translator->translate('Format creation failed.'));
         }
         $this->redirect('Close');
     };
     $storno = $form->addSubmit('storno', 'Storno');
     $storno->setValidationScope(array());
     $storno->onClick[] = function (SubmitButton $button) {
         $values = $button->form->values;
         $this->redirect('SelectFormat', array('datasource' => $values->datasource, 'column' => $values->column, 'metaAttribute' => $values->metaAttribute));
     };
     $form->onError[] = function (Form $form) {
         $values = $form->values;
         $this->handleNewFormat($values->datasource, $values->column, $values->metaAttribute);
     };
     return $form;
 }
 /**
  * Funkce, která projde všechny hodnoty v daném zdrojovém sloupci a předzpracované je překopíruje do cílové tabulky
  * @param DatasourceColumn $datasourceColumn
  * @param Metasource $metasource
  * @param Attribute $attribute
  * @param int $attributeStrLen
  * @param callable $function
  * @throws \Exception
  */
 private function generateAttributeUsingPreprocessingFunction(DatasourceColumn $datasourceColumn, Metasource $metasource, Attribute $attribute, $attributeStrLen, $function)
 {
     $datasource = $datasourceColumn->datasource;
     $this->databasesFacade->openDatabase($datasource->getDbConnection(), $metasource->getDbConnection());
     //vytvoření DB sloupce
     $dbColumn = new DbColumn();
     $dbColumn->name = $attribute->name;
     $dbColumn->dataType = DbColumn::TYPE_STRING;
     $dbColumn->strLength = $attributeStrLen;
     try {
         $this->databasesFacade->createColumn($metasource->attributesTable, $dbColumn, DatabasesFacade::SECOND_DB);
     } catch (\Exception $e) {
         throw new \Exception('Attribute creation failed!', $e);
     }
     $valuesArr = $this->databasesFacade->getColumnValuesWithId($datasource->dbTable, $datasourceColumn->name, DatabasesFacade::FIRST_DB);
     if (!empty($valuesArr)) {
         $updateDataArr = array();
         foreach ($valuesArr as $id => $value) {
             $updateDataArr[$id] = $function($value);
             //$this->databasesFacade->updateColumnValueById($metasource->attributesTable,$attribute->name,$id,$function($value),DatabasesFacade::SECOND_DB);
         }
         $this->databasesFacade->multiUpdateColumnValueById($metasource->attributesTable, $attribute->name, $updateDataArr, DatabasesFacade::SECOND_DB);
     }
 }
 public function createMetasourcesTables(Metasource $metasource)
 {
     $datasource = $metasource->miner->datasource;
     $this->databasesFacade->openDatabase($datasource->getDbConnection(), $metasource->getDbConnection());
     $attributesTable = $metasource->attributesTable;
     $i = 1;
     while ($this->databasesFacade->checkTableExists($attributesTable . DatabasesFacade::SECOND_DB)) {
         $attributesTable = $metasource->attributesTable . $i;
         $i++;
     }
     $this->databasesFacade->createTable($attributesTable, array(), DatabasesFacade::SECOND_DB);
     //nakopírování hodnot ID
     $values = $this->databasesFacade->getColumnValuesWithId($metasource->attributesTable, 'id', DatabasesFacade::SECOND_DB);
     if (!empty($values)) {
         foreach ($values as $value) {
             $this->databasesFacade->insertRow($metasource->attributesTable, array('id' => $value));
         }
     }
 }
 /**
  * Akce pro vykreslení histogramu z hodnot konkrétního sloupce v DB
  * @param int $datasource = null
  * @param int $miner = null
  * @param string $columnName
  * @param string $mode = 'default'|'component'|'iframe'
  * @throws BadRequestException
  * @throws \Nette\Application\ApplicationException
  * @throws \Nette\Application\ForbiddenRequestException
  */
 public function renderColumnHistogram($datasource = null, $miner = null, $columnName, $mode = 'default')
 {
     if ($miner) {
         $miner = $this->findMinerWithCheckAccess($miner);
         $datasource = $miner->datasource;
     } elseif ($datasource) {
         $datasource = $this->datasourcesFacade->findDatasource($datasource);
         $this->checkDatasourceAccess($datasource);
     }
     if (!$datasource) {
         throw new BadRequestException('Requested data not specified!');
     }
     $this->databasesFacade->openDatabase($datasource->getDbConnection());
     $this->template->dbColumnValuesStatistic = $this->databasesFacade->getColumnValuesStatistic($datasource->dbTable, $columnName);
     if ($this->isAjax() || $mode == 'component' || $mode == 'iframe') {
         $this->layout = 'iframe';
         $this->template->layout = $this->layout;
     }
 }