[tracker/wip/carlosg/sparql-parser-ng: 3/6] libtracker-data: Support sequence property path
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/sparql-parser-ng: 3/6] libtracker-data: Support sequence property path
- Date: Tue, 6 Nov 2018 10:22:08 +0000 (UTC)
commit 301e7e70a183af93a12b71ffa86eb9daf68b3ee9
Author: Carlos Garnacho <carlosg gnome org>
Date: Sat Nov 3 13:16:59 2018 +0100
libtracker-data: Support sequence property path
"?a :foo/:bar ?b" is equivalent to "?a :foo ?gen . ?gen :bar ?b",
make the parser make up those generated variables before processing
the current predicate property.
src/libtracker-data/tracker-sparql.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 1961e6dad..9a2732a80 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -4078,14 +4078,35 @@ static gboolean
translate_PathSequence (TrackerSparql *sparql,
GError **error)
{
+ TrackerToken old_object, old_subject;
+ TrackerVariable *var;
+ TrackerParserNode *rule;
+
/* PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )*
*/
- _call_rule (sparql, NAMED_RULE_PathEltOrInverse, error);
+ old_object = sparql->current_state.object;
+ old_subject = sparql->current_state.subject;
- if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_PATH_SEQUENCE)) {
- _unimplemented ("Property paths");
+ rule = _skip_rule (sparql, NAMED_RULE_PathEltOrInverse);
+
+ while (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_PATH_SEQUENCE)) {
+ var = tracker_select_context_add_generated_variable (TRACKER_SELECT_CONTEXT
(sparql->context));
+ tracker_token_variable_init (&sparql->current_state.object, var);
+
+ if (!_postprocess_rule (sparql, rule, NULL, error))
+ return FALSE;
+
+ rule = _skip_rule (sparql, NAMED_RULE_PathEltOrInverse);
+ sparql->current_state.subject = sparql->current_state.object;
+ tracker_token_unset (&sparql->current_state.object);
}
+ if (!_postprocess_rule (sparql, rule, NULL, error))
+ return FALSE;
+
+ sparql->current_state.subject = old_subject;
+ sparql->current_state.object = old_object;
+
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]