Skip to content

Commit cb58845

Browse files
authored
Merge pull request #705 from cosmocode/lazy-search
Lazy search
2 parents fa365d7 + 1c9d444 commit cb58845

18 files changed

+259
-196
lines changed

_test/AccessTableDataReplacementTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public function test_simple()
9393

9494
$search = new meta\SearchConfig($actual_config);
9595
list(, $opts) = $search->getSQL();
96-
$result = $search->execute();
96+
$result = $search->getRows();
9797

9898
$this->assertEquals(['page1', 'page2'], $opts, '$STRUCT.table.col$ should not require table to be selected');
9999
$this->assertEquals('data of page1', $result[0][1]->getValue());
@@ -114,7 +114,7 @@ public function test_emptyfield()
114114
$actual_config = $configParser->getConfig();
115115

116116
$search = new meta\SearchConfig($actual_config);
117-
$result = $search->execute();
117+
$result = $search->getRows();
118118

119119
$this->assertEquals(0, count($result), 'if no pages a given, then none should be shown');
120120
}

_test/AggregationResultsTest.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
use dokuwiki\plugin\struct\meta\ConfigParser;
77
use dokuwiki\plugin\struct\meta\PageMeta;
88
use dokuwiki\plugin\struct\test\mock\AccessTable as MockAccessTableAlias;
9-
use dokuwiki\plugin\struct\test\mock\AggregationEditorTable as MockAggregationEditorTableAlias;
10-
use dokuwiki\plugin\struct\test\mock\AggregationTable as MockAggregationTableAlias;
119
use dokuwiki\plugin\struct\test\mock\SearchConfig as MockSearchConfigAlias;
1210

1311
/**
@@ -181,8 +179,7 @@ protected function fetchAllResults($schema, $id = '', $filters = [])
181179
if ($filters) $config['filter'][] = $filters;
182180
$search = new MockSearchConfigAlias($config);
183181

184-
$table = new MockAggregationTableAlias($id, 'xhtml', new \Doku_Renderer_xhtml(), $search);
185-
return $table->getResult();
182+
return $search->getRows();
186183
}
187184

188185
/**
@@ -211,8 +208,7 @@ protected function fetchNonPageResults($schema, $id = '', $filters = [])
211208
if ($filters) $config['filter'][] = $filters;
212209
$search = new MockSearchConfigAlias($config);
213210

214-
$table = new MockAggregationEditorTableAlias($id, 'xhtml', new \Doku_Renderer_xhtml(), $search);
215-
return $table->getResult();
211+
return $search->getRows();
216212
}
217213

218214
protected function prepareLookup()

_test/SearchTest.php

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ class SearchTest extends StructTest
1616

1717
public function setUp(): void
1818
{
19+
// workaround for recent GitHub disk I/O errors
20+
parent::setUpBeforeClass();
21+
1922
parent::setUp();
2023

2124
$this->loadSchemaJSON('schema1');
@@ -103,7 +106,7 @@ public function test_simple()
103106
$search->addColumn('second');
104107

105108
/** @var meta\Value[][] $result */
106-
$result = $search->execute();
109+
$result = $search->getRows();
107110

108111
$this->assertCount(2, $result, 'result rows');
109112
$this->assertCount(3, $result[0], 'result columns');
@@ -122,7 +125,7 @@ public function test_simple_title()
122125
$search->addColumn('second');
123126

124127
/** @var meta\Value[][] $result */
125-
$result = $search->execute();
128+
$result = $search->getRows();
126129

127130
$this->assertCount(2, $result, 'result rows');
128131
$this->assertCount(3, $result[0], 'result columns');
@@ -142,7 +145,7 @@ public function test_search_published()
142145
$search->addColumn('second');
143146

144147
/** @var meta\Value[][] $result */
145-
$result = $search->execute();
148+
$result = $search->getRows();
146149

147150
$this->assertCount(0, $result, 'result rows');
148151
}
@@ -158,7 +161,7 @@ public function test_search_lasteditor()
158161
$search->addColumn('second');
159162

160163
/** @var meta\Value[][] $result */
161-
$result = $search->execute();
164+
$result = $search->getRows();
162165

163166
$this->assertCount(2, $result, 'result rows');
164167
$this->assertCount(4, $result[0], 'result columns');
@@ -185,7 +188,7 @@ public function test_search_lastupdate()
185188
$search->addColumn('second');
186189

187190
/** @var meta\Value[][] $result */
188-
$result = $search->execute();
191+
$result = $search->getRows();
189192

190193
$expected_time = dformat(filemtime(wikiFN('page01')), '%Y-%m-%d %H:%M:%S');
191194

@@ -214,7 +217,7 @@ public function test_search_lastsummary()
214217
$search->addColumn('second');
215218

216219
/** @var meta\Value[][] $result */
217-
$result = $search->execute();
220+
$result = $search->getRows();
218221

