[tracker/parser] SPARQL: Fix SELECT *
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/parser] SPARQL: Fix SELECT *
- Date: Fri, 7 Aug 2009 12:15:17 +0000 (UTC)
commit 665e0c895427359a19af57c0924ecffc11c30295
Author: Jürg Billeter <j bitron ch>
Date: Fri Aug 7 14:12:55 2009 +0200
SPARQL: Fix SELECT *
src/libtracker-data/tracker-sparql-query.vala | 86 +++++++++++++++++++------
1 files changed, 65 insertions(+), 21 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index bb76114..fbf4c44 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -506,6 +506,26 @@ public class Tracker.SparqlQuery : Object {
return stmt.execute ();
}
+ void skip_select_variables () {
+ while (true) {
+ switch (current ()) {
+ case SparqlTokenType.FROM:
+ case SparqlTokenType.WHERE:
+ case SparqlTokenType.OPEN_BRACE:
+ case SparqlTokenType.GROUP:
+ case SparqlTokenType.ORDER:
+ case SparqlTokenType.LIMIT:
+ case SparqlTokenType.OFFSET:
+ case SparqlTokenType.EOF:
+ break;
+ default:
+ next ();
+ continue;
+ }
+ break;
+ }
+ }
+
DBResultSet? execute_select () throws Error {
// SELECT query
@@ -513,8 +533,6 @@ public class Tracker.SparqlQuery : Object {
var_map = new HashTable<string,VariableBinding>.full (str_hash, str_equal, g_free, g_object_unref);
predicate_variable_map = new HashTable<string,PredicateVariable>.full (str_hash, str_equal, g_free, g_object_unref);
- var select_variables = new List<string> ();
-
// build SQL
var sql = new StringBuilder ();
sql.append ("SELECT ");
@@ -526,17 +544,9 @@ public class Tracker.SparqlQuery : Object {
} else if (accept (SparqlTokenType.REDUCED)) {
}
- if (accept (SparqlTokenType.STAR)) {
- // TODO
- } else {
- if (current () == SparqlTokenType.VAR) {
- while (accept (SparqlTokenType.VAR)) {
- select_variables.append (get_last_string ().substring (1));
- }
- } else {
- // TODO: error
- }
- }
+ // skip select variables (processed later)
+ var select_variables_location = get_location ();
+ skip_select_variables ();
if (accept (SparqlTokenType.FROM)) {
accept (SparqlTokenType.NAMED);
@@ -546,23 +556,57 @@ public class Tracker.SparqlQuery : Object {
accept (SparqlTokenType.WHERE);
visit_group_graph_pattern ();
+ string pattern_sql_string = pattern_sql.str;
+ pattern_sql.truncate (0);
+
+ // process select variables
+ var after_where = get_location ();
+ set_location (select_variables_location);
bool first = true;
- foreach (string variable in select_variables) {
- if (!first) {
- sql.append (", ");
- } else {
- first = false;
+ if (accept (SparqlTokenType.STAR)) {
+ foreach (string variable_name in var_map.get_keys ()) {
+ if (!first) {
+ pattern_sql.append (", ");
+ } else {
+ first = false;
+ }
+ pattern_sql.append (get_sql_for_variable (variable_name));
+ }
+ } else {
+ while (true) {
+ if (!first) {
+ pattern_sql.append (", ");
+ } else {
+ first = false;
+ }
+ parse_primary_expression ();
+
+ switch (current ()) {
+ case SparqlTokenType.FROM:
+ case SparqlTokenType.WHERE:
+ case SparqlTokenType.OPEN_BRACE:
+ case SparqlTokenType.GROUP:
+ case SparqlTokenType.ORDER:
+ case SparqlTokenType.LIMIT:
+ case SparqlTokenType.OFFSET:
+ case SparqlTokenType.EOF:
+ break;
+ default:
+ continue;
+ }
+ break;
}
- sql.append (get_sql_for_variable (variable));
}
+ sql.append (pattern_sql.str);
+ pattern_sql.truncate (0);
// select from results of WHERE clause
sql.append (" FROM (");
- sql.append (pattern_sql.str);
+ sql.append (pattern_sql_string);
sql.append (")");
- pattern_sql.truncate (0);
+ set_location (after_where);
if (accept (SparqlTokenType.GROUP)) {
expect (SparqlTokenType.BY);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]