diff roundup/backends/back_anydbm.py @ 6401:8bc5faeb7677

Make rev multilink expressions work for anydbm
author Ralf Schlatterbeck <rsc@runtux.com>
date Sat, 08 May 2021 12:52:35 +0200
parents f3fcd6628c0c
children a0c0ee3ed8b1
line wrap: on
line diff
--- a/roundup/backends/back_anydbm.py	Sat May 08 10:39:01 2021 +0200
+++ b/roundup/backends/back_anydbm.py	Sat May 08 12:52:35 2021 +0200
@@ -28,6 +28,7 @@
 from roundup.anypy.strings import b2s, bs2b, repr_export, eval_import, is_us
 
 from roundup import hyperdb, date, password, roundupdb, security, support
+from roundup.mlink_expr import Expression
 from roundup.backends import locking
 from roundup.i18n import _
 
@@ -48,101 +49,6 @@
 def db_nuke(config):
     shutil.rmtree(config.DATABASE)
 
-class Binary:
-
-    def __init__(self, x, y):
-        self.x = x
-        self.y = y
-
-    def visit(self, visitor):
-        self.x.visit(visitor)
-        self.y.visit(visitor)
-
-class Unary:
-
-    def __init__(self, x):
-        self.x = x
-
-    def generate(self, atom):
-        return atom(self)
-
-    def visit(self, visitor):
-        self.x.visit(visitor)
-
-class Equals(Unary):
-
-    def evaluate(self, v):
-        return self.x in v
-
-    def visit(self, visitor):
-        visitor(self)
-
-class Empty(Unary):
-
-    def evaluate(self, v):
-        return not v
-
-    def visit(self, visitor):
-        visitor(self)
-
-class Not(Unary):
-
-    def evaluate(self, v):
-        return not self.x.evaluate(v)
-
-    def generate(self, atom):
-        return "NOT(%s)" % self.x.generate(atom)
-
-class Or(Binary):
-
-    def evaluate(self, v):
-        return self.x.evaluate(v) or self.y.evaluate(v)
-
-    def generate(self, atom):
-        return "(%s)OR(%s)" % (
-            self.x.generate(atom),
-            self.y.generate(atom))
-
-class And(Binary):
-
-    def evaluate(self, v):
-        return self.x.evaluate(v) and self.y.evaluate(v)
-
-    def generate(self, atom):
-        return "(%s)AND(%s)" % (
-            self.x.generate(atom),
-            self.y.generate(atom))
-
-def compile_expression(opcodes):
-
-    stack = []
-    push, pop = stack.append, stack.pop
-    for opcode in opcodes:
-        if   opcode == -1: push(Empty(opcode))
-        elif opcode == -2: push(Not(pop()))
-        elif opcode == -3: push(And(pop(), pop()))
-        elif opcode == -4: push(Or(pop(), pop()))
-        else:              push(Equals(opcode))
-
-    return pop()
-
-class Expression:
-
-    def __init__(self, v):
-        try:
-            opcodes = [int(x) for x in v]
-            if min(opcodes) >= -1:
-                raise ValueError()
-
-            compiled = compile_expression(opcodes)
-            self.evaluate = lambda x: compiled.evaluate([int(y) for y in x])
-        except:
-            if '-1' in v:
-                v = [x for x in v if int(x) > 0]
-                self.evaluate = lambda x: bool(set(x) & set(v)) or not x
-            else:
-                self.evaluate = lambda x: bool(set(x) & set(v))
-
 #
 # Now the database
 #

Roundup Issue Tracker: http://roundup-tracker.org/