219222
$this->assertCount(2, $result, 'result rows');
220223
$this->assertCount(4, $result[0], 'result columns');
@@ -270,7 +273,7 @@ public function test_search()
270273
$search->addFilter('second', '%sec%', '~', 'AND');
271274
$search->addFilter('first', '%rst%', '~', 'AND');
272275

273-
$result = $search->execute();
276+
$result = $search->getRows();
274277
$count = $search->getCount();
275278

276279
$this->assertEquals(1, $count, 'result count');
@@ -280,40 +283,25 @@ public function test_search()
280283
// sort by multi-column
281284
$search->addSort('second');
282285
$this->assertCount(2, $search->sortby);
283-
$result = $search->execute();
286+
$result = $search->getRows();
284287
$count = $search->getCount();
285288
$this->assertEquals(1, $count, 'result count');
286289
$this->assertCount(1, $result, 'result rows');
287290
$this->assertCount(6, $result[0], 'result columns');
288-
289-
/*
290-
{#debugging
291-
list($sql, $opts) = $search->getSQL();
292-
print "\n";
293-
print_r($sql);
294-
print "\n";
295-
print_r($opts);
296-
print "\n";
297-
#print_r($result);
298-
}
299-
*/
300291
}
301292

302293
public function test_ranges()
303294
{
304295
$search = new mock\Search();
305296
$search->addSchema('schema2');
306-
307297
$search->addColumn('%pageid%');
308298
$search->addColumn('afirst');
309299
$search->addColumn('asecond');
310-
311300
$search->addFilter('%pageid%', '%ag%', '~', 'AND');
312-
313301
$search->addSort('%pageid%', false);
314302

315303
/** @var meta\Value[][] $result */
316-
$result = $search->execute();
304+
$result = $search->getRows();
317305
$count = $search->getCount();
318306

319307
// check result dimensions
@@ -326,9 +314,19 @@ public function test_ranges()
326314
$this->assertEquals('page19', $result[1][0]->getValue());
327315
$this->assertEquals('page18', $result[2][0]->getValue());
328316

329-
// now add limit
317+
// now with limit
318+
// new search object because result is fetched only once
319+
$search = new mock\Search();
320+
$search->addSchema('schema2');
321+
$search->addColumn('%pageid%');
322+
$search->addColumn('afirst');
323+
$search->addColumn('asecond');
324+
$search->addFilter('%pageid%', '%ag%', '~', 'AND');
325+
$search->addSort('%pageid%', false);
330326
$search->setLimit(5);
331-
$result = $search->execute();
327+
328+
/** @var meta\Value[][] $result */
329+
$result = $search->getRows();
332330
$count = $search->getCount();
333331

334332
// check result dimensions
@@ -340,8 +338,17 @@ public function test_ranges()
340338
$this->assertEquals('page16', $result[4][0]->getValue());
341339

342340
// now add offset
341+
// again a new object
342+
$search = new mock\Search();
343+
$search->addSchema('schema2');
344+
$search->addColumn('%pageid%');
345+
$search->addColumn('afirst');
346+
$search->addColumn('asecond');
347+
$search->addFilter('%pageid%', '%ag%', '~', 'AND');
348+
$search->addSort('%pageid%', false);
349+
$search->setLimit(5);
343350
$search->setOffset(5);
344-
$result = $search->execute();
351+
$result = $search->getRows();
345352
$count = $search->getCount();
346353

347354
// check result dimensions

_test/mock/AggregationTable.php

Lines changed: 0 additions & 13 deletions
This file was deleted.

_test/types/DecimalTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public function test_sort()
191191
$search->addColumn('field');
192192
$search->addSort('field', true);
193193
/** @var Value[][] $result */
194-
$result = $search->execute();
194+
$result = $search->getRows();
195195

196196
$this->assertEquals(4, count($result));
197197
$this->assertEquals('page4', $result[0][0]->getValue());
@@ -216,7 +216,7 @@ public function test_filter()
216216
$search->addFilter('field', '800', '>', 'AND');
217217
$search->addSort('field', true);
218218
/** @var Value[][] $result */
219-
$result = $search->execute();
219+
$result = $search->getRows();
220220

221221
$this->assertEquals(3, count($result));
222222
$this->assertEquals('page3', $result[0][0]->getValue());

_test/types/PageTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public function test_sort()
5858
$search->addColumn('singletitle');
5959
$search->addSort('singletitle', true);
6060
/** @var Value[][] $result */
61-
$result = $search->execute();
61+
$result = $search->getRows();
6262

6363
$this->assertEquals(3, count($result));
6464
$this->assertEquals('test3', $result[0][0]->getValue());
@@ -98,7 +98,7 @@ public function test_search()
9898
$search->addColumn('multititle');
9999

100100
/** @var Value[][] $result */
101-
$result = $search->execute();
101+
$result = $search->getRows();
102102

103103
// no titles:
104104
$this->assertEquals('wiki:dokuwiki', $result[0][0]->getValue());
@@ -127,28 +127,28 @@ public function test_search()
127127
// search single with title
128128
$single = clone $search;
129129
$single->addFilter('singletitle', 'Overview', '*~', 'AND');
130-
$result = $single->execute();
130+
$result = $single->getRows();
131131
$this->assertTrue(is_array($result));
132132
$this->assertEquals(1, count($result));
133133

134134
// search multi with title
135135
$multi = clone $search;
136136
$multi->addFilter('multititle', 'Foobar', '*~', 'AND');
137-
$result = $multi->execute();
137+
$result = $multi->getRows();
138138
$this->assertTrue(is_array($result));
139139
$this->assertEquals(1, count($result));
140140

141141
// search single with page
142142
$single = clone $search;
143143
$single->addFilter('singletitle', 'wiki:dokuwiki', '*~', 'AND');
144-
$result = $single->execute();
144+
$result = $single->getRows();
145145
$this->assertTrue(is_array($result));
146146
$this->assertEquals(1, count($result));
147147

148148
// search multi with page
149149
$multi = clone $search;
150150
$multi->addFilter('multititle', 'welcome', '*~', 'AND');
151-
$result = $multi->execute();
151+
$result = $multi->getRows();
152152
$this->assertTrue(is_array($result));
153153
$this->assertEquals(1, count($result));
154154
}

