Mercurial > p > roundup > code
annotate roundup/support.py @ 3634:57c66056ffe4
Implemented what I'll call for now "transitive searching"...
...using the filter method. The first idea was mentioned on the
roundup-users mailing list:
http://article.gmane.org/gmane.comp.bug-tracking.roundup.user/6909
We can now search for items which link transitively to other classes
using filter. An example is searching for all items where a certain user
has added a message in the last week:
db.issue.filter (None, {'messages.author' : '42', 'messages.date' : '.-1w;'})
or more readable (but not exactly semantically equivalent, if you're
searching for multiple users in this way it will fail, because string
searches are ANDed): {'messages.author.username':'ralf', ...
We can even extend this further, look for all items that were changed by
users belonging to a certain department (having the same supervisor -- a
property that is not in the user class in standard roundup) in the last
week, the filterspec would be:
{'messages.author.supervisor' : '42', 'messages.date' : '.-1w;'}
If anybody wants to suggest another name instead of transitive
searching, you're welcome.
I've implemented a generic method for this in hyperdb.py -- the backend
now implements _filter in this case. With the generic method, anydbm and
metakit should work (anydbm is tested, metakit breaks for other
reasons). A backend may chose to implement the real transitive filter
itself. This was done for rdbms_common.py. It now has an implementation
of filter that supports transitive searching by creating one big join in
the generated SQL query.
I've added several new regression tests to test for the new features.
All the tests (not just the new ones) run through on python2.3 and
python2.4 with postgres, mysql, sqlite, anydbm -- but metakit was
already broken when I started.
I've generated a tag before commit called 'rsc_before_transitive_search'
and will create the 'after' tag after this commit, so you can merge out
my changes if you don't like them -- if you like them I can remove the
tags.
.-- Ralf
| author | Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net> |
|---|---|
| date | Sat, 08 Jul 2006 18:28:18 +0000 |
| parents | 1be293265e61 |
| children | 53987aa153d2 |
| rev | line source |
|---|---|
| 2984 | 1 """Implements various support classes and functions used in a number of |
| 2 places in Roundup code. | |
| 3 """ | |
| 4 | |
| 5 __docformat__ = 'restructuredtext' | |
| 6 | |
|
3544
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
7 import os, time, sys |
|
3634
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
8 import hyperdb |
|
3019
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
9 |
| 2984 | 10 class TruthDict: |
| 11 '''Returns True for valid keys, False for others. | |
| 12 ''' | |
| 13 def __init__(self, keys): | |
| 14 if keys: | |
| 15 self.keys = {} | |
| 16 for col in keys: | |
| 17 self.keys[col] = 1 | |
| 18 else: | |
| 19 self.__getitem__ = lambda name: 1 | |
| 20 | |
| 21 def __getitem__(self, name): | |
| 22 return self.keys.has_key(name) | |
| 23 | |
|
3019
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
24 def ensureParentsExist(dest): |
|
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
25 if not os.path.exists(os.path.dirname(dest)): |
|
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
26 os.makedirs(os.path.dirname(dest)) |
|
293a17149765
First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
2984
diff
changeset
|
27 |
|
3487
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
28 class PrioList: |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
29 '''Manages a sorted list. |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
30 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
31 Currently only implements method 'append' and iteration from a |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
32 full list interface. |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
33 Implementation: We manage a "sorted" status and sort on demand. |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
34 Appending to the list will require re-sorting before use. |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
35 >>> p = PrioList () |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
36 >>> for i in 5,7,1,-1 : |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
37 ... p.append (i) |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
38 ... |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
39 >>> for k in p : |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
40 ... print k |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
41 ... |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
42 -1 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
43 1 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
44 5 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
45 7 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
46 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
47 ''' |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
48 def __init__(self): |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
49 self.list = [] |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
50 self.sorted = True |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
51 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
52 def append(self, item): |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
53 self.list.append (item) |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
54 self.sorted = False |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
55 |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
56 def __iter__(self): |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
57 if not self.sorted : |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
58 self.list.sort () |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
59 self.sorted = True |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
60 return iter (self.list) |
|
a2ae11191968
added class PrioList (patch from rfe [SF#413165])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3019
diff
changeset
|
61 |
|
3544
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
62 class Progress: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
63 '''Progress display for console applications. |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
64 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
65 See __main__ block at end of file for sample usage. |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
66 ''' |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
67 def __init__(self, info, sequence): |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
68 self.info = info |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
69 self.sequence = iter(sequence) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
70 self.total = len(sequence) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
71 self.start = self.now = time.time() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
72 self.num = 0 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
73 self.stepsize = self.total / 100 or 1 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
74 self.steptimes = [] |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
75 self.display() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
76 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
77 def __iter__(self): return self |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
78 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
79 def next(self): |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
80 self.num += 1 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
81 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
82 if self.num > self.total: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
83 print self.info, 'done', ' '*(75-len(self.info)-6) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
84 sys.stdout.flush() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
85 return self.sequence.next() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
86 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
87 if self.num % self.stepsize: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
88 return self.sequence.next() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
89 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
90 self.display() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
91 return self.sequence.next() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
92 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
93 def display(self): |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
94 # figure how long we've spent - guess how long to go |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
95 now = time.time() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
96 steptime = now - self.now |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
97 self.steptimes.insert(0, steptime) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
98 if len(self.steptimes) > 5: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
99 self.steptimes.pop() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
100 steptime = sum(self.steptimes) / len(self.steptimes) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
101 self.now = now |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
102 eta = steptime * ((self.total - self.num)/self.stepsize) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
103 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
104 # tell it like it is (or might be) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
105 if now - self.start > 3: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
106 M = eta / 60 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
107 H = M / 60 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
108 M = M % 60 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
109 S = eta % 60 |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
110 if self.total: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
111 s = '%s %2d%% (ETA %02d:%02d:%02d)'%(self.info, |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
112 self.num * 100. / self.total, H, M, S) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
113 else: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
114 s = '%s 0%% (ETA %02d:%02d:%02d)'%(self.info, H, M, S) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
115 elif self.total: |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
116 s = '%s %2d%%'%(self.info, self.num * 100. / self.total) |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
117 else: |
|
3589
1be293265e61
woo, that was quick
Richard Jones <richard@users.sourceforge.net>
parents:
3544
diff
changeset
|
118 s = '%s %d done'%(self.info, self.num) |
|
3544
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
119 sys.stdout.write(s + ' '*(75-len(s)) + '\r') |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
120 sys.stdout.flush() |
|
5cd1c83dea50
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
3487
diff
changeset
|
121 |
|
3634
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
122 class Proptree : |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
123 ''' Simple tree data structure for optimizing searching of properties |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
124 ''' |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
125 |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
126 def __init__ (self, db, cls, name, props, parent = None, val = None) : |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
127 self.db = db |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
128 self.name = name |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
129 self.props = props |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
130 self.parent = parent |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
131 self.val = val |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
132 self.cls = cls |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
133 self.classname = None |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
134 self.uniqname = None |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
135 self.children = [] |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
136 self.propnames = {} |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
137 if parent : |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
138 self.root = parent.root |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
139 self.prcls = self.parent.props [name] |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
140 else : |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
141 self.root = self |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
142 self.seqno = 1 |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
143 self.id = self.root.seqno |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
144 self.root.seqno += 1 |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
145 if self.cls : |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
146 self.classname = self.cls.classname |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
147 self.uniqname = '%s%s' % (self.cls.classname, self.id) |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
148 if not self.parent : |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
149 self.uniqname = self.cls.classname |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
150 |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
151 def append (self, name) : |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
152 if name in self.propnames : |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
153 return self.propnames [name] |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
154 propclass = self.props [name] |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
155 cls = None |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
156 props = None |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
157 if isinstance (propclass, (hyperdb.Link, hyperdb.Multilink)) : |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
158 cls = self.db.getclass (propclass.classname) |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
159 props = cls.getprops () |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
160 child = self.__class__ (self.db, cls, name, props, parent = self) |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
161 self.children.append (child) |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
162 self.propnames [name] = child |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
163 return child |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
164 |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
165 def __iter__ (self) : |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
166 """ Yield nodes in depth-first order -- visited nodes first """ |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
167 for p in self.children : |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
168 yield p |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
169 for c in p : |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
170 yield c |
|
57c66056ffe4
Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3589
diff
changeset
|
171 |
| 2984 | 172 # vim: set et sts=4 sw=4 : |
