annotate sites/all/modules/custom/solrconnect/tests/solr_index_and_search.test @ 0:015d06b10d37 default tip

initial
author dwinter
date Wed, 31 Jul 2013 13:49:13 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
015d06b10d37 initial
dwinter
parents:
diff changeset
1 <?php
015d06b10d37 initial
dwinter
parents:
diff changeset
2
015d06b10d37 initial
dwinter
parents:
diff changeset
3 abstract class AbstractDrupalSolrOnlineWebTestCase extends DrupalWebTestCase {
015d06b10d37 initial
dwinter
parents:
diff changeset
4
015d06b10d37 initial
dwinter
parents:
diff changeset
5 protected $solr;
015d06b10d37 initial
dwinter
parents:
diff changeset
6
015d06b10d37 initial
dwinter
parents:
diff changeset
7 protected $solr_available = FALSE; // workaround for drupal.org test bot
015d06b10d37 initial
dwinter
parents:
diff changeset
8
015d06b10d37 initial
dwinter
parents:
diff changeset
9 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
10 * Implementation of setUp().
015d06b10d37 initial
dwinter
parents:
diff changeset
11 */
015d06b10d37 initial
dwinter
parents:
diff changeset
12 function setUp() {
015d06b10d37 initial
dwinter
parents:
diff changeset
13 // Install modules needed for this test. This could have been passed in as
015d06b10d37 initial
dwinter
parents:
diff changeset
14 // either a single array argument or a variable number of string arguments.
015d06b10d37 initial
dwinter
parents:
diff changeset
15 $modules = func_get_args();
015d06b10d37 initial
dwinter
parents:
diff changeset
16 if (isset($modules[0]) && is_array($modules[0])) {
015d06b10d37 initial
dwinter
parents:
diff changeset
17 $modules = $modules[0];
015d06b10d37 initial
dwinter
parents:
diff changeset
18 }
015d06b10d37 initial
dwinter
parents:
diff changeset
19 $modules[] = 'apachesolr';
015d06b10d37 initial
dwinter
parents:
diff changeset
20 $modules[] = 'apachesolr_search';
015d06b10d37 initial
dwinter
parents:
diff changeset
21 $modules[] = 'search';
015d06b10d37 initial
dwinter
parents:
diff changeset
22
015d06b10d37 initial
dwinter
parents:
diff changeset
23 parent::setUp($modules);
015d06b10d37 initial
dwinter
parents:
diff changeset
24 }
015d06b10d37 initial
dwinter
parents:
diff changeset
25
015d06b10d37 initial
dwinter
parents:
diff changeset
26 function setUpSolr() {
015d06b10d37 initial
dwinter
parents:
diff changeset
27 // Load the default server.
015d06b10d37 initial
dwinter
parents:
diff changeset
28 $env_id = apachesolr_default_environment();
015d06b10d37 initial
dwinter
parents:
diff changeset
29 $environment = apachesolr_environment_load($env_id);
015d06b10d37 initial
dwinter
parents:
diff changeset
30 $this->base_solr_url = $environment['url'];
015d06b10d37 initial
dwinter
parents:
diff changeset
31
015d06b10d37 initial
dwinter
parents:
diff changeset
32 // Because we are in a clean environment, this will always be the default
015d06b10d37 initial
dwinter
parents:
diff changeset
33 // http://localhost:8983/solr
015d06b10d37 initial
dwinter
parents:
diff changeset
34 $this->core_admin_url = "{$this->base_solr_url}/admin/cores";
015d06b10d37 initial
dwinter
parents:
diff changeset
35
015d06b10d37 initial
dwinter
parents:
diff changeset
36 // The core admin url will give a valid response if the
015d06b10d37 initial
dwinter
parents:
diff changeset
37 // Solr server is running locally.
015d06b10d37 initial
dwinter
parents:
diff changeset
38 if ($this->coreAdminAvailable()) {
015d06b10d37 initial
dwinter
parents:
diff changeset
39
015d06b10d37 initial
dwinter
parents:
diff changeset
40 // We will use a core named after the simpletest prefix.
015d06b10d37 initial
dwinter
parents:
diff changeset
41 $environment['url'] .= '/' . $this->databasePrefix;
015d06b10d37 initial
dwinter
parents:
diff changeset
42
015d06b10d37 initial
dwinter
parents:
diff changeset
43 $filesdir = file_directory_temp();
015d06b10d37 initial
dwinter
parents:
diff changeset
44 // Create our Solr core directory.
015d06b10d37 initial
dwinter
parents:
diff changeset
45 drupal_mkdir("{$filesdir}/solr", 0777, TRUE);
015d06b10d37 initial
dwinter
parents:
diff changeset
46 // Our temporary core is located here.
015d06b10d37 initial
dwinter
parents:
diff changeset
47 $instancedir = realpath($filesdir . "/solr");
015d06b10d37 initial
dwinter
parents:
diff changeset
48
015d06b10d37 initial
dwinter
parents:
diff changeset
49 // use the Solr version confs where appropriate.
015d06b10d37 initial
dwinter
parents:
diff changeset
50 $version = $this->getSolrVersion();
015d06b10d37 initial
dwinter
parents:
diff changeset
51 if (isset($version) && $version == 3) {
015d06b10d37 initial
dwinter
parents:
diff changeset
52 $conf_path = dirname(__FILE__) . '/../solr-conf/solr-3.x/*';
015d06b10d37 initial
dwinter
parents:
diff changeset
53 }
015d06b10d37 initial
dwinter
parents:
diff changeset
54 elseif (isset($version) && $version == 4) {
015d06b10d37 initial
dwinter
parents:
diff changeset
55 $conf_path = dirname(__FILE__) . '/../solr-conf/solr-4.x/*';
015d06b10d37 initial
dwinter
parents:
diff changeset
56 }
015d06b10d37 initial
dwinter
parents:
diff changeset
57 else {
015d06b10d37 initial
dwinter
parents:
diff changeset
58 $conf_path = dirname(__FILE__) . '/../solr-conf/solr-1.4/*';
015d06b10d37 initial
dwinter
parents:
diff changeset
59 }
015d06b10d37 initial
dwinter
parents:
diff changeset
60
015d06b10d37 initial
dwinter
parents:
diff changeset
61 $patterns = array(
015d06b10d37 initial
dwinter
parents:
diff changeset
62 $conf_path,
015d06b10d37 initial
dwinter
parents:
diff changeset
63 dirname(__FILE__) . '/conf/*',
015d06b10d37 initial
dwinter
parents:
diff changeset
64 );
015d06b10d37 initial
dwinter
parents:
diff changeset
65
015d06b10d37 initial
dwinter
parents:
diff changeset
66 // Copy all files in solr-conf dir to our temporary solr core.
015d06b10d37 initial
dwinter
parents:
diff changeset
67 drupal_mkdir("{$instancedir}/conf", 0777, TRUE);
015d06b10d37 initial
dwinter
parents:
diff changeset
68 foreach ($patterns as $pattern) {
015d06b10d37 initial
dwinter
parents:
diff changeset
69 foreach (glob($pattern) as $conf_file) {
015d06b10d37 initial
dwinter
parents:
diff changeset
70 copy($conf_file, "$instancedir/conf/" . basename($conf_file));
015d06b10d37 initial
dwinter
parents:
diff changeset
71 }
015d06b10d37 initial
dwinter
parents:
diff changeset
72 }
015d06b10d37 initial
dwinter
parents:
diff changeset
73
015d06b10d37 initial
dwinter
parents:
diff changeset
74 $contents = file_get_contents("$instancedir/conf/solrconfig.xml");
015d06b10d37 initial
dwinter
parents:
diff changeset
75
015d06b10d37 initial
dwinter
parents:
diff changeset
76 // Change the autoCommit time down to 1 second.
015d06b10d37 initial
dwinter
parents:
diff changeset
77 // @todo - use solrcore.properties file for 3.x.
015d06b10d37 initial
dwinter
parents:
diff changeset
78 file_put_contents("$instancedir/conf/solrconfig.xml", preg_replace('@<maxTime>[0-9]+</maxTime>@', '<maxTime>1000</maxTime>', $contents));
015d06b10d37 initial
dwinter
parents:
diff changeset
79
015d06b10d37 initial
dwinter
parents:
diff changeset
80 // hard chmod -R because it seems drupal dirs are too restricted in a
015d06b10d37 initial
dwinter
parents:
diff changeset
81 // testing environment
015d06b10d37 initial
dwinter
parents:
diff changeset
82 system("chmod -R 777 {$instancedir}");
015d06b10d37 initial
dwinter
parents:
diff changeset
83
015d06b10d37 initial
dwinter
parents:
diff changeset
84 $query['name'] = $this->databasePrefix;
015d06b10d37 initial
dwinter
parents:
diff changeset
85 $query['instanceDir'] = $instancedir;
015d06b10d37 initial
dwinter
parents:
diff changeset
86 $created = $this->coreAdmin('CREATE', $query);
015d06b10d37 initial
dwinter
parents:
diff changeset
87
015d06b10d37 initial
dwinter
parents:
diff changeset
88 if ($created && apachesolr_server_status($environment['url'])) {
015d06b10d37 initial
dwinter
parents:
diff changeset
89 $this->instancedir = $instancedir;
015d06b10d37 initial
dwinter
parents:
diff changeset
90 $this->solr_url = $environment['url'];
015d06b10d37 initial
dwinter
parents:
diff changeset
91 apachesolr_environment_save($environment);
015d06b10d37 initial
dwinter
parents:
diff changeset
92 $this->solr = apachesolr_get_solr($env_id);
015d06b10d37 initial
dwinter
parents:
diff changeset
93 $this->solr_available = TRUE;
015d06b10d37 initial
dwinter
parents:
diff changeset
94 $this->checkCoreStatus($this->databasePrefix);
015d06b10d37 initial
dwinter
parents:
diff changeset
95 }
015d06b10d37 initial
dwinter
parents:
diff changeset
96 }
015d06b10d37 initial
dwinter
parents:
diff changeset
97 // Workaround for drupal.org test bot.
015d06b10d37 initial
dwinter
parents:
diff changeset
98 // The tests succeed but further tests will not run because $this->solr_available is FALSE.
015d06b10d37 initial
dwinter
parents:
diff changeset
99 if (!$this->solr_available) {
015d06b10d37 initial
dwinter
parents:
diff changeset
100 $this->pass(t('Warning : The solr instance could not be found. Please enable a multicore one on http://localhost:8983/solr'));
015d06b10d37 initial
dwinter
parents:
diff changeset
101 }
015d06b10d37 initial
dwinter
parents:
diff changeset
102 }
015d06b10d37 initial
dwinter
parents:
diff changeset
103
015d06b10d37 initial
dwinter
parents:
diff changeset
104 protected function coreAdminAvailable() {
015d06b10d37 initial
dwinter
parents:
diff changeset
105 $url = url($this->core_admin_url, array('query' => array('action' => 'STATUS')));
015d06b10d37 initial
dwinter
parents:
diff changeset
106 $options['timeout'] = 2;
015d06b10d37 initial
dwinter
parents:
diff changeset
107 $result = drupal_http_request($url, $options);
015d06b10d37 initial
dwinter
parents:
diff changeset
108 return ($result->code == 200 && empty($result->error));
015d06b10d37 initial
dwinter
parents:
diff changeset
109 }
015d06b10d37 initial
dwinter
parents:
diff changeset
110
015d06b10d37 initial
dwinter
parents:
diff changeset
111 protected function getSolrVersion() {
015d06b10d37 initial
dwinter
parents:
diff changeset
112 $status = $this->coreAdmin('STATUS');
015d06b10d37 initial
dwinter
parents:
diff changeset
113 foreach($status['status'] as $core_id => $core) {
015d06b10d37 initial
dwinter
parents:
diff changeset
114 $solr = new DrupalApacheSolrService($this->base_solr_url . '/' . $core_id);
015d06b10d37 initial
dwinter
parents:
diff changeset
115 $version = $solr->getSolrVersion();
015d06b10d37 initial
dwinter
parents:
diff changeset
116 if (!empty($version)) {
015d06b10d37 initial
dwinter
parents:
diff changeset
117 return $version;
015d06b10d37 initial
dwinter
parents:
diff changeset
118 }
015d06b10d37 initial
dwinter
parents:
diff changeset
119 else {
015d06b10d37 initial
dwinter
parents:
diff changeset
120 return "1";
015d06b10d37 initial
dwinter
parents:
diff changeset
121 }
015d06b10d37 initial
dwinter
parents:
diff changeset
122 }
015d06b10d37 initial
dwinter
parents:
diff changeset
123 }
015d06b10d37 initial
dwinter
parents:
diff changeset
124
015d06b10d37 initial
dwinter
parents:
diff changeset
125 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
126 * Helper function to invoke core admin actions.
015d06b10d37 initial
dwinter
parents:
diff changeset
127 */
015d06b10d37 initial
dwinter
parents:
diff changeset
128 protected function coreAdmin($action, $query = array()) {
015d06b10d37 initial
dwinter
parents:
diff changeset
129 $query['action'] = $action;
015d06b10d37 initial
dwinter
parents:
diff changeset
130 $query['wt'] = 'json';
015d06b10d37 initial
dwinter
parents:
diff changeset
131 $url = url($this->core_admin_url, array('query' => $query));
015d06b10d37 initial
dwinter
parents:
diff changeset
132 $options['timeout'] = 2;
015d06b10d37 initial
dwinter
parents:
diff changeset
133 $result = drupal_http_request($url, $options);
015d06b10d37 initial
dwinter
parents:
diff changeset
134
015d06b10d37 initial
dwinter
parents:
diff changeset
135 if ($result->code == 200) {
015d06b10d37 initial
dwinter
parents:
diff changeset
136 return json_decode($result->data, TRUE);
015d06b10d37 initial
dwinter
parents:
diff changeset
137 }
015d06b10d37 initial
dwinter
parents:
diff changeset
138 else {
015d06b10d37 initial
dwinter
parents:
diff changeset
139 return FALSE;
015d06b10d37 initial
dwinter
parents:
diff changeset
140 }
015d06b10d37 initial
dwinter
parents:
diff changeset
141 }
015d06b10d37 initial
dwinter
parents:
diff changeset
142
015d06b10d37 initial
dwinter
parents:
diff changeset
143 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
144 * Helper function to verify that the expected core exists.
015d06b10d37 initial
dwinter
parents:
diff changeset
145 */
015d06b10d37 initial
dwinter
parents:
diff changeset
146 protected function checkCoreStatus($core_name) {
015d06b10d37 initial
dwinter
parents:
diff changeset
147 $response = $this->coreAdmin('STATUS', array('core' => $core_name));
015d06b10d37 initial
dwinter
parents:
diff changeset
148 $this->assertTrue(isset($response['status'][$core_name]['index']), 'Found Solr test core index status');
015d06b10d37 initial
dwinter
parents:
diff changeset
149 }
015d06b10d37 initial
dwinter
parents:
diff changeset
150
015d06b10d37 initial
dwinter
parents:
diff changeset
151 function tearDown() {
015d06b10d37 initial
dwinter
parents:
diff changeset
152 // Workaround for drupal.org test bot
015d06b10d37 initial
dwinter
parents:
diff changeset
153 if ($this->solr_available) {
015d06b10d37 initial
dwinter
parents:
diff changeset
154 // Unload the Solr core & delete all files
015d06b10d37 initial
dwinter
parents:
diff changeset
155 $query = array(
015d06b10d37 initial
dwinter
parents:
diff changeset
156 'core' => $this->databasePrefix,
015d06b10d37 initial
dwinter
parents:
diff changeset
157 'deleteIndex' => 'true',
015d06b10d37 initial
dwinter
parents:
diff changeset
158 'deleteDataDir' => 'true',
015d06b10d37 initial
dwinter
parents:
diff changeset
159 'deleteInstanceDir' => 'true'
015d06b10d37 initial
dwinter
parents:
diff changeset
160 );
015d06b10d37 initial
dwinter
parents:
diff changeset
161 // This is currently broken due to
015d06b10d37 initial
dwinter
parents:
diff changeset
162 // https://issues.apache.org/jira/browse/SOLR-3586
015d06b10d37 initial
dwinter
parents:
diff changeset
163 $this->coreAdmin('UNLOAD', $query);
015d06b10d37 initial
dwinter
parents:
diff changeset
164
015d06b10d37 initial
dwinter
parents:
diff changeset
165 }
015d06b10d37 initial
dwinter
parents:
diff changeset
166 parent::tearDown();
015d06b10d37 initial
dwinter
parents:
diff changeset
167 }
015d06b10d37 initial
dwinter
parents:
diff changeset
168 }
015d06b10d37 initial
dwinter
parents:
diff changeset
169
015d06b10d37 initial
dwinter
parents:
diff changeset
170
015d06b10d37 initial
dwinter
parents:
diff changeset
171 class DrupalSolrOnlineWebTestCase extends AbstractDrupalSolrOnlineWebTestCase {
015d06b10d37 initial
dwinter
parents:
diff changeset
172 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
173 * Implementation of setUp().
015d06b10d37 initial
dwinter
parents:
diff changeset
174 */
015d06b10d37 initial
dwinter
parents:
diff changeset
175 function setUp() {
015d06b10d37 initial
dwinter
parents:
diff changeset
176 parent::setUp();
015d06b10d37 initial
dwinter
parents:
diff changeset
177 parent::setUpSolr();
015d06b10d37 initial
dwinter
parents:
diff changeset
178 }
015d06b10d37 initial
dwinter
parents:
diff changeset
179 }
015d06b10d37 initial
dwinter
parents:
diff changeset
180
015d06b10d37 initial
dwinter
parents:
diff changeset
181
015d06b10d37 initial
dwinter
parents:
diff changeset
182 class DrupalSolrMatchTestCase extends DrupalSolrOnlineWebTestCase {
015d06b10d37 initial
dwinter
parents:
diff changeset
183 public static function getInfo() {
015d06b10d37 initial
dwinter
parents:
diff changeset
184 return array(
015d06b10d37 initial
dwinter
parents:
diff changeset
185 'name' => 'Solr Index Data and test live queries',
015d06b10d37 initial
dwinter
parents:
diff changeset
186 'description' => 'Indexes content and queries it.',
015d06b10d37 initial
dwinter
parents:
diff changeset
187 'group' => 'ApacheSolr',
015d06b10d37 initial
dwinter
parents:
diff changeset
188 );
015d06b10d37 initial
dwinter
parents:
diff changeset
189 }
015d06b10d37 initial
dwinter
parents:
diff changeset
190
015d06b10d37 initial
dwinter
parents:
diff changeset
191 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
192 * Test search indexing.
015d06b10d37 initial
dwinter
parents:
diff changeset
193 */
015d06b10d37 initial
dwinter
parents:
diff changeset
194 function testMatching() {
015d06b10d37 initial
dwinter
parents:
diff changeset
195 if ($this->solr_available) { // workaround for drupal.org test bot
015d06b10d37 initial
dwinter
parents:
diff changeset
196 $this->assertTrue($this->solr->ping(), "The Server could be Pinged");
015d06b10d37 initial
dwinter
parents:
diff changeset
197 $response = $this->solr->search("*:*", array());
015d06b10d37 initial
dwinter
parents:
diff changeset
198 $response = $response->response;
015d06b10d37 initial
dwinter
parents:
diff changeset
199 $this->assertEqual($response->numFound, 0, "There should not be any documents in the index");
015d06b10d37 initial
dwinter
parents:
diff changeset
200 $this->populateIndex(7);
015d06b10d37 initial
dwinter
parents:
diff changeset
201 $response = $this->solr->search("*:*", array());
015d06b10d37 initial
dwinter
parents:
diff changeset
202 $response = $response->response;
015d06b10d37 initial
dwinter
parents:
diff changeset
203 $this->assertEqual($response->numFound, 7, "There should be 7 documents in the index");
015d06b10d37 initial
dwinter
parents:
diff changeset
204 $this->_testQueries();
015d06b10d37 initial
dwinter
parents:
diff changeset
205 }
015d06b10d37 initial
dwinter
parents:
diff changeset
206 }
015d06b10d37 initial
dwinter
parents:
diff changeset
207
015d06b10d37 initial
dwinter
parents:
diff changeset
208 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
209 * Set up a small index of items to test against.
015d06b10d37 initial
dwinter
parents:
diff changeset
210 */
015d06b10d37 initial
dwinter
parents:
diff changeset
211 protected function populateIndex($count) {
015d06b10d37 initial
dwinter
parents:
diff changeset
212
015d06b10d37 initial
dwinter
parents:
diff changeset
213 variable_set('minimum_word_size', 3);
015d06b10d37 initial
dwinter
parents:
diff changeset
214 for ($i = 1; $i <= $count; ++$i) {
015d06b10d37 initial
dwinter
parents:
diff changeset
215 $documents[] = $this->buildDocument(array('entity_id' => $i, 'content' => $this->getText($i)));
015d06b10d37 initial
dwinter
parents:
diff changeset
216 }
015d06b10d37 initial
dwinter
parents:
diff changeset
217 $this->solr->addDocuments($documents);
015d06b10d37 initial
dwinter
parents:
diff changeset
218 $this->solr->commit();
015d06b10d37 initial
dwinter
parents:
diff changeset
219 }
015d06b10d37 initial
dwinter
parents:
diff changeset
220
015d06b10d37 initial
dwinter
parents:
diff changeset
221 protected function buildDocument($values = array()) {
015d06b10d37 initial
dwinter
parents:
diff changeset
222 $document = new ApacheSolrDocument();
015d06b10d37 initial
dwinter
parents:
diff changeset
223 if (!isset($values['entity_type'])) {
015d06b10d37 initial
dwinter
parents:
diff changeset
224 $values['entity_type'] = 'fake.';
015d06b10d37 initial
dwinter
parents:
diff changeset
225 }
015d06b10d37 initial
dwinter
parents:
diff changeset
226 $document->id = apachesolr_document_id($values['entity_id'], $values['entity_type']);
015d06b10d37 initial
dwinter
parents:
diff changeset
227 foreach ($values as $key => $value) {
015d06b10d37 initial
dwinter
parents:
diff changeset
228 $document->$key = $value;
015d06b10d37 initial
dwinter
parents:
diff changeset
229 }
015d06b10d37 initial
dwinter
parents:
diff changeset
230 return $document;
015d06b10d37 initial
dwinter
parents:
diff changeset
231 }
015d06b10d37 initial
dwinter
parents:
diff changeset
232
015d06b10d37 initial
dwinter
parents:
diff changeset
233 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
234 * Helper method for generating snippets of content.
015d06b10d37 initial
dwinter
parents:
diff changeset
235 *
015d06b10d37 initial
dwinter
parents:
diff changeset
236 * Generated items to test against:
015d06b10d37 initial
dwinter
parents:
diff changeset
237 * 1 ipsum
015d06b10d37 initial
dwinter
parents:
diff changeset
238 * 2 dolore sit
015d06b10d37 initial
dwinter
parents:
diff changeset
239 * 3 sit am ut
015d06b10d37 initial
dwinter
parents:
diff changeset
240 * 4 am ut enim am
015d06b10d37 initial
dwinter
parents:
diff changeset
241 * 5 ut enim am minim veniam
015d06b10d37 initial
dwinter
parents:
diff changeset
242 * 6 enim am minim veniam es cillum
015d06b10d37 initial
dwinter
parents:
diff changeset
243 * 7 am minim veniam es cillum dolore eu
015d06b10d37 initial
dwinter
parents:
diff changeset
244 */
015d06b10d37 initial
dwinter
parents:
diff changeset
245 function getText($n) {
015d06b10d37 initial
dwinter
parents:
diff changeset
246 // Start over after 7.
015d06b10d37 initial
dwinter
parents:
diff changeset
247 $n = $n % 7;
015d06b10d37 initial
dwinter
parents:
diff changeset
248 $words = explode(' ', "Ipsum dolore sit am. Ut enim am minim veniam. Es cillum dolore eu.");
015d06b10d37 initial
dwinter
parents:
diff changeset
249 return implode(' ', array_slice($words, $n - 1, $n));
015d06b10d37 initial
dwinter
parents:
diff changeset
250 }
015d06b10d37 initial
dwinter
parents:
diff changeset
251
015d06b10d37 initial
dwinter
parents:
diff changeset
252 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
253 * Run predefine queries looking for indexed terms.
015d06b10d37 initial
dwinter
parents:
diff changeset
254 */
015d06b10d37 initial
dwinter
parents:
diff changeset
255 function _testQueries() {
015d06b10d37 initial
dwinter
parents:
diff changeset
256 /*
015d06b10d37 initial
dwinter
parents:
diff changeset
257 Note: OR queries that include short words in OR groups are only accepted
015d06b10d37 initial
dwinter
parents:
diff changeset
258 if the ORed terms are ANDed with at least one long word in the rest of the query.
015d06b10d37 initial
dwinter
parents:
diff changeset
259
015d06b10d37 initial
dwinter
parents:
diff changeset
260 e.g. enim dolore OR ut = enim (dolore OR ut) = (enim dolor) OR (enim ut) -> good
015d06b10d37 initial
dwinter
parents:
diff changeset
261 e.g. dolore OR ut = (dolore) OR (ut) -> bad
015d06b10d37 initial
dwinter
parents:
diff changeset
262
015d06b10d37 initial
dwinter
parents:
diff changeset
263 This is a design limitation to avoid full table scans.
015d06b10d37 initial
dwinter
parents:
diff changeset
264
015d06b10d37 initial
dwinter
parents:
diff changeset
265 APACHESOLR NOTE: These are not all in lucene syntax... @TODO. Still works for text searching
015d06b10d37 initial
dwinter
parents:
diff changeset
266 */
015d06b10d37 initial
dwinter
parents:
diff changeset
267 $queries = array(
015d06b10d37 initial
dwinter
parents:
diff changeset
268 // Simple AND queries.
015d06b10d37 initial
dwinter
parents:
diff changeset
269 'ipsum' => array(1),
015d06b10d37 initial
dwinter
parents:
diff changeset
270 'enim' => array(4, 5, 6),
015d06b10d37 initial
dwinter
parents:
diff changeset
271 'xxxxx' => array(),
015d06b10d37 initial
dwinter
parents:
diff changeset
272 // Mixed queries.
015d06b10d37 initial
dwinter
parents:
diff changeset
273 '"minim am veniam es" OR "dolore sit"' => array(2),
015d06b10d37 initial
dwinter
parents:
diff changeset
274 '"minim am veniam es" OR "sit dolore"' => array(),
015d06b10d37 initial
dwinter
parents:
diff changeset
275 '"am minim veniam es" -eu' => array(6),
015d06b10d37 initial
dwinter
parents:
diff changeset
276 '"am minim veniam" -"cillum dolore"' => array(5, 6),
015d06b10d37 initial
dwinter
parents:
diff changeset
277 );
015d06b10d37 initial
dwinter
parents:
diff changeset
278 $broken = array(
015d06b10d37 initial
dwinter
parents:
diff changeset
279 'enim minim' => array(5, 6),
015d06b10d37 initial
dwinter
parents:
diff changeset
280 'enim xxxxx' => array(),
015d06b10d37 initial
dwinter
parents:
diff changeset
281 'dolore eu' => array(7),
015d06b10d37 initial
dwinter
parents:
diff changeset
282 'dolore xx' => array(),
015d06b10d37 initial
dwinter
parents:
diff changeset
283 'ut minim' => array(5),
015d06b10d37 initial
dwinter
parents:
diff changeset
284 'xx minim' => array(),
015d06b10d37 initial
dwinter
parents:
diff changeset
285 'enim veniam am minim ut' => array(5),
015d06b10d37 initial
dwinter
parents:
diff changeset
286 // Simple OR queries.
015d06b10d37 initial
dwinter
parents:
diff changeset
287 'dolore OR ipsum' => array(1, 2, 7),
015d06b10d37 initial
dwinter
parents:
diff changeset
288 'dolore OR xxxxx' => array(2, 7),
015d06b10d37 initial
dwinter
parents:
diff changeset
289 'dolore OR ipsum OR enim' => array(1, 2, 4, 5, 6, 7),
015d06b10d37 initial
dwinter
parents:
diff changeset
290 'minim dolore OR ipsum OR enim' => array(5, 6, 7),
015d06b10d37 initial
dwinter
parents:
diff changeset
291 'xxxxx dolore OR ipsum' => array(),
015d06b10d37 initial
dwinter
parents:
diff changeset
292 // Negative queries.
015d06b10d37 initial
dwinter
parents:
diff changeset
293 'dolore -sit' => array(7),
015d06b10d37 initial
dwinter
parents:
diff changeset
294 'dolore -eu' => array(2),
015d06b10d37 initial
dwinter
parents:
diff changeset
295 'dolore -xxxxx' => array(2, 7),
015d06b10d37 initial
dwinter
parents:
diff changeset
296 'dolore -xx' => array(2, 7),
015d06b10d37 initial
dwinter
parents:
diff changeset
297 // Phrase queries.
015d06b10d37 initial
dwinter
parents:
diff changeset
298 '"dolore sit"' => array(2),
015d06b10d37 initial
dwinter
parents:
diff changeset
299 '"sit dolore"' => array(),
015d06b10d37 initial
dwinter
parents:
diff changeset
300 '"am minim veniam es"' => array(6, 7),
015d06b10d37 initial
dwinter
parents:
diff changeset
301 '"minim am veniam es"' => array(),
015d06b10d37 initial
dwinter
parents:
diff changeset
302 'xxxxx "minim am veniam es" OR dolore' => array(),
015d06b10d37 initial
dwinter
parents:
diff changeset
303 'xx "minim am veniam es" OR dolore' => array(),
015d06b10d37 initial
dwinter
parents:
diff changeset
304 // Mixed queries.
015d06b10d37 initial
dwinter
parents:
diff changeset
305 '"am minim veniam es" OR dolore' => array(2, 6, 7),
015d06b10d37 initial
dwinter
parents:
diff changeset
306 '"am minim veniam" -"dolore cillum"' => array(5, 6, 7),
015d06b10d37 initial
dwinter
parents:
diff changeset
307 );
015d06b10d37 initial
dwinter
parents:
diff changeset
308 foreach ($queries as $query => $results) {
015d06b10d37 initial
dwinter
parents:
diff changeset
309 $response = $this->solr->search($query, array());
015d06b10d37 initial
dwinter
parents:
diff changeset
310 $this->_testQueryMatching($query, $response->response->docs, $results);
015d06b10d37 initial
dwinter
parents:
diff changeset
311 //@TODO: We might get to this later
015d06b10d37 initial
dwinter
parents:
diff changeset
312 #$this->_testQueryScores($query, $response->responses->docs, $results);
015d06b10d37 initial
dwinter
parents:
diff changeset
313 }
015d06b10d37 initial
dwinter
parents:
diff changeset
314 }
015d06b10d37 initial
dwinter
parents:
diff changeset
315
015d06b10d37 initial
dwinter
parents:
diff changeset
316 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
317 * Test the matching abilities of the engine.
015d06b10d37 initial
dwinter
parents:
diff changeset
318 *
015d06b10d37 initial
dwinter
parents:
diff changeset
319 * Verify if a query produces the correct results.
015d06b10d37 initial
dwinter
parents:
diff changeset
320 */
015d06b10d37 initial
dwinter
parents:
diff changeset
321 function _testQueryMatching($query, $set, $results) {
015d06b10d37 initial
dwinter
parents:
diff changeset
322 // Get result IDs.
015d06b10d37 initial
dwinter
parents:
diff changeset
323 $found = array();
015d06b10d37 initial
dwinter
parents:
diff changeset
324 foreach ($set as $item) {
015d06b10d37 initial
dwinter
parents:
diff changeset
325 $found[] = $item->entity_id;
015d06b10d37 initial
dwinter
parents:
diff changeset
326 }
015d06b10d37 initial
dwinter
parents:
diff changeset
327 // Compare $results and $found.
015d06b10d37 initial
dwinter
parents:
diff changeset
328 sort($found);
015d06b10d37 initial
dwinter
parents:
diff changeset
329 sort($results);
015d06b10d37 initial
dwinter
parents:
diff changeset
330 $this->assertEqual($found, $results, strtr("Query matching '$query' found: @found expected: @expected", array('@found' => implode(',', $found), '@expected' => implode(',', $results))));
015d06b10d37 initial
dwinter
parents:
diff changeset
331 }
015d06b10d37 initial
dwinter
parents:
diff changeset
332
015d06b10d37 initial
dwinter
parents:
diff changeset
333 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
334 * Test the scoring abilities of the engine.
015d06b10d37 initial
dwinter
parents:
diff changeset
335 *
015d06b10d37 initial
dwinter
parents:
diff changeset
336 * Verify if a query produces normalized, monotonous scores.
015d06b10d37 initial
dwinter
parents:
diff changeset
337 */
015d06b10d37 initial
dwinter
parents:
diff changeset
338 function _testQueryScores($query, $set, $results) {
015d06b10d37 initial
dwinter
parents:
diff changeset
339 // Get result scores.
015d06b10d37 initial
dwinter
parents:
diff changeset
340 $scores = array();
015d06b10d37 initial
dwinter
parents:
diff changeset
341 foreach ($set as $item) {
015d06b10d37 initial
dwinter
parents:
diff changeset
342 $scores[] = $item->score;
015d06b10d37 initial
dwinter
parents:
diff changeset
343 }
015d06b10d37 initial
dwinter
parents:
diff changeset
344
015d06b10d37 initial
dwinter
parents:
diff changeset
345 // Check order.
015d06b10d37 initial
dwinter
parents:
diff changeset
346 $sorted = $scores;
015d06b10d37 initial
dwinter
parents:
diff changeset
347 sort($sorted);
015d06b10d37 initial
dwinter
parents:
diff changeset
348 $this->assertEqual($scores, array_reverse($sorted), "Query order '$query'");
015d06b10d37 initial
dwinter
parents:
diff changeset
349
015d06b10d37 initial
dwinter
parents:
diff changeset
350 // Check range.
015d06b10d37 initial
dwinter
parents:
diff changeset
351 $this->assertEqual(!count($scores) || (min($scores) > 0.0 && max($scores) <= 1.0001), TRUE, "Query scoring '$query'");
015d06b10d37 initial
dwinter
parents:
diff changeset
352 }
015d06b10d37 initial
dwinter
parents:
diff changeset
353
015d06b10d37 initial
dwinter
parents:
diff changeset
354 }