[tracker] libtracker-data: Add support for YEAR/.../SECONDS builtin functions



commit 7881cb5dab9f2400f190579746b496aeea3d7697
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Jul 29 23:26:02 2015 +0200

    libtracker-data: Add support for YEAR/.../SECONDS builtin functions
    
    These functions are defined in Sparql 1.1 query language recommendation,
    http://www.w3.org/TR/sparql11-query/#func-year
    http://www.w3.org/TR/sparql11-query/#func-month
    http://www.w3.org/TR/sparql11-query/#func-day
    http://www.w3.org/TR/sparql11-query/#func-hours
    http://www.w3.org/TR/sparql11-query/#func-minutes
    http://www.w3.org/TR/sparql11-query/#func-seconds

 src/libtracker-data/tracker-sparql-expression.vala |   36 ++++++++++++++++
 src/libtracker-data/tracker-sparql-scanner.vala    |   45 +++++++++++++++++++-
 2 files changed, 79 insertions(+), 2 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-expression.vala 
b/src/libtracker-data/tracker-sparql-expression.vala
index cde2145..be1646f 100644
--- a/src/libtracker-data/tracker-sparql-expression.vala
+++ b/src/libtracker-data/tracker-sparql-expression.vala
@@ -1343,6 +1343,42 @@ class Tracker.Sparql.Expression : Object {
                        type = translate_aggregate_expression (sql);
                        sql.append (")");
                        return type;
+               case SparqlTokenType.SECONDS:
+                       next ();
+                       expect (SparqlTokenType.OPEN_PARENS);
+                       var result = translate_function (sql, FN_NS + "seconds-from-dateTime");
+                       expect (SparqlTokenType.CLOSE_PARENS);
+                       return result;
+               case SparqlTokenType.MINUTES:
+                       next ();
+                       expect (SparqlTokenType.OPEN_PARENS);
+                       var result = translate_function (sql, FN_NS + "minutes-from-dateTime");
+                       expect (SparqlTokenType.CLOSE_PARENS);
+                       return result;
+               case SparqlTokenType.HOURS:
+                       next ();
+                       expect (SparqlTokenType.OPEN_PARENS);
+                       var result = translate_function (sql, FN_NS + "hours-from-dateTime");
+                       expect (SparqlTokenType.CLOSE_PARENS);
+                       return result;
+               case SparqlTokenType.DAY:
+                       next ();
+                       expect (SparqlTokenType.OPEN_PARENS);
+                       var result = translate_function (sql, FN_NS + "day-from-dateTime");
+                       expect (SparqlTokenType.CLOSE_PARENS);
+                       return result;
+               case SparqlTokenType.MONTH:
+                       next ();
+                       expect (SparqlTokenType.OPEN_PARENS);
+                       var result = translate_function (sql, FN_NS + "month-from-dateTime");
+                       expect (SparqlTokenType.CLOSE_PARENS);
+                       return result;
+               case SparqlTokenType.YEAR:
+                       next ();
+                       expect (SparqlTokenType.OPEN_PARENS);
+                       var result = translate_function (sql, FN_NS + "year-from-dateTime");
+                       expect (SparqlTokenType.CLOSE_PARENS);
+                       return result;
                case SparqlTokenType.GROUP_CONCAT:
                        next ();
                        sql.append ("GROUP_CONCAT(");
diff --git a/src/libtracker-data/tracker-sparql-scanner.vala b/src/libtracker-data/tracker-sparql-scanner.vala
index 3f5e63a..35a417e 100644
--- a/src/libtracker-data/tracker-sparql-scanner.vala
+++ b/src/libtracker-data/tracker-sparql-scanner.vala
@@ -106,6 +106,10 @@ public class Tracker.SparqlScanner : Object {
                                        break;
                                }
                                break;
+                       case 'D':
+                       case 'd':
+                               if (matches (begin, "DAY")) return SparqlTokenType.DAY;
+                               break;
                        case 'M':
                        case 'm':
                                switch (begin[1]) {
@@ -189,6 +193,10 @@ public class Tracker.SparqlScanner : Object {
                        case 'w':
                                if (matches (begin, "WITH")) return SparqlTokenType.WITH;
                                break;
+                       case 'Y':
+                       case 'y':
+                               if (matches (begin, "YEAR")) return SparqlTokenType.YEAR;
+                               break;
                        }
                        break;
                case 5:
@@ -214,6 +222,10 @@ public class Tracker.SparqlScanner : Object {
                                        break;
                                }
                                break;
+                       case 'H':
+                       case 'h':
+                               if (matches (begin, "HOURS")) return SparqlTokenType.HOURS;
+                               break;
                        case 'L':
                        case 'l':
                                switch (begin[1]) {
@@ -227,6 +239,10 @@ public class Tracker.SparqlScanner : Object {
                                        break;
                                }
                                break;
+                       case 'M':
+                       case 'm':
+                               if (matches (begin, "MONTH")) return SparqlTokenType.MONTH;
+                               break;
                        case 'N':
                        case 'n':
                                if (matches (begin, "NAMED")) return SparqlTokenType.NAMED;
@@ -357,6 +373,10 @@ public class Tracker.SparqlScanner : Object {
                        break;
                case 7:
                        switch (begin[0]) {
+                       case 'M':
+                       case 'm':
+                               if (matches (begin, "MINUTES")) return SparqlTokenType.MINUTES;
+                               break;
                        case 'R':
                        case 'r':
                                switch (begin[2]) {
@@ -372,7 +392,16 @@ public class Tracker.SparqlScanner : Object {
                                break;
                        case 'S':
                        case 's':
-                               if (matches (begin, "STRENDS")) return SparqlTokenType.STRENDS;
+                               switch (begin[1]) {
+                               case 'E':
+                               case 'e':
+                                       if (matches (begin, "SECONDS")) return SparqlTokenType.SECONDS;
+                                       break;
+                               case 'T':
+                               case 't':
+                                       if (matches (begin, "STRENDS")) return SparqlTokenType.STRENDS;
+                                       break;
+                               }
                                break;
                        case 'I':
                        case 'i':
@@ -975,6 +1004,7 @@ public enum Tracker.SparqlTokenType {
        COUNT,
        DATA,
        DATATYPE,
+       DAY,
        DECIMAL,
        DELETE,
        DESC,
@@ -996,6 +1026,7 @@ public enum Tracker.SparqlTokenType {
        GROUP,
        GROUP_CONCAT,
        HAVING,
+       HOURS,
        IF,
        INSERT,
        INTEGER,
@@ -1012,6 +1043,8 @@ public enum Tracker.SparqlTokenType {
        MAX,
        MIN,
        MINUS,
+       MINUTES,
+       MONTH,
        NAMED,
        NOT,
        NULL, /* Non-standard in SPARQL spec */
@@ -1040,6 +1073,7 @@ public enum Tracker.SparqlTokenType {
        REPLACE,
        ROUND,
        SAMETERM,
+       SECONDS,
        SELECT,
        SEMICOLON,
        SILENT,
@@ -1061,7 +1095,8 @@ public enum Tracker.SparqlTokenType {
        UNION,
        VAR,
        WHERE,
-       WITH;
+       WITH,
+       YEAR;
 
        public unowned string to_string () {
                switch (this) {
@@ -1089,6 +1124,7 @@ public enum Tracker.SparqlTokenType {
                case CONSTRUCT: return "`CONSTRUCT'";
                case COUNT: return "`COUNT'";
                case DATATYPE: return "`DATATYPE'";
+               case DAY: return "`DAY'";
                case DECIMAL: return "`DECIMAL'";
                case DELETE: return "`DELETE'";
                case DESC: return "`DESC'";
@@ -1108,6 +1144,7 @@ public enum Tracker.SparqlTokenType {
                case GROUP: return "`GROUP'";
                case GROUP_CONCAT: return "`GROUP_CONCAT'";
                case HAVING: return "`HAVING'";
+               case HOURS: return "`HOURS'";
                case IF: return "`IF'";
                case INSERT: return "`INSERT'";
                case INTEGER: return "`INTEGER'";
@@ -1124,6 +1161,8 @@ public enum Tracker.SparqlTokenType {
                case MAX: return "`MAX'";
                case MIN: return "`MIN'";
                case MINUS: return "`-'";
+               case MINUTES: return "`MINUTES'";
+               case MONTH: return "`MONTH'";
                case NAMED: return "`NAMED'";
                case NOT: return "`NOT'";
                case OFFSET: return "`OFFSET'";
@@ -1151,6 +1190,7 @@ public enum Tracker.SparqlTokenType {
                case REPLACE: return "`REPLACE'";
                case ROUND: return "`ROUND'";
                case SAMETERM: return "`SAMETERM'";
+               case SECONDS: return "`SECONDS'";
                case SELECT: return "`SELECT'";
                case SEMICOLON: return "`;'";
                case SILENT: return "`SILENT'";
@@ -1173,6 +1213,7 @@ public enum Tracker.SparqlTokenType {
                case VAR: return "variable";
                case WHERE: return "`WHERE'";
                case WITH: return "`WITH'";
+               case YEAR: return "`YEAR'";
                default: return "unknown token";
                }
        }


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