Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yii2
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PSDI Army
yii2
Commits
c929268b
Commit
c929268b
authored
Nov 25, 2013
by
Paul Klimov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Mongo classes created as blank.
parent
c61ebcc5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
370 additions
and
2 deletions
+370
-2
Command.php
extensions/mongo/Command.php
+33
-0
Connection.php
extensions/mongo/Connection.php
+51
-2
Query.php
extensions/mongo/Query.php
+238
-0
QueryBuilder.php
extensions/mongo/QueryBuilder.php
+38
-0
ConnectionTest.php
tests/unit/extensions/mongo/ConnectionTest.php
+10
-0
No files found.
extensions/mongo/Command.php
0 → 100644
View file @
c929268b
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace
yii\mongo
;
use
\yii\base\Component
;
/**
* Class Command
*
* @author Paul Klimov <klimov.paul@gmail.com>
* @since 2.0
*/
class
Command
extends
Component
{
/**
* @var Connection the Mongo connection that this command is associated with
*/
public
$db
;
/**
* Drop the current database
*/
public
function
dropDb
()
{
$this
->
db
->
db
->
drop
();
}
}
\ No newline at end of file
extensions/mongo/Connection.php
View file @
c929268b
...
@@ -16,6 +16,8 @@ use Yii;
...
@@ -16,6 +16,8 @@ use Yii;
* Class Connection
* Class Connection
*
*
* @property boolean $isActive Whether the Mongo connection is established. This property is read-only.
* @property boolean $isActive Whether the Mongo connection is established. This property is read-only.
* @property QueryBuilder $queryBuilder The query builder for the current Mongo connection. This property
* is read-only.
*
*
* @author Paul Klimov <klimov.paul@gmail.com>
* @author Paul Klimov <klimov.paul@gmail.com>
* @since 2.0
* @since 2.0
...
@@ -23,6 +25,11 @@ use Yii;
...
@@ -23,6 +25,11 @@ use Yii;
class
Connection
extends
Component
class
Connection
extends
Component
{
{
/**
/**
* @var \MongoCollection[] list of Mongo collection available in database.
*/
private
$_collections
=
[];
/**
* @var \MongoClient mongo client instance.
* @var \MongoClient mongo client instance.
*/
*/
public
$client
;
public
$client
;
...
@@ -50,6 +57,24 @@ class Connection extends Component
...
@@ -50,6 +57,24 @@ class Connection extends Component
* @var string name of the Mongo database to use
* @var string name of the Mongo database to use
*/
*/
public
$dbName
;
public
$dbName
;
/**
* @var \MongoDb Mongo database instance.
*/
public
$db
;
/**
* Returns the Mongo collection with the given name.
* @param string $name collection name
* @param boolean $refresh whether to reload the table schema even if it is found in the cache.
* @return \MongoCollection mongo collection instance.
*/
public
function
getCollection
(
$name
,
$refresh
=
false
)
{
if
(
$refresh
||
!
array_key_exists
(
$name
,
$this
->
_collections
))
{
$this
->
_collections
[
$name
]
=
$this
->
client
->
selectCollection
(
$this
->
dbName
,
$name
);
}
return
$this
->
_collections
[
$name
];
}
/**
/**
* Returns a value indicating whether the Mongo connection is established.
* Returns a value indicating whether the Mongo connection is established.
...
@@ -69,7 +94,7 @@ class Connection extends Component
...
@@ -69,7 +94,7 @@ class Connection extends Component
{
{
if
(
$this
->
client
===
null
)
{
if
(
$this
->
client
===
null
)
{
if
(
empty
(
$this
->
dsn
))
{
if
(
empty
(
$this
->
dsn
))
{
throw
new
InvalidConfigException
(
'Connection
::dsn cannot be empty.'
);
throw
new
InvalidConfigException
(
$this
->
className
()
.
'
::dsn cannot be empty.'
);
}
}
$token
=
'Opening Mongo connection: '
.
$this
->
dsn
;
$token
=
'Opening Mongo connection: '
.
$this
->
dsn
;
try
{
try
{
...
@@ -78,7 +103,7 @@ class Connection extends Component
...
@@ -78,7 +103,7 @@ class Connection extends Component
$options
=
$this
->
options
;
$options
=
$this
->
options
;
$options
[
'connect'
]
=
true
;
$options
[
'connect'
]
=
true
;
$this
->
client
=
new
\MongoClient
(
$this
->
dsn
,
$options
);
$this
->
client
=
new
\MongoClient
(
$this
->
dsn
,
$options
);
$this
->
client
->
selectDB
(
$this
->
dbName
);
$this
->
db
=
$this
->
client
->
selectDB
(
$this
->
dbName
);
Yii
::
endProfile
(
$token
,
__METHOD__
);
Yii
::
endProfile
(
$token
,
__METHOD__
);
}
catch
(
\Exception
$e
)
{
}
catch
(
\Exception
$e
)
{
Yii
::
endProfile
(
$token
,
__METHOD__
);
Yii
::
endProfile
(
$token
,
__METHOD__
);
...
@@ -96,6 +121,29 @@ class Connection extends Component
...
@@ -96,6 +121,29 @@ class Connection extends Component
if
(
$this
->
client
!==
null
)
{
if
(
$this
->
client
!==
null
)
{
Yii
::
trace
(
'Closing Mongo connection: '
.
$this
->
dsn
,
__METHOD__
);
Yii
::
trace
(
'Closing Mongo connection: '
.
$this
->
dsn
,
__METHOD__
);
$this
->
client
=
null
;
$this
->
client
=
null
;
$this
->
db
=
null
;
}
}
}
}
/**
* Returns the query builder for the current DB connection.
* @return QueryBuilder the query builder for the current DB connection.
*/
public
function
getQueryBuilder
()
{
return
new
QueryBuilder
(
$this
);
}
/**
* Creates a command for execution.
* @return Command the Mongo command
*/
public
function
createCommand
()
{
$this
->
open
();
$command
=
new
Command
([
'db'
=>
$this
,
]);
return
$command
;
}
}
}
\ No newline at end of file
extensions/mongo/Query.php
0 → 100644
View file @
c929268b
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace
yii\mongo
;
use
yii\base\Component
;
use
yii\db\Connection
;
use
yii\db\QueryInterface
;
/**
* Class Query
*
* @author Paul Klimov <klimov.paul@gmail.com>
* @since 2.0
*/
class
Query
extends
Component
implements
QueryInterface
{
/**
* Executes the query and returns all results as an array.
* @param Connection $db the database connection used to execute the query.
* If this parameter is not given, the `db` application component will be used.
* @return array the query results. If the query results in nothing, an empty array will be returned.
*/
public
function
all
(
$db
=
null
)
{
// TODO: Implement all() method.
}
/**
* Executes the query and returns a single row of result.
* @param Connection $db the database connection used to execute the query.
* If this parameter is not given, the `db` application component will be used.
* @return array|boolean the first row (in terms of an array) of the query result. False is returned if the query
* results in nothing.
*/
public
function
one
(
$db
=
null
)
{
// TODO: Implement one() method.
}
/**
* Returns the number of records.
* @param string $q the COUNT expression. Defaults to '*'.
* @param Connection $db the database connection used to execute the query.
* If this parameter is not given, the `db` application component will be used.
* @return integer number of records
*/
public
function
count
(
$q
=
'*'
,
$db
=
null
)
{
// TODO: Implement count() method.
}
/**
* Returns a value indicating whether the query result contains any row of data.
* @param Connection $db the database connection used to execute the query.
* If this parameter is not given, the `db` application component will be used.
* @return boolean whether the query result contains any row of data.
*/
public
function
exists
(
$db
=
null
)
{
// TODO: Implement exists() method.
}
/**
* Sets the [[indexBy]] property.
* @param string|callable $column the name of the column by which the query results should be indexed by.
* This can also be a callable (e.g. anonymous function) that returns the index value based on the given
* row data. The signature of the callable should be:
*
* ~~~
* function ($row)
* {
* // return the index value corresponding to $row
* }
* ~~~
*
* @return static the query object itself
*/
public
function
indexBy
(
$column
)
{
// TODO: Implement indexBy() method.
}
/**
* Sets the WHERE part of the query.
*
* The method requires a $condition parameter.
*
* The $condition parameter should be an array in one of the following two formats:
*
* - hash format: `['column1' => value1, 'column2' => value2, ...]`
* - operator format: `[operator, operand1, operand2, ...]`
*
* A condition in hash format represents the following SQL expression in general:
* `column1=value1 AND column2=value2 AND ...`. In case when a value is an array,
* an `IN` expression will be generated. And if a value is null, `IS NULL` will be used
* in the generated expression. Below are some examples:
*
* - `['type' => 1, 'status' => 2]` generates `(type = 1) AND (status = 2)`.
* - `['id' => [1, 2, 3], 'status' => 2]` generates `(id IN (1, 2, 3)) AND (status = 2)`.
* - `['status' => null] generates `status IS NULL`.
*
* A condition in operator format generates the SQL expression according to the specified operator, which
* can be one of the followings:
*
* - `and`: the operands should be concatenated together using `AND`. For example,
* `['and', 'id=1', 'id=2']` will generate `id=1 AND id=2`. If an operand is an array,
* it will be converted into a string using the rules described here. For example,
* `['and', 'type=1', ['or', 'id=1', 'id=2']]` will generate `type=1 AND (id=1 OR id=2)`.
* The method will NOT do any quoting or escaping.
*
* - `or`: similar to the `and` operator except that the operands are concatenated using `OR`.
*
* - `between`: operand 1 should be the column name, and operand 2 and 3 should be the
* starting and ending values of the range that the column is in.
* For example, `['between', 'id', 1, 10]` will generate `id BETWEEN 1 AND 10`.
*
* - `not between`: similar to `between` except the `BETWEEN` is replaced with `NOT BETWEEN`
* in the generated condition.
*
* - `in`: operand 1 should be a column or DB expression, and operand 2 be an array representing
* the range of the values that the column or DB expression should be in. For example,
* `['in', 'id', [1, 2, 3]]` will generate `id IN (1, 2, 3)`.
* The method will properly quote the column name and escape values in the range.
*
* - `not in`: similar to the `in` operator except that `IN` is replaced with `NOT IN` in the generated condition.
*
* - `like`: operand 1 should be a column or DB expression, and operand 2 be a string or an array representing
* the values that the column or DB expression should be like.
* For example, `['like', 'name', '%tester%']` will generate `name LIKE '%tester%'`.
* When the value range is given as an array, multiple `LIKE` predicates will be generated and concatenated
* using `AND`. For example, `['like', 'name', ['%test%', '%sample%']]` will generate
* `name LIKE '%test%' AND name LIKE '%sample%'`.
* The method will properly quote the column name and escape values in the range.
*
* - `or like`: similar to the `like` operator except that `OR` is used to concatenate the `LIKE`
* predicates when operand 2 is an array.
*
* - `not like`: similar to the `like` operator except that `LIKE` is replaced with `NOT LIKE`
* in the generated condition.
*
* - `or not like`: similar to the `not like` operator except that `OR` is used to concatenate
* the `NOT LIKE` predicates.
*
* @param array $condition the conditions that should be put in the WHERE part.
* @return static the query object itself
* @see andWhere()
* @see orWhere()
*/
public
function
where
(
$condition
)
{
// TODO: Implement where() method.
}
/**
* Adds an additional WHERE condition to the existing one.
* The new condition and the existing one will be joined using the 'AND' operator.
* @param string|array $condition the new WHERE condition. Please refer to [[where()]]
* on how to specify this parameter.
* @return static the query object itself
* @see where()
* @see orWhere()
*/
public
function
andWhere
(
$condition
)
{
// TODO: Implement andWhere() method.
}
/**
* Adds an additional WHERE condition to the existing one.
* The new condition and the existing one will be joined using the 'OR' operator.
* @param string|array $condition the new WHERE condition. Please refer to [[where()]]
* on how to specify this parameter.
* @return static the query object itself
* @see where()
* @see andWhere()
*/
public
function
orWhere
(
$condition
)
{
// TODO: Implement orWhere() method.
}
/**
* Sets the ORDER BY part of the query.
* @param string|array $columns the columns (and the directions) to be ordered by.
* Columns can be specified in either a string (e.g. "id ASC, name DESC") or an array
* (e.g. `['id' => SORT_ASC, 'name' => SORT_DESC]`).
* The method will automatically quote the column names unless a column contains some parenthesis
* (which means the column contains a DB expression).
* @return static the query object itself
* @see addOrderBy()
*/
public
function
orderBy
(
$columns
)
{
// TODO: Implement orderBy() method.
}
/**
* Adds additional ORDER BY columns to the query.
* @param string|array $columns the columns (and the directions) to be ordered by.
* Columns can be specified in either a string (e.g. "id ASC, name DESC") or an array
* (e.g. `['id' => SORT_ASC, 'name' => SORT_DESC]`).
* The method will automatically quote the column names unless a column contains some parenthesis
* (which means the column contains a DB expression).
* @return static the query object itself
* @see orderBy()
*/
public
function
addOrderBy
(
$columns
)
{
// TODO: Implement addOrderBy() method.
}
/**
* Sets the LIMIT part of the query.
* @param integer $limit the limit. Use null or negative value to disable limit.
* @return static the query object itself
*/
public
function
limit
(
$limit
)
{
// TODO: Implement limit() method.
}
/**
* Sets the OFFSET part of the query.
* @param integer $offset the offset. Use null or negative value to disable offset.
* @return static the query object itself
*/
public
function
offset
(
$offset
)
{
// TODO: Implement offset() method.
}
}
\ No newline at end of file
extensions/mongo/QueryBuilder.php
0 → 100644
View file @
c929268b
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace
yii\mongo
;
use
yii\base\Object
;
/**
* Class QueryBuilder
*
* @author Paul Klimov <klimov.paul@gmail.com>
* @since 2.0
*/
class
QueryBuilder
extends
Object
{
/**
* @var Connection the Mongo connection.
*/
public
$db
;
/**
* Constructor.
* @param Connection $connection the Mongo connection.
* @param array $config name-value pairs that will be used to initialize the object properties
*/
public
function
__construct
(
$connection
,
$config
=
[])
{
$this
->
db
=
$connection
;
parent
::
__construct
(
$config
);
}
// TODO
}
\ No newline at end of file
tests/unit/extensions/mongo/ConnectionTest.php
View file @
c929268b
...
@@ -29,14 +29,23 @@ class ConnectionTest extends MongoTestCase
...
@@ -29,14 +29,23 @@ class ConnectionTest extends MongoTestCase
$connection
->
open
();
$connection
->
open
();
$this
->
assertTrue
(
$connection
->
isActive
);
$this
->
assertTrue
(
$connection
->
isActive
);
$this
->
assertTrue
(
is_object
(
$connection
->
client
));
$this
->
assertTrue
(
is_object
(
$connection
->
client
));
$this
->
assertTrue
(
is_object
(
$connection
->
db
));
$connection
->
close
();
$connection
->
close
();
$this
->
assertFalse
(
$connection
->
isActive
);
$this
->
assertFalse
(
$connection
->
isActive
);
$this
->
assertEquals
(
null
,
$connection
->
client
);
$this
->
assertEquals
(
null
,
$connection
->
client
);
$this
->
assertEquals
(
null
,
$connection
->
db
);
$connection
=
new
Connection
;
$connection
=
new
Connection
;
$connection
->
dsn
=
'unknown::memory:'
;
$connection
->
dsn
=
'unknown::memory:'
;
$this
->
setExpectedException
(
'yii\db\Exception'
);
$this
->
setExpectedException
(
'yii\db\Exception'
);
$connection
->
open
();
$connection
->
open
();
}
}
public
function
testGetCollection
()
{
$connection
=
$this
->
getConnection
(
false
);
$collection
=
$connection
->
getCollection
(
'customer'
);
$this
->
assertTrue
(
$collection
instanceof
\MongoCollection
);
}
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment