[tracker] SPARQL: Add support for IF function



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]