[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