Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 42
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
OntologyIndexService
0.00% covered (danger)
0.00%
0 / 42
0.00% covered (danger)
0.00%
0 / 4
210
0.00% covered (danger)
0.00%
0 / 1
 createIndex
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
20
 getIndexById
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
12
 getIndexes
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 getIndexesByClass
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2
3/**
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; under version 2
7 * of the License (non-upgradable).
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17 *
18 * Copyright (c) 2014 (original work) Open Assessment Technologies SA;
19 *
20 *
21 */
22
23namespace oat\tao\model\search\index;
24
25use core_kernel_classes_Class;
26use oat\generis\model\GenerisRdf;
27use oat\generis\model\OntologyRdfs;
28use oat\tao\model\TaoOntology;
29
30/**
31 * Index service
32 *
33 * @author Joel Bout <joel@taotesting.com>
34 */
35class OntologyIndexService
36{
37    /**
38     * Create a new index
39     *
40     * @param \core_kernel_classes_Property $property
41     * @param unknown $identifier
42     * @param \core_kernel_classes_Resource $tokenizer
43     * @param unknown $isFuzzyMatching
44     * @param unknown $isDefaultSearchable
45     * @return OntologyIndex
46     */
47    public static function createIndex(
48        \core_kernel_classes_Property $property,
49        $identifier,
50        \core_kernel_classes_Resource $tokenizer,
51        $isFuzzyMatching,
52        $isDefaultSearchable
53    ) {
54        $class = new \core_kernel_classes_Class(OntologyIndex::RDF_TYPE);
55        $existingIndex = self::getIndexById($identifier);
56        if (!is_null($existingIndex)) {
57            throw new \common_Exception('Index ' . $identifier . ' already in use');
58        }
59        // verify identifier is unused
60        $resource = $class->createInstanceWithProperties([
61            OntologyRdfs::RDFS_LABEL => $identifier,
62            OntologyIndex::PROPERTY_INDEX_IDENTIFIER => $identifier,
63            OntologyIndex::PROPERTY_INDEX_TOKENIZER => $tokenizer,
64            OntologyIndex::PROPERTY_INDEX_FUZZY_MATCHING => $isFuzzyMatching
65                ? GenerisRdf::GENERIS_TRUE
66                : GenerisRdf::GENERIS_FALSE,
67            OntologyIndex::PROPERTY_DEFAULT_SEARCH => $isDefaultSearchable
68                ? GenerisRdf::GENERIS_TRUE
69                : GenerisRdf::GENERIS_FALSE
70        ]);
71        $property->setPropertyValue(new \core_kernel_classes_Property(OntologyIndex::PROPERTY_INDEX), $resource);
72        return new OntologyIndex($resource);
73    }
74
75    /**
76     * Get an index by its unique index id
77     *
78     * @param string $identifier
79     * @throws \common_exception_InconsistentData
80     * @return OntologyIndex
81     */
82    public static function getIndexById($identifier)
83    {
84
85        $indexClass = new core_kernel_classes_Class(OntologyIndex::RDF_TYPE);
86        $resources = $indexClass->searchInstances([
87            OntologyIndex::PROPERTY_INDEX_IDENTIFIER  => $identifier
88            ], ['like' => false]);
89        if (count($resources) > 1) {
90            throw new \common_exception_InconsistentData("Several index exist with the identifier " . $identifier);
91        }
92        return count($resources) > 0
93            ? new OntologyIndex(array_shift($resources))
94            : null;
95    }
96
97    /**
98     * Get all indexes of a property
99     *
100     * @param \core_kernel_classes_Property $property
101     * @return multitype:OntologyIndex
102     */
103    public static function getIndexes(\core_kernel_classes_Property $property)
104    {
105        $indexUris = $property->getPropertyValues(new \core_kernel_classes_Property(OntologyIndex::PROPERTY_INDEX));
106        $indexes = [];
107
108        foreach ($indexUris as $indexUri) {
109            $indexes[] = new OntologyIndex($indexUri);
110        }
111
112        return $indexes;
113    }
114
115    /**
116     * Get the Search Indexes of a given $class.
117     *
118     * The returned array is an associative array where keys are the Property URI
119     * the Search Index belongs to, and the values are core_kernel_classes_Resource objects
120     * corresponding to Search Index definitions.
121     *
122     * @param \core_kernel_classes_Class $class
123     * @param boolean $recursive Whether or not to look for Search Indexes that belong to sub-classes of $class.
124     *                           Default is true.
125     * @return OntologyIndex[] An array of Search Index to $class.
126     */
127    public static function getIndexesByClass(\core_kernel_classes_Class $class, $recursive = true)
128    {
129        $returnedIndexes = [];
130
131        // Get properties to the root class hierarchy.
132        $properties = $class->getProperties(true);
133
134        foreach ($properties as $prop) {
135            $propUri = $prop->getUri();
136            $indexes = self::getIndexes($prop);
137
138            if (count($indexes) > 0) {
139                if (isset($returnedIndexes[$propUri]) === false) {
140                    $returnedIndexes[$propUri] = [];
141                }
142
143                foreach ($indexes as $index) {
144                    $returnedIndexes[$propUri][] = new OntologyIndex($index->getUri());
145                }
146            }
147        }
148
149        return $returnedIndexes;
150    }
151}