-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrdql.php
121 lines (99 loc) · 3.23 KB
/
rdql.php
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?php
// ----------------------------------------------------------------------------------
// RAP Net API RDQL Query Operaton
// ----------------------------------------------------------------------------------
/**
* The RDQL query operation operation executes a RDQL query against a model.
*
* @version $Id: rdql.php 268 2006-05-15 05:28:09Z tgauss $
* @author Phil Dawes <[email protected]>
*
* @package netapi
* @todo nothing
* @access public
*/
function rdql($model,$serializer){
if (isset($_REQUEST['closure'])) {
if (strtoupper($_REQUEST['closure']) == "TRUE" ) {
$closure = True;
} else {
$closure = False;
}
} else {
$closure = False;
}
$query = $_REQUEST["query"];
// php appears to escape quotes, so unescape them
$query = str_replace('\"','"',$query);
$query = str_replace("\'","'",$query);
// decode %xx
$query =rawurldecode($query);
/// debug
//var_dump($query);
$r = new RdqlParser();
$parsedq = $r->parseQuery($query);
addMissingSelectVarsToQuery($parsedq);
if (is_a($model, 'MemModel')) {
$eng = new RdqlMemEngine();
} else {
$eng = new RdqlDbEngine();
}
$rdqlres = $eng->queryModel($model,$parsedq,TRUE);
$rdqlIter = new RdqlResultIterator($rdqlres);
$outm = new MemModel();
while ($rdqlIter->hasNext()) {
$result=$rdqlIter->next();
generateResultStatementsFromVarResult($result,$parsedq,$outm,$closure,$model);
}
echo $serializer->Serialize($outm);
$outm->close();
}
//
// What about bNodes? The bNode closure should also be added.
//
function generateResultStatementsFromVarResult(&$result,$parsedq, &$outm,$closure, &$model){
foreach ($parsedq['patterns'] as $n => $pattern) {
if (substr($pattern['subject']['value'], 0, 1) == '?')
$subj = $result[$pattern['subject']['value']];
else
$subj = new Resource($pattern['subject']['value']);
if (substr($pattern['predicate']['value'], 0, 1) == '?')
$pred = $result[$pattern['predicate']['value']];
else
$pred = new Resource($pattern['predicate']['value']);
if (substr($pattern['object']['value'], 0, 1) == '?')
$obj = $result[$pattern['object']['value']];
else {
if ($pattern['object']['is_literal']){
$obj = new Literal($pattern['object']['value']);
$obj->setDatatype($pattern['object']['l_dtype']);
$obj->setLanguage($pattern['object']['l_lang']);
} else {
$obj = new Resource($pattern['object']['value']);
}
}
$stmt = new Statement($subj,$pred,$obj);
// bNode closure
if (is_a($stmt->getObject(),'BlankNode') && $closure == True) {
getBNodeClosure($stmt->getObject(),$model,$outm);
}
if (is_a($stmt->getSubject(),'BlankNode') && $closure == True) {
getBNodeClosure($stmt->getSubject(),$model,$outm);
}
// Add statement to model
$outm->add($stmt);
}
}
// If there are variables used in the pattern but not
// in the select clause, add them to the select clause
function addMissingSelectVarsToQuery(&$parsedq){
foreach ($parsedq['patterns'] as $n => $pattern) {
foreach ($pattern as $key => $val_1)
if ($val_1['value']{0}=='?') {
if (!in_array($val_1['value'],$parsedq['selectVars'])){
array_push($parsedq['selectVars'],$val_1['value']);
}
}
}
}
?>