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(); } }
public function error() { $this->layout->pushMain(Raw::create(Expression::create(func_get_args())))->render(); }
public static function info($message, $binds = null) { if (null !== $binds) { $message = (string) Expression::create(func_get_args()); } Console::getInstance()->printLine($message); }
/** * @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; }
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; }
/** * @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; }