[Formed-commits] r385 - in trunk/formed/formed: . plugins/export

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Mon Aug 9 10:20:04 CEST 2010


Author: torsten
Date: 2010-08-09 10:19:58 +0200 (Mon, 09 Aug 2010)
New Revision: 385

Added:
   trunk/formed/formed/plugins/export/rules_sql.py
Modified:
   trunk/formed/formed/config.py
Log:
Added export of rules as SQL-Query


Modified: trunk/formed/formed/config.py
===================================================================
--- trunk/formed/formed/config.py	2010-08-06 13:15:51 UTC (rev 384)
+++ trunk/formed/formed/config.py	2010-08-09 08:19:58 UTC (rev 385)
@@ -27,6 +27,7 @@
 from formed.plugins.export.xls     import ExportKeyValueTableAsXLS
 
 from formed.plugins.export.rules   import ExportRulesAsHTML
+from formed.plugins.export.rules_sql   import ExportRulesAsSQL
 
 from formed.plugins.modify.rules   import GenerateRequiredRules
 
@@ -68,6 +69,7 @@
             ExportKeyValueTableAsXLS(),
             GenerateRequiredRules(),
             ExportRulesAsHTML(),
+            ExportRulesAsSQL(),
             DataImportFilter(),
             DataExportFilter()
         ]

Added: trunk/formed/formed/plugins/export/rules_sql.py
===================================================================
--- trunk/formed/formed/plugins/export/rules_sql.py	2010-08-06 13:15:51 UTC (rev 384)
+++ trunk/formed/formed/plugins/export/rules_sql.py	2010-08-09 08:19:58 UTC (rev 385)
@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+#
+# FormEd is free software under the terms of the
+# GNU General Public License Version 3. See file
+# LICENSE coming with the source of FormEd for details.
+#
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+from formed.plugins.ui.controls import FileDialogFilter
+from formed.model.exprtree import * 
+
+import formed.model.data as data
+
+#from formed.model.misc import ModeChecker, checkMode
+
+import codecs
+from   cgi import escape
+
+def sql_var(node, document):
+    out = []
+    out.append(node.var_name)
+    return " ".join(out)
+
+def sql_const(node, document):
+    out = []
+    out.append(str(node.const))
+    return " ".join(out)
+
+def sql_And(node, document):
+    out = []
+    out.append("(")
+    out.append("%s AND %s" % (recursive_parse(node.a, document), recursive_parse(node.b, document)))
+    out.append(")")
+    return " ".join(out)
+
+def sql_Or(node, document):
+    out = []
+    out.append("(")
+    out.append("%s OR %s" % (recursive_parse(node.a, document), recursive_parse(node.b, document)))
+    out.append(")")
+    return " ".join(out)
+
+def sql_OperatorBinary(node, document):
+    out = []
+    operator = ""
+    if node.operator.__name__ == "GT":
+        operator = ">"
+        out.append("%s %s %s" % (recursive_parse(node.a, document), operator, recursive_parse(node.b, document)))
+    elif node.operator.__name__ == "EQ":
+        operator = "="
+        out.append("%s %s %s" % (recursive_parse(node.a, document), operator, recursive_parse(node.b, document)))
+    elif node.operator.__name__ == "DAYS":
+        operator = "-"
+        out.append("abs(%s %s %s)" % (recursive_parse(node.a, document), operator, recursive_parse(node.b, document)))
+    else:
+        raise Exception('Can not parse %s' % node) 
+    return " ".join(out)
+
+def sql_OperatorUnary(node, document):
+    out = []
+    if node.operator.__name__ == "NOT":
+        out.append("NOT")
+        out.append("(")
+        out.append(recursive_parse(node.a, document))
+        out.append(")")
+    elif node.operator.__name__ == "ISSET":
+        out.append("(")
+        out.append("%s IS NOT NULL" % recursive_parse(node.a, document))
+        out.append(")")
+    elif node.operator.__name__ == "KNOWN":
+        if not isinstance(node.a, Var):
+            raise Exception('Can not parse %s' % node) 
+        n = document.getNodeComponentByName(node.a.var_name)
+        if isinstance(n, data.DateLeaf):
+            ukv = "'0001-01-01'"
+        elif isinstance(n, data.IntLeaf):
+            ukv = '-9999999'
+        elif isinstance(n, data.TextLeaf):
+            ukv = "'unbekannt'"
+        out.append("%s != %s" % (recursive_parse(node.a, document), ukv))
+    else:
+        print "Unkown OperatorUnary %s" % node.operator.__name__
+        out.append(recursive_parse(node.a, document))
+    return " ".join(out)
+
+def recursive_parse(node, document):
+    out = []
+    if isinstance(node, OperatorUnary):
+        out.append(sql_OperatorUnary(node, document))
+    elif isinstance(node, OperatorBinary):
+        out.append(sql_OperatorBinary(node, document))
+    elif isinstance(node, And):
+        out.append(sql_And(node, document))
+    elif isinstance(node, Or):
+        out.append(sql_Or(node, document))
+    elif isinstance(node, Var):
+        out.append(sql_var(node, document))
+    elif isinstance(node, Const):
+        out.append(sql_const(node, document))
+    else:
+        raise Exception('Can not parse %s' % node) 
+    return " ".join(out)
+
+class ExportRulesAsSQL(FileDialogFilter):
+
+    def __init__(self):
+        FileDialogFilter.__init__(self)
+
+    def getMenuName(self):
+        return _("Export R&ules As SQL Query...")
+
+    def getDescription(self):
+        return _("Exports rules as a SQL")
+
+    def wildcards(self):
+        return _("SQL files (*.sql)|*.sql")
+
+    def dialogMessage(self):
+        return _("Export rules as SQL document")
+
+    def errorTitle(self):
+        return _("Error occured while exporting rules to SQL")
+
+    def doExport(self, path, main, dummy):
+        document = main.getDocument()
+        root     = document.root
+        mode     = main.getSelectedMode()
+        allModes = main.getAllModes()
+        out      = None
+        sql      = []
+        try:
+            sql.append("select count(id) from master_tbl where (")
+            out = codecs.open(path, "wb", "UTF-8")
+            all_rules = list(document.findAllByClass(data.RuleLeaf, mode, allModes))
+            where = []
+            for idx, rule in enumerate(all_rules):
+                if rule.getMark().find('error') < 0: continue
+                desc = rule.getDescription()
+                if not desc: desc = rule.getValue()
+                #sql2.append("-- %s\n" % desc)
+                #sql2.append("-- Prog %s\n" % rule.getExpr().prog)
+                where.append("%s" % recursive_parse(rule.getExpr().prog, document))
+            sql.append("\nAND ".join(where))
+            sql.append(")")
+            print >> out, "\n".join(sql)
+        finally:
+            if out:
+                try: out.close()
+                except: pass
+
+# vim:set ts=4 sw=4 si et sta sts=4 enc=utf-8 fenc=utf-8:



More information about the Formed-commits mailing list