summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2018-11-03 13:07:04 +0100
committerCarlos Garnacho <carlosg@gnome.org>2018-11-13 11:17:31 +0100
commit2c28350d1e3200fa88eb504cf04f7986c76a769e (patch)
treed89e3046123ffd923cdecf377e9dad739f522588
parent449eee76472a773f237f7a447b2aff64739d4d77 (diff)
downloadtracker-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.c45
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 {