[tracker] libtracker-data: Handle BIND while in group graph pattern



commit 086ac5d29c7dbb8319356a01c1202c00a9b87fd2
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun Nov 13 15:44:22 2016 +0100

    libtracker-data: Handle BIND while in group graph pattern
    
    Currently SQL construction fails while using the BIND form inside
    a group graph pattern, eg. after OPTIONALs. When in that stage,
    the OPTIONALs will be already resolved to SQL in the "FROM ..."
    clause as nested SELECTs.
    
    As such the generated SQL is wrong, make it handle this case
    by wrapping the nested SELECTs under "SELECT $bind_value, * FROM (...)"
    so the value is made available to the wrapping SELECT. The older
    code still applies when building simple "{ ... . BIND (...) }" clauses.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=774251

 src/libtracker-data/tracker-sparql-pattern.vala |   21 +++++++++++++++++++--
 1 files changed, 19 insertions(+), 2 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-pattern.vala b/src/libtracker-data/tracker-sparql-pattern.vala
index e6a209d..4511c02 100644
--- a/src/libtracker-data/tracker-sparql-pattern.vala
+++ b/src/libtracker-data/tracker-sparql-pattern.vala
@@ -1108,7 +1108,10 @@ class Tracker.Sparql.Pattern : Object {
 
                                expect (SparqlTokenType.OPEN_PARENS);
 
-                               context.in_bind = true;
+                               // We only need the binding sql expression when
+                               // we are not in a group graph pattern, both
+                               // cases are handled differently below.
+                               context.in_bind = !in_group_graph_pattern;
                                expression.translate_expression (bind_sql);
                                context.in_bind = false;
                                binding.sql_expression = bind_sql.str;
@@ -1123,7 +1126,21 @@ class Tracker.Sparql.Pattern : Object {
                                }
 
                                binding.variable = as_var;
-                               add_variable_binding (sql, binding, VariableState.BOUND);
+
+                               if (in_group_graph_pattern) {
+                                       // Surround the entire group graph pattern with
+                                       // SELECT $binding , * FROM (...)
+                                       var binding_sql = new StringBuilder ("SELECT ");
+                                       add_variable_binding (binding_sql, binding, VariableState.BOUND);
+                                       binding_sql.append (" * FROM (");
+                                       sql.insert (group_graph_pattern_start, binding_sql.str);
+                                       sql.append (")");
+                               } else {
+                                       // This is the "simple" case, where we are
+                                       // still constructing the SELECT ... part,
+                                       // just add the binding sql in this case.
+                                       add_variable_binding (sql, binding, VariableState.BOUND);
+                               }
 
                                expect (SparqlTokenType.CLOSE_PARENS);
                        } else if (current () == SparqlTokenType.OPEN_BRACE) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]