Changeset 8
- Timestamp:
- 10/09/04 18:01:37
- Files:
-
- trunk/__init__.py (modified) (3 diffs)
- trunk/codewalk.py (added)
- trunk/engines.py (modified) (1 diff)
- trunk/logic.py (added)
- trunk/storage/__init__.py (modified) (1 diff)
- trunk/storage/storeado.py (modified) (11 diffs)
- trunk/storage/storeodbc.py (modified) (3 diffs)
- trunk/storage/test_storeado.py (modified) (3 diffs)
- trunk/storage/test_storeodbc.py (modified) (2 diffs)
- trunk/test_codewalk.py (added)
- trunk/test_logic.py (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/__init__.py
r7 r8 1 1 import ConfigParser 2 2 import containers 3 import logic3 import datetime 4 4 import xray 5 5 6 6 from dejavu.analysis import * 7 7 from dejavu.readme import * 8 from dejavu import logic 8 9 9 10 … … 425 426 # Otherwise, you should create your own instance 426 427 # per application. 427 arena = Arena()428 dejavuarena = Arena() 428 429 429 430 def _synapses_func(key, farClass, farKey): … … 729 730 pass 730 731 732 733 ########################################################################### 734 ## ## 735 ## Logic functions ## 736 ## ## 737 ########################################################################### 738 739 740 def icontains(a, b): 741 """Case-insensitive test b in a. Note the operand order.""" 742 if a is None or b is None: 743 return False 744 return b.lower() in a.lower() 745 746 def icontainedby(a, b): 747 """Case-insensitive test a in b. Note the operand order.""" 748 if a is None or b is None: 749 return False 750 return a.lower() in b.lower() 751 752 def istartswith(a, b): 753 """True if a starts with b (case-insensitive), False otherwise.""" 754 if a is None or b is None: 755 return False 756 return a.lower().startswith(b.lower()) 757 758 def iendswith(a, b): 759 """True if a ends with b (case-insensitive), False otherwise.""" 760 if a is None or b is None: 761 return False 762 return a.lower().endswith(b.lower()) 763 764 def ieq(a, b): 765 """True if a == b (case-insensitive), False otherwise.""" 766 if a is None or b is None: 767 return False 768 return (a.lower() == b.lower()) 769 770 def year(value): 771 """The year attribute of a date.""" 772 if isinstance(value, (datetime.date, datetime.datetime)): 773 return value.year 774 else: 775 return None 776 777 def now(): 778 """Late-bound datetime.datetime.now(). Taint this when early binding.""" 779 return datetime.datetime.now() 780 now.bind_late = True 781 782 def today(): 783 """Late-bound datetime.date.today(). Taint this when early binding.""" 784 return datetime.date.today() 785 today.bind_late = True 786 787 def iscurrentweek(value): 788 """If value is in the current week, return True, else False.""" 789 if isinstance(value, (datetime.date, datetime.datetime)): 790 return datetime.date.today().strftime('%W%Y') == value.strftime('%W%Y') 791 else: 792 return False 793 iscurrentweek.bind_late = True trunk/engines.py
r7 r8 14 14 import pickle 15 15 import dejavu 16 import logic16 from dejavu import logic 17 17 import sets 18 18 import xray trunk/storage/__init__.py
r7 r8 280 280 lock.release() 281 281 282 283 class Adapter(object): 284 """Transform values according to their type.""" 285 286 def __init__(self): 287 self.default_processor = unicode 288 self.processors = {} 289 290 def coerce(self, value, valuetype=None): 291 if valuetype is None: 292 valuetype = type(value) 293 xform = self.processors.get(valuetype, self.default_processor) 294 return xform(value) 295 trunk/storage/storeado.py
r7 r8 8 8 import pythoncom 9 9 import threading 10 import codewalk11 10 import datetime 12 11 try: … … 15 14 import pickle 16 15 import recur 17 import logic 18 import new 19 20 from dejavu import storage 16 from types import FunctionType 17 18 import dejavu 19 from dejavu import storage, codewalk, logic 21 20 22 21 adOpenForwardOnly = 0 … … 44 43 def time_from_com(com_date): 45 44 """Return a valid (day, datetime.time) from a COM date or time object.""" 46 hour, min = divmod(86400 * (float(com_date) % 1), 3600)47 min , sec = divmod(min, 60)45 hour, mins = divmod(86400 * (float(com_date) % 1), 3600) 46 mins, sec = divmod(mins, 60) 48 47 # Must do both int() and round() or we'll be up to 1 second off. 49 48 hour = int(round(hour)) 50 min = int(round(min))49 mins = int(round(mins)) 51 50 sec = int(round(sec)) 52 return recur.sane_time(0, hour, min , sec)53 54 55 class AdapterFromADO( logic.Adapter):51 return recur.sane_time(0, hour, mins, sec) 52 53 54 class AdapterFromADO(storage.Adapter): 56 55 """Coerce incoming values from ADO to Dejavu datatypes.""" 57 56 def __init__(self, unit=None): … … 172 171 173 172 174 class AdapterToADOFields( logic.Adapter):173 class AdapterToADOFields(storage.Adapter): 175 174 """Coerce outgoing values from Dejavu datatypes to ADO.Field types.""" 176 175 … … 221 220 222 221 223 class AdapterToADOSQL( logic.Adapter):222 class AdapterToADOSQL(storage.Adapter): 224 223 """Coerce Expression constants to ADO SQL.""" 225 224 … … 300 299 301 300 sql_cmp_op = ('<', '<=', '=', '!=', '>', '>=', 'in', 'not in') 302 functions = { logic.icontains: lambda x, y: x + " Like '%" + y[1:-1] + "%'",303 logic.icontainedby: icontainedby,304 logic.istartswith: lambda x, y: x + " Like '" + y[1:-1] + "%'",305 logic.iendswith: lambda x, y: x + " Like '%" + y[1:-1] + "'",306 logic.ieq: lambda x, y: x + " = " + y,307 logic.now: lambda: "getdate()",308 logic.today: lambda: "DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)",309 logic.year: lambda x: "YEAR(" + x + ")",301 functions = {dejavu.icontains: lambda x, y: x + " Like '%" + y[1:-1] + "%'", 302 dejavu.icontainedby: icontainedby, 303 dejavu.istartswith: lambda x, y: x + " Like '" + y[1:-1] + "%'", 304 dejavu.iendswith: lambda x, y: x + " Like '%" + y[1:-1] + "'", 305 dejavu.ieq: lambda x, y: x + " = " + y, 306 dejavu.now: lambda: "getdate()", 307 dejavu.today: lambda: "DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)", 308 dejavu.year: lambda x: "YEAR(" + x + ")", 310 309 } 311 310 … … 332 331 term, operation = terms.pop() 333 332 # All this checking of None is done so that a function 334 # (like logic.iscurrentweek) can be labeled imperfect--333 # (like dejavu.iscurrentweek) can be labeled imperfect-- 335 334 # all Units (which match the rest of the Expression) 336 335 # will be recalled. They can then be compared in … … 359 358 # Some constants are function or class objects, 360 359 # which should not be coerced. 361 no_coerce = ( new.function, type)360 no_coerce = (FunctionType, type) 362 361 if not isinstance(val, no_coerce): 363 362 val = self.adapter.coerce(val) … … 686 685 if not path: return firstcls.__name__ 687 686 688 path = self.arena.associations.shortest_path(firstcls, path[0])689 path.pop(0)690 cls = path[0]687 spath = self.arena.associations.shortest_path(firstcls, path[0]) 688 spath.pop(0) 689 cls = spath[0] 691 690 leftkey, rightkey = firstcls._associations[cls] 692 691 params = {u'prefix': u'djv', … … 696 695 u'rightkey': rightkey, 697 696 } 698 if len( path) == 1:697 if len(spath) == 1: 699 698 params[u'child'] = u"[%(prefix)s%(right)s]" % params 700 699 else: 701 params[u'child'] = u"(%s)" % self._join( path)700 params[u'child'] = u"(%s)" % self._join(spath) 702 701 703 702 return (u"[%(prefix)s%(left)s] LEFT JOIN %(child)s" … … 1008 1007 class ADOSQLDecompiler_MSAccess(ADOSQLDecompiler): 1009 1008 sql_cmp_op = ('<', '<=', '=', '<>', '>', '>=', 'in', 'not in') 1010 functions = { logic.icontains: lambda x, y: x + " Like '%" + y[1:-1] + "%'",1011 logic.icontainedby: icontainedby,1012 logic.istartswith: lambda x, y: x + " Like '" + y[1:-1] + "%'",1013 logic.iendswith: lambda x, y: x + " Like '%" + y[1:-1] + "'",1014 logic.ieq: lambda x, y: x + " = " + y,1015 logic.now: lambda: "Now()",1016 logic.today: lambda: "DateValue(Now())",1017 logic.year: lambda x: "Year(" + x + ")",1009 functions = {dejavu.icontains: lambda x, y: x + " Like '%" + y[1:-1] + "%'", 1010 dejavu.icontainedby: icontainedby, 1011 dejavu.istartswith: lambda x, y: x + " Like '" + y[1:-1] + "%'", 1012 dejavu.iendswith: lambda x, y: x + " Like '%" + y[1:-1] + "'", 1013 dejavu.ieq: lambda x, y: x + " = " + y, 1014 dejavu.now: lambda: "Now()", 1015 dejavu.today: lambda: "DateValue(Now())", 1016 dejavu.year: lambda x: "Year(" + x + ")", 1018 1017 } 1019 1018 trunk/storage/storeodbc.py
r7 r8 4 4 5 5 import fixedpoint 6 import codewalk7 6 import datetime 8 7 import pickle 9 import logic10 8 import dbi, odbc 11 9 12 10 import dejavu 13 from dejavu import storage 14 15 16 class AdapterFromODBC( logic.Adapter):11 from dejavu import storage, codewalk 12 13 14 class AdapterFromODBC(storage.Adapter): 17 15 """Transform incoming values from ODBC to Dejavu datatypes.""" 18 16 … … 91 89 92 90 93 class AdapterToODBCSQL( logic.Adapter):91 class AdapterToODBCSQL(storage.Adapter): 94 92 """Transform Expression values according to their type for ODBC SQL.""" 95 93 … … 154 152 155 153 sql_cmp_op = ('<', '<=', '=', '<>', '>', '>=', 'in', 'not in') 156 functions = { logic.icontains: lambda x, y: x + " Like '%" + y[1:-1] + "%'",157 logic.icontainedby: _icontainedby,158 logic.istartswith: lambda x, y: x + " Like '" + y[1:-1] + "%'",159 logic.iendswith: lambda x, y: x + " Like '%" + y[1:-1] + "'",160 logic.ieq: lambda x, y: x + " = " + y,154 functions = {dejavu.icontains: lambda x, y: x + " Like '%" + y[1:-1] + "%'", 155 dejavu.icontainedby: _icontainedby, 156 dejavu.istartswith: lambda x, y: x + " Like '" + y[1:-1] + "%'", 157 dejavu.iendswith: lambda x, y: x + " Like '%" + y[1:-1] + "'", 158 dejavu.ieq: lambda x, y: x + " = " + y, 161 159 } 162 160 trunk/storage/test_storeado.py
r7 r8 5 5 import storeado 6 6 import dejavu 7 import logic7 from dejavu import logic 8 8 9 9 arena = dejavu.Arena() … … 55 55 56 56 # Test now(), today(), year() 57 sel(lambda x: x.FirstDate > logic.today(),57 sel(lambda x: x.FirstDate > dejavu.today(), 58 58 u"SELECT * FROM [djvThings] WHERE [djvThings].[FirstDate] > DateValue(Now())", False) 59 sel(lambda x: x.Event == logic.now(),59 sel(lambda x: x.Event == dejavu.now(), 60 60 u"SELECT * FROM [djvThings] WHERE [djvThings].[Event] = Now()", False) 61 sel(lambda x: logic.year(x.Event) == 2004,61 sel(lambda x: dejavu.year(x.Event) == 2004, 62 62 u"SELECT * FROM [djvThings] WHERE Year([djvThings].[Event]) = 2004", False) 63 63 ## … … 167 167 168 168 # logic and other functions 169 trial(lambda x: logic.ieq(x.Name, 'Johann'), u"[djvThings].[Name] = 'Johann'", False)170 trial(lambda x: logic.icontains(x.Name, 'tool'), u"[djvThings].[Name] Like '%tool%'", False)171 trial(lambda x: logic.icontainedby(x.Name, ('Johann', 'Gambolputty', 'de von Ausfern')),169 trial(lambda x: dejavu.ieq(x.Name, 'Johann'), u"[djvThings].[Name] = 'Johann'", False) 170 trial(lambda x: dejavu.icontains(x.Name, 'tool'), u"[djvThings].[Name] Like '%tool%'", False) 171 trial(lambda x: dejavu.icontainedby(x.Name, ('Johann', 'Gambolputty', 'de von Ausfern')), 172 172 u"[djvThings].[Name] in ('Johann', 'Gambolputty', 'de von Ausfern')", False) 173 173 reqZip = '92104' trunk/storage/test_storeodbc.py
r7 r8 4 4 import datetime 5 5 import dejavu 6 import logic7 6 import dbi 8 from dejavu import servers 7 from dejavu import servers, logic 9 8 10 9 … … 137 136 138 137 # logic functions 139 trial(lambda x: logic.ieq(x.Name, 'Johann'), u"[Name] = 'Johann'", False)140 trial(lambda x: logic.icontains(x.Name, 'tool'), u"[Name] Like '%tool%'", False)141 trial(lambda x: logic.icontainedby(x.Name, ('Johann', 'Gambolputty', 'de von Ausfern')),138 trial(lambda x: dejavu.ieq(x.Name, 'Johann'), u"[Name] = 'Johann'", False) 139 trial(lambda x: dejavu.icontains(x.Name, 'tool'), u"[Name] Like '%tool%'", False) 140 trial(lambda x: dejavu.icontainedby(x.Name, ('Johann', 'Gambolputty', 'de von Ausfern')), 142 141 u"[Name] in ('Johann', 'Gambolputty', 'de von Ausfern')", False) 143 142
