diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2018-11-03 13:07:04 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2018-11-13 11:17:31 +0100 |
commit | 2c28350d1e3200fa88eb504cf04f7986c76a769e (patch) | |
tree | d89e3046123ffd923cdecf377e9dad739f522588 | |
parent | 449eee76472a773f237f7a447b2aff64739d4d77 (diff) | |
download | tracker-2c28350d1e3200fa88eb504cf04f7986c76a769e.tar.gz |
libtracker-data: Prepare for property paths
Property paths may introduce intermediate anonymous resources, or
shuffle subject/object. We still do the bulk of the job while parsing
the predicate, so prepare for the predicate being pre-filled, and
the Path grammar element to alter the next parsed token.
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index 54e48a1d2..c085d6e1d 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -3761,21 +3761,23 @@ translate_TriplesSameSubject (TrackerSparql *sparql, /* TriplesSameSubject ::= VarOrTerm PropertyListNotEmpty | TriplesNode PropertyList */ rule = _current_rule (sparql); + sparql->current_state.token = &sparql->current_state.subject; if (rule == NAMED_RULE_VarOrTerm) { - sparql->current_state.token = &sparql->current_state.subject; _call_rule (sparql, rule, error); g_assert (!tracker_token_is_empty (&sparql->current_state.subject)); + sparql->current_state.token = &sparql->current_state.object; _call_rule (sparql, NAMED_RULE_PropertyListNotEmpty, error); } else if (rule == NAMED_RULE_TriplesNode) { - sparql->current_state.token = &sparql->current_state.subject; _call_rule (sparql, rule, error); g_assert (!tracker_token_is_empty (&sparql->current_state.subject)); + sparql->current_state.token = &sparql->current_state.object; _call_rule (sparql, NAMED_RULE_PropertyList, error); } tracker_token_unset (&sparql->current_state.subject); sparql->current_state.subject = old_subject; + sparql->current_state.token = NULL; return TRUE; } @@ -3826,9 +3828,11 @@ static gboolean translate_PropertyListNotEmpty (TrackerSparql *sparql, GError **error) { - TrackerToken old_pred; + TrackerToken old_pred, *prev_token; old_pred = sparql->current_state.predicate; + prev_token = sparql->current_state.token; + sparql->current_state.token = &sparql->current_state.object; /* PropertyListNotEmpty ::= Verb ObjectList ( ';' ( Verb ObjectList )? )* */ @@ -3853,6 +3857,7 @@ translate_PropertyListNotEmpty (TrackerSparql *sparql, } sparql->current_state.predicate = old_pred; + sparql->current_state.token = prev_token; return TRUE; } @@ -3906,23 +3911,23 @@ translate_TriplesSameSubjectPath (TrackerSparql *sparql, /* TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty | TriplesNodePath PropertyListPath */ rule = _current_rule (sparql); + sparql->current_state.token = &sparql->current_state.subject; if (rule == NAMED_RULE_VarOrTerm) { - sparql->current_state.token = &sparql->current_state.subject; _call_rule (sparql, rule, error); g_assert (!tracker_token_is_empty (&sparql->current_state.subject)); - + sparql->current_state.token = &sparql->current_state.object; _call_rule (sparql, NAMED_RULE_PropertyListPathNotEmpty, error); } else if (rule == NAMED_RULE_TriplesNodePath) { - sparql->current_state.token = &sparql->current_state.subject; _call_rule (sparql, rule, error); g_assert (!tracker_token_is_empty (&sparql->current_state.subject)); - + sparql->current_state.token = &sparql->current_state.object; _call_rule (sparql, NAMED_RULE_PropertyListPath, error); } tracker_token_unset (&sparql->current_state.subject); sparql->current_state.subject = old_subject; + sparql->current_state.token = NULL; return TRUE; } @@ -3945,13 +3950,15 @@ translate_PropertyListPathNotEmpty (TrackerSparql *sparql, GError **error) { TrackerGrammarNamedRule rule; - TrackerToken old_predicate; + TrackerToken old_predicate, *prev_token; TrackerParserNode *verb; /* PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple ) ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )* */ rule = _current_rule (sparql); old_predicate = sparql->current_state.predicate; + prev_token = sparql->current_state.token; + sparql->current_state.token = &sparql->current_state.object; if (rule == NAMED_RULE_VerbPath || rule == NAMED_RULE_VerbSimple) { verb = _skip_rule (sparql, rule); @@ -3982,6 +3989,7 @@ translate_PropertyListPathNotEmpty (TrackerSparql *sparql, } sparql->current_state.predicate = old_predicate; + sparql->current_state.token = prev_token; return TRUE; } @@ -4047,6 +4055,7 @@ translate_Path (TrackerSparql *sparql, /* Path ::= PathAlternative */ _call_rule (sparql, NAMED_RULE_PathAlternative, error); + return TRUE; } @@ -4109,11 +4118,17 @@ 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; + if (!tracker_token_is_empty (sparql->current_state.token)) { + return _add_quad (sparql, + &sparql->current_state.graph, + &sparql->current_state.subject, + &sparql->current_state.predicate, + &sparql->current_state.object, + error); + } else { + return _postprocess_rule (sparql, sparql->current_state.object_list, + NULL, error); + } } static gboolean @@ -4320,11 +4335,9 @@ translate_GraphNode (TrackerSparql *sparql, * VarOrTerm | TriplesNode | 'NULL' */ if (_check_in_rule (sparql, NAMED_RULE_VarOrTerm)) { - sparql->current_state.token = &sparql->current_state.object; _call_rule (sparql, NAMED_RULE_VarOrTerm, error); g_assert (!tracker_token_is_empty (&sparql->current_state.object)); } else if (_check_in_rule (sparql, NAMED_RULE_TriplesNode)) { - sparql->current_state.token = &sparql->current_state.object; _call_rule (sparql, NAMED_RULE_TriplesNode, error); g_assert (!tracker_token_is_empty (&sparql->current_state.object)); } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_NULL)) { @@ -4390,11 +4403,9 @@ translate_GraphNodePath (TrackerSparql *sparql, /* GraphNodePath ::= VarOrTerm | TriplesNodePath */ if (_check_in_rule (sparql, NAMED_RULE_VarOrTerm)) { - sparql->current_state.token = &sparql->current_state.object; _call_rule (sparql, NAMED_RULE_VarOrTerm, error); g_assert (!tracker_token_is_empty (&sparql->current_state.object)); } else if (_check_in_rule (sparql, NAMED_RULE_TriplesNodePath)) { - sparql->current_state.token = &sparql->current_state.object; _call_rule (sparql, NAMED_RULE_TriplesNodePath, error); g_assert (!tracker_token_is_empty (&sparql->current_state.object)); } else { |