diff --git a/framework/yii/elasticsearch/ActiveQuery.php b/extensions/elasticsearch/ActiveQuery.php similarity index 100% rename from framework/yii/elasticsearch/ActiveQuery.php rename to extensions/elasticsearch/ActiveQuery.php diff --git a/framework/yii/elasticsearch/ActiveRecord.php b/extensions/elasticsearch/ActiveRecord.php similarity index 99% rename from framework/yii/elasticsearch/ActiveRecord.php rename to extensions/elasticsearch/ActiveRecord.php index 6a036cb..33b01dd 100644 --- a/framework/yii/elasticsearch/ActiveRecord.php +++ b/extensions/elasticsearch/ActiveRecord.php @@ -24,6 +24,7 @@ use yii\helpers\StringHelper; * For defining a record a subclass should at least implement the [[attributes()]] method to define * attributes. * 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`: * diff --git a/framework/yii/elasticsearch/ActiveRelation.php b/extensions/elasticsearch/ActiveRelation.php similarity index 100% rename from framework/yii/elasticsearch/ActiveRelation.php rename to extensions/elasticsearch/ActiveRelation.php diff --git a/framework/yii/elasticsearch/Cluster.php b/extensions/elasticsearch/Cluster.php similarity index 100% rename from framework/yii/elasticsearch/Cluster.php rename to extensions/elasticsearch/Cluster.php diff --git a/framework/yii/elasticsearch/Command.php b/extensions/elasticsearch/Command.php similarity index 100% rename from framework/yii/elasticsearch/Command.php rename to extensions/elasticsearch/Command.php diff --git a/framework/yii/elasticsearch/Connection.php b/extensions/elasticsearch/Connection.php similarity index 100% rename from framework/yii/elasticsearch/Connection.php rename to extensions/elasticsearch/Connection.php diff --git a/extensions/elasticsearch/LICENSE.md b/extensions/elasticsearch/LICENSE.md new file mode 100644 index 0000000..e98f03d --- /dev/null +++ b/extensions/elasticsearch/LICENSE.md @@ -0,0 +1,32 @@ +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. diff --git a/framework/yii/elasticsearch/Node.php b/extensions/elasticsearch/Node.php similarity index 100% rename from framework/yii/elasticsearch/Node.php rename to extensions/elasticsearch/Node.php diff --git a/framework/yii/elasticsearch/Query.php b/extensions/elasticsearch/Query.php similarity index 100% rename from framework/yii/elasticsearch/Query.php rename to extensions/elasticsearch/Query.php diff --git a/framework/yii/elasticsearch/QueryBuilder.php b/extensions/elasticsearch/QueryBuilder.php similarity index 100% rename from framework/yii/elasticsearch/QueryBuilder.php rename to extensions/elasticsearch/QueryBuilder.php diff --git a/extensions/elasticsearch/README.md b/extensions/elasticsearch/README.md new file mode 100644 index 0000000..7988de1 --- /dev/null +++ b/extensions/elasticsearch/README.md @@ -0,0 +1,92 @@ +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 diff --git a/extensions/elasticsearch/composer.json b/extensions/elasticsearch/composer.json new file mode 100644 index 0000000..9f5ed3a --- /dev/null +++ b/extensions/elasticsearch/composer.json @@ -0,0 +1,27 @@ +{ + "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" +} diff --git a/extensions/redis/ActiveQuery.php b/extensions/redis/ActiveQuery.php index 2174901..755fc6f 100644 --- a/extensions/redis/ActiveQuery.php +++ b/extensions/redis/ActiveQuery.php @@ -226,7 +226,7 @@ class ActiveQuery extends \yii\base\Component implements ActiveQueryInterface { $record = $this->one($db); if ($record !== null) { - return $record->$attribute; + return $record->hasAttribute($attribute) ? $record->$attribute : null; } else { return null; } diff --git a/extensions/redis/README.md b/extensions/redis/README.md index 28cecf1..86450dc 100644 --- a/extensions/redis/README.md +++ b/extensions/redis/README.md @@ -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. -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. To use this extension, you have to configure the Connection class in your application configuration: diff --git a/tests/unit/data/ar/elasticsearch/Customer.php b/tests/unit/data/ar/elasticsearch/Customer.php index 6f7f79c..7d00dd3 100644 --- a/tests/unit/data/ar/elasticsearch/Customer.php +++ b/tests/unit/data/ar/elasticsearch/Customer.php @@ -1,7 +1,7 @@ open(); - } - -} \ No newline at end of file