diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2018-06-10 18:44:34 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2018-11-13 11:17:31 +0100 |
commit | 9292ed6da367790450f77a384b55617ea8bf3ddf (patch) | |
tree | c141cb575b53cb9d668e41fa874589e16bf9a4b4 | |
parent | 58b399e302423ed9a65cb6b184f7a7b652bc0531 (diff) | |
download | tracker-9292ed6da367790450f77a384b55617ea8bf3ddf.tar.gz |
libtracker-data: Invert processing of Verb and ObjectList clauses
For sequential property paths it will be more convenient to have the
ObjectList node available before processing the property path, so we
can explode those properly into intermediate blank nodes.
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index 1015a0a92..6def40023 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -103,6 +103,7 @@ struct _TrackerSparql TrackerStringBuilder *sql; TrackerParserNode *node; TrackerParserNode *prev_node; + TrackerParserNode *object_list; TrackerToken graph; TrackerToken subject; @@ -3517,6 +3518,7 @@ translate_PropertyListPathNotEmpty (TrackerSparql *sparql, { TrackerGrammarNamedRule rule; TrackerToken old_predicate; + TrackerParserNode *verb; /* PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple ) ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )* */ @@ -3524,12 +3526,14 @@ translate_PropertyListPathNotEmpty (TrackerSparql *sparql, old_predicate = sparql->current_state.predicate; if (rule == NAMED_RULE_VerbPath || rule == NAMED_RULE_VerbSimple) { - _call_rule (sparql, rule, error); + verb = _skip_rule (sparql, rule); } else { g_assert_not_reached (); } - _call_rule (sparql, NAMED_RULE_ObjectListPath, error); + sparql->current_state.object_list = _skip_rule (sparql, NAMED_RULE_ObjectListPath); + if (!_postprocess_rule (sparql, verb, NULL, error)) + return FALSE; tracker_token_unset (&sparql->current_state.predicate); @@ -3537,12 +3541,15 @@ translate_PropertyListPathNotEmpty (TrackerSparql *sparql, rule = _current_rule (sparql); if (rule == NAMED_RULE_VerbPath || rule == NAMED_RULE_VerbSimple) { - _call_rule (sparql, rule, error); + verb = _skip_rule (sparql, rule); } else { break; } - _call_rule (sparql, NAMED_RULE_ObjectList, error); + sparql->current_state.object_list = _skip_rule (sparql, NAMED_RULE_ObjectList); + if (!_postprocess_rule (sparql, verb, NULL, error)) + return FALSE; + tracker_token_unset (&sparql->current_state.predicate); } @@ -3572,6 +3579,10 @@ translate_VerbSimple (TrackerSparql *sparql, _init_token (&sparql->current_state.predicate, sparql->current_state.prev_node, sparql); + if (!_postprocess_rule (sparql, sparql->current_state.object_list, + NULL, error)) + return FALSE; + return TRUE; } @@ -3670,6 +3681,10 @@ translate_PathElt (TrackerSparql *sparql, _call_rule (sparql, NAMED_RULE_PathMod, error); } + if (!_postprocess_rule (sparql, sparql->current_state.object_list, + NULL, error)) + return FALSE; + return TRUE; } |