Commit 5dca1257 by Carsten Brandt

reverted primaryKey of elasticsearch to be array again

meet the AR interface requirements.
parent a7b852fc
......@@ -92,7 +92,7 @@ class ActiveQuery extends Query implements ActiveQueryInterface
}
/** @var ActiveRecord $modelClass */
$modelClass = $this->modelClass;
$pk = $modelClass::primaryKey();
$pk = $modelClass::primaryKey()[0];
if ($this->asArray && $this->indexBy) {
foreach ($result['hits']['hits'] as &$row) {
if ($pk === '_id') {
......@@ -136,7 +136,7 @@ class ActiveQuery extends Query implements ActiveQueryInterface
/** @var ActiveRecord $modelClass */
$modelClass = $this->modelClass;
$model = $result['_source'];
$pk = $modelClass::primaryKey();
$pk = $modelClass::primaryKey()[0];
if ($pk === '_id') {
$model['_id'] = $result['_id'];
}
......@@ -165,7 +165,7 @@ class ActiveQuery extends Query implements ActiveQueryInterface
if ($this->asArray) {
/** @var ActiveRecord $modelClass */
$modelClass = $this->modelClass;
$pk = $modelClass::primaryKey();
$pk = $modelClass::primaryKey()[0];
foreach($models as $key => $model) {
if ($pk === '_id') {
$model['_source']['_id'] = $model['_id'];
......
......@@ -171,7 +171,7 @@ class ActiveRecord extends BaseActiveRecord
*/
public function setPrimaryKey($value)
{
$pk = static::primaryKey();
$pk = static::primaryKey()[0];
if ($this->getIsNewRecord() || $pk != '_id') {
$this->$pk = $value;
} else {
......@@ -184,7 +184,7 @@ class ActiveRecord extends BaseActiveRecord
*/
public function getPrimaryKey($asArray = false)
{
$pk = static::primaryKey();
$pk = static::primaryKey()[0];
if ($asArray) {
return [$pk => $this->$pk];
} else {
......@@ -197,7 +197,7 @@ class ActiveRecord extends BaseActiveRecord
*/
public function getOldPrimaryKey($asArray = false)
{
$pk = static::primaryKey();
$pk = static::primaryKey()[0];
if ($this->getIsNewRecord()) {
$id = null;
} elseif ($pk == '_id') {
......@@ -213,21 +213,37 @@ class ActiveRecord extends BaseActiveRecord
}
/**
* This method defines the primary.
* This method defines the attribute that uniquely identifies a record.
*
* The primaryKey for elasticsearch documents is always `primaryKey`. It can not be changed.
* The primaryKey for elasticsearch documents is the `_id` field by default. This field is not part of the
* ActiveRecord attributes so you should never add `_id` to the list of [[attributes()|attributes]].
*
* @return string the primary key of this record.
* You may overide this method to define the primary key name when you have defined
* [path mapping](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-id-field.html)
* for the `_id` field so that it is part of the `_source` and thus part of the [[attributes()|attributes]].
*
* Note that elasticsearch only supports _one_ attribute to be the primary key. However to match the signature
* of the [[\yii\db\ActiveRecordInterface|ActiveRecordInterface]] this methods returns an array instead of a
* single string.
*
* @return string[] array of primary key attributes. Only the first element of the array will be used.
*/
public static function primaryKey()
{
return '_id';
return ['_id'];
}
/**
* Returns the list of all attribute names of the model.
*
* This method must be overridden by child classes to define available attributes.
* @return array list of attribute names.
*
* Attributes are names of fields of the corresponding elasticsearch document.
* The primaryKey for elasticsearch documents is the `_id` field by default which is not part of the attributes.
* You may define [path mapping](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-id-field.html)
* for the `_id` field so that it is part of the `_source` fields and thus becomes part of the attributes.
*
* @return string[] list of attribute names.
*/
public function attributes()
{
......@@ -260,7 +276,7 @@ class ActiveRecord extends BaseActiveRecord
public static function create($row)
{
$record = parent::create($row['_source']);
$pk = static::primaryKey();
$pk = static::primaryKey()[0];
$record->$pk = $row['_id'];
$record->_score = isset($row['_score']) ? $row['_score'] : null;
$record->_version = isset($row['_version']) ? $row['_version'] : null; // TODO version should always be available...
......@@ -336,8 +352,11 @@ class ActiveRecord extends BaseActiveRecord
if (!isset($response['ok'])) {
return false;
}
$pk = static::primaryKey();
$values[$pk] = $this->$pk = $response['_id'];
$pk = static::primaryKey()[0];
$this->$pk = $response['_id'];
if ($pk != '_id') {
$values[$pk] = $response['_id'];
}
$this->_version = $response['_version'];
$this->_score = null;
$this->setOldAttributes($values);
......@@ -362,9 +381,9 @@ class ActiveRecord extends BaseActiveRecord
*/
public static function updateAll($attributes, $condition = [])
{
$pkName = static::primaryKey();
$pkName = static::primaryKey()[0];
if (count($condition) == 1 && isset($condition[$pkName])) {
$primaryKeys = (array) $condition[$pkName];
$primaryKeys = is_array($condition[$pkName]) ? $condition[$pkName] : [$condition[$pkName]];
} else {
$primaryKeys = static::find()->where($condition)->column($pkName); // TODO check whether this works with default pk _id
}
......@@ -372,7 +391,7 @@ class ActiveRecord extends BaseActiveRecord
return 0;
}
$bulk = '';
foreach((array) $primaryKeys as $pk) {
foreach($primaryKeys as $pk) {
$action = Json::encode([
"update" => [
"_id" => $pk,
......@@ -420,9 +439,9 @@ class ActiveRecord extends BaseActiveRecord
*/
public static function updateAllCounters($counters, $condition = [])
{
$pkName = static::primaryKey();
$pkName = static::primaryKey()[0];
if (count($condition) == 1 && isset($condition[$pkName])) {
$primaryKeys = (array) $condition[$pkName];
$primaryKeys = is_array($condition[$pkName]) ? $condition[$pkName] : [$condition[$pkName]];
} else {
$primaryKeys = static::find()->where($condition)->column($pkName); // TODO check whether this works with default pk _id
}
......@@ -430,7 +449,7 @@ class ActiveRecord extends BaseActiveRecord
return 0;
}
$bulk = '';
foreach((array) $primaryKeys as $pk) {
foreach($primaryKeys as $pk) {
$action = Json::encode([
"update" => [
"_id" => $pk,
......@@ -478,9 +497,9 @@ class ActiveRecord extends BaseActiveRecord
*/
public static function deleteAll($condition = [])
{
$pkName = static::primaryKey();
$pkName = static::primaryKey()[0];
if (count($condition) == 1 && isset($condition[$pkName])) {
$primaryKeys = (array) $condition[$pkName];
$primaryKeys = is_array($condition[$pkName]) ? $condition[$pkName] : [$condition[$pkName]];
} else {
$primaryKeys = static::find()->where($condition)->column($pkName); // TODO check whether this works with default pk _id
}
......@@ -488,7 +507,7 @@ class ActiveRecord extends BaseActiveRecord
return 0;
}
$bulk = '';
foreach((array) $primaryKeys as $pk) {
foreach($primaryKeys as $pk) {
$bulk .= Json::encode([
"delete" => [
"_id" => $pk,
......
......@@ -176,7 +176,7 @@ class Generator extends \yii\gii\Generator
/** @var \yii\db\ActiveRecord $class */
$class = $this->modelClass;
$pk = $class::primaryKey();
return is_array($pk) ? $pk[0] : $pk;
return $pk[0];
}
/**
......@@ -363,7 +363,7 @@ class Generator extends \yii\gii\Generator
{
/** @var ActiveRecord $class */
$class = $this->modelClass;
$pks = (array) $class::primaryKey();
$pks = $class::primaryKey();
if (count($pks) === 1) {
return "'id' => \$model->{$pks[0]}";
} else {
......@@ -379,7 +379,7 @@ class Generator extends \yii\gii\Generator
{
/** @var ActiveRecord $class */
$class = $this->modelClass;
$pks = (array) $class::primaryKey();
$pks = $class::primaryKey();
if (count($pks) === 1) {
return '$id';
} else {
......@@ -391,7 +391,7 @@ class Generator extends \yii\gii\Generator
{
/** @var ActiveRecord $class */
$class = $this->modelClass;
$pks = (array) $class::primaryKey();
$pks = $class::primaryKey();
if (($table = $this->getTableSchema()) === false) {
$params = [];
foreach ($pks as $pk) {
......
......@@ -19,7 +19,7 @@ if ($modelClass === $searchModelClass) {
/** @var ActiveRecordInterface $class */
$class = $generator->modelClass;
$pks = (array) $class::primaryKey();
$pks = $class::primaryKey();
$urlParams = $generator->generateUrlParams();
$actionParams = $generator->generateActionParams();
$actionParamComments = $generator->generateActionParamComments();
......
......@@ -128,7 +128,7 @@ class ActiveDataProvider extends BaseDataProvider
} elseif ($this->query instanceof ActiveQueryInterface) {
/** @var \yii\db\ActiveRecord $class */
$class = $this->query->modelClass;
$pks = (array) $class::primaryKey();
$pks = $class::primaryKey();
if (count($pks) === 1) {
$pk = $pks[0];
foreach ($models as $model) {
......
......@@ -1273,7 +1273,7 @@ abstract class BaseActiveRecord extends Model implements ActiveRecordInterface
*/
public static function isPrimaryKey($keys)
{
$pks = (array) static::primaryKey();
$pks = static::primaryKey();
if (count($keys) === count($pks)) {
return count(array_intersect($keys, $pks)) === count($pks);
} else {
......
......@@ -101,7 +101,7 @@ class UniqueValidator extends Validator
$n = count($objects);
if ($n === 1) {
$keys = array_keys($params);
$pks = (array) $targetClass::primaryKey();
$pks = $targetClass::primaryKey();
sort($keys);
sort($pks);
if ($keys === $pks) {
......
......@@ -22,7 +22,7 @@ class Customer extends ActiveRecord
public static function primaryKey()
{
return 'id';
return ['id'];
}
public function attributes()
......
......@@ -14,7 +14,7 @@ class Item extends ActiveRecord
{
public static function primaryKey()
{
return 'id';
return ['id'];
}
public function attributes()
......
......@@ -15,7 +15,7 @@ class Order extends ActiveRecord
{
public static function primaryKey()
{
return 'id';
return ['id'];
}
public function attributes()
......
......@@ -251,7 +251,7 @@ class ActiveRecordTest extends ElasticSearchTestCase
public function testInsertNoPk()
{
$this->assertEquals('id', Customer::primaryKey());
$this->assertEquals(['id'], Customer::primaryKey());
$pkName = 'id';
$customer = new Customer;
......
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