blob: e936bf942e10f9e4e83037d4dfe73eb2b0616e38 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
<?php
namespace SMW\SQLStore\QueryEngine\DescriptionInterpreters;
use SMW\DIProperty;
use SMW\Query\Language\ClassDescription;
use SMW\Query\Language\Description;
use SMW\SQLStore\QueryEngine\DescriptionInterpreter;
use SMW\SQLStore\QueryEngine\QuerySegment;
use SMW\SQLStore\QueryEngine\QuerySegmentListBuilder;
/**
* @license GNU GPL v2+
* @since 2.2
*
* @author Markus Krötzsch
* @author Jeroen De Dauw
* @author mwjames
*/
class ClassDescriptionInterpreter implements DescriptionInterpreter {
/**
* @var QuerySegmentListBuilder
*/
private $querySegmentListBuilder;
/**
* @since 2.2
*
* @param QuerySegmentListBuilder $querySegmentListBuilder
*/
public function __construct( QuerySegmentListBuilder $querySegmentListBuilder ) {
$this->querySegmentListBuilder = $querySegmentListBuilder;
}
/**
* @since 2.2
*
* @return boolean
*/
public function canInterpretDescription( Description $description ) {
return $description instanceof ClassDescription;
}
/**
* @since 2.2
*
* @param Description $description
*
* @return QuerySegment
*/
public function interpretDescription( Description $description ) {
$query = new QuerySegment();
$cqid = QuerySegment::$qnum;
$cquery = new QuerySegment();
$cquery->type = QuerySegment::Q_CLASS_HIERARCHY;
$cquery->joinfield = [];
$cquery->depth = $description->getHierarchyDepth();
foreach ( $description->getCategories() as $category ) {
$categoryId = $this->querySegmentListBuilder->getStore()->getObjectIds()->getSMWPageID(
$category->getDBkey(),
NS_CATEGORY,
$category->getInterwiki(),
''
);
if ( $categoryId != 0 ) {
$cquery->joinfield[] = $categoryId;
}
}
if ( count( $cquery->joinfield ) == 0 ) { // Empty result.
$query->type = QuerySegment::Q_VALUE;
$query->joinTable = '';
$query->joinfield = '';
} else { // Instance query with disjunction of classes (categories)
$query->joinTable = $this->querySegmentListBuilder->getStore()->findPropertyTableID( new DIProperty( '_INST' ) );
$query->joinfield = "$query->alias.s_id";
$query->components[$cqid] = "$query->alias.o_id";
$this->querySegmentListBuilder->addQuerySegment( $cquery );
}
return $query;
}
}
|