[tracker/rss-enclosures] libtracker-data: Support for SPARQL 1.1's IN operator



commit 3ebb61d8a58c08f81dd341827e3ae93cc5789c5e
Author: Philip Van Hoof <philip codeminded be>
Date:   Fri Jul 30 11:14:50 2010 +0200

    libtracker-data: Support for SPARQL 1.1's IN operator

 src/libtracker-data/tracker-sparql-expression.vala |   15 +++++++++++++++
 src/libtracker-data/tracker-sparql-scanner.vala    |    6 ++++++
 2 files changed, 21 insertions(+), 0 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-expression.vala b/src/libtracker-data/tracker-sparql-expression.vala
index 4325fcd..b155aa3 100644
--- a/src/libtracker-data/tracker-sparql-expression.vala
+++ b/src/libtracker-data/tracker-sparql-expression.vala
@@ -1088,6 +1088,19 @@ class Tracker.Sparql.Expression : Object {
 		return PropertyType.BOOLEAN;
 	}
 
+	PropertyType translate_in (StringBuilder sql) throws SparqlError {
+		expect (SparqlTokenType.OPEN_PARENS);
+		sql.append (" IN (");
+		translate_expression_as_string (sql);
+		while (accept (SparqlTokenType.COMMA)) {
+			sql.append (", ");
+			translate_expression_as_string (sql);
+		}
+		expect (SparqlTokenType.CLOSE_PARENS);
+		sql.append (")");
+		return PropertyType.BOOLEAN;
+	}
+
 	PropertyType translate_relational_expression (StringBuilder sql) throws SparqlError {
 		long begin = sql.len;
 		// TODO: improve performance (linked list)
@@ -1105,6 +1118,8 @@ class Tracker.Sparql.Expression : Object {
 			return process_relational_expression (sql, begin, n_bindings, optype, " <= ");
 		} else if (accept (SparqlTokenType.OP_GT)) {
 			return process_relational_expression (sql, begin, n_bindings, optype, " > ");
+		} else if (accept (SparqlTokenType.OP_IN)) {
+			return translate_in (sql);
 		}
 		return optype;
 	}
diff --git a/src/libtracker-data/tracker-sparql-scanner.vala b/src/libtracker-data/tracker-sparql-scanner.vala
index d803045..bef8d5c 100644
--- a/src/libtracker-data/tracker-sparql-scanner.vala
+++ b/src/libtracker-data/tracker-sparql-scanner.vala
@@ -59,6 +59,10 @@ public class Tracker.SparqlScanner : Object {
 			case 'b':
 				if (matches (begin, "BY")) return SparqlTokenType.BY;
 				break;
+			case 'i':
+			case 'I':
+				if (matches (begin, "IN")) return SparqlTokenType.OP_IN;
+				break;
 			}
 			break;
 		case 3:
@@ -863,6 +867,7 @@ public enum Tracker.SparqlTokenType {
 	OP_NE,
 	OP_NEG,
 	OP_OR,
+	OP_IN,
 	OPEN_BRACE,
 	OPEN_BRACKET,
 	OPEN_PARENS,
@@ -953,6 +958,7 @@ public enum Tracker.SparqlTokenType {
 		case OP_NE: return "`!='";
 		case OP_NEG: return "`!'";
 		case OP_OR: return "`||'";
+		case OP_IN: return "`IN'";
 		case OPEN_BRACE: return "`{'";
 		case OPEN_BRACKET: return "`['";
 		case OPEN_PARENS: return "`('";



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]