[tracker] SPARQL: Add support for IF function
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker] SPARQL: Add support for IF function
- Date: Thu, 20 Jan 2011 10:22:37 +0000 (UTC)
commit 7394589754516df9d6fd1fc8b21ac1f6f95540a9
Author: Jürg Billeter <j bitron ch>
Date: Wed Jan 19 14:55:29 2011 +0100
SPARQL: Add support for IF function
src/libtracker-data/tracker-sparql-expression.vala | 28 ++++++++++++++++++++
src/libtracker-data/tracker-sparql-scanner.vala | 13 ++++++++-
2 files changed, 40 insertions(+), 1 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-expression.vala b/src/libtracker-data/tracker-sparql-expression.vala
index bd4a53a..760cc90 100644
--- a/src/libtracker-data/tracker-sparql-expression.vala
+++ b/src/libtracker-data/tracker-sparql-expression.vala
@@ -208,6 +208,31 @@ class Tracker.Sparql.Expression : Object {
expect (SparqlTokenType.CLOSE_PARENS);
}
+ PropertyType translate_if_call (StringBuilder sql) throws Sparql.Error {
+ expect (SparqlTokenType.IF);
+ expect (SparqlTokenType.OPEN_PARENS);
+
+ // condition
+ sql.append ("(CASE ");
+ translate_expression (sql);
+
+ // if condition is true
+ sql.append (" WHEN 1 THEN ");
+ expect (SparqlTokenType.COMMA);
+ var type = translate_expression (sql);
+
+ // if condition is false
+ sql.append (" WHEN 0 THEN ");
+ expect (SparqlTokenType.COMMA);
+ translate_expression (sql);
+
+ sql.append (" ELSE NULL END)");
+
+ expect (SparqlTokenType.CLOSE_PARENS);
+
+ return type;
+ }
+
void translate_regex (StringBuilder sql) throws Sparql.Error {
expect (SparqlTokenType.REGEX);
expect (SparqlTokenType.OPEN_PARENS);
@@ -962,6 +987,8 @@ class Tracker.Sparql.Expression : Object {
case SparqlTokenType.BOUND:
translate_bound_call (sql);
return PropertyType.BOOLEAN;
+ case SparqlTokenType.IF:
+ return translate_if_call (sql);
case SparqlTokenType.SAMETERM:
next ();
expect (SparqlTokenType.OPEN_PARENS);
@@ -1280,6 +1307,7 @@ class Tracker.Sparql.Expression : Object {
case SparqlTokenType.LANGMATCHES:
case SparqlTokenType.DATATYPE:
case SparqlTokenType.BOUND:
+ case SparqlTokenType.IF:
case SparqlTokenType.SAMETERM:
case SparqlTokenType.ISIRI:
case SparqlTokenType.ISURI:
diff --git a/src/libtracker-data/tracker-sparql-scanner.vala b/src/libtracker-data/tracker-sparql-scanner.vala
index 5a188db..e9f6615 100644
--- a/src/libtracker-data/tracker-sparql-scanner.vala
+++ b/src/libtracker-data/tracker-sparql-scanner.vala
@@ -61,7 +61,16 @@ public class Tracker.SparqlScanner : Object {
break;
case 'i':
case 'I':
- if (matches (begin, "IN")) return SparqlTokenType.OP_IN;
+ switch (begin[1]) {
+ case 'F':
+ case 'f':
+ if (matches (begin, "IF")) return SparqlTokenType.IF;
+ break;
+ case 'N':
+ case 'n':
+ if (matches (begin, "IN")) return SparqlTokenType.OP_IN;
+ break;
+ }
break;
}
break;
@@ -858,6 +867,7 @@ public enum Tracker.SparqlTokenType {
GRAPH,
GROUP,
GROUP_CONCAT,
+ IF,
INSERT,
INTEGER,
INTO,
@@ -949,6 +959,7 @@ public enum Tracker.SparqlTokenType {
case GRAPH: return "`GRAPH'";
case GROUP: return "`GROUP'";
case GROUP_CONCAT: return "`GROUP_CONCAT'";
+ case IF: return "`IF'";
case INSERT: return "`INSERT'";
case INTEGER: return "`INTEGER'";
case INTO: return "`INTO'";
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]