-
Notifications
You must be signed in to change notification settings - Fork 0
/
Query.php
153 lines (139 loc) · 4.33 KB
/
Query.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<?php
namespace librdf;
/* $Id: Query.php 171 2006-06-15 23:24:18Z das-svn $ */
/**
* Query, a representation of a query against a Model.
*
* PHP version 5
*
* Copyright (C) 2006, David Shea <david@gophernet.org>
*
* LICENSE: This package is Free Software and a derivative work of Redland
* http://librdf.org/. This package is not endorsed by Dave Beckett or the
* University of Bristol. It is licensed under the following three licenses as
* alternatives:
* 1. GNU Lesser General Public License (LGPL) V2.1 or any newer version
* 2. GNU General Public License (GPL) V2 or any newer version
* 3. Apache License, V2.0 or any newer version
*
* You may not use this file except in compliance with at least one of the
* above three licenses.
*
* See LICENSE.txt at the top of this package for the complete terms and futher
* detail along with the license tests for the licenses in COPYING.LIB, COPYING
* and LICENSE-2.0.txt repectively.
*
* @package LibRDF
* @author David Shea <david@gophernet.org>
* @copyright 2006 David Shea
* @license LGPL/GPL/APACHE
* @version Release: 1.0.0
* @link http://reallylongword.org/projects/librdf-php/
*/
/**
*/
use librdf\exception\Error;
use librdf\Model;
use librdf\QueryResults;
/**
* A wrapper around the query datatype.
*
* A query is created independent of any context and is then executed, using
* {@link execute}, against a particular model. A query can be executed
* multiple times and against multiple models. Results are represented as
* a {@link QueryResults} object.
*
* @package LibRDF
* @author David Shea <david@gophernet.org>
* @copyright 2006 David Shea
* @license LGPL/GPL/APACHE
* @version Release: 1.0.0
* @link http://reallylongword.org/projects/librdf-php/
*/
class Query
{
/**
* The underlying query resource.
*
* @var resource
* @access private
*/
private $query;
/**
* Create a new query.
*
* Query language is any language supported by rasqal, including "rdql",
* "sparql" and "triples".
*
* The syntax of the query is not checked until it is executed.
*
* @param string $query_string The contents of the query
* @param string $base_uri The base URI to use
* @param string $query_language The language of the query (default rdql)
* @param string $query_uri The URI of the query language or NULL
* @return void
* @throws Error If unable to create a new query
* @access public
*/
public function __construct($query_string, $base_uri=NULL,
$query_language="rdql", $query_uri=NULL)
{
if ($base_uri) {
$base_uri = new URI($base_uri);
}
if ($query_uri) {
$query_uri = new URI($query_uri);
}
$this->query = librdf_new_query(librdf_php_get_world(),
$query_language, ($query_uri ? $query_uri->getURI() : $query_uri),
$query_string, ($base_uri ? $base_uri->getURI() : $base_uri));
if (!$this->query) {
throw new Error("Unable to create a new query");
}
}
/**
* Free the query resources.
*
* @return void
* @access public
*/
public function __destruct()
{
if ($this->query) {
librdf_free_query($this->query);
}
}
/**
* Clone the query.
*
* Cloning may not be supported for all query types.
*
* @return void
* @throws Error If unable to clone the query
* @access public
*/
public function __clone()
{
$this->query = librdf_new_query_from_query($this->query);
if (!$this->query) {
throw new Error("Unable to create new query from query");
}
}
/**
* Run the query against a model.
*
* @param Model $model The model to query
* @return QueryResults The result of the query
* @throws Error If unable to execute the query
* @access public
*/
public function execute(Model $model)
{
$results = librdf_query_execute($this->query, $model->getModel());
if (!$results) {
throw new Error("Unable to execute query");
}
return QueryResults::makeQueryResults($results);
}
}
?>