Beispiel #1
0
 def _reinit(self, pdspath):
     if self.ofs:
         self.ofs.gc()
         self.ofs.close()
     if self.pstor:
         self.pstor.close()
     self.pstor, self.ofs = ostore.init_ostore(pdspath)
     self.ptrieObj = Ptrie(self.pstor)
     self.root = ptrie.Nulltrie # Start with Nulltrie as root
Beispiel #2
0
class PtrieTester(object):
    def __init__(self, pdspath="/home/ning/local/run/test_ostore"):
        # Get a PStructStor and Oidfs
        self.pstor = None
        self.ofs = None
        self._reinit(pdspath)

    def _reinit(self, pdspath):
        if self.ofs:
            self.ofs.gc()
            self.ofs.close()
        if self.pstor:
            self.pstor.close()
        self.pstor, self.ofs = ostore.init_ostore(pdspath)
        self.ptrieObj = Ptrie(self.pstor)
        self.root = ptrie.Nulltrie # Start with Nulltrie as root

    def run(self):
        # start test loop
        self.testloop()
        self.pstor.close()

    # Find words
    def findWords(self, words):
        for w in words:
            wnode = self.ptrieObj.find(self.root, w)
            if not wnode:
                print "Cannot find %s" % w
            else:
                fields = self.ptrieObj.getfields(wnode)
                print "Found %s (%d) at %s" % (w, fields['value'], wnode)

    def delete(self, word):
        newroot = self.ptrieObj.delete(self.root, word)
        if newroot is self.root:
            print "%s is not found, nothing deleted!" % word
        else:
            print "%s is deleted from ptrie" % word
            self.root = newroot

    def printNode(self, node):
        f = self.ptrieObj.getfields(node)
        if f['final']:
            print "(%s : %s)" % (f['prefix'], f['value'])

    def makeBFSPrintFunc(self, initialLevel=-1):
        env = {'level': initialLevel}
        def prnode(tn):
            fields = self.ptrieObj.getfields(tn)
            prefix = fields['prefix']
            if fields['final']:
                pfxString = "(%s : %s)" % (fields['prefix'], fields['value'])
            else:
                assert(fields['value'] is None)
                pfxString = prefix
            if len(prefix) != env['level']:
                env['level'] += 1
                print "level %d:" % env['level']
            print pfxString
        return prnode

    def bfwalk(self):
        level = -1
        for node in self.ptrieObj.bfiter(self.root):
            fields = self.ptrieObj.getfields(node)
            prefix = fields['prefix']
            if fields['final']:
                pfxString = "(%s : %s)" % (fields['prefix'], fields['value'])
            else:
                assert(fields['value'] is None)
                pfxString = prefix
            if len(prefix) != level:
                level += 1
                print "level %d:" % level
            print pfxString


    def testloop(self):
        while True:
            try:
                inputtext = raw_input(">> ");
            except EOFError as e:
                print "Goodbye!"
                self.ofs.close()
                self.pstor.close()
                return
            args = inputtext.split()
            if len(args) == 0:
                cmd = "help"
            else:
                cmd = args.pop(0)

            if cmd == "help":
                print """Type a command. Commands are:
help quit read load find delete insert dfwalk bfwalk save ls gc inspect stats"""
            elif cmd == "quit":
                ans = raw_input("Save? (y/n)")
                if ans == "y":
                    self.ofs.store(self.root, "examplePtrie")
                    self.ofs.close()
                    self.pstor.close()
                    print "Ptrie saved as \"examplePtrie\""
                break
            elif cmd == "print":
                try:
                    print eval(args[0])
                except Exception as e:
                    print e
            elif cmd == "reinit":
                pdspath = args[0]
                if os.path.exists(pdspath) and os.path.isabs(pdspath):
                    self._reinit(pdspath)
                else:
                    print "Must be an existing absolute path!"
            elif cmd == "read":
                # Insert words from a list
                try:
                    fobj = open(args[0])
                    words = fobj.read()
                    words = eval(words) # words must be in the format of a python list
                    fobj.close()
                    print words
                    # Insert words into trie
                    for w in words:
                        self.root = self.ptrieObj.insert(
                            self.root, w, 1, lambda v1, v2: v1 + v2)
                except Exception as e:
                    print e
            elif cmd == "load":
                # Load a previously saved ptrie
                oidname = args[0]
                self.root = self.ofs.load(oidname)
                if not self.root:
                    print "Not found: %s" % oidname
            elif cmd == "find":
                self.findWords(args)
            elif cmd == "delete":
                self.delete(args[0])
            elif cmd == "insert":
                if len(args) == 1:
                    self.root = self.ptrieObj.insert(
                        self.root, args[0], 1, lambda v1, v2: v1 + v2)
                elif len(args) == 2:
                    self.root = self.ptrieObj.insert(
                        self.root, args[0], args[1], lambda v1, v2: v2)
            elif cmd == "dfwalk":
                print "Depth-First Walk:"
                for node in self.ptrieObj.dfiter(self.root):
                    self.printNode(node)
            elif cmd == "bfwalk":
                print "Breadth-First Walk:"
                self.bfwalk()
            elif cmd == "gc":
                ans = raw_input(
                    """GC will destroy any unsaved OIDs. After GC is complete,
you must re-load your saved OID because current OID references may be stale.
Continue? (y/n)""")
                if ans == "y":
                    print "Garbage Collecting oidfs."
                    self.ofs.gc()
            elif cmd == "save":
                # Save the root in oidfs
                if len(args):
                    oidname = args[0]
                else:
                    oidname = "examplePtrie"
                self.ofs.store(self.root, oidname)
            elif cmd == "ls":
                for orec in self.ofs.oriter():
                    print orec
            elif cmd == "rm":
                if len(args):
                    oidname = args[0]
                else:
                    oidname = "examplePtrie"
                self.ofs.delete(oidname)
            elif cmd == "inspect":
                if "pdscache" in sys.modules:
                    pdscache.write_coid(self.root)
                self.ptrieObj.inspect(self.root)
                self.pstor.print_stats()
            elif cmd == "stats":
                self.pstor.print_stats()
            else:
                print "Bad command: type 'quit' to quit"