diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2018-11-03 13:14:35 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2018-11-13 11:17:31 +0100 |
commit | d58a15bea1b2ad2b1a9a5f5f4f208f066f8959ba (patch) | |
tree | 2aae3b58a4991caae56c9f9dbe0712ce0c0bbcc3 | |
parent | 2c28350d1e3200fa88eb504cf04f7986c76a769e (diff) | |
download | tracker-d58a15bea1b2ad2b1a9a5f5f4f208f066f8959ba.tar.gz |
libtracker-data: Support inverse property path
"?a ^:foo ?b" is equivalent to "?b :foo ?a", invert the subject/predicate
in order to handle this.
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index c085d6e1d..1961e6dad 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -4093,14 +4093,26 @@ static gboolean translate_PathEltOrInverse (TrackerSparql *sparql, GError **error) { + TrackerToken old_object, old_subject, *old_token; + /* PathEltOrInverse ::= PathElt | '^' PathElt */ + old_object = sparql->current_state.object; + old_subject = sparql->current_state.subject; + old_token = sparql->current_state.token; + if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_PATH_INVERSE)) { - _unimplemented ("Property paths"); + sparql->current_state.object = old_subject; + sparql->current_state.subject = old_object; + sparql->current_state.token = &sparql->current_state.subject; } _call_rule (sparql, NAMED_RULE_PathElt, error); + sparql->current_state.subject = old_subject; + sparql->current_state.object = old_object; + sparql->current_state.token = old_token; + return TRUE; } |