The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>RDF::Query</title>
	<style type="text/css">
		.list {
			display: block;
			margin: 0 2em;
			font-family: monospace;
		}
	</style>
</head>
<body>
	<h1>RDF::Query - A SPARQL 1.1 Query implementation for use with RDF::Trine.</h1>
	<p>RDF::Query allows RDQL and SPARQL queries to be run against an RDF model, returning rows of matching results.</p>
	
	<h2>Requirements</h2>
		<p>To install RDF::Query you'll need the following perl modules installed:</p>
		<ul>
			<li>Data::UUID</li>
			<li>Digest::SHA</li>
			<li>DateTime</li>
			<li>DateTime::Format::W3CDTF</li>
			<li>Error</li>
			<li>File::Spec</li>
			<li>File::Temp</li>
			<li>I18N::LangTags</li>
			<li>JSON</li>
			<li>List::Util</li>
			<li>LWP</li>
			<li>Parse::RecDescent</li>
			<li>RDF::Trine</li>
			<li>Scalar::Util</li>
			<li>Set::Scalar</li>
			<li>Storable</li>
			<li>URI</li>
		</ul>
		<p>The following additional modules are recommended for some functionality:</p>
		<ul>
			<li>Geo::Distance</li>
		</ul>
	<h2 id="installing">Installing RDF::Query</h2>
		<p>To install, run:</p>
		<div class="list">
			perl Makefile.PL<br />
			make<br />
			make test<br />
			make install<br />
		</div>
	<h2 id="changelog">Version History</h2>
		<h3 id="v2_909">Version 2.909 (2012-11-24)</h3>
			<ul>
				<li>Bug Fixes
					<ul>
						<li>Fixed bad sparql serialization of filters with equality tests; was using '==' instead of '=' (github issue 53).</li>
						<li>Fixed bug in RDF::Query::Algebra::Service->referenced_variables.</li>
						<li>Fixed bug that wasn't passing the active graph to EXISTS filter evaluation.</li>
						<li>Fixed RDF::Query prepare and execute methods to properly localize the model object.</li>
						<li>Fixed bug in RDQL parser that mistakenly required a USING clause (github issue 70).</li>
						<li>Fixed handling of aggregates over empty groups.</li>
					</ul></li>
				<li>New Features
					<ul>
						<li>Added support for VALUES graph pattern (in-place BINDINGS).</li>
						<li>Added support for UUID() and STRUUID() functions.</li>
						<li>Added is_update() and specifies_update_dataset() methods to RDF::Query.</li>
						<li>Accept common typo of SEPARATOR in SPARQL 1.1 parser ("SEPERATOR") with constructor arg 'allow_typos' in RDF::Query::Parser::SPARQL11.</li>
					</ul></li>
				<li>Enhancements
					<ul>
						<li>Fixed SPARQL 1.1 parsing to enforce not using shared bnode labels between update data operations.</li>
						<li>Improved SPARQL 1.1 parser detection of invalid use of BIND() (when binding already in-scope variables).</li>
						<li>Fixed bug in SPARQL 1.1 parser to recognize legal Update operations.</li>
						<li>Updated SPARQL 1.1 parser to allow colon in local part of a prefixname.</li>
						<li>Updated STRBEFORE() and STRAFTER() implementations to track SPARQL 1.1 standard.</li>
						<li>Updated property path implementation to track W3C standard (changed counting semantics and dropped {m,n} form).</li>
						<li>Added support to passthrough query eval to the model if supported and the 'allow_passthrough' option is set on the query object.</li>
						<li>Added 'canonicalize' option to RDF::Query constructor to canonicalize literal values.</li>
					</ul></li>
				<li>Other
					<ul>
						<li>Updated handling of BIND() in the SPARQL 1.1 parser to match the latest spec semantics.</li>
						<li>Added ability to run tests of type mf:CSVResultFormatTest.</li>
						<li>Fixed config handling in rqsh to allow the use of hexastore backends.</li>
						<li>Merged Log4perl initialization cleanup patches (from github/kba).</li>
						<li>Use $plan->explain instead of $plan->sse for "explain" rqsh command.</li>
						<li>Updated EARL IRIs in bin/failing_earl_tests.sh and bin/passing_earl_tests.sh.</li>
						<li>Removed RDF::Redland recommendation in Makefile.PL.</li>
						<li>Added doap:implements statements, and updated release data to doap.rdf.</li>
						<li>Updated RDF::Query::Util::cli_parse_args to allow no-argument setup.</li>
						<li>Updated xt/dawg/earl.pl to use new EARL IRIs earl:passed and earl:failed.</li>
						<li>Added POD to bin/rqsh.</li>
						<li>Updated DAWG test harnesses to support expected query bindings results in RDF/XML format.</li>
						<li>Fixed xt/dawg-eval11.t to emit TAP failures when query parsing fails.</li>
						<li>Require RDF::Endpoint 0.05 in xt/dawg-eval11.t.</li>
						<li>Removed values from test directory list in xt/dawg-eval11.t.</li>
						<li>Added values to list of test directories in xt/dawg-eval11.t.</li>
						<li>Added exists test directory to xt/dawg-eval11.t.</li>
						<li>Added test case confirming bad sparql serialization of equality testing filters (github issue 53).</li>
						<li>Removed tests for {m,n} property path forms.</li>
						<li>Fixed RDF::Query::Algebra::Project to throw exception on bad constructor arguments.</li>
						<li>Added bugtracker info to Makefile.PL.</li>
						<li>Added POD marking modules as unstable: RDF::Query::BGPOptimizer, RDF::Query::Compiler::SQL, RDF::Query::Federate, RDF::Query::Federate::Plan</li>
						<li>Improved expected/actual results output when encountering failing tests.</li>
						<li>Removed old bloom-filter federation code.</li>
						<li>Removed RDF::Query::ExecutionContext->base method.</li>
						<li>Fix POD in RDF::Query::Algebra::Table.</li>
					</ul></li>
			</ul>
		<h3 id="v2_908">Version 2.908 (2012-01-31)</h3>
			<ul>
				<li>Bug Fixes
					<ul>
						<li>Fixed SPARQL serialization of expressions using &amp;&amp; and ||.</li>
						<li>Fixed SPARQL 1.1 parser to support "GRAPH&lt;iri&gt;" without whitespace.</li>
						<li>Fixed bug resulting in false positive error when projecting expressions with aggregates.</li>
						<li>Fixed aggregate evaluation to result in unbound variables on error (instead of dropping the result).</li>
						<li>Fixed numeric divide operation to return xsd:decimal when operands are xsd:integers.</li>
						<li>Fixed RDF::Query::Expression::Binary->evaluate to properly throw on div-by-zero.</li>
						<li>Fixed RDF::Query::Expression::Function->evaluate to propogate type errors in IF().</li>
						<li>Fixed bin/rqsh to handle queries that use BASE.</li>
						<li>Fixed bug in RDF::Query::Plan::Join::PushDownNestedLoop that produced invalid results when the RHS was a subselect.</li>
						<li>Fixed RDF::Query::Algebra::Filter->as_sparql to handle variation of serialization of the child pattern.</li>
						<li>Fixed bug in SPARQL 1.1 parser that mistakenly introduced aggregate operations in non-aggregate queries.</li>
					</ul></li>
				<li>New Features
					<ul>
						<li>Added support for Service as a binary op (allowing variable-endpoint SERVICE blocks).</li>
						<li>Added implementations for functions STRBEFORE, STRAFTER, and REPLACE.</li>
						<li>Added RDF::Query->prepare_with_named_graphs method.</li>
						<li>Added support for COPY and MOVE operations.</li>
						<li>Allow percent encoding and backslash escaping in prefix names.</li>
					</ul></li>
				<li>Enhancements
					<ul>
						<li>Fixed RDF::Query::Expression::Binary to canonicalize numeric literal results.</li>
						<li>Added syntax support for SILENT form of LOAD.</li>
						<li>Added support for SILENT and variable endpoint handling for SERVICE patterns.</li>
						<li>Added syntax support for optional GRAPH keyword on SPARQL 1.1 update shortcuts.</li>
						<li>Updated RDF::Query::Plan::Extend to copy variable bindings instead of using the existing reference.</li>
						<li>Added RDF::Query::Plan::Extend->explain.</li>
						<li>Changed explain() syntax of plan quads.</li>
						<li>Updated plan classes to optionally register intermediate results with a execution delegate object.</li>
						<li>Made RDF::Query::Plan::Construct uniq the returned triples.</li>
						<li>Added custom RDF::Query::Plan::Construct->explain method.</li>
						<li>Normalize language tags used in SPARQL query syntax to lowercase.</li>
						<li>Modularize RDF::Query::Plan::Service to allow mock testing.</li>
						<li>Added exception handling in RDF::Query->set_error.</li>
						<li>Added subplans_of_type method to Plan classes.</li>
						<li>Fixed use of '__DEFAULT__' sentinel value in RDF::Query::Plan, RDF::Query::Plan::Service, RDF::Query::Node::Resource->as_sparql, and RDF::Query->as_sparql.</li>
						<li>Force the planner to avoid using a bind-join when the RHS contains a Service subplan (to avoid a DOS attack on the remote endpoint).</li>
						<li>Updated DATATYPE() to return rdf:langString on language-tagged literals (per RDF 1.1 change).</li>
						<li>Fixed sse serialization in RDF::Query::Algebra::Service to handle binary op (variable endpoint) form.</li>
						<li>Croak rather than die in some places, confess and use logdie in one place</li>
						<li>Allow aggregates in ORDER BY clause.</li>
					</ul></li>
				<li>Other
					<ul>
						<li>Added examples/query_url.pl.</li>
						<li>Added RDF::Trine::Error::UnimplementedError exception class.</li>
						<li>Updated required version of RDF::Trine to 0.138.</li>
					</ul></li>
			</ul>
		<h3 id="v2_907">Version 2.907 (2011-06-04)</h3>
			<ul>
				<li>Bug Fixes
					<ul>
						<li>Fixed bug in SPARQL 1.1 parser for DESCRIBE queries without a WHERE clause.</li>
						<li>Fixed join ordering bug for queries with a BINDINGS clause and several joins.</li>
						<li>Fixed RDF::Query->as_sparql for DESCRIBE queries which project URI terms, not variables.</li>
					</ul></li>
				<li>Other
					<ul>
						<li>Fixed expected test results for DESCRIBE queries without a WHERE clause.</li>
						<li>examples/query.pl now emits a warning if the query object cannot be constructed.</li>
					</ul></li>
			</ul>
		<h3 id="v2_906">Version 2.906 (2011-05-14)</h3>
			<ul>
				<li>API Changes
					<ul>
						<li>Globally changed 'base' to 'base_uri' in code and API.</li>
					</ul></li>
				<li>Bug Fixes
					<ul>
						<li>Fixed SPARQL serialization in RDF::Query::Plan generation of SERVICE blocks to always include braces around the query body.</li>
						<li>Fixed SPARQL 1.1 parsing bug in property paths using alternatives ('|').</li>
						<li>Fixed SPARQL 1.1 bug in parsing prefixnames where a graph term is expected.</li>
						<li>Fixed bug in ZeroOrMore reverse path handling (patterns matching { var path* term }).</li>
						<li>Fixed bug in RDF::Query::Node::Literal::_cmp that was causing wrong node comparison results.</li>
						<li>Fixed bug in parsing solution modifiers in CONSTRUCT and DESCRIBE queries.</li>
						<li>Fixed bug in handling of unbound variables in delete templates in RDF::Query::Plan::Update.</li>
						<li>Fixed bug in calls to RDF::Query->var_or_expr_value that was preventing use of EXISTS filters in project expressions.</li>
					</ul></li>
				<li>New Features
					<ul>
						<li>Updated RDF::Query::Plan::Iterator->new to allow passing in a callback that will return an iterator, instead of an iterator directly.</li>
						<li>Updated RDF::Query->query_plan to delegate entire queries to the RDF::Trine::Model when possible.</li>
						<li>Updated bin/deparse.pl to allow specifying an endpoint url for SPARQL-backed models (which can affect the query plan).</li>
						<li>Added support for empty SPARQL 1.1 Update sequence operations (allowing no-op updates).</li>
						<li>Added options to RDF::Query->new to allow forcing RDF::Query to disable query delegation to the underlying store.</li>
						<li>Added option to RDF::Query::Util::cli_parse_args to specify arbitrary options to be supplied to the RDF::Query->new constructor.</li>
						<li>Added new, cleaner line-based "explain" format for serializing query Plan and Algebra objects.</li>
						<li>Added bindings accessor and is_unit method to RDF::Query::Plan::Constant.</li>
						<li>Added ability to forcibly remove a particular join algorithm from consideration in plan generation.</li>
						<li>Added 'execute' command in rqsh to allow loading a query from a file or URL.</li>
					</ul></li>
				<li>Enhancements
					<ul>
						<li>Updated SPARQL 1.1 parser to prevent bnode use in DELETE blocks.</li>
						<li>Updated rqsh to associate common filename extensions with media types (helps in loading local files).</li>
						<li>Updated RDF::Query::Plan::Path to align with new ALP algorithm from the spec text.</li>
						<li>Added some simple statistics generation code in RDF::Query::Plan::Join subclasses.</li>
						<li>Added missing implementation for property paths using {n,} modifier syntax.</li>
						<li>Added code to guard against mishandling unbound/blank/variable nodes in DELETE templates in RDF::Query::Plan::Update.</li>
					</ul></li>
				<li>Other
					<ul>
						<li>Updated tests to use new RDF::Trine::Iterator->seen_count method instead of deprecated count method.</li>
						<li>Updated serialization text for zero-length paths in RDF::Query::Plan::Path->plan_node_data.</li>
						<li>Removed warning of unknown options passed to RDF::Query->new.</li>
						<li>Removed unused projection code in RDF::Query->execute_plan.</li>
						<li>Removed Digest::SHA1 from prereq modules, and updated code to use Digest::SHA instead.</li>
						<li>Remove the meaningless "All rights reserved" copyright text.</li>
						<li>Fixed test count in t/sparql11-propery_paths.t.</li>
						<li>Commented out noisy debugging output in RDF::Query::Plan::Path.</li>
						<li>Added trace debugging in RDF::Query::Plan::Sort.</li>
						<li>Added options instance variable to RDF::Query::ExecutionContext.</li>
						<li>Added Module::Pluggable to list of required modules in Makefile.PL.</li>
						<li>Added mappings from file extensions to media types in dawg test scripts.</li>
						<li>Various updates to SPARQL 1.1 dawg test harness scripts.</li>
					</ul></li>
			</ul>
		<h3 id="v2_905">Version 2.905 (2011-02-18)</h3>
			<ul>
				<li>Bug Fixes
					<ul>
						<li>Fixed mistaken case sensitivity of COALESCE, BNODE, CONCAT, and SUBSTR keywords in SPARQL 1.1 parser.</li>
						<li>Fixed parsing ambiguity between MIN aggregate and MINUTES function.</li>
						<li>Fixed Xpath fn:timezone-from-dateTime function return for UTC timezones.</li>
						<li>Fixed RDF::Query::Algebra::Project->as_sparql handling of binary select expressions.</li>
						<li>Fixed RDF::Query::Algebra::Construct->sse serialization to include construct triples.</li>
						<li>Updated handling of BIND() to not close group scope (which was applying filters in the wrong place).</li>
						<li>Fixed RDF::Query::Parser::SPARQL11 to handle whitespace between tokens in 'INSERT DATA' and 'DELETE DATA'.</li>
						<li>Fixed RDF::Query::Parser::SPARQL11 to handle empty ModifyTemplates.</li>
						<li>Fixed SPARQL 1.1 parser to properly set relevant datasets for update operations.</li>
						<li>Fixed plan code for zero-length paths to return RDF::Query::Node-based results (not Trine-based).</li>
						<li>Fixed bug in RDF::Query::Plan::Clear when attempting to clear the default graph.</li>
						<li>Fixed exception throwing on numeric binary expression eval without numeric literal arguments.</li>
						<li>Updated RDF::Query::Plan to handle update operations with different datasets for matching (USING clause).</li>
					</ul></li>
				<li>New Features
					<ul>
						<li>Added SPARQL 1.1 numeric functions: ABS, CEIL, FLOOR, ROUND, RAND</li>
						<li>Added SPARQL 1.1 string functions: CONCAT, SUBSTR, STRLEN, UCASE, LCASE, ENCODE_FOR_URI, CONTAINS, STRSTARTS, STRENDS</li>
						<li>Added SPARQL 1.1 date functions: NOW, TIMEZONE, TZ, YEAR, MONTH, DAY, HOURS, MINUTES, SECONDS</li>
						<li>Added SPARQL 1.1 hashing functions: MD5, SHA1, SHA224, SHA256, SHA384, and SHA512</li>
						<li>Added RDF::Query::Functions->install_function method, and implementations for fn:compare, fn:concat, and fn:substring.</li>
						<li>Updated RDF::Query->execute_with_named_graphs to accept optional arguments to be passed to execute().</li>
						<li>Added support for CONSTRUCT WHERE syntax shortcut.</li>
						<li>Added support for SILENT modifier to SERVICE patterns.</li>
						<li>Added SILENT flag in RDF::Query::Algebra::Service.</li>
						<li>Added initial code to create SPIN serializations of queries.</li>
						<li>Added RDF::Query::Node::Literal->type_list method.</li>
					</ul></li>
				<li>Enhancements
					<ul>
						<li>Updated xt/dawg-syntax11.t to find more syntax queries in the dawg test data.</li>
						<li>SPARQL 1.1 parser now throws errors for more classes of syntactically invalid queries (repeated expression aliases, wrong number of BINDINGS values, SELECT * with use of grouping).</li>
						<li>Added support for non-strict comparisons of xsd:strings in RDF::Query::Node::Literal (based on $LAZY_COMPARISONS variable).</li>
					</ul></li>
				<li>Other
					<ul>
						<li>Major refactor of xt/dawg-eval11.t test harness.</li>
						<li>Updated required version of Test::More to 0.88 (0.86 doesn't have done_testing() used in t/store-config.t).</li>
						<li>Updated RDF::Query::Expression::Function->evaluate to throw an error if no function coderef is found.</li>
					</ul></li>
			</ul>
		<h3 id="v2_904">Version 2.904 (2010-11-23)</h3>
			<ul>
				<li>Added 'set prefix' and 'time' commands to rqsh.</li>
				<li>Added string concatenation overloading of binary +.</li>
				<li>Fixed bug in property path evaluation on encountering blank path nodes.</li>
				<li>Fixed use of binary '*' in FILTER without numeric data in t/resultforms.t.</li>
				<li>Fixed bin/dawg11-status.pl to only load SPARQL 1.1 earl result files.</li>
				<li>Fixed RDF::Query::Plan::Update to ignore non-ground triples (unbound variables don't act as wildcards).</li>
				<li>Fixed handling of named graph data in insert/delete patterns of update operations.</li>
				<li>Updated RDF::Query::Util to use RDF::Trine::Model->temporary_model and guess an appropriate parser based on filenames.</li>
				<li>Updated namespace URI in RDF::Query::Functions::Jena to &lt;http://jena.hpl.hp.com/ARQ/function#&gt;.</li>
				<li>Updated namespace URI in RDF::Query::Functions::Xpath to &lt;http://www.w3.org/2005/xpath-functions#&gt;.</li>
				<li>Updated xt/dawg-eval11.t to align with updated test case manifest schemas.</li>
				<li>Updated xt/dawg-eval11.t to prevent test cases with missing files from emitting failures (now skipped).</li>
				<li>Added xpath function implementations.</li>
				<li>Added SPARQL 1.1 Update shortcut syntax support for COPY, MOVE, and ADD graph operations.</li>
				<li>Fixed bug in RDF::Query::Plan::Construct that wasn't giving each result a new set of blank nodes (RT 63155).</li>
				<li>Updated SYNOPSIS and execute() and execute_plan() methods POD (RT 63153 comment from Ivan Shmakov).</li>
				<li>Updated documentation to explicitly discuss inherited methods due to subclassing.</li>
				<li>Fixed RDF::Query::Algebra::Sequence->sse to serialize operations in proper order.</li>
				<li>Added $silent argument to RDF::Query::Algebra::Clear constructor.</li>
			</ul>
		<h3 id="v2_903">Version 2.903 (2010-11-03)</h3>
			<ul>
				<li>SPARQL 1.1
					<ul>
						<li>New features
							<ul>
								<li>Added support for BIND(expr AS ?var) operator.</li>
								<li>Added isNumeric built-in function, checking for proper datatype and valid lexical forms for numerics.</li>
							</ul>
						</li>	
						<li>Updates
							<ul>
								<li>Updated SPARQL 1.1 parser to handle WITH clauses with PrefixedNames.</li>
								<li>SPARQL 1.1 parser now sets error and returns if no query string is supplied.</li>
								<li>Added more exception handling in RDF::Query::Parser::SPARQL11.</li>
								<li>Updated CLEAR and DROP handling in SPARQL 1.1 parser and engine to handle 'NAMED' and 'ALL' variants.</li>
								<li>Renamed 'binding_variables' methods to 'potentially_bound' to align with current SPARQL 1.1 terminology.</li>
								<li>Results returned by property path plans are now RDF::Query::VariableBindings objects and are properly projected.</li>
								<li>The query planner now interprets simple paths as basic graph patterns.</li>
								<li>Removed Algebra and Plan classes for Not and Exists operations (now handled in other classes).</li>
								<li>Updated RDF::Query::Plan::Extend to drop the extended variable binding if evaluating the extension yields an error.</li>
								<li>Updated RDF::Query::Plan::Update to accept delete patterns with variables.</li>
								<li>Updated subquery plan objects to use a sub-plan, not a full query object.</li>
							</ul>
						</li>
						<li>Bug fixes
							<ul>
								<li>Fixed SPARQL 1.1 parser bug that was returning partial data from a failed parse call.</li>
								<li>Fixed SPARQL 1.1 parser bug for queries with multiple FILTERs in a GGP including an EXISTS filter.</li>
								<li>Fixed SPARQL 1.1 parser bug for DROP/CLEAR queries.</li>
								<li>Fixed SPARQL 1.1 parser typo of 'SEPARATOR' argument to GROUP_CONCAT aggregate.</li>
								<li>Fixed SPARQL 1.1 parser to handle FITLERS to the left of MINUS/OPTIONAL and allow projecting '*' with other vars/epressions.</li>
								<li>Fixed SPARQL 1.1 parser case sensitivity of project expression 'AS' token.</li>
								<li>Fixed SPARQL 1.1 parser handling of of subqueries within GRAPH blocks.</li>
								<li>Fixed miscellaneous bugs and improved performance of parsing SPARQL 1.1 queries.</li>
								<li>Made parsing of very large triple blocks non-recursive in SPARQL 1.1 parser.</li>
								<li>Fixed COALESCE function to handle errors properly.</li>
								<li>Fixed RDF::Query::Plan::Aggregate to extend results using AliasExpressions from HAVING clauses.</li>
								<li>Fixed bug that was ignoring GROUP BY clauses when no aggregate operations were present.</li>
								<li>Fixed bad looping on start node of unbounded property paths.</li>
								<li>Fixed bug in query planning of '^' property paths.</li>
								<li>Fixed zero-length property path evaluation within GRAPH blocks.</li>
								<li>Removed plan duplication of zero-length case in '*' property paths.</li>
								<li>Fixed handling of named graphs within subqueries (changes to active graph handling in the query planner).</li>
								<li>Fixed type-promotion and handling of numeric types in aggregate handling.</li>
								<li>Fixed RDF::Query::Algebra::Update->as_sparql to handle INSERT/DELETE updates properly.</li>
								<li>Fixed RDF::Query::Plan::Aggregate->sse to allow handling of (non-blessed, scalar) '*' columns.</li>
							</ul>
						</li>
					</ul>
				</li>
				<li>Query Engine
					<ul>
						<li>Added ability to pass through arguments to the query planner in RDF::Query->prepare.</li>
						<li>Updated RDF::Query::Node::Literal::_cmp to handle literals that fail to parse as DateTime objects.</li>
						<li>Updated RDF::Query::Plan::Limit to use the limit accessor internally.</li>
						<li>RDF::Query::Plan::NamedGraph now uses lazy iterator for graph names.</li>
						<li>Updated RDF::Query::VariableBindings to subclass the new RDF::Trine::VariableBindings.</li>
						<li>RDF::Query::Algebra::Project now implements bind_variables().</li>
						<li>Updated RDF::Query->describe to use $model->bounded_description instead of simply outgoing arcs.</li>
						<li>Fixed bug in evaluation of function expressions in which the execution context object was lost (causing EXISTS filters to fail).</li>
						<li>Fixed optimization of COUNT(*) over 1-triple BGPs to keep the variable binding for the pseudo-variable ?COUNT(*).</li>
						<li>Fixed sse serialization in RDF::Query::Algebra::Distinct.</li>
						<li>Fixed RDF::Query::Plan::Join::PushDownNestedLoop to close sub-plans in close() method.</li>
					</ul>
				</li>
				<li>rqsh - RDF::Query Shell
					<ul>
						<li>Added ability to show the parsed algebra with 'parse' command.</li>
						<li>Added abiility to show the query execution plan with the 'explain' command.</li>
						<li>Added ability to change the RDF serializer with the 'serializer' command.</li>
						<li>Added ability to initialize new stores with the 'init' command.</li>
						<li>Added ability to change underlying store with the 'use' command.</li>
						<li>Added 'help' command.</li>
						<li>Updated packaging to install rqsh script (renamed from old bin/rqsh.pl).</li>
						<li>Updated to catch errors thrown while trying to create new storage backends (e.g. DBI->connect failing).</li>
						<li>rqsh now defaults to read-write models.</li>
						<li>rqsh now sets a base URI for the current working directory.</li>
						<li>Password input now doesn't echo to the terminal.</li>
						<li>Filename input now autocompletes via Term::ReadLine.</li>
					</ul>
				</li>
				<li>Warning and Error Handling
					<ul>
						<li>Replaced calls to die with throwing exceptions.</li>
						<li>RDF::Query->new now warns about unrecognized options.</li>
						<li>DATATYPE() now throws an exception unless passed a valid node object.</li>
						<li>RDF::Query::Expresion::Binary now throws exceptions on numeric comparisions with non-numeric operands.</li>
						<li>Fixed error message in RDF::Query::Plan::NamedGraph.</li>
						<li>Added trace debugging to RDF::Query::Plan::Union.</li>
						<li>Added trace debugging to RDF::Query::Plan::Project.</li>
						<li>Added trace debugging to RDF::Query::Plan::Path.</li>
					</ul>
				</li>
				<li>Tests and Miscellany
					<ul>
						<li>Added SPARQL 1.1 syntax and eval test harnesses.</li>
						<li>Fixed bug in xt/dawg-eval11.t parsing of srx files containing literal values that evaluate to false in perl (e.g. '0').</li>
						<li>Fixed turtle output for rdfs:comments in xt/dawg/earl.pl.</li>
						<li>Moved developer tests from t/ to xt/.</li>
						<li>Refactored RDF::Query::Functions into several auto-loaded sub-packages via Module::Pluggable (patch from tobyink).</li>
						<li>Removed references to the now-deprecated mac.com in network-based tests.</li>
						<li>Updated expected values in t/queryform-describe.t for results using bounded descriptions.</li>
						<li>Updated RDF::Query::Util to look for .prefix-cmd cache of common namespace names.</li>
						<li>Updated RDF::Query::Util::cli_parse_args to accept '-r' as a read-only flag.</li>
						<li>Updated required version of RDF::Trine to 0.126.</li>
						<li>Updated to use URI 1.52 to allow direct usage of IRIs without unicode workarounds.</li>
						<li>Made code updates to improve performance based on profiling.</li>
					</ul>
				</li>
			</ul>
		<h3 id="v2_902">Version 2.902 (2010-07-02)</h3>
			<ul>
				<li>Fixed bug in requiring prerequisite modules.</li>
			</ul>
		<h3 id="v2_901">Version 2.901 (2010-06-29)</h3>
			<ul>
				<li>Fixed named graph handling.</li>
				<li>Fixed bug in handling of * aggregates.</li>
				<li>Simplified code to create new temporary models when FROM clauses dereference graph data.</li>
				<li>Added support for SPARQL 1.1 CREATE/DROP GRAPH update operations.</li>
				<li>Fixed infinite loop bug on parsing certain invalid SPARQL 1.1 update queries.</li>
				<li>Fixed handling of BGPs within named graphs in RDF::Query::Plan::BasicGraphPattern.</li>
				<li>Updated syntax error exception messages in SPARQL parsers.</li>
				<li>Fixed property path evaluation within named graphs.</li>
				<li>Converted Makefile.PL to properly use Module::Install.</li>
			</ul>
		<h3 id="v2_900">Version 2.900 (2010-06-23)</h3>
			<ul>
				<li>Major Changes
					<ul>
						<li>SPARQL 1.1 is now the default query parser.</li>
						<li>RDF::Core is no longer supported as a backend triplestore.</li>
						<li>Redland is still supported as a backend store, but updated handling of default and named graphs means that existing triples stored in Redland without a context (named graph) will not be accessible from RDF::Query.</li>
					</ul>
				</li>
				<li>SPARQL Language Updates
					<ul>
						<li>Added support for SPARQL 1.1 Query features:
							<ul>
								<li>Basic Query Federation with BINDINGS and UNDEF support.</li>
								<li>Functions: IF, STRDT, STRLANG, IRI, URI, BNODE.</li>
								<li>Infix operators IN and NOT IN.</li>
								<li>Aggregates COUNT, SUM, MIN, MAX, AVG, GROUP_CONCAT, and SAMPLE.</li>
								<li>Property paths.</li>
								<li>Negation with MINUS graph patterns and NOT EXISTS filters.</li>
							</ul>
						</li>
						<li>Added support for SPARQL 1.1 Update features:
							<ul>
								<li>INSERT/DELETE DATA, INSERT/DELETE WHERE, LOAD, and CLEAR</li>
								<li>Added support for multi-statement updates.</li>
							</ul>
						</li>
					</ul>
				</li>
				<li>API Updates
					<ul>
						<li>Removed all bridge classes (RDF::Query::Model::*).</li>
						<li>Removed RDF::Query::Logger class.</li>
						<li>Removed net filter function code from RDF::Query.</li>
						<li>Added as_hash method to Query, Algebra, and Node classes.</li>
						<li>Removed SPARUL and SPARQLP parsers.</li>
						<li>RDF::Query no longer loads URIs in FROM and FROM NAMED clauses with SPARQL 1.1 by default.</li>
						<li>Added ability for RDF::Query::Plan::Iterator to fire a callback when execute() is called.</li>
						<li>Added new RDF::Query::Plan::ComputedStatement class.</li>
						<li>Added new RDF::Query::Plan::Iterator class.</li>
					</ul>
				</li>
				<li>Bugfixes
					<ul>
						<li>Fixed whitespace unescaping bug in SPARQL (1.0 and 1.1) parsers.</li>
					</ul>
				</li>
				<li>Scripts
					<ul>
						<li>Added bin/json.pl to print a JSON-formatted representation of the query algebra.</li>
						<li>Added bin/rqsh.pl CLI interface to executing updates and queries.</li>
						<li>Added ability to serialize algebra and plan in bin/deparse.pl.</li>
						<li>bin/deparse.pl now catches parsing errors and prints stacktrace.</li>
					</ul>
				</li>
				<li>Optimizations
					<ul>
						<li>Implemented optimization for COUNT(*) over a single triplepattern.</li>
					</ul>
				</li>
			</ul>
		<h3 id="v2_202">Version 2.202 (2010-05-22)</h3>
			<ul>
				<li>Added initial SPARQL 1.1 syntax and eval support for select expressions, subqueries, negation, aggregates, subqueries, and basic federation.</li>
				<li>Added RDF::Query::VariableBindings.pm->set method.</li>
				<li>Added RDF::Query::_new constructor without any sanity or setup code (used for subquery construction).</li>
				<li>Added RDF::Query::Node::Blank::new constructor to avoid RDF::Trine's N-Triples syntax requirements.</li>
				<li>Added SAMPLE and GROUP_CONCAT aggregate support.</li>
				<li>Added shortcut functions for constructing RDF::Query::Node objects and Algebra Triples, BGPs and GGPs.</li>
				<li>Added warning to RDF::Query::Algebra::Project constructor for improper variable lists.</li>
				<li>Updated DAWG tests to use SPARQL 1.1 parser.</li>
				<li>Removed SPARQLP aggregate tests that don't align with new SPARQL 1.1 semantics.</li>
				<li>Updated DAWG eval tests to skip non-approved tests.</li>
				<li>Fixed handling of unicode decoding in DAWG eval tests.</li>
				<li>Bumped required version of RDF::Trine to 0.123.</li>
				<li>Updated t/models.pl to use RDF::Trine::Parser->parse_url_into_model method and redland's 'guess' parser.</li>
				<li>Fixed logging key name in RDF::Query::Plan::Exists.</li>
				<li>Fixed sse and as_sparql methods in RDF::Query::Algebra::Exists.</li>
				<li>Implemented RDF::Query::Algebra::Exists::binding_variables.</li>
				<li>Updated BGPOptimizer to estimate selectivity directly instead of using costmodel code.</li>
				<li>Removed costmodel code.</li>
				<li>Removed unused fixup and execute methods in Algebra classes.</li>
				<li>Updated RDF::Query to only instantiate DateTime parser and LWP::UserAgent if needed.</li>
				<li>Changed DBPedia network test to align with recent DBPedia update in t/dev-service-description.</li>
				<li>Updated SPARQLP parser tests to align with internal changes in RDF::Query::Algebra::Aggregate.</li>
				<li>Updated RDF::Query::Algebra::Aggregate and RDF::Query::Plan::Aggregate to syntactically handle HAVING clauses.</li>
				<li>Fixed bin/graph-bgp.pl (had bitrotted).</li>
				<li>Changed bnodes to named variables in examples/queries/sparql-bgp-people-knows.rq.</li>
				<li>RDF::Query::Util::cli_make_query now defaults the 'class' parameter to 'RDF::Query'.</li>
				<li>Removed dependency list and added perlrdf link to POD in RDF::Trine and RDF::Query.</li>
			</ul>
		<h3 id="v2_201">Version 2.201 (2010-01-30)</h3>
			<ul>
				<li>Added benchmark/lubm.pl.</li>
				<li>Added examples/queries/sparql-ask-people.rq.</li>
				<li>Added RDFa tests.</li>
				<li>Added Data::UUID prerequisite to META.yml and Makefile.PL.</li>
				<li>Updated ::Model::RDFTrine::add_uri and ::add_string to use new RDF::Trine::Parser methods.</li>
				<li>Updated as_sparql and sse code to work with more recent RDF::Trine versions.</li>
				<li>Removed as_sparql caching in RDF::Query::Algebra::Triple.</li>
				<li>Renamed RDF::Query test files to remove old-style numbering.</li>
				<li>Updated parser tests to track new RDF::Trine::Node::Literal internal structure.</li>
				<li>Updated prereq version of RDF::Trine to 0.114.</li>
				<li>Fixed NAME POD section in RDF::Query::ServiceDescription (RT52264 from KjetilK).</li>
			</ul>
		<h3 id="v2_200">Version 2.200 (2009-08-06)</h3>
			<ul>
				<li>Federation / Service Descriptions
					<ul>
						<li>Rewrote the optimistic plan generator in RDF::Query::Federate::Plan.</li>
						<li>Added threshold timeout argument to RDF::Query::Plan::ThresholdUnion and support for it in RDF::Query::Federate::Plan.</li>
						<li>Simplified logging in RDF::Query::Federate::Plan (now only logs to category 'rdf.query.federate.plan').</li>
						<li>RDF::Query::ServiceDescription now adds an 'origin' label annotations to RDF::Query::Algebra::Triple objects.</li>
						<li>Removed check of the sd:definitive property in RDF::Query::ServiceDescription (was based on wrong assumptions).</li>
						<li>Updated RDF::Query::ServiceDescription::answers_triple_pattern() to recognize wildcard capabilities, constructor now adds wildcard by default.</li>
						<li>Added new RDF::Query::ServiceDescription::new_with_model constructor.</li>
						<li>RDF::Query::ServiceDescription::computed_statement_generator now returns empty iterators when passed triple patterns with bound blank nodes.</li>
						<li>Added test data in data/federation_data/.</li>
						<li>RDF::Query::Plan::Service now adds an 'origin' label annotation to the RDF::Query::VariableBindings object.</li>
						<li>Added 'optimistic_threshold_time' query flag to RDF::Query::ExecutionContext and RDF::Query constructor.</li>
						<li>RDF::Query::Federate::add_service() now adds the appropriate computed statement generators to the query object.</li>
						<li>Removed optimistic query rewriting test from t/34-servicedescription.t (now covered by t/federate.t).</li>
						<li>Added t/federate.t with tests for optimistic federated query optimization using ::Plan::ThresholdUnion and RDF::Endpoint::Server.</li>
					</ul>
				</li>
				<li>Aggregates
					<ul>
						<li>Fixed serialization quoting issue in RDF::Query::Algebra::Aggregate::sse().</li>
						<li>RDF::Query::Plan::Aggregate now attempts plain string comparisons for MIN,MAX when strict_errors is not set.</li>
						<li>Added support for average aggregates, and fixed datatype support in aggregates.</li>
					</ul>
				</li>
				<li>Command Line Inferface
					<ul>
						<li>Added bin/query.pl, a fork of examples/query.pl, to support simple query execution.</li>
						<li>Added RDF::Query::Util as home to helper functions (added CLI args parsing functions to create queries and models).</li>
						<li>Simplified CLI argument parsing in bin/ and examples/ programs.</li>
					</ul>
				</li>
				<li>Refactoring, Code Cleanup, and Documentation
					<ul>
						<li>Added and updated POD to RDF::Query::Util, RDF::Query::Node and RDF::Query::Plan and RDF::Query::Federate::Plan.</li>
						<li>Added check for RDFQUERY_THROW_ON_SERVICE environment variable in RDF::Query::Plan::Service.</li>
						<li>Cleaned up code in RDF::Query::Model::get_computed_statements().</li>
						<li>Updated SSE formatting and uninitialized warning in RDF::Query::Plan, RDF::Query::Algebra::Filter, RDF::Query::Algebra::Distinct and RDF::Query::Algebra::Sort.</li>
						<li>Moved shared RDF::Trine-related model methods into RDF::Query::Model from subclasses.</li>
						<li>Raised required RDF::Trine version to 0.111 which brings RDF::Trine::Graph support.</li>
						<li>RDF::Query::Model::RDFTrine::BasicGraphPattern::execute now returns $self.</li>
						<li>Removed dependency on Test::JSON, List::MoreUtils, and XML::Parser.</li>
						<li>Removed TODO on test in t/29-serialize.t.</li>
						<li>Removed unnecessary code in RDF::Query::Plan subclasses, bin/query.pl, bin/graph-bgp.pl and bin/graph-query.pl.</li>
					</ul>
				</li>
				<li>Logging
					<ul>
						<li>Added logging in RDF::Query::Plan::ThresholdUnion, and RDF::Query::Model.</li>
						<li>Changed logging level from debug to trace in RDF::Query::Plan::Triple, RDF::Query::Plan::Project, RDF::Query::Plan::Filter, RDF::Query::Plan::Join::NestedLoop, RDF::Query::Plan::PushDownNestedLoop, and RDF::Query::Model::RDFTrine.</li>
						<li>Added calls to Log::Log4perl::is_debug to eliminate unnecessary serialization of logging when not in use.</li>
						<li>Made error message more useful when SERVICE calls fail in RDF::Query::Plan::Service.</li>
					</ul>
				</li>
				<li>Bugfixes
					<ul>
						<li>Fixed bug in RDF::Query::Plan::Offset in cases where the offset was beyond the end of the result set.</li>
						<li>Fixed testing for Bloom::Filter in t/31-service.t.</li>
						<li>Fixed test expectations when making remote DBPedia query in t/34-servicedescription.t.</li>
						<li>Fixed check of $ENV{RDFQUERY_NETWORK_TESTS} to test boolean value, not just existence.</li>
						<li>Fixed (bad) expected serializations in t/29-serialize.t.</li>
						<li>Fixed bug in RDF::Query::Plan::ThresholdUnion attempting to close an iterator twice.</li>
						<li>Fixed sse serialization issues in RDF::Query::Algebra::BasicGraphPattern and RDF::Query::Algebra::Project.</li>
						<li>Fixed bug in RDF::Query::Node::from_trine() that up-cast blank nodes to variables.</li>
						<li>Fixed quoting issue in RDF::Query::Algebra::Service::sse().</li>
						<li>Fixed parameter handling in bin/graph-qeps.pl:prune_plans().</li>
						<li>Fixed handling of 'GRAPH ?g {}' (empty GraphGraphPatterns) to return all graph names.</li>
						<li>Added check for ref($node) in RDF::Query::VariableBindings::new (broke code after previous removal of blessed() check).</li>
						<li>Added use of defined() in code that had been testing boolean value of objects (and causing expensive string overloading).</li>
					</ul>
				</li>
				<li>Miscellaneous Changes
					<ul>
						<li>Added examples of queries and service descriptions in examples/.</li>
						<li>Updated dawg-eval.t to actually test graph equivalence.</li>
						<li>Clarified graph labels in RDF::Query::Model::RDFTrine::BasicGraphPattern::graph().</li>
						<li>Added the ability to add label annotations to RDF::Query::VariableBindings, RDF::Query::Algebra::Triple and RDF::Query::Algebra::Quad objects.</li>
						<li>RDF::Query::Plan::Quad and RDF::Query::Plan::Triple now add an 'origin' label annotation to the RDF::Query::VariableBindings object if the underlying statement has one.</li>
						<li>RDF::Query::Plan::prune_plans now uses a stable sort when comparing plan costs.</li>
						<li>RDF::Query::Algebra::Triple::new now up-casts to RDF::Query node objects, if necessary.</li>
						<li>RDF::Query::Model::RDFTrine::generate_plans now respects the force_no_optimization query flag.</li>
						<li>RDF::Query::Algebra::BasicGraphPattern::sse() now sorts triples for output.</li>
						<li>Added distinguish_bnode_variables method to RDF::Query::Algebra::Quad and RDF::Query::Algebra::Triple.</li>
						<li>Added RDF::Query::Node::Blank::make_distinguished_variable method.</li>
						<li>Added caching of sparql serializations to RDF::Query::Algebra::BasicGraphPattern and RDF::Query::Algebra::Triple.</li>
						<li>Added code to RDF::Query::VariableBindings::new to up-cast any RDF::Trine::Node objects to their RDF::Query equivalents.</li>
						<li>RDF::Query::new() now looks for $args{ defines }, and adds them to the internal %options HASH.</li>
						<li>Added hook in RDF::Query::execute_plan() to print the query plan to STDERR if $options{plan} is set (can be set if defines).</li>
						<li>Updated RDF::Query::Plan to only consider model-specific plans (if there are any).</li>
					</ul>
				</li>
			</ul>
		<h3 id="v2_100">Version 2.100 (2009-03-18)</h3>
			<ul>
				<li>API
					<ul>
						<li>Added ::Algebra::BasicGraphPattern::connected method.</li>
						<li>Added 'node_counts' as a recognized key to ::Model::RDFTrine::suports().</li>
						<li>Added ::Model::node_count method.</li>
						<li>Added ::Model::RDFTrine::count_statements() and ::Model::RDFTrine::node_count() methods.</li>
						<li>Added 'store' field to the data returned by the meta() method in the ::Model::* classes.</li>
						<li>Added a peek method to ::Iterator to support execution deferment like in ::Algebra::Service.</li>
						<li>Added ability to force SERVICE calls to abort using $ENV{RDFQUERY_THROW_ON_SERVICE} and RequestedInterruptError.</li>
						<li>Added bf methods to ::Triple and ::BasicGraphPattern to describe the BGP in terms of bound/free.</li>
						<li>Added bind_variables method to RDF::Query::Algebra.</li>
						<li>Added caching to ::Algebra::Service::_names_for_node.</li>
						<li>Added code to count (and warn) the rate of false positives from a bloomjoin.</li>
						<li>Added cost model hooks in RDF::Query and ::Algebra::BasicGraphPattern.</li>
						<li>Added FeDeRate BINDINGS to the list of supported extensions.</li>
						<li>Added get_basic_graph_pattern to ::Model::RDFTrine (not used yet).</li>
						<li>Added is_solution_modifier() methods to ::Algebra classes.</li>
						<li>Added labels and common patterns to service description template.</li>
						<li>Added more logic and debugging to aggregating triples into BGPs for SERVICE calls.</li>
						<li>Added optional restriction argument to ::Algebra::subpatterns_of_type.</li>
						<li>Added RDF::Query::Model::RDFTrine::BasicGraphPattner::graph() method.</li>
						<li>Added RDF::Query::Node::compare for sorting (either Trine or Query) node objects.</li>
						<li>Added RDF::Query::plan_class so that ::Federate can overload calls to ::Plan methods.</li>
						<li>Added support for computed statement generators (like ARQ's computed property support [e.g. list:member]).</li>
						<li>Added trial subsumes() methods to ::Algebra::BasicGraphPattern and ::Algebra::Triple.</li>
						<li>Algebra classes now call RDF::Query::algebra_fixup for optimization before falling back on normal fixup code.</li>
						<li>Allow equality test and disjunction filters in patterns that can be compiled to SQL.</li>
						<li>Fixed ::Algebra::GroupGraphPattern to use join_bnode_streams in cases where the bloom filter wasn't automatically created but instead provided by the user.</li>
						<li>Fixed ::Model::RDFTrine::as_string use with Quads.</li>
						<li>Fixed argument list for RDF::Query::Algebra::Service::_names_for_node called from bloom function.</li>
						<li>Fixed bug so ::Model::RDFTrine::meta may be called as a class method.</li>
						<li>Fixed RDF::Query::algebra_fixup to ignore service capabilities that would result in empty BGPs.</li>
						<li>Modified code for aggregate queries (though they are currently broken).</li>
						<li>Moved construction of bloom-filter-optimized patterns to RDF::Query::Algebra::GroupGraphPattern::_bloom_optimized_pattern().</li>
						<li>Moved initial federated service code into RDF::Query::fixup and ::algebra_fixup.</li>
						<li>Moved QEP generation code to RDF::Query::query_plan so it can be overloaded.</li>
						<li>Moved RDF::Query::add_service() to RDF::Query::Federate::add_service().</li>
						<li>Parsing service descriptions now more forgiving in the face of missing values.</li>
						<li>RDF::Query::Algebra::Triple::new now adds RDF::Query::Node::Variable objects for undefined nodes.</li>
						<li>RDF::Query::fixup() now only returns a construct pattern (the query pattern now being returned by RDF::Query::query_plan()).</li>
						<li>RDF::Query::Model::get_computed_statements now doesn't die if there's no query object present.</li>
						<li>RDF::Query::new() now accepts two-argument form with just $query and \%options.</li>
						<li>RDF::Query::Node::Literal objects now can compare as equal when they're of numeric type but the lexical values aren't numeric.</li>
						<li>RDF::Query::prune_plans now takes ExecutionContext as an argument, and in turn calls ::Plan::prune_plans.</li>
						<li>RDF::Query::query_plan() now returns all possible query plans when called in list context.</li>
						<li>RDF::Query::query_plans now calls RDF::Query::prune_plans to select from the list of possible QEPs.</li>
						<li>RDF::Trine::Node::Resource now escapes unicode in base URIs (now just relative URI part) before calling URI->new_abs.</li>
						<li>Removed now unused RDF::Query::construct() and RDF::Query::fixup().</li>
						<li>Removed old execute() code from ::Algebra classes.</li>
						<li>Removed unused redland fallback code from RDF::Query::Model::RDFTrine.</li>
						<li>Split RDF::Query::execute into prepare() and execute_plan() methods.</li>
						<li>Converted RDF::Query::execute() to use ::Plan classes.</li>
						<li>Updated ::Compiler::SQL to recognize ::Algebra::Project objects.</li>
						<li>Updates to RDF::Query::execute() to support explicit pre-binding lists (instead of just scalar values).</li>
						<li>::Algebra::GroupGraphPattern now throws an exception if passed unblessed values as patterns.</li>
						<li>::Federate now labels nodes in the QEP tree with applicable services.</li>
						<li>::Model::debug() now shows data from the named graph model.</li>
						<li>::Model::RDFTrine::add_uri now decodes resulting content as utf8 before proceeding.</li>
						<li>::Model::RDFTrine::meta() probes the underlying store object to declare the proper 'store' class.</li>
						<li>::Service::_names_for_node updated to use ::Plan classes for query execution (fixes use of the k:bloom filter).</li>
					</ul>
				</li>
				<li>Classes
					<ul>
						<li>Added algebra classes for solution modifiers and query forms (construct, project).</li>
						<li>Added code and tests for Query Execution Plan classes RDF::Query::Plan::*.</li>
						<li>Added RDF::Query::Federate::Plan for federation-specific code.</li>
						<li>Added RDF::Query::BGPOptimizer implementing a basic optimizer for basic selectivity-based join ordering.</li>
						<li>Added RDF::Query::CostModel classes for computing/estimating the cost of executing a specific pattern.</li>
						<li>Added RDF::Query::ExecutionContext to hold all necessary information for query execution (query, model, bound variables).</li>
						<li>Added RDF::Query::ServiceDescription for parsing DARQ-style service descriptions.</li>
						<li>Added RDF::Query::VariableBindings to wrap existing HASH-based variable binding structure.</li>
						<li>Added stub ::Plan::ThresholdUnion class for running optimistic queries.</li>
						<li>Added workaround to RDFCore bridge so that RDF::Core doesn't die if getStmts is called with a Literal in the subj or pred position.</li>
						<li>Added a RequestedInterruptError exception class.</li>
						<li>Added code for RDF-Trine specific BGP query plans.</li>
						<li>Changed debugging in RDF::Query modules to use Log::Log4perl.</li>
						<li>Made SERVICE work again by rolling back streaming socket work (now commented out).</li>
						<li>Moved federation code to new RDF::Query::Federate class.</li>
						<li>Plan generation now includes any plans the model object can provide.</li>
						<li>RDF::Query now always uses a cost model (defaulting to ::Naive).</li>
						<li>RDF::Query::Federate now defaults to SPARQLP parser.</li>
						<li>Removed logging/warn calls from forked process in ::Service (was screwing up the parent-child IO pipe).</li>
						<li>Removed use of "DISTINCT" queries in SERVICE calls (for pipelining).</li>
						<li>ServiceDescription now only runs sofilter if ?subject/?object are bound.</li>
						<li>Started work on a more holistic approach to supporting service descriptions (instead of using add_computed_statement_generator()).</li>
						<li>Updated ::Algebra::Service to fork and use LWP's callback mechanism for concurrency.</li>
						<li>::Algebra::Service now defers loading of content until the first result is requested.</li>
						<li>::Model::RDFTrine now only produces BGP plans if there is no get_computed_statement_generators in the query object.</li>
						<li>Code now materializes all node identities before creating the Bloom filter (so capacity arg is accurate).</li>
						<li>Bloom filter use is now only attempted on SERVICE blocks that don't immediately contain a FILTER.</li>
						<li>Re-ordered conditionals so that the service-bloom-filter try block is called less frequently.</li>
						<li>SERVICE execution now uses non-identity reasoning Bloom filter function.</li>
					</ul>
				</li>
				<li>Syntax and Serialization
					<ul>
						<li>Added from_sse method to ::Statement, ::Node.</li>
						<li>Added initial code for ARQ-style property paths.</li>
						<li>Added initial parser code for SPARQL Update (SPARUL) extension.</li>
						<li>Added new 'UNSAID' syntax for SPARQLP, implementing negation.</li>
						<li>Added parse_expr method to RDF::Query::Parser::SPARQL.</li>
						<li>Added RDF::Query::Algebra::Quad::bf() method.</li>
						<li>Fixed RDQL parser to qualify URIs before returning from parse().</li>
						<li>Fixed SSE serialization of Aggregates using '*' instead of a variable as the column.</li>
						<li>Removed (now unused) parser generator script.</li>
						<li>SPARQL parser now always adds a ::Algebra::Project (even when the query selects '*').</li>
						<li>SPARQL parser now creates ::Algebra::Construct objects for CONSTRUCT queries.</li>
						<li>SPARQL parser now puts ::Distinct above ::Sort algebras in the parse tree.</li>
						<li>SPARQLP parser now creates ::Project object as parent of any ::Aggregate.</li>
						<li>Turtle parser now doesn't modify the lexical value of numeric typed literals.</li>
						<li>Turtle parser now makes universal IDs for all blank node (even those with given IDs like _:xyz).</li>
						<li>Updated ::Algebra SSE serializations to conform to Jena's serialization syntax.</li>
						<li>Updated ::Algebra::Limit::sse to emit 'slice' serialization if its child is a ::Algebra::Offset.</li>
						<li>Updated as_sparql() methods to support the new ::Construct classes.</li>
						<li>Updated RDF::Query::sse to emit base and prefix serializations.</li>
						<li>Updated SPARQL parser and serializer tests to always assume an ::Algebra::Project on SELECT queries.</li>
						<li>Updated SSE serialization of ::Join::PushDownNestedLoop to use 'bind-join' terminology.</li>
						<li>Updates to SPARQLP parser to support FeDeRate BINDINGS keyword.</li>
						<li>::Algebra::Distinct now does proper serialization in as_sparql().</li>
						<li>::GroupGraphPattern::sse() updated to output the '(join ...)' only if the GGP has more than one pattern.</li>
					</ul>
				</li>
				<li>Optimizer
					<ul>
						<li>Added benchmark/plans.pl to show the runtimes of the available QEPs for a query.</li>
						<li>Added benchmark/costmodel.pl for testing the RDF::Query::CostModel.</li>
						<li>Added logging for execution time (time to construct iterator) of Triples, BGPs, GGPs and sorting.</li>
						<li>Added logging of cardinalities in ::Algebra::Triple, ::Algebra::BasicGraphPattern and ::Algebra::Service.</li>
						<li>Added logging to plan classes ::NestedLoop, ::Service, ::Triple.</li>
						<li>Naive plan is used in ::Federate::Plan::generate_plans only if no optimistic plans are available.</li>
						<li>Updated cost model code to work with ::Plan classes instead of ::Algebra classes.</li>
						<li>Logging code now uses sse serialization as log keys (because of expressions that can't be serialized as SPARQL).</li>
						<li>Logging object can now be passed to RDF::Query constructor.</li>
						<li>Updated logging of algebra execution to use SPARQL serialization as logging key.</li>
					</ul>
				</li>
				<li>Miscellaneous
					<ul>
						<li>SPARQL parser now constructs ::Algebra::Project objects (had been in RDF::Query::execute).</li>
						<li>Updated RDF::Query to require version 0.108 of RDF::Trine.</li>
						<li>Added new bloom:filter function variant that doesn't use identity reasoning.</li>
						<li>Added debugging information when RDFQUERY_THROW_ON_SERVICE is in effect.</li>
						<li>Fixed test plan for t/optimizer.t in cases where no appropriate model is available.</li>
						<li>Updated plan generation code to use ::BGPOptimizer when the model supports node_counts.</li>
						<li>Fixed SSE serialization bug in ::Algebra::Sort.</li>
						<li>Fixed bugs in RDF::Query and RDF::Query::Expression classes that insisted variables be RDF::Query objects (and not simply RDF::Trine objects).</li>
						<li>Fixed propogation of iterator binding_names when pre-bound values are used in ::Algebra execution.</li>
						<li>Fixed RDF::Query::Algebra::Triple to correctly set binding_names when pre-binding is used.</li>
						<li>Fixed use of pre-binding in execution of RDF::Trine optimized BasicGraphPatterns.</li>
						<li>Fixed bug in SQL compilation when restricting left-joins to specific node types (based on functions like isIRI).</li>
						<li>Fixed node identity computation based on owl:sameAs.</li>
						<li>Fixed bitrotted livejournal example script to work with new 2.000 API.</li>
					</ul>
				</li>
				<li>Tests
					<ul>
						<li>Added expected result count test in t/34-servicedescription.t.</li>
						<li>Added initial tests for algebra subsumes method.</li>
						<li>Added logging and costmodel tests.</li>
						<li>Added more example capabilities and patterns to the test service descriptions.</li>
						<li>Added RDF::Trine::Store::Hexastore to test model construction list in t/models.pl.</li>
						<li>Added sparql:pattern data to test service descriptions.</li>
						<li>Added sse re-serialization test to t/29-serialize.t.</li>
						<li>Added support for sparql:pattern in service description parsing.</li>
						<li>Added t/plan-rdftrine.t to test QEP generation optimized for RDF::Trine BGPs.</li>
						<li>Added test data for repeat patterns (e.g. { ?a ?a ?b}).</li>
						<li>Added tests to t/plan.t for QEP sse serialization.</li>
						<li>Cleaned up federation tests.</li>
						<li>Commented out in-progress service description tests.</li>
						<li>Fixed bug in t/23-model_bridge.t to allow two models from the same model class to be used in testing.</li>
						<li>Fixed error handling in t/plan.t.</li>
						<li>Fixed t/costmodel-naive.t to provide a serialized query to ::Plan::Service constructor.</li>
						<li>Fixed test count in algebra-bgp.t.</li>
						<li>Fixed test in t/31-service.t that relied on identity-reasoning support in bloom filters (which is now off by default).</li>
						<li>Fixed use of RDFQUERY_NETWORK_TESTS in 31-service.t.</li>
						<li>Improved use of temporary RDF::Trine stores in RDF::Query tests.</li>
						<li>Marked tests TODO for federated query serialization.</li>
						<li>Removed what looks like an accidentally pasted test in t/plan.t.</li>
						<li>SERVICE tests involving bloom filter handling marked as TODO.</li>
						<li>ServiceDescription parsing now gets entire sparql:patterns and not just arcs to depth one.</li>
						<li>Silenced unfinished test debugging in t/logging.t.</li>
						<li>Updated args to roqet call in failing_earl_tests.sh.</li>
						<li>Updated costmodel and logging test expected results that changed due to changes to ::Plan::Join code.</li>
						<li>Updated dawg-eval.t regex to recognize RDFTrine blank nodes.</li>
						<li>Updated DBPedia test query in t/34-servicedescription.t to reflect new source data.</li>
						<li>Updated expected cardinalities in t/logging.t for current plan choice.</li>
						<li>Updated logging tests to use the new sparql serialization keys.</li>
						<li>Updated SERVICE test in t/plan.t (still broken, but only runs when dev env var RDFQUERY_NETWORK_TESTS in effect).</li>
						<li>Updated t/plan.t to be less dependent on the specific state of the kasei.us service endpoint.</li>
						<li>Updated test service description RDF for new tests.</li>
						<li>Updates to improve logging and test coverage.</li>
					</ul>
				</li>
				<li>Examples and Documentation
					<ul>
						<li>Added examples/query.pl to show a simple example of loading data and executing a query.</li>
						<li>Added examples/create_query_api.pl for generating queries programatically (based on request from KjetilK).</li>
						<li>Added bin/graph-bgp.pl to produce a png of a query's BGP variable connectivity graph.</li>
						<li>Added bin/graph-query.pl to graph the (one chosen) QEP tree.</li>
						<li>Added bin/graph-qeps.pl to vizualize all QEPs of a query with GraphViz.</li>
						<li>Updated bin/parse.pl to emit the SSE serialization of the query algebra tree.</li>
						<li>Updated bin/rdf_parse_turtle.pl to warn on any parser error.</li>
					</ul>
				</li>
			</ul>
		<h3 id="v2_002">Version 2.002 (2008-04-25)</h3>
			<ul>
				<li>Updated Bloom::Filter required version in RDF-Query's Makefile.PL.</li>
				<li>Fixed bug in get_function() when called as a class method.</li>
				<li>Updated sparql:logical-* functions to accept more than two operands.</li>
				<li>Added code to make loading of Bloom::Filter optional.</li>
				<li>Added Bloom::Filter to list of recommended modules.</li>
			</ul>
		<h3 id="v2_001">Version 2.001 (2008-04-19)</h3>
			<ul>
				<li>Fixed use of "DESCRIBE &lt;resource&gt;" (instead of "DESCRIBE ?var").</li>
				<li>Fixed SPARQL serialization of queries with DISTINCT.</li>
				<li>Added ::Algebra::subpatterns_of_type method for retrieving all subpatterns of a particular type.</li>
				<li>Moved sort_rows() into new ::Algebra classes Sort, Limit, Offset and Distinct.</li>
				<li>Updated SQL compiler to handle new ::Algebra classes.</li>
				<li>Bumped required RDF::Trine version to 0.106.</li>
				<li>Added methods to RDF::Query for retrieving lists of supported SPARQL extensions and extension functions.</li>
				<li>RDF::Trine pattern optimization now holds onto the original BGP object for forwarding of calls to as_sparql().</li>
				<li>Removed use of Storable module. Query execution no longer clones parse tree before running.</li>
				<li>Simplified project operation on query stream in RDF::Query::execute().</li>
				<li>fixup() method in ::Algebra and ::Expression now passed the query object as an argument.</li>
				<li>Replaced ::RDFTrine::unify_bgp with more general fixup() implementation.</li>
				<li>::Algebra classes now defer to the bridge during fixup() to allow model-specific optimizations.</li>
				<li>RDF::Trine::Iterator::smap now allows overriding default construct_args (e.g. binding names).</li>
				<li>sparql:str now throws a TypeError if argument isn't bound.</li>
				<li>Fixed referenced_variables in RDF::Query::Expression.</li>
				<li>Fixed COUNT function to only count bound variables.</li>
				<li>Fixed aggregation to work with expressions.</li>
				<li>Added support for GROUP BY clauses to aggregation queries.</li>
				<li>Removed now unused ::Algebra::OldFilter class.</li>
				<li>Added serialization tests for aggregate and union patterns.</li>
				<li>Moved as_sparql methods from RDF::Trine:: to RDF::Query:: classes.</li>
				<li>Removed context- (quad-) specific code from RDF::Query::Algebra::Triple.</li>
				<li>Fixed serialization of BOUND filter functions.</li>
				<li>Fixed serialization of unary expressions.</li>
				<li>Fixed call to join_streams to use ::Iterator::Bindings instead of ::Iterator.</li>
				<li>var_or_expr_value now takes bridge object as an argument.</li>
				<li>var_or_expr_value will now accept any RDF::Query::Expression object as an argument.</li>
				<li>Added test for using AS syntax for variable renaming: "(?var AS ?newvar)".</li>
				<li>Added support for MIN, MAX, COUNT and COUNT-DISTINCT aggregate operators to the SPARQLP parser.</li>
				<li>Added COUNT DISTINCT variant aggregate operator.</li>
				<li>Aggregates (MIN, MAX, COUNT, COUNT-DISTINCT) now return xsd:decimal values (this shouldn't really happen for non-numeric operands to MIN and MAX...)</li>
				<li>Added as_sparql submethod to RDF::Query::Node::Literal to serialize numeric types unquoted.</li>
				<li>Added var_or_expr_value method in RDF::Query.</li>
				<li>Removed unused _true and _false methods in RDF::Query.</li>
				<li>Fixed existing aggregates code and tests.</li>
				<li>Removed unused (and bitrotted) t/05-stress.t test.</li>
				<li>Made all tests that access the network opt-in with the RDFQUERY_NETWORK_TESTS environment variable.</li>
				<li>Updated POD for ::Expression::Alias.</li>
				<li>Added tests for select expressions.</li>
				<li>Added initial support for selecting expression values.</li>
			</ul>
		<h3 id="v2_000">Version 2.000 (2008-03-19)</h3>
			<ul>
				<li>RDF::Query now uses RDF::Trine package for common classes (nodes, statements, iterators).</li>
				<li>Moved RDF::Query::Stream into RDF::Trine::Iterator namespace.</li>
				<li>Reshuffled SPARQL parsers tests.</li>
				<li>Added support for RDF::Trine::Model.</li>
				<li>RDF::Trine::Iterator can serialize to XML and JSON natively; Updated tests accordingly.</li>
				<li>rdf namespace is only added by default for RDQL.</li>
				<li>Fixed bug where the wrong bridge object would be returned for queries with FROM clauses.</li>
				<li>Moved query_more code to Algebra classes.</li>
				<li>Added RDF::Query::pattern method to return the GGP algebra pattern for the query.</li>
				<li>Added RDF::Query::as_sparql method to serialize query as SPARQL string.</li>
				<li>Removed unused RDF::Query::set_named_graph_query method.</li>
				<li>Fixed bug where triples from a FROM clause were loaded into the underlying persistent store.</li>
				<li>Added POD to RDF::Query::Node classes.</li>
				<li>Added equal method to RDF::Query::Node classes.</li>
				<li>RDF::Query::Node::Blank constructor now optionally produces identifiers.</li>
				<li>Merged tSPARQL parsing code into new SPARQLP parser.</li>
				<li>Added definite_variables method to RDF::Query::Algebra classes.</li>
				<li>Triple class now serializes rdf:type shortcut 'a' appropriately.</li>
				<li>Removed 'VAR' type from ::Node::Variable object structure.</li>
				<li>Updated code to always expect a HASH reference from ::Bindings iterator.</li>
				<li>Added more (sparql and see) serialization tests.</li>
				<li>Removed old fixup code, replaced by ::Algebra fixup methods.</li>
				<li>Moved FROM clause data loading to its own method.</li>
				<li>Started removing old code (RDF::Base, direct DBI use, AUTOLOAD, profiling).</li>
				<li>Moved general count_statements() method into bridge superclass.</li>
				<li>Fixed SQL compiler to work with ::Algebra and ::Node classes.</li>
				<li>Added as_native method to bridge superclass for converting ::Node objects to bridge-native objects.</li>
				<li>Updated document namespace declaration for SPARQL XML Results.</li>
				<li>Added support for SERVICE queries (ala ARQ) with Bloom filter semijoins.</li>
				<li>Moved Expression classes out of the Algebra hierarchy and into their own space (RDF::Query::Expression).</li>
			</ul>
		<h3 id="v1_501">Version 1.501 (2007-11-15)</h3>
			<ul>
				<li>Fixed CONSTRUCT+OPTIONAL bug.</li>
				<li>Added as_sparql methods to Algebra and Node classes to serialize patterns in SPARQL syntax.</li>
				<li>Added deparse script.</li>
				<li>Fixed jena:sha1sum tests when Digest::SHA1 isn't available.</li>
			</ul>
		<h3 id="v1_50">Version 1.500 (2007-11-13)</h3>
			<ul>
				<li>Query Engine
					<ul>
						<li>URIs are now properly qualified with a BASE when present.</li>
						<li>Base URI passed to constructor is now used if no BASE clause exists in the query.</li>
						<li>Fixed BASE qualification when an IRI contains Unicode characters (Emulating IRI support with the URI module).</li>
						<li>NAMED graph data is now seperated from the default model into new (temporary) models.</li>
						<li>NAMED graphs now work with RDF::Core.</li>
						<li>Added new RDF::Query::Algebra:: classes that are used to represent query ASTs.</li>
						<li>Added new RDF::Query::Node:: classes that are used to represent RDF Nodes and Variables.</li>
						<li>Major refactoring to RDF::Query::query_more() to enhance extensibility.</li>
						<li>Added RDF::Query::query_more_triple() and RDF::Query::query_more_bgp() for triple and bgp matching.</li>
						<li>Improved support of GGP pattern matching.</li>
						<li>Added sgrep, smap, swatch and concat methods to RDF::Query::Stream class.</li>
						<li>Refactored query_more() variants and sort_rows() to use new stream methods sgrep, smap, and concat.</li>
						<li>Continued to fix bugs to more closely align with DAWG tests.</li>
						<li>Updated DAWG tests to run with the RDF::Core backend.</li>
						<li>Any DAWG tests with mf:requires are now automatically marked TODO.</li>
						<li>DAWG tests graph equality is now punted to user verification.</li>
						<li>Fixed bNode merging code in DAWG tests.</li>
						<li>query_more() variants and sort_rows() now all return RDF::Query::Stream objects.</li>
						<li>query_more() (and everything it calls) now expects bridge object as a method argument (to ensure NAMED graph querying works).</li>
						<li>Added join_streams() to perform netsted-loop natural joins on two Stream objects.</li>
					</ul></li>
				<li>Filters
					<ul>
						<li>Added call_function() method to abstract the generation of ['FUNCTION',...] blocks.</li>
						<li>FILTER operator != is now negative for unknown datatypes.</li>
						<li>Fixed exception handling in check_constraints().</li>
						<li>Fixed type-promotion in arithmetic operations and added recognized xsd numeric types.</li>
						<li>API Chnage: extension functions now take a bridge object as their second argument (after the query object).</li>
						<li>Fixed equals() method in RDF::Core bridge to properly use the RDF::Core API.</li>
						<li>Javascript function makeTerm now accepts language and datatype parameters.</li>
						<li>toString() javascript funtion now returns just the literal value (not including language or datatype).</li>
						<li>sop:str now will stringify blank nodes properly.</li>
						<li>sparql:langmatches now properly differentiates between no language tag and an empty language tag.</li>
					</ul></li>
				<li>Parsers
					<ul>
						<li>Parsers now generate ASTs using the Algebra and Node classes.</li>
						<li>Fixed bugs in SPARQL tokenizer for some Unicode strings (with combining accents).</li>
						<li>RDF::Query::Parser::new_literal() now canonicalizes language tags (to lowercase).</li>
						<li>Fixed GGP verification in RDF::Query::Parser::SPARQL::fixup().</li>
						<li>Merged GGPAtom changes from tSPARQL to SPARQL grammar.</li>
					</ul></li>
				<li>Backends
					<ul>
						<li>Fixed bug in RDF::Query::Model::RDFCore::equals() when comparing two blank nodes.</li>
						<li>Changed RDF::Query::Model::RDFCore::as_string to return strings where node type is identifiable (like Redland, URIs as [...], literal \"...\", bnodes (...)).</li>
						<li>Model methods literal_value, literal_datatype and literal_value_langauge now return undef if argument isn't a literal.</li>
						<li>Model methods uri_value and blank_identifier now return undef unless argument is of correct type.</li>
						<li>Model add_string methods now normalize Unicode input.</li>
						<li>Blank node prefix is now scoped to bridge, not lexically in RDF::Query::Model::RDFCore.</li>
						<li>RDF::Query::Model::Redland::new_literal now forces argument to a string (XS code breaks on non-PVOK scalars).</li>
						<li>RDF::Query::Model::Redland::add_uri now uses LWP instead of relying on Redland to fetch content.</li>
						<li>Redland model class now recognizes DateTime objects as literals.</li>
						<li>Updated add_uri() method in RDF::Core bridge to support named graphs (only one name per model for now).</li>
					</ul></li>
				<li>Miscellaneous
					<ul>
						<li>Added rudimentary profiling code (Devel::DProf seems to crash on RDF::Query)</li>
						<li>Added initial code for supporting property functions (using time:inside as an example).</li>
						<li>Removed multi_get code.</li>
						<li>Removed code for MULTI patterns. Will replace with algebra-based optimization in the future.</li>
						<li>RDF::Query::Stream constructor now accepts an ARRAY reference.</li>
						<li>Stopped using the peephole optimizers. Will replace with an algebra-based optimizer in the future.</li>
					</ul></li>
			</ul>
		<h3 id="v1_044">Version 1.044 (2007-09-13)</h3>
			<ul>
				<li>DAWG tests now emit EARL reports.</li>
				<li>Added test harness and temporal data importing scripts to new bin/ directory.</li>
				<li>Added support for temporal queries in RDF::Query and optimizers.</li>
				<li>Added support for CONSTRUCT queries in new YAPP-based SPARQL parsers.</li>
				<li>Added TIMED graph tests for new SPARQL temporal extensions.</li>
				<li>Added tests to SPARQL parser for bugs that were discovered with temporal extensions.</li>
				<li>Added POD to new SPARQL parsers.</li>
				<li>Added new Parse::Yapp-based SPARQL parser in preparation for temporal SPARQL extensions.</li>
				<li>Added stub functions for temporal extension support.</li>
				<li>Added model_as_stream() method to Redland bridge class.</li>
				<li>Addded debug() method to RDF::Query::Model.</li>
				<li>Added UNION tests.</li>
				<li>Added a javascript debugging flag to RDF::Query.</li>
				<li>Added RDF::Query::groupgraphpattern() for handling GGPs.</li>
				<li>Added xsd:integer casting function.</li>
				<li>Added &lt;http://kasei.us/2007/09/functions/warn&gt; as a FILTER tee that warns to STDERR.</li>
				<li>Added Eyapp SPARQL grammer file and replaced parser with auto-generated code from eyapp.</li>
				<li>Marked some SPARQL parser tests as TODO (due to incompatability with new YAPP-based parser).</li>
				<li>Network tests are now run against all available models.</li>
				<li>Stream tests are now run against all available models.</li>
				<li>Query parser initialization code cleaned up (and now supports beta tSPARQL parser).</li>
				<li>net_filter_function() now properly accesses nodes with bridge methods.</li>
				<li>RDF::Query::Parser::new_blank now assigns default names if none is supplied.</li>
				<li>Updated error messages in SPARQL parser to align with new YAPP-based parser.</li>
				<li>SPARQL parse_predicate_object() fixed to support tripleNodes.</li>
				<li>SPARQL parse_object() and parse_predicate() fixed for whitespace insensitivity.</li>
				<li>Moved old hand-written SPARQL parser to now unused SPARQL-RD.pm.</li>
				<li>Moved new YAPP-based SPARQL parser to SPARQL.pm.</li>
				<li>Copied YAPP-based SPARQL parser for new temporal extension tSPARQL.pm.</li>
				<li>Moved existing tests for hand-written SPARQL parser to 01-sparql_parser.t.rd-old.</li>
				<li>Moved new YAPP-based SPARQL tests to t/01-sparql_parser.t.</li>
				<li>Removed bad-syntax queries from optimizer and SQL compiler tests.</li>
				<li>Fixed bad-syntax queries in stream and hook tests.</li>
				<li>Made output of coverage tests easier to read by adding test names.</li>
				<li>Fixed SPARQL parsers to allow keywords as variable names.</li>
				<li>Fixed SPARQL parsers to allow dashes and underscores in variable names.</li>
				<li>Fixed bad parser constructor call in SQL compiler tests.</li>
				<li>Suppressed RDF::Base loading (again) during RDF::Query startup.</li>
				<li>RDF::Query::Model::Redland::debug now shows contexts during iterator debugging.</li>
				<li>Moved the old (hand written) SPARQL parser out of the way to make test harnesses happy.</li>
				<li>SPARQL parser now respects spec regarding the reuse of blank node labels across BGPs.</li>
				<li>SPARQL parser now does the right thing with NIL (the empty list).</li>
				<li>SPARQL parser now handles embedded GGPs correctly.</li>
				<li>Updated SPARQL parser and tests to pass (almost all) DAWG tests.</li>
				<li>Fixed bug where results couldn't be sorted by a non-selected variable.</li>
				<li>Removed the unused RDF::Query::timed_graph() method.</li>
				<li>RDF::Query::qualify_uri is now more liberal in what it accepts.</li>
				<li>Fixed xsd:boolean casting of integer values.</li>
				<li>RDF::Query::Parser::new_variable can now generate private variable names.</li>
				<li>Fixed test suite to work properly on systems without Redland.</li>
				<li>Disabled loading of tSPARQL parser for release.</li>
				<li>Removed function prototype definitions in Model base class (was causing loading problems when models are missing).</li>
			</ul>
		<h3 id="v1_043">Version 1.043 (2007-06-14)</h3>
			<ul>
				<li>Fixed broken MANIFEST causing MakeMaker code to break.</li>
			</ul>
		<h3 id="v1_042">Version 1.042 (2007-06-13)</h3>
			<ul>
				<li>Added support for Javascript URL-based extension functions.</li>
				<li>Added GPG signing support for Javascript functions.</li>
				<li>Added meta methods to model classes.</li>
				<li>Added count_statements methods to model classes.</li>
				<li>Added default format for stringifying query result streams.</li>
				<li>Added SPARQL syntax coverage tests.</li>
				<li>Added stream tests.</li>
				<li>ISIRI() now returns a sop:isIRI function IRI.</li>
				<li>Redland bridge add_uri strips off URI fragment from parser base URI.</li>
				<li>Underlying models aren't loaded if turned off by environment variables.</li>
				<li>Stopped using the (currently broken) multi-get code.</li>
				<li>Model classes aren't used if turned off by environment variable.</li>
				<li>Standardized node testing to is_node (replacing older isa_node).</li>
				<li>GPG verification failure now throws exceptions.</li>
				<li>GPG fingerprint handling is now whitespace insensitive.</li>
				<li>Removed (currently) unused multiget tests.</li>
				<li>Redland bridge uri_value returns undef if not called with a node.</li>
			</ul>
		<h3 id="v1_041">Version 1.041 (2006-11-26)</h3>
			<ul>
				<li>Removed unwanted '+' signs on stringified bigints when running under perl 5.6.x.</li>
				<li>Fixed unicode errors when running under perl 5.6.x.</li>
				<li>Added tests for model bridge classes.</li>
				<li>Fixed bugs in SQL bridge class.</li>
				<li>RDFCore and Redland bridge classes now throw error when passed a bad model object.</li>
				<li>Bridge class support() method now responds to feature requests for 'temp_model'.</li>
				<li>Fixed bug in RDF::Query::Model::RDFCore::isa_resource returning true for blank nodes.</li>
				<li>Fixed code in RDF::Query::Model::::SQL::equals().</li>
				<li>Added partial support for new RDF::Storage::DBI storage class.</li>
				<li>Added support for RDF::Query:::Model::SQL models in RDF::Query bridge code.</li>
				<li>Removed RDF::Query::Model::SQL::* code that's now in RDF::Storage::DBI.</li>
				<li>Added tests for backend bridge classes (RDF::Query::Model::*).</li>
				<li>Added checks for which backends support XML serialization.</li>
				<li>Fixed naive peephole tests in cases where model supports cost-based analysis.</li>
				<li>Fixed bugs in tests that were relying on as_string() to act like literal_value().</li>
				<li>Added RDF::Base support.</li>
				<li>Fixed bug in fixup() that prevented running queries against multiple models.</li>
				<li>Added SimpleQueryPatternError exception class for future work on multi-get optimizations.</li>
				<li>Removed forced dependence on Digest::SHA1.</li>
				<li>Makefile.PL now recommends Digest::SHA1 (for jena function) and Geo::Distance (for 07-filters.t).</li>
			</ul>
		<h3 id="v1_040">Version 1.040 (2006-07-21)</h3>
			<ul>
				<li>Added support for BOUND() fiters in SQL compilation.</li>
				<li>SQL compiler now produces valid SQL when query variable names are SQL reserved keywords.</li>
				<li>Moved SPARQL parser test data into YAML.</li>
				<li>Added YAML as a build-time prerequisite.</li>
				<li>Fixed SPARQL parsing bug for blank nodes as statement objects.</li>
				<li>Added peephole optimizer code with naive and cost-analysis strategies.</li>
				<li>Added add_string method to RDF::Query::Model::Redland.</li>
				<li>Added node_count method to RDF::Query::Model::Redland (only used for testing at this point).</li>
				<li>RDF::Query::execute() now uses the peephole optimizer.</li>
				<li>Removed punting code in RDF::Query::execute that tried to do JIT optimization.</li>
				<li>Removed calls to getLabel() on model objects in test files.</li>
				<li>Fixed dawg tests (was dying because of multiple plans being printed).</li>
				<li>Fixed cost-based peephole optimizer tests (by forcing Redland to do node counting).</li>
			</ul>
		<h3 id="v1_039">Version 1.039 (2006-07-14)</h3>
			<ul>
				<li>Removed dawg tests from distribution. Only used as developer tests now.</li>
				<li>Updated package to use Module::Install instead of ExtUtils::MakeMaker.</li>
				<li>Fixed a spurious uninitialized warning in RDF::Query::get_bridge.</li>
			</ul>
		<h3 id="v1_038">Version 1.038 (2006-07-09)</h3>
			<ul>
				<li>Fixed DBI case-sensitivity for PostgreSQL support.</li>
				<li>Cleaned up SQL syntax for easier debugging.</li>
				<li>Removed extra parens in SQL that were causing postgresql to break.</li>
				<li>Reference test foaf file using File::Spec->catfile() instead of directly.</li>
				<li>Fixed SPARQL parsing bug for anonymous nodes in FILTER expressions.</li>
				<li>Fixed major SQL compilation bugs for testing equality in FILTER expressions.</li>
				<li>Fixed bug in hashing code for blank nodes in SQL compiler.</li>
			</ul>
		<h3 id="v1_037">Version 1.037 (2006-07-06)</h3>
			<ul>
				<li>execute() method now takes optional 'bind' parameter for pre-binding query variables.</li>
				<li>Updated code to support basic FILTERs in SQL compilation.</li>
				<li>Fixed bug in SQL compilation where no WHERE clause was needed.</li>
				<li>Fixed bug in SQL compilation when using model-specific Statements tables.</li>
				<li>Added Storable to the list of required modules (was missing in the list).</li>
				<li>Fixed typos in metadata about past versions in DOAP Changes.ttl.</li>
			</ul>
		<h3 id="v1_036">Version 1.036 (2006-06-26)</h3>
			<ul>
				<li>Fixed memory leak in RDF::Query::Stream that resulted in too many database handles.</li>
				<li>Initial support for OPTIONALs in SQL compiler.</li>
				<li>Removed LWP requirement for systems without libwww.</li>
				<li>Added support for class variable to hold parsing errors. (Beware under threads.)</li>
				<li>RDF::Query now sets error variable upon parsing error. (Access with error().)</li>
				<li>Fixed POD errors, and added tests for POD coverage.</li>
				<li>Added model API methods to SQL model class.</li>
				<li>Added close() method to RDF::Query::Stream.</li>
			</ul>
		<h3 id="v1_035">Version 1.035 (2006-06-04)</h3>
			<ul>
				<li>Added DAWG tests and harness.</li>
				<li>Rewrote core logic in OPTIONAL handling code.</li>
				<li>Comparisons on literals now respect numeric datatypes.</li>
				<li>Fixed outdated calling conventions in casting functions.</li>
				<li>Added custom functions:
					<ul>
						<li>jena:sha1sum</li>
						<li>jena:now</li>
						<li>jena:langeq</li>
						<li>jena:listMember</li>
						<li>ldodds:Distance</li>
					</ul></li>
				<li>Added new model methods: equals, subject, predicate, object.</li>
				<li>Relocated external http-based test data to .Mac URLs.</li>
			</ul>
		<h3 id="v1_034">Version 1.034 (2006-05-01)</h3>
			<ul>
				<li>Added JSON serialization for bindings and boolean queries.</li>
				<li>Initial support for compiling RDF queries to SQL queries using the Redland schema.</li>
				<li>Added to_string method to query results Stream class.</li>
				<li>Model objects now store the query parse tree for access to data needed in serialization.</li>
				<li>Unquoted number and boolean literals in SPARQL are now datatyped appropriately.</li>
				<li>Fixed crashing bug when RDF::Query::Model::Redland::as_string was called with an undefined value.</li>
				<li>Fixed bug parsing queries with predicate starting with 'a' (confused with { ?subj a ?type}).</li>
				<li>Fixed bug parsing queries whose triple pattern ended with the optional dot.</li>
			</ul>
		<h3 id="v1_033">Version 1.033 (2006-03-08)</h3>
			<ul>
				<li>Updated test suite to work if one of the model classes is missing.</li>
				<li>Data-typed literals are now cast appropriately when used in a FILTER.</li>
				<li>Added support for xsd:dateTime datatypes using the DateTime module.</li>
				<li>Added support for LANG(), LANGMATCHES() and DATATYPE() built-in functions.</li>
				<li>Updated TODO list.</li>
				<li>Added more exception types to RDF::Query::Error.</li>
				<li>Added POD coverage.</li>
				<li>Fixed SPARQL parsing bug for logical operators &lt;= and &gt;=.</li>
			</ul>
		<h3 id="v1_032">Version 1.032 (2006-03-03)</h3>
			<ul>
				<li>Replaced the Parse::RecDescent SPARQL parser with a much faster hand-written one.</li>
				<li>Updated SPARQL parsing rules to be better about URI and QName character sets.</li>
				<li>FILTER equality operator now '=', not '==' (to match SPARQL spec).</li>
				<li>Initial support for FILTER constraints as part of the triple pattern structure (Will allow for nested FILTERs).</li>
				<li>Implemented support for ordering query results by an expression.</li>
				<li>Fixed bug in expresion handling of unary minus.</li>
				<li>Fixed bug in Redland NAMED GRAPH parsing.</li>
				<li>Fixed bug in RDF::Core parsing code where blank nodes would be accidentally smushed.</li>
			</ul>
		<h3 id="v1_031">Version 1.031 (2006-02-08)</h3>
			<ul>
				<li>Added support for NAMED graphs.</li>
			</ul>
		<h3 id="v1_030">Version 1.030 (2006-01-13)</h3>
			<ul>
				<li>Added support for SELECT * in SPARQL queries.</li>
				<li>Added support for default namespaces in SPARQL queries.</li>
				<li>Added tests for querying RDF collections in SPARQL (1 ?x 3)</li>
				<li>Added tests for triple patterns of the form { ?a ?a ?b . }</li>
				<li>Added tests for default namespaces in SPARQL.</li>
				<li>Added tests for SELECT * SPARQL queries.</li>
				<li>Bugfix where one of two identical triple variables would be ignored ({ ?a ?a ?b }).</li>
			</ul>
		<h3 id="v1_028">Version 1.028 (2005-11-18)</h3>
			<ul>
				<li>Added SPARQL functions: BOUND, isURI, isBLANK, isLITERAL.</li>
				<li>Updated SPARQL REGEX syntax.</li>
				<li>Updated SPARQL FILTER syntax.</li>
				<li>Added SPARQL RDF Collections syntactic forms.</li>
				<li>Fixed FILTER support in OPTIONAL queries.</li>
				<li>Added binding_value_by_name method to Query results stream class.</li>
				<li>Added isa_blank methods to RDF::Redland and RDF::Core model classes.</li>
				<li>Fixed RDF literal datatyping when using Redland versions >= 1.00_02.</li>
				<li>Updated SPARQL grammar to make 'WHERE' token optional.</li>
				<li>Added &lt;commit&gt; directives to SPARQL grammar.</li>
				<li>Updated SPARQL 'ORDER BY' syntax to use parenthesis.</li>
				<li>Fixed SPARQL FILTER logical-and support for more than two operands.</li>
				<li>Fixed SPARQL FILTER equality operator syntax to use '=' instead of '=='.</li>
				<li>Now requires Test::More 0.52 because of changes to is_deeply().</li>
			</ul>
		<h3 id="v1_027">Version 1.027 (2005-07-28)</h3>
			<ul>
				<li>Updated to follow SPARQL Draft 2005.07.21:<ul>
					<li>ORDER BY arguments now use parenthesis.</li>
					<li>SPARQL parser now supports ORDER BY operands: variable, expression, or function call.</li></ul></li>
				<li>Added binding_value_by_name() method to query result streams.</li>
			</ul>
		<h3 id="v1_026">Version 1.026 (2005-06-05)</h3>
			<ul>
				<li>Added new DBI model bridge (accesses Redland's mysql storage directly).</li>
				<li>Added built-in SPARQL functions and operators (not connected to grammar yet).</li>
				<li>Added bridge methods for accessing typed literal information.</li>
			</ul>
		<h3 id="v1_024">Version 1.024 (2005-06-02)</h3>
			<ul>
				<li>Added missing SPARQL OFFSET grammar rules.</li>
				<li>Added XML Results support for graph and boolean queries (DESCRIBE, CONSTRUCT, ASK).</li>
				<li>Fixed major bugs in RDF::Core bridge:<ul>
					<li>- Bridge wasn't using passed model.</li>
					<li>- Literal construction was broken.</li>
					<li>- Blank node construction was broken when no identifier was specified.</li></ul></li>
				<li>Stream::bindings_count now returns the right number even if there is no data.</li>
				<li>XML Result format now works with RDF::Core models.</li>
				<li>The Model bridge object is now passed to the Stream constructor.</li>
				<li>Internal code now uses the variables method.</li>
				<li>Removed redundant code from ORDER BY/LIMIT/OFFSET handling.</li>
				<li>Removed unused count method.</li>
				<li>Removed unused delegating AUTOLOAD.</li>
				<li>Removed unused parse_files method.</li>
				<li>Removed usused add_file method.</li>
				<li>Removed duplicate net test file.</li>
				<li>Added test file for local file-based SPARQL 'FROM' queries.</li>
				<li>Added test file for SPARQL Result Forms (LIMIT, ORDER BY, OFFSET, DISTINCT).</li>
				<li>Added test file for SPARQL Protocol for RDF (XML Results).</li>
				<li>Added new tests based on Devel::Cover results.</li>
				<li>Some test files now run against both Redland and RDF::Core:<ul>
					<li>- 00-simple.t</li>
					<li>- 03-coverage.t</li>
					<li>- 10-sparql_protocol.t</li></ul></li>
				<li>All debugging is now centrally located in the _debug method.</li>
				<li>Moved Stream class to lib/RDF/Query/Stream.pm.</li>
				<li>Fixed tests that broke with previous fix to CONSTRUCT queries.</li>
				<li>Fixed tests that broke with previous change to ASK query results.</li>
			</ul>
		<h3 id="v1_021">Version 1.021 (2005-06-01)</h3>
			<ul>
				<li>Added SPARQL UNION support.</li>
				<li>Broke OPTIONAL handling code off into a seperate method.</li>
				<li>Added new debugging code to trace errors in the twisty web of closures.</li>
			</ul>
		<h3 id="v1_020">Version 1.020 (2005-05-18)</h3>
			<ul>
				<li>Added support for SPARQL OPTIONAL graph patterns.</li>
				<li>Calling bindings_count on a stream now returns 0 with no data.</li>
				<li>Added Stream methods:
					<ul><li>is_bindings</li>
						<li>binding_name</li>
						<li>binding_values</li>
						<li>binding_names</li>
					</ul></li>
				<li>Added as_xml method to Stream class for XML Binding Results format.</li>
			</ul>
		<h3 id="v1_016">Version 1.016 (2005-05-08)</h3>
			<ul>
				<li>Added initial support for SPARQL ASK, DESCRIBE and CONSTRUCT queries.
					<ul><li>Added new test files for new query types.</li></ul></li>
				<li>Added methods to bridge classes for creating statements and blank nodes.</li>
				<li>Added as_string method to bridge classes for getting string versions of nodes.</li>
				<li>Broke out triple fixup code into fixup_triple_bridge_variables().</li>
				<li>Updated FILTER test to use new Geo::Distance API.</li>
			</ul>
		<h3 id="v1_015">Version 1.015 (2005-05-03)</h3>
			<ul>
				<li>Fixes to the arguments passed to FILTERs.</li>
				<li>Filter tests now show example of two custom filters:
					<ul><li>Transitive subClassOf testing.</li>
						<li>Logical comparison operators (range testing lat/lon values).</li></ul></li>
				<li>Added literal_value, uri_value, and blank_identifier methods to bridges.</li>
				<li>Redland bridge now calls sources/arcs/targets when only one field is missing.</li>
				<li>Fixes to stream code. Iterators are now destroyed in a timely manner.
					<ul><li>Complex queries no longer max out mysql connections under Redland.</li></ul></li>
				<li>Cleaned up node sorting code.
					<ul><li>Removed dependency on Sort::Naturally.</li>
						<li>Added new node sorting function ncmp().</li></ul></li>
				<li>check_constraints now calls ncmp() for logical comparisons.</li>
				<li>Added get_value method to make bridge calls and return a scalar value.</li>
				<li>Fixed node creation in Redland bridge.</li>
				<li>Moved DISTINCT handling code to occur before LIMITing.</li>
				<li>Added variables method to retrieve bound variable names.</li>
				<li>Added binding_count and get_all methods to streams.</li>
				<li>get_statments bridge methods now return RDF::Query::Stream objects.</li>
			</ul>
		<h3 id="v1_014">Version 1.014 (2005-04-26)</h3>
			<ul>
				<li>Made FILTERs work in SPARQL.</li>
				<li>Added initial SPARQL support for custom function constraints.</li>
				<li>SPARQL variables may now begin with the '$' sigil.</li>
				<li>Added direction support for ORDER BY (ascending/descending).</li>
				<li>Added 'next', 'current', and 'end' to Stream API.</li>
			</ul>
		<h3 id="v1_012">Version 1.012 (2005-04-24)</h3>
			<ul>
				<li>Stream objects now handle being constructed with an undef coderef.</li>
				<li>Streams are now objects usinig the Redland QueryResult API.</li>
				<li>RDF namespace is now always available in queries.</li>
				<li>row() now uses a stream when calling execute().</li>
				<li>Added ORDER BY support to RDQL parser.</li>
				<li>SPARQL constraints now properly use the 'FILTER' keyword.</li>
				<li>SPARQL constraints can now use '&amp;&amp;' as an operator.</li>
				<li>SPARQL namespace declaration is now optional.</li>
				<li>Updated tests.</li>
			</ul>
		<h3 id="v1_010">Version 1.010 (2005-04-21)</h3>
			<ul>
				<li><tt>execute</tt> now returns an iterator</li>
				<li>Added core support for DISTINCT, LIMIT, OFFSET</li>
				<li>Added initial core support for ORDER BY (only works on one column right now)</li>
				<li>Broke out the query parser into it's own RDQL class</li>
				<li>Added initial support for a SPARQL parser
					<ul><li>Added support for blank nodes</li>
						<li>Added lots of syntactic sugar (with blank nodes, multiple predicates and objects)</li>
						<li>Added SPARQL support for DISTINCT and ORDER BY</li>
					</ul></li>
				<li>Moved model-specific code into RDF::Query::Model::*</li>
				<li>Moving over to redland's query API (pass in the model when query is executed)</li>
			</ul>
	<h2>Copyright</h2>
		<p>Copyright &copy; 2005&#8211;2010 Gregory Williams. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.</p>
</body></html>