summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2018-11-03 13:14:35 +0100
committerCarlos Garnacho <carlosg@gnome.org>2018-11-13 11:17:31 +0100
commitd58a15bea1b2ad2b1a9a5f5f4f208f066f8959ba (patch)
tree2aae3b58a4991caae56c9f9dbe0712ce0c0bbcc3
parent2c28350d1e3200fa88eb504cf04f7986c76a769e (diff)
downloadtracker-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.c14
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;
}