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
fea4c8da
Commit
fea4c8da
authored
Jan 07, 2015
by
Carsten Brandt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add fixture support for elasticsearch
close #6432 issue #2053
parent
81412f94
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
151 additions
and
2 deletions
+151
-2
TestCase.php
extensions/codeception/TestCase.php
+2
-1
ActiveFixture.php
extensions/elasticsearch/ActiveFixture.php
+145
-0
CHANGELOG.md
extensions/elasticsearch/CHANGELOG.md
+1
-1
Connection.php
extensions/elasticsearch/Connection.php
+3
-0
No files found.
extensions/codeception/TestCase.php
View file @
fea4c8da
...
...
@@ -13,6 +13,7 @@ use Codeception\TestCase\Test;
use
yii\base\UnknownMethodException
;
use
yii\base\UnknownPropertyException
;
use
yii\test\ActiveFixture
;
use
yii\test\BaseActiveFixture
;
use
yii\test\FixtureTrait
;
/**
...
...
@@ -66,7 +67,7 @@ class TestCase extends Test
public
function
__call
(
$name
,
$params
)
{
$fixture
=
$this
->
getFixture
(
$name
);
if
(
$fixture
instanceof
ActiveFixture
)
{
if
(
$fixture
instanceof
Base
ActiveFixture
)
{
return
$fixture
->
getModel
(
reset
(
$params
));
}
else
{
throw
new
UnknownMethodException
(
'Unknown method: '
.
get_class
(
$this
)
.
"::
$name
()"
);
...
...
extensions/elasticsearch/ActiveFixture.php
0 → 100644
View file @
fea4c8da
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace
yii\elasticsearch
;
use
Yii
;
use
yii\base\InvalidConfigException
;
use
yii\test\BaseActiveFixture
;
/**
* ActiveFixture represents a fixture for testing backed up by an [[modelClass|ActiveRecord class]] or an elastic search index.
*
* Either [[modelClass]] or [[index]] and [[type]] must be set. You should also provide fixture data in the file
* specified by [[dataFile]] or overriding [[getData()]] if you want to use code to generate the fixture data.
*
* When the fixture is being loaded, it will first call [[resetIndex()]] to remove any existing data in the index for the [[type]].
* It will then populate the index with the data returned by [[getData()]].
*
* After the fixture is loaded, you can access the loaded data via the [[data]] property. If you set [[modelClass]],
* you will also be able to retrieve an instance of [[modelClass]] with the populated data via [[getModel()]].
*
* @author Carsten Brandt <mail@cebe.cc>
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0.2
*/
class
ActiveFixture
extends
BaseActiveFixture
{
/**
* @var Connection|string the DB connection object or the application component ID of the DB connection.
* After the DbFixture object is created, if you want to change this property, you should only assign it
* with a DB connection object.
*/
public
$db
=
'elasticsearch'
;
/**
* @var string the name of the index that this fixture is about. If this property is not set,
* the name will be determined via [[modelClass]].
* @see modelClass
*/
public
$index
;
/**
* @var string the name of the type that this fixture is about. If this property is not set,
* the name will be determined via [[modelClass]].
* @see modelClass
*/
public
$type
;
/**
* @var string|boolean the file path or path alias of the data file that contains the fixture data
* to be returned by [[getData()]]. If this is not set, it will default to `FixturePath/data/Index/Type.php`,
* where `FixturePath` stands for the directory containing this fixture class, `Index` stands for the elasticsearch [[index]] name
* and `Type` stands for the [[type]] associated with this fixture.
* You can set this property to be false to prevent loading any data.
*/
public
$dataFile
;
/**
* @inheritdoc
*/
public
function
init
()
{
parent
::
init
();
if
(
!
isset
(
$this
->
modelClass
)
&&
(
!
isset
(
$this
->
index
)
||
!
isset
(
$this
->
type
)))
{
throw
new
InvalidConfigException
(
'Either "modelClass" or "index" and "type" must be set.'
);
}
/* @var $modelClass ActiveRecord */
$modelClass
=
$this
->
modelClass
;
if
(
$this
->
index
===
null
)
{
$this
->
index
=
$modelClass
::
index
();
}
if
(
$this
->
type
===
null
)
{
$this
->
type
=
$modelClass
::
type
();
}
}
/**
* Loads the fixture.
*
* The default implementation will first clean up the index by calling [[resetIndex()]].
* It will then populate the index with the data returned by [[getData()]].
*
* If you override this method, you should consider calling the parent implementation
* so that the data returned by [[getData()]] can be populated into the index.
*/
public
function
load
()
{
$this
->
resetIndex
();
$this
->
data
=
[];
$mapping
=
$this
->
db
->
createCommand
()
->
getMapping
(
$this
->
index
,
$this
->
type
);
if
(
isset
(
$mapping
[
$this
->
index
][
'mappings'
][
$this
->
type
][
'_id'
][
'path'
]))
{
$idField
=
$mapping
[
$this
->
index
][
'mappings'
][
$this
->
type
][
'_id'
][
'path'
];
}
else
{
$idField
=
'_id'
;
}
foreach
(
$this
->
getData
()
as
$alias
=>
$row
)
{
$options
=
[];
$id
=
isset
(
$row
[
$idField
])
?
$row
[
$idField
]
:
null
;
$response
=
$this
->
db
->
createCommand
()
->
insert
(
$this
->
index
,
$this
->
type
,
$row
,
$id
,
$options
);
if
(
$id
===
null
)
{
$row
[
$idField
]
=
$response
[
'_id'
];
}
$this
->
data
[
$alias
]
=
$row
;
}
}
/**
* Returns the fixture data.
*
* The default implementation will try to return the fixture data by including the external file specified by [[dataFile]].
* The file should return an array of data rows (column name => column value), each corresponding to a row in the index.
*
* If the data file does not exist, an empty array will be returned.
*
* @return array the data rows to be inserted into the database index.
*/
protected
function
getData
()
{
if
(
$this
->
dataFile
===
null
)
{
$class
=
new
\ReflectionClass
(
$this
);
$dataFile
=
dirname
(
$class
->
getFileName
())
.
"/data/
{
$this
->
index
}
/
{
$this
->
type
}
.php"
;
return
is_file
(
$dataFile
)
?
require
(
$dataFile
)
:
[];
}
else
{
return
parent
::
getData
();
}
}
/**
* Removes all existing data from the specified index and type.
* This method is called before populating fixture data into the index associated with this fixture.
*/
protected
function
resetIndex
()
{
$this
->
db
->
createCommand
([
'index'
=>
$this
->
index
,
'type'
=>
$this
->
type
,
'queryParts'
=>
[
'query'
=>
[
'match_all'
=>
new
\stdClass
()]],
])
->
deleteByQuery
();
}
}
extensions/elasticsearch/CHANGELOG.md
View file @
fea4c8da
...
...
@@ -4,7 +4,7 @@ Yii Framework 2 elasticsearch extension Change Log
2.
0.2 under development
-----------------------
-
no changes in this release.
-
Enh: Added
`ActiveFixture`
class for testing fixture support for elasticsearch (cebe, viilveer)
2.0.1 December 07, 2014
...
...
extensions/elasticsearch/Connection.php
View file @
fea4c8da
...
...
@@ -137,6 +137,9 @@ class Connection extends Component
*/
public
function
close
()
{
if
(
$this
->
activeNode
===
null
)
{
return
;
}
Yii
::
trace
(
'Closing connection to elasticsearch. Active node was: '
.
$this
->
nodes
[
$this
->
activeNode
][
'http_address'
],
__CLASS__
);
$this
->
activeNode
=
null
;
...
...
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