action/bureaucracy.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public function handleLookupFields(Event $event, $param)
103103
$search = new Search();
104104
$search->addSchema($config['schema']);
105105
$search->addColumn($config['field']);
106-
$result = $search->execute();
106+
$result = $search->getRows();
107107
$pids = $search->getPids();
108108
$rids = $search->getRids();
109109

meta/Aggregation.php

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,6 @@ abstract class Aggregation
2424
/** @var Column[] the list of columns to be displayed */
2525
protected $columns;
2626

27-
/** @var Value[][] the search result */
28-
protected $result;
29-
30-
/** @var int number of all results */
31-
protected $resultCount;
32-
3327
/** @var string usually a div, but AggregationValue needs to be wrapped in a span */
3428
protected $tagName = 'div';
3529

@@ -62,8 +56,6 @@ public function __construct($id, $mode, \Doku_Renderer $renderer, SearchConfig $
6256
$this->searchConfig = $searchConfig;
6357
$this->data = $searchConfig->getConf();
6458
$this->columns = $searchConfig->getColumns();
65-
$this->result = $this->searchConfig->execute();
66-
$this->resultCount = $this->searchConfig->getCount();
6759
$this->helper = plugin_load('helper', 'struct_config');
6860
}
6961

meta/AggregationCloud.php

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,19 @@ class AggregationCloud extends Aggregation
1010
/** @var int */
1111
protected $min;
1212

13-
/**
14-
* Initialize the Aggregation renderer and executes the search
15-
*
16-
* You need to call @param string $id
17-
* @param string $mode
18-
* @param \Doku_Renderer $renderer
19-
* @param SearchConfig $searchConfig
20-
* @see render() on the resulting object.
21-
*
22-
*/
23-
public function __construct($id, $mode, \Doku_Renderer $renderer, SearchCloud $searchConfig)
24-
{
25-
parent::__construct($id, $mode, $renderer, $searchConfig);
26-
27-
$this->max = $this->result[0]['count'];
28-
$this->min = end($this->result)['count'];
29-
}
30-
3113
/** @inheritdoc */
3214
public function render($showNotFound = false)
3315
{
34-
$this->sortResults();
16+
17+
if ($this->mode !== 'xhtml') return;
18+
19+
$rows = $this->searchConfig->getRows();
20+
$this->max = $rows[0]['count'];
21+
$this->min = end($rows)['count'];
22+
23+
$this->sortResults($rows);
3524
$this->startList();
36-
foreach ($this->result as $result) {
25+
foreach ($rows as $result) {
3726
$this->renderTag($result);
3827
}
3928
$this->finishList();
@@ -110,9 +99,9 @@ protected function getWeight($current, $min, $max)
11099
/**
111100
* Sort the list of results
112101
*/
113-
protected function sortResults()
102+
protected function sortResults(&$rows)
114103
{
115-
usort($this->result, function ($a, $b) {
104+
usort($rows, function ($a, $b) {
116105
$asort = $a['tag']->getColumn()->getType()->getSortString($a['tag']);
117106
$bsort = $b['tag']->getColumn()->getType()->getSortString($b['tag']);
118107
if ($asort < $bsort) {

meta/AggregationEditorTable.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public function getFirstRow()
7070
$this->renderer->table_open();
7171
$this->renderer->doc = '';
7272

73-
$this->renderResultRow(0, $this->result[0]);
73+
$this->renderResultRow(0, $this->searchConfig->getRows()[0]);
7474
return $this->renderer->doc;
7575
}
7676
}

0 commit comments

Comments
 (0)