[tracker: 4/5] SPARQL: Support fn:*-from-dateTime functions to retrieve local time



commit 51981e033a0fa49c8aba0db859f0f15e2d03c926
Author: Jürg Billeter <j bitron ch>
Date:   Wed Feb 17 15:31:06 2010 +0100

    SPARQL: Support fn:*-from-dateTime functions to retrieve local time

 src/libtracker-data/tracker-sparql-query.vala |   92 +++++++++++++++++++++++++
 1 files changed, 92 insertions(+), 0 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index a9fa3c3..b755470 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -60,6 +60,9 @@ public class Tracker.SparqlQuery : Object {
 			}
 		}
 		string? _sql_expression;
+		public string get_extra_sql_expression (string suffix) {
+			return "\"%s\".\"%s:%s\"".printf (table.sql_query_tablename, sql_db_column_name, suffix);
+		}
 	}
 
 	// Represents a mapping of a SPARQL literal to a SQL table and column
@@ -85,11 +88,17 @@ public class Tracker.SparqlQuery : Object {
 		public string name { get; private set; }
 		public string sql_expression { get; private set; }
 		public VariableBinding binding;
+		string sql_identifier;
 
 		public Variable (string name, string sql_identifier) {
 			this.name = name;
+			this.sql_identifier = sql_identifier;
 			this.sql_expression = "\"%s\"".printf (sql_identifier);
 		}
+
+		public string get_extra_sql_expression (string suffix) {
+			return "\"%s:%s\"".printf (sql_identifier, suffix);
+		}
 	}
 
 	// Represents a variable used as a predicate
@@ -1458,6 +1467,80 @@ public class Tracker.SparqlQuery : Object {
 			sql.append (")");
 
 			return PropertyType.STRING;
+		} else if (uri == FN_NS + "year-from-dateTime") {
+			expect (SparqlTokenType.VAR);
+			string variable_name = get_last_string ().substring (1);
+			var variable = get_variable (variable_name);
+
+			sql.append ("strftime (\"%Y\", ");
+			sql.append (variable.get_extra_sql_expression ("localDate"));
+			sql.append (" * 24 * 3600, \"unixepoch\")");
+
+			return PropertyType.INTEGER;
+		} else if (uri == FN_NS + "month-from-dateTime") {
+			expect (SparqlTokenType.VAR);
+			string variable_name = get_last_string ().substring (1);
+			var variable = get_variable (variable_name);
+
+			sql.append ("strftime (\"%m\", ");
+			sql.append (variable.get_extra_sql_expression ("localDate"));
+			sql.append (" * 24 * 3600, \"unixepoch\")");
+
+			return PropertyType.INTEGER;
+		} else if (uri == FN_NS + "day-from-dateTime") {
+			expect (SparqlTokenType.VAR);
+			string variable_name = get_last_string ().substring (1);
+			var variable = get_variable (variable_name);
+
+			sql.append ("strftime (\"%d\", ");
+			sql.append (variable.get_extra_sql_expression ("localDate"));
+			sql.append (" * 24 * 3600, \"unixepoch\")");
+
+			return PropertyType.INTEGER;
+		} else if (uri == FN_NS + "hours-from-dateTime") {
+			expect (SparqlTokenType.VAR);
+			string variable_name = get_last_string ().substring (1);
+			var variable = get_variable (variable_name);
+
+			sql.append ("(");
+			sql.append (variable.get_extra_sql_expression ("localTime"));
+			sql.append (" / 3600)");
+
+			return PropertyType.INTEGER;
+		} else if (uri == FN_NS + "minutes-from-dateTime") {
+			expect (SparqlTokenType.VAR);
+			string variable_name = get_last_string ().substring (1);
+			var variable = get_variable (variable_name);
+
+			sql.append ("(");
+			sql.append (variable.get_extra_sql_expression ("localTime"));
+			sql.append (" / 60 % 60)");
+
+			return PropertyType.INTEGER;
+		} else if (uri == FN_NS + "seconds-from-dateTime") {
+			expect (SparqlTokenType.VAR);
+			string variable_name = get_last_string ().substring (1);
+			var variable = get_variable (variable_name);
+
+			sql.append ("(");
+			sql.append (variable.get_extra_sql_expression ("localTime"));
+			sql.append ("% 60)");
+
+			return PropertyType.INTEGER;
+		} else if (uri == FN_NS + "timezone-from-dateTime") {
+			expect (SparqlTokenType.VAR);
+			string variable_name = get_last_string ().substring (1);
+			var variable = get_variable (variable_name);
+
+			sql.append ("(");
+			sql.append (variable.get_extra_sql_expression ("localDate"));
+			sql.append (" * 24 * 3600 + ");
+			sql.append (variable.get_extra_sql_expression ("localTime"));
+			sql.append ("- ");
+			sql.append (variable.sql_expression);
+			sql.append (")");
+
+			return PropertyType.INTEGER;
 		} else if (uri == FTS_NS + "rank") {
 			bool is_var;
 			string v = parse_var_or_term (null, out is_var);
@@ -2774,6 +2857,15 @@ public class Tracker.SparqlQuery : Object {
 				binding.sql_expression,
 				binding.variable.sql_expression);
 
+			if (binding.data_type == PropertyType.DATETIME) {
+				sql.append_printf ("%s AS %s, ",
+					binding.get_extra_sql_expression ("localDate"),
+					binding.variable.get_extra_sql_expression ("localDate"));
+				sql.append_printf ("%s AS %s, ",
+					binding.get_extra_sql_expression ("localTime"),
+					binding.variable.get_extra_sql_expression ("localTime"));
+			}
+
 			subgraph_var_set.insert (binding.variable, variable_state);
 		}
 		binding_list.list.append (binding);



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