Example #1
0
 public function performAction()
 {
     if (!file_exists($this->path)) {
         throw new \Exception(Expression::create('File ? not found', $this->path));
     }
     $GPSEssentials = new GPSEssentials($this->path);
     $database = new Database('sqlite:///' . realpath($this->path));
     $database->log(new Log('colored-stdout'));
     TrackElement::bindDatabase($database);
     //$this->count = $database->query("SELECT COUNT(1) AS c FROM ?", TrackElement::table())->fetchRow('c');
     $pageQuery = TrackElement::statement()->order("? ASC", TrackElement::columns()->id)->limit($this->pageSize);
     if ($this->from) {
         $pageQuery->where('? >= 1000 * ?', TrackElement::columns()->time, strtotime($this->from));
     }
     if ($this->to) {
         $pageQuery->where('? <= 1000 * ?', TrackElement::columns()->time, strtotime($this->to));
     }
     $this->segments = array(Segment5::className(), Segment10::className(), Segment100::className(), Segment500::className(), Segment1k::className(), Segment5k::className(), Segment10k::className());
     $timeSegments = array(Segment10s::className(), Segment60s::className());
     /** @var BatchSaver[] $batchSavers */
     $batchSavers = array();
     foreach ($this->segments as $segment) {
         $batchSavers[$segment] = new BatchSaver();
     }
     foreach ($timeSegments as $segment) {
         $batchSavers[$segment] = new BatchSaver();
     }
     while ($res = $pageQuery->query()->fetchAll()) {
         /** @var TrackElement $row */
         foreach ($res as $row) {
             $row->time /= 1000;
             /** @var Segment5|string $segment */
             foreach ($this->segments as $segment) {
                 if (!isset($this->lastPoints[$segment])) {
                     $this->lastPoints[$segment] = $row;
                 }
                 /** @var TrackElement $lastPoint */
                 $lastPoint = $this->lastPoints[$segment];
                 if (($distance = GPSEssentials::distance($lastPoint, $row)) > $segment::MIN_DISTANCE) {
                     /** @var Segment5 $segmentItem */
                     $segmentItem = new $segment();
                     $segmentItem->distance = $distance;
                     $segmentItem->latitude = $row->latitude;
                     $segmentItem->longitude = $row->longitude;
                     $segmentItem->ut = $row->time;
                     $segmentItem->altitude = $row->altitude;
                     $segmentItem->time = $row->time - $lastPoint->time;
                     if ($segmentItem->time) {
                         $segmentItem->speed = $segmentItem->distance / $segmentItem->time;
                     }
                     $segmentItem->elevation = $row->altitude - $lastPoint->altitude;
                     $batchSavers[$segment]->add($segmentItem);
                     //$segmentItem->save();
                     $this->lastPoints[$segment] = $row;
                 }
             }
             /** @var Segment10s|string $segment */
             foreach ($timeSegments as $segment) {
                 if (!isset($this->lastPoints[$segment])) {
                     $this->lastPoints[$segment] = $row;
                 }
                 /** @var TrackElement $lastPoint */
                 $lastPoint = $this->lastPoints[$segment];
                 if ($row->time - $lastPoint->time > $segment::MIN_TIME) {
                     /** @var Segment5 $segmentItem */
                     $segmentItem = new $segment();
                     $segmentItem->distance = GPSEssentials::distance($lastPoint, $row);
                     $segmentItem->latitude = $row->latitude;
                     $segmentItem->longitude = $row->longitude;
                     $segmentItem->ut = $row->time;
                     $segmentItem->altitude = $row->altitude;
                     $segmentItem->time = $row->time - $lastPoint->time;
                     if ($segmentItem->time) {
                         $segmentItem->speed = $segmentItem->distance / $segmentItem->time;
                     }
                     $segmentItem->elevation = $row->altitude - $lastPoint->altitude;
                     $batchSavers[$segment]->add($segmentItem);
                     //$segmentItem->save();
                     $this->lastPoints[$segment] = $row;
                 }
             }
         }
         $this->offset += $this->pageSize;
         $pageQuery->offset($this->offset);
     }
     foreach ($batchSavers as $batchSaver) {
         $batchSaver->flush();
     }
 }
Example #2
0
 public function error()
 {
     $this->layout->pushMain(Raw::create(Expression::create(func_get_args())))->render();
 }
Example #3
0
 public static function info($message, $binds = null)
 {
     if (null !== $binds) {
         $message = (string) Expression::create(func_get_args());
     }
     Console::getInstance()->printLine($message);
 }
