xref: /template/strap/ComboStrap/Search.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace ComboStrap;
4*04fd306cSNickeau
5*04fd306cSNickeauuse action_plugin_combo_linkwizard;
6*04fd306cSNickeau
7*04fd306cSNickeau/**
8*04fd306cSNickeau * Function that supports the internal search functions
9*04fd306cSNickeau */
10*04fd306cSNickeauclass Search
11*04fd306cSNickeau{
12*04fd306cSNickeau
13*04fd306cSNickeau    /**
14*04fd306cSNickeau     * @param $searchTermWords
15*04fd306cSNickeau     * @param array $columns
16*04fd306cSNickeau     * @return array - the parametrized sql and the parameters
17*04fd306cSNickeau     */
18*04fd306cSNickeau    public static function getPageRowsSql($searchTermWords, array $columns = ["h1", "title", "name"]): array
19*04fd306cSNickeau    {
20*04fd306cSNickeau        $sqlParameters = [];
21*04fd306cSNickeau        $sqlPredicates = [];
22*04fd306cSNickeau        foreach ($searchTermWords as $searchTermWord) {
23*04fd306cSNickeau            if (strlen($searchTermWord) < action_plugin_combo_linkwizard::MINIMAL_WORD_LENGTH) {
24*04fd306cSNickeau                continue;
25*04fd306cSNickeau            }
26*04fd306cSNickeau            $pattern = "%$searchTermWord%";
27*04fd306cSNickeau            $sqlPatternPredicates = [];
28*04fd306cSNickeau            foreach ($columns as $column) {
29*04fd306cSNickeau                $sqlParameters[] = $pattern;
30*04fd306cSNickeau                $sqlPatternPredicates[] = "$column like ? COLLATE NOCASE";
31*04fd306cSNickeau            }
32*04fd306cSNickeau            $sqlPredicates[] = "(" . implode(" or ", $sqlPatternPredicates) . ")";
33*04fd306cSNickeau        }
34*04fd306cSNickeau        $sqlPredicate = implode(" and ", $sqlPredicates);
35*04fd306cSNickeau        $searchTermSql = <<<EOF
36*04fd306cSNickeauselect id as "id" from pages where $sqlPredicate order by name
37*04fd306cSNickeauEOF;
38*04fd306cSNickeau        return [$searchTermSql, $sqlParameters];
39*04fd306cSNickeau    }
40*04fd306cSNickeau
41*04fd306cSNickeau    /**
42*04fd306cSNickeau     * @param $searchTerm
43*04fd306cSNickeau     * @param array $columns
44*04fd306cSNickeau     * @return MarkupPath[]
45*04fd306cSNickeau     */
46*04fd306cSNickeau    public static function getPages($searchTerm, array $columns = ["h1", "title", "name"]): array
47*04fd306cSNickeau    {
48*04fd306cSNickeau        $minimalWordLength = action_plugin_combo_linkwizard::MINIMAL_WORD_LENGTH;
49*04fd306cSNickeau        if (strlen($searchTerm) < $minimalWordLength) {
50*04fd306cSNickeau            return [];
51*04fd306cSNickeau        }
52*04fd306cSNickeau        $searchTermWords = StringUtility::getWords($searchTerm);
53*04fd306cSNickeau        if (sizeOf($searchTermWords) === 0) {
54*04fd306cSNickeau            return [];
55*04fd306cSNickeau        }
56*04fd306cSNickeau        try {
57*04fd306cSNickeau            $sqlite = Sqlite::createOrGetSqlite();
58*04fd306cSNickeau        } catch (ExceptionSqliteNotAvailable $e) {
59*04fd306cSNickeau            return [];
60*04fd306cSNickeau        }
61*04fd306cSNickeau        [$searchTermSql, $sqlParameters] = self::getPageRowsSql($searchTermWords, $columns);
62*04fd306cSNickeau        $request = $sqlite
63*04fd306cSNickeau            ->createRequest()
64*04fd306cSNickeau            ->setQueryParametrized($searchTermSql, $sqlParameters);
65*04fd306cSNickeau        $pages = [];
66*04fd306cSNickeau        try {
67*04fd306cSNickeau            $rows = $request
68*04fd306cSNickeau                ->execute()
69*04fd306cSNickeau                ->getRows();
70*04fd306cSNickeau            foreach ($rows as $row) {
71*04fd306cSNickeau                $pages[] = MarkupPath::createMarkupFromId($row["id"]);
72*04fd306cSNickeau            }
73*04fd306cSNickeau            return $pages;
74*04fd306cSNickeau        } catch (ExceptionCompile $e) {
75*04fd306cSNickeau            LogUtility::msg("Error while trying to retrieve a list of pages", LogUtility::LVL_MSG_ERROR, action_plugin_combo_linkwizard::CANONICAL);
76*04fd306cSNickeau            return $pages;
77*04fd306cSNickeau        } finally {
78*04fd306cSNickeau            $request->close();
79*04fd306cSNickeau        }
80*04fd306cSNickeau    }
81*04fd306cSNickeau}
82