From 3d7a91e12beb6b932befc4b4d74467a8557f158b Mon Sep 17 00:00:00 2001 From: Klimov Paul Date: Wed, 18 Jun 2014 17:13:16 +0300 Subject: [PATCH] `yii\mongodb\Migration` created --- extensions/mongodb/Migration.php | 137 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 extensions/mongodb/Migration.php diff --git a/extensions/mongodb/Migration.php b/extensions/mongodb/Migration.php new file mode 100644 index 0000000..3b6fe45 --- /dev/null +++ b/extensions/mongodb/Migration.php @@ -0,0 +1,137 @@ + + * @since 2.0 + */ +abstract class Migration extends Component implements MigrationInterface +{ + /** + * @var Connection|string the MongoDB connection object or the application component ID of the MongoDB connection + * that this migration should work with. + */ + public $db = 'mongodb'; + + /** + * Initializes the migration. + * This method will set [[db]] to be the 'db' application component, if it is null. + */ + public function init() + { + parent::init(); + $this->db = Instance::ensure($this->db, Connection::className()); + } + + /** + * Creates new collection with the specified options. + * @param string|array $collection name of the collection + * @param array $options collection options in format: "name" => "value" + * @return \MongoCollection new Mongo collection instance. + */ + public function createCollection($collection, $options = []) + { + if (is_array($collection)) { + list($database, $collectionName) = $collection; + } else { + $database = null; + $collectionName = $collection; + } + echo " > create collection " . $this->composeCollectionLogName($collection) . " ..."; + $time = microtime(true); + $this->db->getDatabase($database)->createCollection($collectionName, $options); + echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n"; + } + + /** + * Drops existing collection. + * @param string|array $collection name of the collection + */ + public function dropCollection($collection) + { + echo " > drop collection " . $this->composeCollectionLogName($collection) . " ..."; + $time = microtime(true); + $this->db->getCollection($collection)->drop(); + echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n"; + } + + /** + * Creates an index on the collection and the specified fields. + * @param string|array $collection name of the collection + * @param array|string $columns column name or list of column names. + * @param array $options list of options in format: optionName => optionValue. + */ + public function createIndex($collection, $columns, $options = []) + { + echo " > create index on " . $this->composeCollectionLogName($collection) . " (" . Json::encode((array)$columns) . empty($options) ? "" : ", " . Json::encode($options) . ") ..."; + $time = microtime(true); + $this->db->getCollection($collection)->createIndex($columns, $options); + echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n"; + } + + /** + * Drop indexes for specified column(s). + * @param string|array $collection name of the collection + * @param string|array $columns column name or list of column names. + */ + public function dropIndex($collection, $columns) + { + echo " > drop index on " . $this->composeCollectionLogName($collection) . " (" . Json::encode((array)$columns) . ") ..."; + $time = microtime(true); + $this->db->getCollection($collection)->dropIndex($columns); + echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n"; + } + + /** + * Drops all indexes for specified collection. + * @param string|array $collection name of the collection. + */ + public function dropAllIndexes($collection) + { + echo " > drop all indexes on " . $this->composeCollectionLogName($collection) . ") ..."; + $time = microtime(true); + $this->db->getCollection($collection)->dropAllIndexes(); + echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n"; + } + + /** + * Composes string representing collection name. + * @param array|string $collection collection name. + * @return string collection name. + */ + protected function composeCollectionLogName($collection) + { + if (is_array($collection)) { + list($database, $collection) = $collection; + return $database . '.' . $collection; + } else { + return $collection; + } + } +} \ No newline at end of file