Example #4
0
 /**
  * @param array $properties
  * @return Expression
  */
 public function makeAnchor(array $properties)
 {
     if (!$properties) {
         throw new Command\Exception('Unable to make anchor, no properties');
     }
     $unnamed = array();
     $unnamedTemplate = '';
     $queryTemplate = '';
     $query = array();
     foreach ($properties as $property) {
         /** @var Option $option */
         list($option, $value) = $property;
         if ($option->isUnnamed) {
             if (!$option->isVariadic) {
                 $value = array($value);
             }
             foreach ($value as $item) {
                 $unnamedTemplate .= '/??';
                 $unnamed[] = $this->unnamedMapper->__invoke($item);
             }
         } else {
             $queryTemplate .= '&' . $this->namedMapper->__invoke($option->name) . '=??';
             $query[] = $value;
         }
     }
     $template = $unnamedTemplate;
     $binds = $unnamed;
     if ($queryTemplate) {
         $template .= '?' . substr($queryTemplate, 1);
         $binds = array_merge($binds, $query);
     }
     $expression = new Expression($template, $binds);
     $expression->setPlaceholder('??');
     return $expression;
 }
Example #5
0
 private function makeExpression(Parsed $parsed, &$binds, &$index)
 {
     $statement = '';
     foreach ($parsed->tokens as $token) {
         if ($token instanceof Token) {
             if (isset($this->strip[$token->start])) {
                 continue;
             } elseif (isset($this->keep[$token->start])) {
                 $statement .= $token->start . $token->escapedContent . $token->end;
             } elseif (isset($this->keepBoundaries[$token->start])) {
                 $key = $this->bindKeyPrefix . $index . $this->bindKeyPostfix;
                 $statement .= $token->start . $key . $token->end;
                 $binds[$key] = $token;
                 ++$index;
             } else {
                 $key = $this->bindKeyPrefix . $index . $this->bindKeyPostfix;
                 $statement .= $key;
                 $binds[$key] = $token;
                 ++$index;
             }
         } elseif ($token instanceof Parsed) {
             if (isset($this->strip[$token->bracket->start])) {
                 continue;
             } elseif (isset($this->keep[$token->bracket->start])) {
                 $statement .= $token->bracket->start . $this->makeExpression($token, $binds, $index)->getStatement() . $token->bracket->end;
             } elseif (isset($this->keepBoundaries[$token->bracket->start])) {
                 $key = $this->bindKeyPrefix . $index . $this->bindKeyPostfix;
                 $statement .= $token->bracket->start . $key . $token->bracket->end;
                 $binds[$key] = $token;
                 ++$index;
             } else {
                 $key = $this->bindKeyPrefix . $index . $this->bindKeyPostfix;
                 $statement .= $key;
                 $binds[$key] = $token;
                 ++$index;
             }
         } elseif ($token instanceof Delimiter) {
             $statement .= $token->start;
         } else {
             $statement .= $token;
         }
     }
     $expression = new Expression($statement, $binds);
     $expression->setNamedPrefix('');
     return $expression;
 }
Example #6
0
 /**
  * @return bool
  * @throws Exception
  */
 public function rollback()
 {
     if (self::$enableStateCache && isset(self::$rolledBack[$this->table->entityClassName])) {
         if ($this->log) {
             $this->log->push(Expression::create('# Migration for table ? (?) already rolled back, skipping', $this->table->schemaName, $this->table->entityClassName));
         }
         return true;
     }
     $utility = $this->table->database()->getUtility();
     $tableExists = $utility->tableExists($this->table->schemaName);
     $requires = $tableExists;
     if ($this->log) {
         $this->log->push(Expression::create('# Rollback, table ? (?) ?', $this->table->schemaName, $this->table->entityClassName, $requires ? 'requires deletion' : 'is already non-existent'));
     }
     if (!$requires) {
         self::setRolledBack($this->table->entityClassName);
         return false;
     }
     /** @var Migration[] $dependentMigrations */
     $dependentMigrations = array();
     foreach ($this->table->dependentTables as $dependentTable) {
         $referenceMigration = $dependentTable->migration();
         $referenceMigration->dryRun = $this->dryRun;
         $referenceMigration->log = $this->log;
         $dependentMigrations[$referenceMigration->table->schemaName] = $referenceMigration;
     }
     if (!$this->dryRun) {
         try {
             if ($dependentMigrations) {
                 $dropFk = $utility->generateDropForeignKeys($this->table->schemaName);
                 $this->runStatement($dropFk);
                 self::setRolledBack($this->table->entityClassName);
                 if ($this->log) {
                     $this->log->push('# Dependent tables found: ' . implode(', ', array_keys($dependentMigrations)));
                 }
                 foreach ($dependentMigrations as $migration) {
                     $migration->rollback();
                 }
                 $this->runStatement($utility->generateDropTable($this->table->schemaName));
             } else {
                 $this->runStatement($utility->generateDropTable($this->table->schemaName));
                 self::setRolledBack($this->table->entityClassName);
             }
             if ($this->log) {
                 $this->log->push('# OK', Log::TYPE_SUCCESS);
             }
         } catch (Exception $exception) {
             if ($this->log) {
                 $this->log->push($exception->getMessage(), Log::TYPE_ERROR);
             }
             throw $exception;
         }
     }
     return true;
 }