Passed
Push — master ( 3f6c85...9c6499 )
by Jens
02:40
created

SearchRouting::stepRouting()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 17
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 0
Metric Value
cc 8
eloc 14
nc 8
nop 3
dl 0
loc 17
rs 7.7777
c 2
b 1
f 0
1
<?php
2
/**
3
 * User: jensk
4
 * Date: 21-2-2017
5
 * Time: 10:22
6
 */
7
8
namespace library\components\cms;
9
10
11
use library\components\CmsComponent;
12
use library\search\Indexer;
13
use library\search\Search;
14
15
class SearchRouting implements CmsRouting
16
{
17
18
	/**
19
	 * SearchRouting constructor.
20
	 *
21
	 * @param \library\cc\Request              $request
22
	 * @param                                  $relativeCmsUri
23
	 * @param \library\components\CmsComponent $cmsComponent
24
	 */
25
	public function __construct($request, $relativeCmsUri, $cmsComponent)
26
	{
27
		switch ($relativeCmsUri) {
28
			case '/search': $this->overviewRoute($cmsComponent); break;
29
			case '/search/update-index' : $this->updateIndexRoute($cmsComponent); break;
30
			case '/search/ajax-update-index': $this->ajaxUpdateIndexRoute($request, $cmsComponent); break;
31
			case '/search/manual-update-index' :
32
				$indexer = new Indexer($cmsComponent->storage);
33
				$indexer->updateIndex();
34
				break;
35
		}
36
	}
37
38
	/**
39
	 * @param \library\components\CmsComponent $cmsComponent
40
	 */
41
	private function overviewRoute($cmsComponent)
42
	{
43
		$cmsComponent->subTemplate = 'cms/search';
44
		$cmsComponent->setParameter(CmsComponent::PARAMETER_MAIN_NAV_CLASS, CmsComponent::PARAMETER_SEARCH);
45
		$documentCount = $cmsComponent->storage->getDocuments()->getTotalDocumentCount();
46
		$indexer = new Search($cmsComponent->storage);
47
		$indexedDocuments = $indexer->getIndexedDocuments();
48
		$cmsComponent->setParameter(CmsComponent::PARAMETER_SEARCH_NEEDS_UPDATE, $documentCount !== $indexedDocuments);
49
	}
50
51
	/**
52
	 * @param \library\components\CmsComponent $cmsComponent
53
	 */
54
	private function updateIndexRoute($cmsComponent)
55
	{
56
		$cmsComponent->subTemplate = 'cms/search/update-index';
57
		$cmsComponent->setParameter(CmsComponent::PARAMETER_MAIN_NAV_CLASS, CmsComponent::PARAMETER_SEARCH);
58
	}
59
60
	private function ajaxUpdateIndexRoute($request, $cmsComponent)
61
	{
62
		$cmsComponent->subTemplate = 'cms/search/update-index';
63
		if (isset($request::$get['step'])) {
64
			\set_time_limit(0); // Set max excecution time infinite
65
			\session_write_close(); // Close the session, so it doesnt create a lock on the sessionstorage, block other requests.
66
			$indexer = new Indexer($cmsComponent->storage);
67
			$step = $request::$get['step'];
68
			$this->stepRouting($step, $cmsComponent, $indexer);
69
		} else {
70
			$this->showJson('No step defined.', 'HTTP/1.0 500 Internal Server Error');
71
		}
72
	}
73
74
	private function showJson($obj, $httpHeader = 'HTTP/1.0 200 OK') {
75
		header($_SERVER['SERVER_PROTOCOL'] . $httpHeader, true);
76
		header('Content-type: application/json');
77
		die(json_encode($obj));
78
	}
79
80
	/**
81
	 * @param CmsComponent $cmsComponent
82
	 * @param string $step
83
	 * @param Indexer $indexer
84
	 */
85
	private function stepRouting($step, $cmsComponent, $indexer)
86
	{
87
		switch($step) {
88
			case 'resetIndex': $indexer->resetIndex(); break;
89
			case 'cleanPublishedDeletedDocuments': $cmsComponent->storage->getDocuments()->cleanPublishedDeletedDocuments(); break;
90
			case 'createDocumentTermCount':
91
				$documents = $cmsComponent->storage->getDocuments()->getPublishedDocumentsNoFolders();
92
				$indexer->createDocumentTermCount($documents);
93
				break;
94
			case 'createDocumentTermFrequency': $indexer->createDocumentTermFrequency(); break;
95
			case 'createTermFieldLengthNorm': $indexer->createTermFieldLengthNorm(); break;
96
			case 'createInverseDocumentFrequency': $indexer->createInverseDocumentFrequency(); break;
97
			case 'replaceOldIndex': $indexer->replaceOldIndex(); break;
98
			default : $this->showJson('Invalid step: ' . $step . '.', 'HTTP/1.0 500 Internal Server Error'); break;
99
		}
100
		$this->showJson('done');
101
	}
102
}