[tracker] SPARQL: Support WITH <uri> syntax for updates
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker] SPARQL: Support WITH <uri> syntax for updates
- Date: Mon, 8 Mar 2010 12:46:43 +0000 (UTC)
commit f7bedf2b1f178e38f2b84c3c7fba59a1e4dc3db0
Author: Jürg Billeter <j bitron ch>
Date: Mon Mar 8 13:23:16 2010 +0100
SPARQL: Support WITH <uri> syntax for updates
This has been specified in the current SPARQL 1.1 Update draft. The
old DELETE FROM / INSERT INTO syntax remains supported to not break
any clients.
src/libtracker-data/tracker-sparql-query.vala | 41 ++++++++++++----------
src/libtracker-data/tracker-sparql-scanner.vala | 15 +++++++-
2 files changed, 35 insertions(+), 21 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index 2a9e696..d6111c7 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -533,15 +533,14 @@ public class Tracker.SparqlQuery : Object {
while (current () != SparqlTokenType.EOF) {
switch (current ()) {
+ case SparqlTokenType.WITH:
case SparqlTokenType.INSERT:
- PtrArray* ptr = execute_insert (blank);
+ case SparqlTokenType.DELETE:
+ PtrArray* ptr = execute_insert_or_delete (blank);
if (blank) {
blank_nodes.add (ptr);
}
break;
- case SparqlTokenType.DELETE:
- execute_delete ();
- break;
case SparqlTokenType.DROP:
execute_drop_graph ();
break;
@@ -971,28 +970,32 @@ public class Tracker.SparqlQuery : Object {
}
}
- PtrArray? execute_insert (bool blank) throws DBInterfaceError, DataError, SparqlError, DateError {
- expect (SparqlTokenType.INSERT);
- if (accept (SparqlTokenType.INTO)) {
+ PtrArray? execute_insert_or_delete (bool blank) throws DBInterfaceError, DataError, SparqlError, DateError {
+ // INSERT or DELETE
+
+ if (accept (SparqlTokenType.WITH)) {
parse_from_or_into_param ();
} else {
current_graph = null;
}
- return execute_insert_or_delete (false, blank);
- }
- void execute_delete () throws DBInterfaceError, DataError, SparqlError, DateError {
- expect (SparqlTokenType.DELETE);
- if (accept (SparqlTokenType.FROM)) {
- parse_from_or_into_param ();
+ bool delete_statements;
+
+ if (accept (SparqlTokenType.INSERT)) {
+ delete_statements = false;
+
+ if (current_graph == null && accept (SparqlTokenType.INTO)) {
+ parse_from_or_into_param ();
+ }
} else {
- current_graph = null;
- }
- execute_insert_or_delete (true, false);
- }
+ expect (SparqlTokenType.DELETE);
+ delete_statements = true;
+ blank = false;
- PtrArray? execute_insert_or_delete (bool delete_statements, bool blank) throws DBInterfaceError, DataError, SparqlError, DateError {
- // INSERT or DELETE
+ if (current_graph == null && accept (SparqlTokenType.FROM)) {
+ parse_from_or_into_param ();
+ }
+ }
var pattern_sql = new StringBuilder ();
begin_query ();
diff --git a/src/libtracker-data/tracker-sparql-scanner.vala b/src/libtracker-data/tracker-sparql-scanner.vala
index 4fceb4f..e90abb6 100644
--- a/src/libtracker-data/tracker-sparql-scanner.vala
+++ b/src/libtracker-data/tracker-sparql-scanner.vala
@@ -195,7 +195,16 @@ public class Tracker.SparqlScanner : Object {
break;
case 'W':
case 'w':
- if (matches (begin, "WHERE")) return SparqlTokenType.WHERE;
+ switch (begin[1]) {
+ case 'H':
+ case 'h':
+ if (matches (begin, "WHERE")) return SparqlTokenType.WHERE;
+ break;
+ case 'I':
+ case 'i':
+ if (matches (begin, "WITH")) return SparqlTokenType.WITH;
+ break;
+ }
break;
case 'F':
case 'f':
@@ -864,7 +873,8 @@ public enum Tracker.SparqlTokenType {
TRUE,
UNION,
VAR,
- WHERE;
+ WHERE,
+ WITH;
public weak string to_string () {
switch (this) {
@@ -951,6 +961,7 @@ public enum Tracker.SparqlTokenType {
case UNION: return "`UNION'";
case VAR: return "variable";
case WHERE: return "`WHERE'";
+ case WITH: return "`WITH'";
default: return "unknown token";
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]