[rygel] media-db: Refactor search translator



commit 05fbd93bcf5e3b62d21329df3c375008ee070af8
Author: Jens Georg <mail jensge org>
Date:   Sat Nov 21 14:47:37 2009 +0100

    media-db: Refactor search translator

 src/rygel/rygel-media-db-container.vala |  209 ++++++++++++++++---------------
 1 files changed, 105 insertions(+), 104 deletions(-)
---
diff --git a/src/rygel/rygel-media-db-container.vala b/src/rygel/rygel-media-db-container.vala
index 623b779..5cbd43f 100644
--- a/src/rygel/rygel-media-db-container.vala
+++ b/src/rygel/rygel-media-db-container.vala
@@ -72,6 +72,7 @@ public class Rygel.MediaDBContainer : MediaContainer {
                                         out uint         total_matches,
                                         Cancellable?     cancellable)
                                         throws GLib.Error {
+
         var args = new GLib.ValueArray(0);
         var filter = this.search_expression_to_sql (expression, args);
 
@@ -97,6 +98,16 @@ public class Rygel.MediaDBContainer : MediaContainer {
         return children;
     }
 
+    private string? logexp_to_sql (LogicalExpression? exp,
+                                   GLib.ValueArray args) {
+        string left = search_expression_to_sql (exp.operand1, args);
+        string right = search_expression_to_sql (exp.operand2, args);
+        return "(%s %s %s)".printf (
+                                  left,
+                                  exp.op == LogicalOperator.AND ? "AND" : "OR",
+                                  right);
+    }
+
     private string? search_expression_to_sql (SearchExpression? expression,
                                               GLib.ValueArray args) {
         string result = null;
@@ -105,113 +116,103 @@ public class Rygel.MediaDBContainer : MediaContainer {
             return result;
 
         if (expression is LogicalExpression) {
-            var exp = (LogicalExpression) expression;
-            string left = search_expression_to_sql (exp.operand1, args);
-            string right = search_expression_to_sql (exp.operand2, args);
-            result = "(%s %s %s)".printf (left,
-                          expression.op == LogicalOperator.AND ? "AND" : "OR",
-                          right);
+            return logexp_to_sql ((LogicalExpression) expression, args);
         } else {
-            var exp = (RelationalExpression) expression;
-            string column = null;
-            string func = null;
-            switch (exp.operand1)
-            {
-                case "@id":
-                    column = "o.upnp_id";
-                    break;
-                case "@parentID":
-                    column = "o.parent";
-                    break;
-                case "upnp:class":
-                    column = "m.class";
-                    break;
-                case "dc:title":
-                    column = "o.title";
-                    break;
-                case "dc:creator":
-                    column = "m.author";
-                    break;
-                case "dc:date":
-                    column = "m.date";
-                    break;
-                default:
-                    warning("Unsupported thing");
-                    break;
-            }
-            if (column == null)
-                return result;
-
-            switch (exp.op) {
-/*                case SearchCriteriaOp.EXISTS:
-                    if (op.operand2 == "true")
-                        func = "=";
-                    else
-                        func = "!=";
-                    break; */
-                case SearchCriteriaOp.EQ:
-                    func = "=";
-                    GLib.Value v;
-                    v = exp.operand2;
-                    args.append (v);
-                    break;
-                case SearchCriteriaOp.NEQ:
-                    func = "=";
-                    GLib.Value v;
-                    v = exp.operand2;
-                    args.append (v);
-                    break;
-                case SearchCriteriaOp.LESS:
-                    func = "<";
-                    GLib.Value v;
-                    v = exp.operand2;
-                    args.append (v);
-                    break;
-                case SearchCriteriaOp.LEQ:
-                    func = "<=";
-                    GLib.Value v;
-                    v = exp.operand2;
-                    args.append (v);
-                    break;
-                case SearchCriteriaOp.GREATER:
-                    func = ">";
-                    GLib.Value v;
-                    v = exp.operand2;
-                    args.append (v);
-                    break;
-                case SearchCriteriaOp.GEQ:
-                    func = ">=";
-                    GLib.Value v;
-                    v = exp.operand2;
-                    args.append (v);
-                    break;
-                case SearchCriteriaOp.CONTAINS:
-                    func = "LIKE";
-                    GLib.Value v;
-                    v = "%%%s%%".printf(exp.operand2);
-                    args.append (v);
-                    break;
-                case SearchCriteriaOp.DOES_NOT_CONTAIN:
-                    func = "NOT LIKE";
-                    GLib.Value v;
-                    v = "%%%s%%".printf(exp.operand2);
-                    args.append (v);
-                    break;
-                case SearchCriteriaOp.DERIVED_FROM:
-                    func = "LIKE";
-                    GLib.Value v;
-                    v = "%s%%".printf(exp.operand2);
-                    args.append (v);
-                    break;
-                default:
-                    warning ("Unsupported op %d", exp.op);
-                    break;
-            }
-
-            result = "%s %s ?".printf(column, func);
+            return relexp_to_sql ((RelationalExpression) expression, args);
+        }
+    }
+
+    private string? map_operand_to_column (string operand) {
+        string column = null;
+
+        switch (operand) {
+            case "@id":
+                column = "o.upnp_id";
+                break;
+            case "@parentID":
+                column = "o.parent";
+                break;
+            case "upnp:class":
+                column = "m.class";
+                break;
+            case "dc:title":
+                column = "o.title";
+                break;
+            case "dc:creator":
+                column = "m.author";
+                break;
+            case "dc:date":
+                column = "m.date";
+                break;
+            default:
+                warning("Unsupported: %s", operand);
+                break;
         }
 
-        return result;
+        return column;
+    }
+
+    private string? relexp_to_sql (RelationalExpression? exp,
+                                   GLib.ValueArray args) {
+        string func = null;
+        GLib.Value? v = null;
+
+        string column = map_operand_to_column (exp.operand1);
+        if (column == null)
+            return null;
+
+        switch (exp.op) {
+            case SearchCriteriaOp.EXISTS:
+                if (exp.operand2 == "true")
+                    func = "IS NOT NULL AND %s != ''";
+                else
+                    func = "IS NULL OR %s = ''";
+                break;
+            case SearchCriteriaOp.EQ:
+                func = "=";
+                v = exp.operand2;
+                break;
+            case SearchCriteriaOp.NEQ:
+                func = "=";
+                v = exp.operand2;
+                break;
+            case SearchCriteriaOp.LESS:
+                func = "<";
+                v = exp.operand2;
+                break;
+            case SearchCriteriaOp.LEQ:
+                func = "<=";
+                v = exp.operand2;
+                break;
+            case SearchCriteriaOp.GREATER:
+                func = ">";
+                v = exp.operand2;
+                break;
+            case SearchCriteriaOp.GEQ:
+                func = ">=";
+                v = exp.operand2;
+                break;
+            case SearchCriteriaOp.CONTAINS:
+                func = "LIKE";
+                v = "%%%s%%".printf(exp.operand2);
+                break;
+            case SearchCriteriaOp.DOES_NOT_CONTAIN:
+                func = "NOT LIKE";
+                v = "%%%s%%".printf(exp.operand2);
+                break;
+            case SearchCriteriaOp.DERIVED_FROM:
+                func = "LIKE";
+                v = "%s%%".printf(exp.operand2);
+                break;
+            default:
+                warning ("Unsupported op %d", exp.op);
+                break;
+        }
+
+        if (v != null)
+            args.append (v);
+
+        return "%s %s ?".printf(column, func);
     }
 }
 



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