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
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"