godmarowset.py (5941B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\util\godmarowset.py 2 from __future__ import print_function 3 import blue 4 import types 5 import log 6 from carbon.common.script.sys.crowset import CFilterRowset, CIndexedRowset, CRowset 7 DEBUG = True 8 9 def rowsetIterator(rowset): 10 if isinstance(rowset, (GodmaIndexedRowset, GodmaFilterRowset)): 11 for key in rowset.iterkeys(): 12 yield rowset.__getitem__(key) 13 14 elif isinstance(rowset, GodmaRowset): 15 for i in xrange(len(rowset)): 16 yield rowset.__getitem__(i) 17 18 else: 19 raise NotImplementedError('Yikes, what are you? rowsetIterator does not operate on %s (%s)' % (str(type(rowset)), str(rowset.__class__))) 20 raise StopIteration 21 22 23 class GodmaRowset(CRowset): 24 __passbyvalue__ = 1 25 26 def __init__(self, header, rows, rowClass = blue.DBRow): 27 CRowset.__init__(self, header, rows) 28 self.rowClass = rowClass 29 30 def __getitem__(self, index): 31 ret = CRowset.__getitem__(self, index) 32 if isinstance(self.rowClass, types.MethodType) or not isinstance(ret, self.rowClass): 33 if not isinstance(ret, blue.DBRow): 34 ret = blue.DBRow(self.header, ret) 35 return self.rowClass(self.header, ret) 36 return ret 37 38 def __setitem__(self, idx, row): 39 if not isinstance(row, blue.DBRow): 40 log.LogTraceback('__setitem__:Storing non-dbrow in GodmaRowset') 41 CRowset.__setitem__(self, idx, row) 42 43 def __iter__(self): 44 if self.rowClass != blue.DBRow: 45 return rowsetIterator(self) 46 return CRowset.__iter__(self) 47 48 def __getslice__(self, i, j): 49 return GodmaRowset(self.header, list.__getslice__(self, i, j), rowClass=self.rowClass) 50 51 def pop(self, idx = -1): 52 ret = self.__getitem__(idx) 53 CRowset.pop(self, idx) 54 return ret 55 56 def Index(self, columnName): 57 return GodmaIndexedRowset(self.header, columnName, CRowset.Index(self, columnName), rowClass=self.rowClass) 58 59 def Filter(self, columnName, indexName = None): 60 return GodmaFilterRowset(self.header, columnName, indexName, CRowset.Filter(self, columnName, indexName), rowClass=self.rowClass) 61 62 63 class GodmaIndexedRowset(CIndexedRowset): 64 65 def __init__(self, header, columnName, ccdict = {}, rowClass = blue.DBRow): 66 CIndexedRowset.__init__(self, header, columnName) 67 self.rowClass = rowClass 68 if len(ccdict): 69 self.update(ccdict) 70 71 def __getitem__(self, key): 72 ret = CIndexedRowset.__getitem__(self, key) 73 if isinstance(self.rowClass, types.MethodType) or not isinstance(ret, self.rowClass): 74 if not isinstance(ret, blue.DBRow): 75 ret = blue.DBRow(self.header, ret) 76 ret = self.rowClass(self.header, ret) 77 return ret 78 79 def values(self): 80 return GodmaRowset(self.header, CIndexedRowset.values(self), rowClass=self.rowClass) 81 82 def itervalues(self): 83 if self.rowClass != blue.DBRow: 84 return rowsetIterator(self) 85 return CIndexedRowset.itervalues(self) 86 87 def get(self, k, d = None): 88 try: 89 ret = self.__getitem__(k) 90 except KeyError: 91 return d 92 93 return ret 94 95 def pop(self, *args): 96 if len(args) > 2 or len(args) < 1: 97 raise TypeError('pop expected at most 2 arguments, got %d' % len(args)) 98 try: 99 ret = self.__getitem__(args[0]) 100 del self[args[0]] 101 except KeyError: 102 if len(args) != 2: 103 raise 104 return args[1] 105 106 return ret 107 108 def popitem(self): 109 if len(self) == 0: 110 raise KeyError 111 import random 112 key = random.randrange(len(self)) 113 ret = self.__getitem__(key) 114 del self[key] 115 return ret 116 117 118 class GodmaFilterRowset(CFilterRowset): 119 120 def __init__(self, header, columnName, indexName, ccdict = {}, rowClass = blue.DBRow): 121 CFilterRowset.__init__(self, header, columnName) 122 self.indexName = indexName 123 self.rowClass = rowClass 124 if len(ccdict) > 0: 125 self.update(ccdict) 126 127 def __getitem__(self, key): 128 ret = CFilterRowset.__getitem__(self, key) 129 if isinstance(ret, dict): 130 if not isinstance(ret, GodmaIndexedRowset): 131 return GodmaIndexedRowset(self.header, self.indexName, ret, rowClass=self.rowClass) 132 return ret 133 if isinstance(self.rowClass, types.MethodType) or not isinstance(ret, self.rowClass): 134 if not isinstance(ret, blue.DBRow): 135 print(' _!_ GodmaFilteredRowset storing non-DBRow as leaf-element:', type(ret)) 136 ret = blue.DBRow(self.header, ret) 137 return self.rowClass(self.header, ret) 138 return ret 139 140 def values(self): 141 v = CFilterRowset.values(self) 142 if isinstance(v, list): 143 return v 144 return GodmaIndexedRowset(self.header, self.indexName, v, rowClass=self.rowClass) 145 146 def itervalues(self): 147 if self.rowClass != blue.DBRow: 148 return rowsetIterator(self) 149 return CFilterRowset.itervalues(self) 150 151 def get(self, k, d = None): 152 try: 153 ret = self.__getitem__(k) 154 except KeyError: 155 return d 156 157 return ret 158 159 def pop(self, *args): 160 if len(args) > 2 or len(args) < 1: 161 raise TypeError('pop expected at most 2 arguments, got %d' % len(args)) 162 try: 163 ret = self.__getitem__(args[0]) 164 del self[args[0]] 165 except KeyError: 166 if len(args) != 2: 167 raise 168 return args[1] 169 170 return ret 171 172 def popitem(self): 173 if len(self) == 0: 174 raise KeyError 175 import random 176 key = self.keys()[random.randrange(len(self))] 177 ret = self.__getitem__(key) 178 del self[key] 179 return ret