Commit b081cf5e by Carsten Brandt

moved elasticsearch to extensions

parent f6811002
...@@ -24,6 +24,7 @@ use yii\helpers\StringHelper; ...@@ -24,6 +24,7 @@ use yii\helpers\StringHelper;
* For defining a record a subclass should at least implement the [[attributes()]] method to define * For defining a record a subclass should at least implement the [[attributes()]] method to define
* attributes. * attributes.
* The primary key (the `_id` field in elasticsearch terms) is represented by `getId()` and `setId()`. * The primary key (the `_id` field in elasticsearch terms) is represented by `getId()` and `setId()`.
* The primary key is not part of the attributes.
* *
* The following is an example model called `Customer`: * The following is an example model called `Customer`:
* *
......
The Yii framework is free software. It is released under the terms of
the following BSD License.
Copyright © 2008 by Yii Software LLC (http://www.yiisoft.com)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
* Neither the name of Yii Software LLC nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
Elasticsearch Query and ActiveRecord for Yii 2
==============================================
This extension provides the [elasticsearch](http://www.elasticsearch.org/) integration for the Yii2 framework.
It includes basic querying/search support and also implements the `ActiveRecord` pattern that allows you to store active
records in elasticsearch.
To use this extension, you have to configure the Connection class in your application configuration:
```php
return [
//....
'components' => [
'elasticsearch' => [
'class' => 'yii\elasticsearch\Connection',
'hosts' => [
['hostname' => 'localhost', 'port' => 9200],
// configure more hosts if you have a cluster
],
],
]
];
```
Installation
------------
The preferred way to install this extension is through [composer](http://getcomposer.org/download/).
Either run
```
php composer.phar require yiisoft/yii2-elasticsearch "*"
```
or add
```json
"yiisoft/yii2-elasticsearch": "*"
```
to the require section of your composer.json.
Using the Query
---------------
TBD
Using the ActiveRecord
----------------------
For general information on how to use yii's ActiveRecord please refer to the [guide](https://github.com/yiisoft/yii2/blob/master/docs/guide/active-record.md).
For defining an elasticsearch ActiveRecord class your record class needs to extend from `yii\elasticsearch\ActiveRecord` and
implement at least the `attributes()` method to define the attributes of the record.
The primary key (the `_id` field in elasticsearch terms) is represented by `getId()` and `setId()` and can not be changed.
The primary key is not part of the attributes.
primary key can be defined via [[primaryKey()]] which defaults to `id` if not specified.
The primaryKey needs to be part of the attributes so make sure you have an `id` attribute defined if you do
not specify your own primary key.
The following is an example model called `Customer`:
```php
class Customer extends \yii\elasticsearch\ActiveRecord
{
public function attributes()
{
return ['id', 'name', 'address', 'registration_date'];
}
}
```
You may override [[index()]] and [[type()]] to define the index and type this record represents.
The general usage of elasticsearch ActiveRecord is very similar to the database ActiveRecord as described in the
[guide](https://github.com/yiisoft/yii2/blob/master/docs/guide/active-record.md).
It supports the same interface and features except the following limitations and additions(*!*):
- As elasticsearch does not support SQL, the query API does not support `join()`, `groupBy()`, `having()` and `union()`.
Sorting, limit, offset and conditional where are all supported.
- `from()` does not select the tables, but the [index](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/glossary.html#glossary-index)
and [type](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/glossary.html#glossary-type) to query against.
- `select()` has been replaced with `fields()` which basically does the same but `fields` is more elasticsearch terminology.
It defines the fields to retrieve from a document.
- `via`-relations can not be defined via a table as there are not tables in elasticsearch. You can only define relations via other records.
- As elasticsearch is a data storage and search engine there is of course support added for search your records.
TBD ...
- It is also possible to define relations from elasticsearch ActiveRecords to normal ActiveRecord classes and vice versa.
\ No newline at end of file
{
"name": "yiisoft/yii2-elasticsearch",
"description": "Elasticsearch integration and ActiveRecord for the Yii framework",
"keywords": ["yii", "elasticsearch", "active-record", "search", "fulltext"],
"type": "yii2-extension",
"license": "BSD-3-Clause",
"support": {
"issues": "https://github.com/yiisoft/yii2/issues?labels=ext%3Aelasticsearch",
"forum": "http://www.yiiframework.com/forum/",
"wiki": "http://www.yiiframework.com/wiki/",
"irc": "irc://irc.freenode.net/yii",
"source": "https://github.com/yiisoft/yii2"
},
"authors": [
{
"name": "Carsten Brandt",
"email": "mail@cebe.cc"
}
],
"require": {
"yiisoft/yii2": "*"
},
"autoload": {
"psr-0": { "yii\\elasticsearch\\": "" }
},
"target-dir": "yii/elasticsearch"
}
...@@ -226,7 +226,7 @@ class ActiveQuery extends \yii\base\Component implements ActiveQueryInterface ...@@ -226,7 +226,7 @@ class ActiveQuery extends \yii\base\Component implements ActiveQueryInterface
{ {
$record = $this->one($db); $record = $this->one($db);
if ($record !== null) { if ($record !== null) {
return $record->$attribute; return $record->hasAttribute($attribute) ? $record->$attribute : null;
} else { } else {
return null; return null;
} }
......
...@@ -2,7 +2,7 @@ Redis Cache and ActiveRecord for Yii 2 ...@@ -2,7 +2,7 @@ Redis Cache and ActiveRecord for Yii 2
====================================== ======================================
This extension provides the [redis](http://redis.io/) key-value store support for the Yii2 framework. This extension provides the [redis](http://redis.io/) key-value store support for the Yii2 framework.
It includes a `Cache` class and implents the `ActiveRecord` pattern that allows you to store active It includes a `Cache` class and implements the `ActiveRecord` pattern that allows you to store active
records in redis. records in redis.
To use this extension, you have to configure the Connection class in your application configuration: To use this extension, you have to configure the Connection class in your application configuration:
......
<?php <?php
namespace yiiunit\data\ar\elasticsearch; namespace yiiunit\data\ar\elasticsearch;
use yiiunit\framework\elasticsearch\ActiveRecordTest; use yiiunit\extensions\elasticsearch\ActiveRecordTest;
/** /**
* Class Customer * Class Customer
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
namespace yiiunit\data\ar\redis; namespace yiiunit\data\ar\redis;
use yiiunit\framework\redis\ActiveRecordTest; use yiiunit\extensions\redis\ActiveRecordTest;
class Customer extends ActiveRecord class Customer extends ActiveRecord
{ {
......
<?php <?php
namespace yiiunit\framework\elasticsearch; namespace yiiunit\extensions\elasticsearch;
use yii\elasticsearch\Connection; use yii\elasticsearch\Connection;
use yii\elasticsearch\ActiveQuery;
use yii\helpers\Json; use yii\helpers\Json;
use yiiunit\framework\ar\ActiveRecordTestTrait; use yiiunit\framework\ar\ActiveRecordTestTrait;
use yiiunit\data\ar\elasticsearch\ActiveRecord; use yiiunit\data\ar\elasticsearch\ActiveRecord;
......
<?php <?php
namespace yiiunit\framework\elasticsearch; namespace yiiunit\extensions\elasticsearch;
use yii\redis\Connection; use yii\redis\Connection;
...@@ -9,14 +9,6 @@ use yii\redis\Connection; ...@@ -9,14 +9,6 @@ use yii\redis\Connection;
*/ */
class ElasticSearchConnectionTest extends ElasticSearchTestCase class ElasticSearchConnectionTest extends ElasticSearchTestCase
{ {
/** // TODO
* Empty DSN should throw exception
* @expectedException \yii\base\InvalidConfigException
*/
public function testEmptyDSN()
{
$db = new Connection();
$db->open();
}
} }
\ No newline at end of file
<?php <?php
namespace yiiunit\framework\elasticsearch; namespace yiiunit\extensions\elasticsearch;
use Yii;
use yii\elasticsearch\Connection; use yii\elasticsearch\Connection;
use yiiunit\TestCase; use yiiunit\TestCase;
Yii::setAlias('@yii/elasticsearch', __DIR__ . '/../../../../extensions/elasticsearch');
/** /**
* ElasticSearchTestCase is the base class for all elasticsearch related test cases * ElasticSearchTestCase is the base class for all elasticsearch related test cases
*/ */
......
<?php <?php
namespace yiiunit\framework\elasticsearch; namespace yiiunit\extensions\elasticsearch;
use yii\elasticsearch\Query; use yii\elasticsearch\Query;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment