View source
<?php
namespace Drupal\Tests\search_api_solr\Kernel;
use Drupal\search_api\Entity\Index;
use Drupal\search_api\Entity\Server;
use Drupal\search_api\Query\QueryInterface;
use Drupal\search_api\Query\ResultSetInterface;
use Drupal\search_api\Utility\Utility;
use Drupal\search_api_autocomplete\Entity\Search;
use Drupal\search_api_solr\SolrBackendInterface;
use Drupal\Tests\search_api\Kernel\BackendTestBase;
use Drupal\Tests\search_api_solr\Traits\InvokeMethodTrait;
use Drupal\user\Entity\User;
class SearchApiSolrTest extends BackendTestBase {
use InvokeMethodTrait;
public static $modules = array(
'search_api_autocomplete',
'search_api_solr',
'search_api_solr_test',
'user',
);
protected $serverId = 'solr_search_server';
protected $indexId = 'solr_search_index';
protected $solrAvailable = FALSE;
protected $waitForCommit = 2;
protected $fieldsHelper;
public function setUp() {
parent::setUp();
$this
->installEntitySchema('user');
$this
->installConfig([
'search_api_solr',
'search_api_solr_test',
]);
$this
->detectSolrAvailability();
$this->fieldsHelper = \Drupal::getContainer()
->get('search_api.fields_helper');
}
protected function detectSolrAvailability() {
\Drupal::service('router.builder')
->rebuild();
try {
$backend = Server::load($this->serverId)
->getBackend();
if ($backend
->isAvailable()) {
$this->solrAvailable = TRUE;
}
} catch (\Exception $e) {
}
}
protected function executeQueryWithoutPostProcessing(QueryInterface $query) {
$index = Index::load($this->indexId);
$query
->preExecute();
return $index
->getServerInstance()
->search($query);
}
public function tearDown() {
$this
->clearIndex();
parent::tearDown();
}
public function testBackend() {
if ($this->solrAvailable) {
parent::testBackend();
}
else {
$this
->assertTrue(TRUE, 'Error: The Solr instance could not be found. Please enable a multi-core one on http://localhost:8983/solr/drupal');
}
}
protected function backendSpecificRegressionTests() {
$this
->regressionTest2888629();
$this
->regressionTest2850160();
}
protected function indexItems($index_id) {
$index_status = parent::indexItems($index_id);
sleep($this->waitForCommit);
return $index_status;
}
protected function clearIndex() {
if ($this->solrAvailable) {
$index = Index::load($this->indexId);
$index
->clear();
sleep(2);
}
}
protected function checkServerBackend() {
}
protected function updateIndex() {
}
protected function checkSecondServer() {
}
protected function checkIndexWithoutFields() {
$index = parent::checkIndexWithoutFields();
$index
->clear();
sleep(2);
}
protected function regressionTest2469547() {
$query = $this
->buildSearch();
$facets = array();
$facets['body'] = array(
'field' => 'body',
'limit' => 0,
'min_count' => 1,
'missing' => FALSE,
);
$query
->setOption('search_api_facets', $facets);
$query
->addCondition('id', 5, '<>');
$query
->range(0, 0);
$results = $query
->execute();
$expected = $this
->getExpectedFacetsOfRegressionTest2469547();
$facets = $results
->getExtraData('search_api_facets', array())['body'];
usort($facets, array(
$this,
'facetCompare',
));
$this
->assertEquals($expected, $facets, 'Correct facets were returned for a fulltext field.');
}
protected function regressionTest2888629() {
$query = $this
->buildSearch();
$query
->addCondition('category', NULL);
$results = $query
->execute();
$this
->assertResults([
3,
], $results, 'comparing against NULL');
$query = $this
->buildSearch();
$conditions = $query
->createConditionGroup('OR');
$conditions
->addCondition('category', 'article_category', '<>');
$conditions
->addCondition('category', NULL);
$query
->addConditionGroup($conditions);
$results = $query
->execute();
$this
->assertResults([
1,
2,
3,
], $results, 'group comparing against category NOT article_category OR category NULL');
$query = $this
->buildSearch();
$conditions = $query
->createConditionGroup('AND');
$conditions
->addCondition('body', NULL, '<>');
$conditions
->addCondition('category', 'article_category', '<>');
$conditions
->addCondition('category', NULL, '<>');
$query
->addConditionGroup($conditions);
$results = $query
->execute();
$this
->assertResults([
1,
2,
], $results, 'group comparing against body NOT NULL AND category NOT article_category AND category NOT NULL');
}
public function regressionTest2850160() {
if ($this->solrAvailable) {
$backend = Server::load($this->serverId)
->getBackend();
$index = $this
->getIndex();
$entity = \Drupal::entityTypeManager()
->getStorage('entity_test_mulrev_changed')
->load(1);
$id = Utility::createCombinedId('entity:entity_test_mulrev_changed', $entity
->id());
$item = \Drupal::getContainer()
->get('search_api.fields_helper')
->createItemFromObject($index, $entity
->getTypedData(), $id);
$item
->setBoost('3.0');
$document = $this
->invokeMethod($backend, 'getDocument', [
$index,
$item,
]);
$this
->assertEquals($item
->getBoost(), $document
->getBoost());
}
}
protected function getExpectedFacetsOfRegressionTest2469547() {
return [
[
'count' => 4,
'filter' => '"test"',
],
[
'count' => 3,
'filter' => '"case"',
],
[
'count' => 1,
'filter' => '"bar"',
],
[
'count' => 1,
'filter' => '"foobar"',
],
];
}
protected function checkModuleUninstall() {
$server = Server::load($this->serverId);
$index = Index::load($this->indexId);
$server
->deleteAllIndexItems($index);
sleep(2);
$query = $this
->buildSearch();
$results = $query
->execute();
$this
->assertEquals(0, $results
->getResultCount(), 'Clearing the server worked correctly.');
}
protected function assertIgnored(ResultSetInterface $results, array $ignored = array(), $message = 'No keys were ignored.') {
}
protected function checkBackendSpecificFeatures() {
$this
->indexItems($this->indexId);
$this
->checkSearchResultGrouping();
$this
->clearIndex();
}
protected function getFieldsAndMapping(SolrBackendInterface $backend) {
$index = Index::load($this->indexId);
$fields = $index
->getFields();
$fields += $this
->invokeMethod($backend, 'getSpecialFields', [
$index,
]);
$field_info = array(
'type' => 'string',
'original type' => 'string',
);
$fields['x'] = $this->fieldsHelper
->createField($index, 'x', $field_info);
$fields['y'] = $this->fieldsHelper
->createField($index, 'y', $field_info);
$fields['z'] = $this->fieldsHelper
->createField($index, 'z', $field_info);
$mapping = $backend
->getSolrFieldNames($index) + [
'x' => 'solr_x',
'y' => 'solr_y',
'z' => 'solr_z',
];
return [
$fields,
$mapping,
];
}
public function testQueryConditions() {
$backend = Server::load($this->serverId)
->getBackend();
list($fields, $mapping) = $this
->getFieldsAndMapping($backend);
$options = [];
$query = $this
->buildSearch();
$query
->addCondition('x', 5, '=');
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('solr_x:"5"', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$query
->addCondition('x', 5, '<>');
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(*:* -solr_x:"5")', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$query
->addCondition('x', 3, '<>');
$query
->addCondition('x', 5, '<>');
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(*:* -solr_x:"3")', $fq[0]['query']);
$this
->assertEquals('(*:* -solr_x:"5")', $fq[1]['query']);
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$condition_group
->addCondition('x', 3, '<>');
$condition_group
->addCondition('x', 5, '<>');
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+(*:* -solr_x:"3") +(*:* -solr_x:"5"))', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$condition_group
->addCondition('x', 5, '<>');
$condition_group
->addCondition('y', 3);
$condition_group
->addCondition('z', 7);
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+(*:* -solr_x:"5") +solr_y:"3" +solr_z:"7")', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$inner_condition_group = $query
->createConditionGroup('OR');
$condition_group
->addCondition('x', 5, '<>');
$inner_condition_group
->addCondition('y', 3);
$inner_condition_group
->addCondition('z', 7);
$condition_group
->addConditionGroup($inner_condition_group);
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+(*:* -solr_x:"5") +(solr_y:"3" solr_z:"7"))', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$inner_condition_group = $query
->createConditionGroup('OR');
$condition_group
->addCondition('x', 5, '<>');
$inner_condition_group
->addCondition('y', 3);
$inner_condition_group
->addCondition('z', NULL);
$condition_group
->addConditionGroup($inner_condition_group);
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+(*:* -solr_x:"5") +(solr_y:"3" (*:* -solr_z:[* TO *])))', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$inner_condition_group_or = $query
->createConditionGroup('OR');
$inner_condition_group_or
->addCondition('x', 3);
$inner_condition_group_or
->addCondition('y', 7, '<>');
$inner_condition_group_and = $query
->createConditionGroup();
$inner_condition_group_and
->addCondition('x', 1);
$inner_condition_group_and
->addCondition('y', 2, '<>');
$inner_condition_group_and
->addCondition('z', 5, '<');
$condition_group
->addConditionGroup($inner_condition_group_or);
$condition_group
->addConditionGroup($inner_condition_group_and);
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+(solr_x:"3" (*:* -solr_y:"7")) +(+solr_x:"1" +(*:* -solr_y:"2") +solr_z:{* TO "5"}))', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$condition_group
->addCondition('x', 5);
$condition_group
->addCondition('y', [
1,
2,
3,
], 'NOT IN');
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+solr_x:"5" +(*:* -solr_y:"1" -solr_y:"2" -solr_y:"3"))', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$condition_group = $query
->createConditionGroup();
$condition_group
->addCondition('x', 5);
$inner_condition_group = $query
->createConditionGroup();
$inner_condition_group
->addCondition('y', [
1,
2,
3,
], 'NOT IN');
$condition_group
->addConditionGroup($inner_condition_group);
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+solr_x:"5" +(*:* -solr_y:"1" -solr_y:"2" -solr_y:"3"))', $fq[0]['query']);
$this
->assertFalse(isset($fq[1]));
$query = $this
->buildSearch();
$conditions = $query
->createConditionGroup('OR', array(
'facet:' . 'tagtosearchfor',
));
$conditions
->addCondition('category', 'article_category');
$query
->addConditionGroup($conditions);
$conditions = $query
->createConditionGroup('AND');
$conditions
->addCondition('category', NULL, '<>');
$query
->addConditionGroup($conditions);
$facets['category'] = array(
'field' => 'category',
'limit' => 0,
'min_count' => 1,
'missing' => TRUE,
'operator' => 'or',
);
$query
->setOption('search_api_facets', $facets);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('ss_category:"article_category"', $fq[0]['query'], 'Condition found in tagged first filter query');
$this
->assertEquals([
'facet:tagtosearchfor' => 'facet:tagtosearchfor',
], $fq[0]['tags'], 'Tag found in tagged first filter query');
$this
->assertEquals('ss_category:[* TO *]', $fq[1]['query'], 'Condition found in unrelated second filter query');
$this
->assertEquals([], $fq[1]['tags'], 'No tag found in second filter query');
$query = $this
->buildSearch();
$conditions = $query
->createConditionGroup('OR', array(
'facet:x',
));
$conditions
->addCondition('x', 'A');
$conditions
->addCondition('x', 'B');
$query
->addConditionGroup($conditions);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals(1, count($fq));
$this
->assertEquals([
'facet:x' => 'facet:x',
], $fq[0]['tags']);
$this
->assertEquals('(solr_x:"A" solr_x:"B")', $fq[0]['query']);
$query = $this
->buildSearch();
$conditions = $query
->createConditionGroup('AND', array(
'facet:x',
));
$conditions
->addCondition('x', 'A');
$conditions
->addCondition('x', 'B');
$query
->addConditionGroup($conditions);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals(1, count($fq));
$this
->assertEquals([
'facet:x' => 'facet:x',
], $fq[0]['tags']);
$this
->assertEquals('(+solr_x:"A" +solr_x:"B")', $fq[0]['query']);
}
public function testQueryConditionsAndLanguageFilter() {
$backend = Server::load($this->serverId)
->getBackend();
list($fields, $mapping) = $this
->getFieldsAndMapping($backend);
$options = [];
$query = $this
->buildSearch();
$query
->setLanguages([
'en',
]);
$query
->addCondition('x', 5, '=');
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('solr_x:"5"', $fq[0]['query']);
$this
->assertEquals('ss_search_api_language:"en"', $fq[1]['query']);
$query = $this
->buildSearch();
$query
->setLanguages([
'en',
'de',
]);
$condition_group = $query
->createConditionGroup();
$condition_group
->addCondition('x', 5);
$inner_condition_group = $query
->createConditionGroup();
$inner_condition_group
->addCondition('y', [
1,
2,
3,
], 'NOT IN');
$condition_group
->addConditionGroup($inner_condition_group);
$query
->addConditionGroup($condition_group);
$fq = $this
->invokeMethod($backend, 'getFilterQueries', [
$query,
$mapping,
$fields,
&$options,
]);
$this
->assertEquals('(+solr_x:"5" +(*:* -solr_y:"1" -solr_y:"2" -solr_y:"3"))', $fq[0]['query']);
$this
->assertEquals('(ss_search_api_language:"en" ss_search_api_language:"de")', $fq[1]['query']);
}
public function testHighlightAndExcerpt() {
if ($this->solrAvailable) {
$config = $this
->getIndex()
->getServerInstance()
->getBackendConfig();
$this
->insertExampleContent();
$this
->indexItems($this->indexId);
$config['retrieve_data'] = TRUE;
$config['highlight_data'] = TRUE;
$config['excerpt'] = FALSE;
$query = $this
->buildSearch('foobar');
$query
->getIndex()
->getServerInstance()
->setBackendConfig($config);
$results = $query
->execute();
$this
->assertEquals(1, $results
->getResultCount(), 'Search for »foobar« returned correct number of results.');
foreach ($results as $result) {
$this
->assertStringContainsString('<strong>foobar</strong>', (string) $result
->getField('body')
->getValues()[0]);
$this
->assertNull($result
->getExcerpt());
}
$config['highlight_data'] = FALSE;
$config['excerpt'] = TRUE;
$query = $this
->buildSearch('foobar');
$query
->getIndex()
->getServerInstance()
->setBackendConfig($config);
$results = $query
->execute();
$this
->assertEquals(1, $results
->getResultCount(), 'Search for »foobar« returned correct number of results.');
foreach ($results as $result) {
$this
->assertStringNotContainsString('<strong>foobar</strong>', (string) $result
->getField('body')
->getValues()[0]);
$this
->assertStringContainsString('<strong>foobar</strong>', $result
->getExcerpt());
}
$config['highlight_data'] = TRUE;
$config['excerpt'] = TRUE;
$query = $this
->buildSearch('foobar');
$query
->getIndex()
->getServerInstance()
->setBackendConfig($config);
$results = $query
->execute();
$this
->assertEquals(1, $results
->getResultCount(), 'Search for »foobar« returned correct number of results.');
foreach ($results as $result) {
$this
->assertStringContainsString('<strong>foobar</strong>', (string) $result
->getField('body')
->getValues()[0]);
$this
->assertStringContainsString('<strong>foobar</strong>', $result
->getExcerpt());
}
}
else {
$this
->assertTrue(TRUE, 'Error: The Solr instance could not be found. Please enable a multi-core one on http://localhost:8983/solr/drupal');
}
}
public function testBasicAuth() {
$server = $this
->getServer();
$config = $server
->getBackendConfig();
$config['connector_config']['username'] = 'foo';
$config['connector_config']['password'] = 'bar';
$server
->setBackendConfig($config);
$backend = $server
->getBackend();
$auth = $backend
->getSolrConnector()
->getEndpoint()
->getAuthentication();
$this
->assertEquals([
'username' => 'foo',
'password' => 'bar',
], $auth);
}
public function testDatasourceAdditionAndDeletion() {
if ($this->solrAvailable) {
$this
->insertExampleContent();
$this
->indexItems($this->indexId);
$results = $this
->buildSearch()
->execute();
$this
->assertEquals(5, $results
->getResultCount(), 'Number of indexed entities is correct.');
try {
$results = $this
->buildSearch()
->addCondition('uid', 0, '>')
->execute();
$this
->fail('Field uid must not yet exists in this index.');
} catch (\Exception $e) {
$this
->assertEquals('Filter term on unknown or unindexed field uid.', $e
->getMessage());
}
$index = $this
->getIndex();
$index
->set('datasource_settings', $index
->get('datasource_settings') + [
'entity:user' => [],
]);
$info = [
'label' => 'uid',
'type' => 'integer',
'datasource_id' => 'entity:user',
'property_path' => 'uid',
];
$index
->addField($this->fieldsHelper
->createField($index, 'uid', $info));
$index
->save();
User::create([
'uid' => 1,
'name' => 'root',
'langcode' => 'en',
])
->save();
$this
->indexItems($this->indexId);
$results = $this
->buildSearch()
->execute();
$this
->assertEquals(6, $results
->getResultCount(), 'Number of indexed entities in multi datasource index is correct.');
$results = $this
->buildSearch()
->addCondition('uid', 0, '>')
->execute();
$this
->assertEquals(1, $results
->getResultCount(), 'Search for users returned correct number of results.');
$this
->getIndex()
->removeDatasource('entity:user')
->save();
sleep(2);
$results = $this
->buildSearch()
->execute();
$this
->assertEquals(5, $results
->getResultCount(), 'Number of indexed entities is correct.');
try {
$results = $this
->buildSearch()
->addCondition('uid', 0, '>')
->execute();
$this
->fail('Field uid must not yet exists in this index.');
} catch (\Exception $e) {
$this
->assertEquals('Filter term on unknown or unindexed field uid.', $e
->getMessage());
}
}
else {
$this
->assertTrue(TRUE, 'Error: The Solr instance could not be found. Please enable a multi-core one on http://localhost:8983/solr/drupal');
}
}
protected function getLongText($length) {
$sequence = 'abcdefghijklmnopqrstuwxyz1234567890,./;\'[]\\<>?:"{}|~!@#$%^&*()_+`1234567890-=ööążźćęółńABCDEFGHIJKLMNOPQRSTUWXYZ';
$result = '';
$i = 0;
$sequenceLength = strlen($sequence);
while ($i++ != $length) {
$result .= $sequence[$i % $sequenceLength];
}
return $result;
}
public function checkSearchResultGrouping() {
if (in_array('search_api_grouping', $this
->getIndex()
->getServerInstance()
->getBackend()
->getSupportedFeatures())) {
$query = $this
->buildSearch(NULL, [], [], FALSE);
$query
->setOption('search_api_grouping', [
'use_grouping' => TRUE,
'fields' => [
'type',
],
]);
$results = $query
->execute();
$this
->assertEquals(2, $results
->getResultCount(), 'Get the results count grouping by type.');
$data = $results
->getExtraData('search_api_solr_response');
$this
->assertEquals(5, $data['grouped']['ss_type']['matches'], 'Get the total documents after grouping.');
$this
->assertEquals(2, $data['grouped']['ss_type']['ngroups'], 'Get the number of groups after grouping.');
$this
->assertResults([
1,
4,
], $results, 'Grouping by type');
}
else {
$this
->markTestSkipped("The selected backend/connector doesn't support the *search_api_grouping* feature.");
}
}
public function testSearchResultSorts() {
if ($this->solrAvailable) {
$this
->insertExampleContent();
$this
->addTestEntity(6, [
'name' => 'Long text',
'body' => $this
->getLongText(32767),
'type' => 'article',
]);
$this
->addTestEntity(7, [
'name' => 'Z long',
'body' => $this
->getLongText(32766),
'type' => 'article',
]);
$this
->indexItems($this->indexId);
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('name')
->sort('search_api_id')
->execute();
$this
->assertResults([
3,
5,
1,
4,
2,
6,
7,
], $results, 'Sort by name.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('name', QueryInterface::SORT_DESC)
->sort('search_api_id')
->execute();
$this
->assertResults([
7,
6,
2,
4,
1,
5,
3,
], $results, 'Sort by name descending.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('type')
->sort('search_api_id')
->execute();
$this
->assertResults([
4,
5,
6,
7,
1,
2,
3,
], $results, 'Sort by type.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('type', QueryInterface::SORT_DESC)
->sort('search_api_id')
->execute();
$this
->assertResults([
1,
2,
3,
4,
5,
6,
7,
], $results, 'Sort by type descending.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('keywords')
->sort('search_api_id')
->execute();
$this
->assertResults([
3,
6,
7,
4,
1,
2,
5,
], $results, 'Sort by keywords.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('keywords', QueryInterface::SORT_DESC)
->sort('search_api_id')
->execute();
$this
->assertResults([
1,
2,
5,
4,
3,
6,
7,
], $results, 'Sort by keywords descending.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('width')
->sort('search_api_id')
->execute();
$this
->assertResults([
1,
2,
3,
6,
7,
4,
5,
], $results, 'Sort by width.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('width', QueryInterface::SORT_DESC)
->sort('search_api_id')
->execute();
$this
->assertResults([
5,
4,
1,
2,
3,
6,
7,
], $results, 'Sort by width descending.');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('changed')
->execute();
$this
->assertResults([
1,
2,
3,
4,
5,
6,
7,
], $results, 'Sort by last update date');
$results = $this
->buildSearch(NULL, [], [], FALSE)
->sort('changed', QueryInterface::SORT_DESC)
->execute();
$this
->assertResults([
7,
6,
5,
4,
3,
2,
1,
], $results, 'Sort by last update date descending');
}
else {
$this
->assertTrue(TRUE, 'Error: The Solr instance could not be found. Please enable a multi-core one on http://localhost:8983/solr/drupal');
}
}
public function testAutocomplete() {
if ($this->solrAvailable) {
$this
->addTestEntity(1, [
'name' => 'Test Article 1',
'body' => 'The test article number 1 about cats, dogs and trees.',
'type' => 'article',
]);
$this
->addTestEntity(2, [
'name' => 'Test Article 1',
'body' => 'The test article number 2 about a tree.',
'type' => 'article',
]);
$this
->indexItems($this->indexId);
$backend = Server::load($this->serverId)
->getBackend();
$autocompleteSearch = new Search([], 'search_api_autocomplete_search');
$query = $this
->buildSearch([
'artic',
], [], [
'body',
], FALSE);
$suggestions = $backend
->getAutocompleteSuggestions($query, $autocompleteSearch, 'artic', 'artic');
$this
->assertEquals(1, count($suggestions));
$this
->assertEquals('le', $suggestions[0]
->getSuggestionSuffix());
$this
->assertEquals(2, $suggestions[0]
->getResultsCount());
$query = $this
->buildSearch([
'articel',
], [], [
'body',
], FALSE);
$suggestions = $backend
->getAutocompleteSuggestions($query, $autocompleteSearch, 'articel', 'articel');
$this
->assertEquals(1, count($suggestions));
$this
->assertEquals('article', $suggestions[0]
->getSuggestedKeys());
$this
->assertEquals(0, $suggestions[0]
->getResultsCount());
$query = $this
->buildSearch([
'articel doks',
], [], [
'body',
], FALSE);
$suggestions = $backend
->getAutocompleteSuggestions($query, $autocompleteSearch, 'doks', 'articel doks');
$this
->assertEquals(1, count($suggestions));
$this
->assertEquals('article dogs', $suggestions[0]
->getSuggestedKeys());
}
else {
$this
->assertTrue(TRUE, 'Error: The Solr instance could not be found. Please enable a multi-core one on http://localhost:8983/solr/drupal');
}
}
public function testExtract() {
$filepath = drupal_get_path('module', 'search_api_solr_test') . '/assets/test_extraction.pdf';
$backend = Server::load($this->serverId)
->getBackend();
$content = $backend
->extractContentFromFile($filepath);
$this
->assertStringContainsString('The extraction seems working!', $content);
}
public function testNgramResult() {
if ($this->solrAvailable) {
$this
->addTestEntity(1, [
'name' => 'Test Article 1',
'body' => 'The test article number 1 about cats, dogs and trees.',
'type' => 'article',
'category' => 'dogs and trees',
]);
$this
->addTestEntity(2, [
'name' => 'Test Article 1',
'body' => 'The test article number 2 about a tree.',
'type' => 'article',
'category' => 'trees',
]);
$this
->indexItems($this->indexId);
$results = $this
->buildSearch([
'tre',
], [], [
'category_ngram',
])
->execute();
$this
->assertResults([
1,
2,
], $results, 'Ngram text "tre".');
$results = $this
->buildSearch([], [], [])
->addCondition('category_ngram_string', 'tre')
->execute();
$this
->assertResults([
2,
], $results, 'Ngram string "tre".');
$results = $this
->buildSearch([
'Dog',
], [], [
'category_ngram',
])
->execute();
$this
->assertResults([
1,
], $results, 'Ngram text "Dog".');
$results = $this
->buildSearch([], [], [])
->addCondition('category_ngram_string', 'Dog')
->execute();
$this
->assertResults([
1,
], $results, 'Ngram string "Dog".');
}
else {
$this
->assertTrue(TRUE, 'Error: The Solr instance could not be found. Please enable a multi-core one on http://localhost:8983/solr/drupal');
}
}
}