mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-09 01:27:20 +08:00
Methods "callSnippets()" and "callKeywords()" added to Sphinx Active Record
This commit is contained in:
@ -11,6 +11,7 @@ use yii\base\InvalidConfigException;
|
|||||||
use yii\base\InvalidParamException;
|
use yii\base\InvalidParamException;
|
||||||
use yii\base\Model;
|
use yii\base\Model;
|
||||||
use yii\base\ModelEvent;
|
use yii\base\ModelEvent;
|
||||||
|
use yii\base\NotSupportedException;
|
||||||
use yii\base\UnknownMethodException;
|
use yii\base\UnknownMethodException;
|
||||||
use yii\db\ActiveRelationInterface;
|
use yii\db\ActiveRelationInterface;
|
||||||
use yii\db\Expression;
|
use yii\db\Expression;
|
||||||
@ -92,6 +93,10 @@ class ActiveRecord extends Model
|
|||||||
* @var array related models indexed by the relation names
|
* @var array related models indexed by the relation names
|
||||||
*/
|
*/
|
||||||
private $_related = [];
|
private $_related = [];
|
||||||
|
/**
|
||||||
|
* @var string snippet value for this Active Record instance.
|
||||||
|
*/
|
||||||
|
private $_snippet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Sphinx connection used by this AR class.
|
* Returns the Sphinx connection used by this AR class.
|
||||||
@ -247,6 +252,90 @@ class ActiveRecord extends Model
|
|||||||
return static::getIndexSchema()->primaryKey;
|
return static::getIndexSchema()->primaryKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a snippet from provided data and query, using specified index settings.
|
||||||
|
* @param string|array $source is the source data to extract a snippet from.
|
||||||
|
* It could be either a single string or array of strings.
|
||||||
|
* @param string $query the full-text query to build snippets for.
|
||||||
|
* @param array $options list of options in format: optionName => optionValue
|
||||||
|
* @return string|array built snippet in case "source" is a string, list of built snippets
|
||||||
|
* in case "source" is an array.
|
||||||
|
*/
|
||||||
|
public static function callSnippets($source, $query, $options = [])
|
||||||
|
{
|
||||||
|
$command = static::getDb()->createCommand();
|
||||||
|
$command->callSnippets(static::indexName(), $source, $query, $options);
|
||||||
|
if (is_array($source)) {
|
||||||
|
return $command->queryColumn();
|
||||||
|
} else {
|
||||||
|
return $command->queryScalar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns tokenized and normalized forms of the keywords, and, optionally, keyword statistics.
|
||||||
|
* @param string $text the text to break down to keywords.
|
||||||
|
* @param boolean $fetchStatistic whether to return document and hit occurrence statistics
|
||||||
|
* @return array keywords and statistics
|
||||||
|
*/
|
||||||
|
public static function callKeywords($text, $fetchStatistic = false)
|
||||||
|
{
|
||||||
|
$command = static::getDb()->createCommand();
|
||||||
|
$command->callKeywords(static::indexName(), $text, $fetchStatistic);
|
||||||
|
return $command->queryAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $snippet
|
||||||
|
*/
|
||||||
|
public function setSnippet($snippet)
|
||||||
|
{
|
||||||
|
$this->_snippet = $snippet;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $query snippet source query
|
||||||
|
* @param array $options list of options in format: optionName => optionValue
|
||||||
|
* @return string snippet value
|
||||||
|
*/
|
||||||
|
public function getSnippet($query = null, $options = [])
|
||||||
|
{
|
||||||
|
if ($query !== null) {
|
||||||
|
$this->_snippet = $this->fetchSnippet($query, $options);
|
||||||
|
}
|
||||||
|
return $this->_snippet;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds up the snippet value from the given query.
|
||||||
|
* @param string $query the full-text query to build snippets for.
|
||||||
|
* @param array $options list of options in format: optionName => optionValue
|
||||||
|
* @return string snippet value.
|
||||||
|
*/
|
||||||
|
protected function fetchSnippet($query, $options = [])
|
||||||
|
{
|
||||||
|
return static::callSnippets($this->getSnippetSource(), $query, $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the string, which should be used as a source to create snippet for this
|
||||||
|
* Active Record instance.
|
||||||
|
* Child classes must implement this method to return the actual snippet source text.
|
||||||
|
* For example:
|
||||||
|
* ```php
|
||||||
|
* public function getSnippetSource()
|
||||||
|
* {
|
||||||
|
* return $this->snippetSourceRelation->content;
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
* @return string snippet source string.
|
||||||
|
* @throws \yii\base\NotSupportedException if this is not supported by the Active Record class
|
||||||
|
*/
|
||||||
|
public function getSnippetSource()
|
||||||
|
{
|
||||||
|
throw new NotSupportedException($this->className() . ' does not provide snippet source.');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the name of the column that stores the lock version for implementing optimistic locking.
|
* Returns the name of the column that stores the lock version for implementing optimistic locking.
|
||||||
*
|
*
|
||||||
@ -1137,7 +1226,7 @@ class ActiveRecord extends Model
|
|||||||
*/
|
*/
|
||||||
public function offsetSet($offset, $item)
|
public function offsetSet($offset, $item)
|
||||||
{
|
{
|
||||||
// Bypass relation owner restriction to 'yii\db\ActiveRecord' at [[ActiveRelationTrait::findWith()]]:
|
// Bypass relation owner restriction to 'yii\db\ActiveRecord' at [[yii\db\ActiveRelationTrait::findWith()]]:
|
||||||
try {
|
try {
|
||||||
$relation = $this->getRelation($offset);
|
$relation = $this->getRelation($offset);
|
||||||
if (is_object($relation)) {
|
if (is_object($relation)) {
|
||||||
|
|||||||
@ -202,4 +202,27 @@ class ActiveRecordTest extends SphinxTestCase
|
|||||||
$records = RuntimeIndex::find()->all();
|
$records = RuntimeIndex::find()->all();
|
||||||
$this->assertEquals(0, count($records));
|
$this->assertEquals(0, count($records));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testCallSnippets()
|
||||||
|
{
|
||||||
|
$query = 'pencil';
|
||||||
|
$source = 'Some data sentence about ' . $query;
|
||||||
|
|
||||||
|
$snippet = ArticleIndex::callSnippets($source, $query);
|
||||||
|
$this->assertNotEmpty($snippet, 'Unable to call snippets!');
|
||||||
|
$this->assertContains('<b>' . $query . '</b>', $snippet, 'Query not present in the snippet!');
|
||||||
|
|
||||||
|
$rows = ArticleIndex::callSnippets([$source], $query);
|
||||||
|
$this->assertNotEmpty($rows, 'Unable to call snippets!');
|
||||||
|
$this->assertContains('<b>' . $query . '</b>', $rows[0], 'Query not present in the snippet!');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCallKeywords()
|
||||||
|
{
|
||||||
|
$text = 'table pencil';
|
||||||
|
$rows = ArticleIndex::callKeywords($text);
|
||||||
|
$this->assertNotEmpty($rows, 'Unable to call keywords!');
|
||||||
|
$this->assertArrayHasKey('tokenized', $rows[0], 'No tokenized keyword!');
|
||||||
|
$this->assertArrayHasKey('normalized', $rows[0], 'No normalized keyword!');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user