Skip to content

Commit 2788e35

Browse files
author
quantmind
committed
more tests passing
1 parent 367e052 commit 2788e35

File tree

8 files changed

+60
-73
lines changed

8 files changed

+60
-73
lines changed

stdnet/backends/redisb.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ def _build(self, pipe=None, **kwargs):
169169
qs = self.queryelem
170170
pipe = self.pipe
171171
backend = self.backend
172-
key, meta, keys, args = None, self.meta, (), []
172+
key, meta, keys, args = None, self.meta, [], []
173173
# loop over element in queries
174174
for child in qs:
175175
if getattr(child, 'backend', None) != backend:
@@ -185,20 +185,22 @@ def _build(self, pipe=None, **kwargs):
185185
temp_key = False
186186
else:
187187
key = backend.tempkey(meta)
188-
backend.odmrun(pipe, 'query', meta, (key,), self.meta_info,
188+
keys.insert(0, key)
189+
backend.odmrun(pipe, 'query', meta, keys, self.meta_info,
189190
qs.name, *args)
190191
else:
191192
key = backend.tempkey(meta)
192193
p = 'z' if meta.ordering else 's'
193194
pipe.script_call('move2set', keys, p, script_dependency='odmrun')
194195
if qs.keyword == 'intersect':
195-
getattr(pipe, p+'interstore')(key, keys, **self.script_dep)
196+
command = getattr(pipe, p+'interstore')
196197
elif qs.keyword == 'union':
197-
getattr(pipe, p+'unionstore')(key, keys, **self.script_dep)
198+
command = getattr(pipe, p+'unionstore')
198199
elif qs.keyword == 'diff':
199-
getattr(pipe, p+'diffstore')(key, keys, **self.script_dep)
200+
command = getattr(pipe, p+'diffstore')
200201
else:
201202
raise ValueError('Could not perform %s operation' % qs.keyword)
203+
command(key, keys, script_dependency='odmrun')
202204
# If e requires a different field other than id, perform a sort
203205
# by nosort and get the object field.
204206
gf = qs._get_field
@@ -247,24 +249,22 @@ def _execute_query_result(self, result):
247249

248250
def order(self, last):
249251
'''Perform ordering with respect model fields.'''
250-
desc = 'DESC' if last.desc else ''
252+
desc = last.desc
251253
field = last.name
252254
nested = last.nested
253255
nested_args = []
254256
while nested:
255257
meta = nested.model._meta
256-
nested_args.extend((self.backend.basekey(meta),nested.name))
258+
nested_args.extend((self.backend.basekey(meta), nested.name))
257259
last = nested
258260
nested = nested.nested
259-
meth = ''
260-
if last.field.internal_type == 'text':
261-
meth = 'ALPHA'
262-
261+
method = 'ALPHA' if last.field.internal_type == 'text' else ''
263262
if field == last.model._meta.pkname():
264263
field = ''
265-
args = [field, meth, desc, len(nested_args)//2]
266-
args.extend(nested_args)
267-
return args
264+
return {'field': field,
265+
'method': method,
266+
'desc': desc,
267+
'nested': nested_args}
268268

269269
def _has(self, val):
270270
r = self.ismember(self.query_key, val)
@@ -888,7 +888,7 @@ def model_keys(self, meta):
888888

889889
def instance_keys(self, obj):
890890
meta = obj._meta
891-
keys = [self.basekey(meta,OBJ,obj.id)]
891+
keys = [self.basekey(meta, OBJ, obj.id)]
892892
for field in meta.multifields:
893893
f = getattr(obj,field.attname)
894894
keys.append(f.id)

stdnet/lib/lua/odm.lua

Lines changed: 26 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,11 @@ odm.Model = {
126126
local result, ids, related_items
127127
options = tabletools.json_clean(options)
128128
if options.ordering == 'explicit' then
129-
ids = self:_explicit_ordering(key, options)
129+
ids = self:_explicit_ordering(key, options.start, options.stop, options.order)
130130
elseif options.ordering == 'DESC' then
131-
ids = odm.redis.call('zrevrange', key, start, stop)
131+
ids = odm.redis.call('zrevrange', key, options.start, options.stop)
132132
elseif options.ordering == 'ASC' then
133-
ids = odm.redis.call('range', key, start, stop)
133+
ids = odm.redis.call('zrange', key, options.start, options.stop)
134134
else
135135
ids = odm.redis.call('smembers', key)
136136
end
@@ -407,60 +407,48 @@ odm.Model = {
407407
end
408408
end,
409409
--
410-
_explicit_ordering = function (self, key, options)
411-
local field = ARGV[io+1]
412-
local alpha = ARGV[io+2]
413-
local desc = ARGV[io+3]
414-
local tkeys = {}
415-
local sortargs = {}
416-
local bykey
417-
io = io + 4
410+
_explicit_ordering = function (self, key, start, stop, order)
411+
local tkeys, sortargs, bykey, ids = {}, {}
418412
-- nested sorting for foreign key fields
419-
if options.nested and options.nested > 0 then
413+
if order.nested and # order.nested > 0 then
420414
-- generate a temporary key where to store the hash table holding
421415
-- the values to sort with
422-
local ion, key, name
423-
local skey = redis_randomkey(bk)
424-
for i,id in pairs(redis_members(rkey)) do
425-
local value = redis.call('hget', bk .. ':obj:' .. id, field)
426-
local n = 0
427-
while n < nested do
428-
ion = io + 2*n
429-
n = n + 1
430-
key = ARGV[ion+1] .. ':obj:' .. value
431-
name = ARGV[ion+2]
432-
value = redis.call('hget', key, name)
416+
local skey = self:temp_key()
417+
for i, id in ipairs(redis_members(key)) do
418+
local value, key = redis.call('hget', self:object_key(id), order.field)
419+
for n, name in ipairs(order.nested) do
420+
if 2*math.floor(n/2) == n then
421+
value = redis.call('hget', key, name)
422+
else
423+
key = name .. ':obj:' .. value
424+
end
433425
end
434-
-- store value on temporary hash table
435-
--redis.call('hset', skey, id, value)
436-
tkeys[i] = skey .. id
437426
-- store value on temporary key
427+
tkeys[i] = skey .. id
438428
redis.call('set', tkeys[i], value)
439429
end
440-
--bykey = skey .. '->*'
441430
bykey = skey .. '*'
442-
--redis.call('expire', skey, 5)
443-
elseif field == '' then
444-
bykey = nil
445-
else
446-
bykey = bk .. ':obj:*->' .. field
431+
elseif order.field ~= '' then
432+
bykey = self:object_key('*->' .. order.field)
447433
end
434+
-- sort by field
448435
if bykey then
449-
sortargs = {'BY',bykey}
436+
sortargs = {'BY', bykey}
450437
end
451438
if start > 0 or stop > 0 then
452439
table.insert(sortargs, 'LIMIT')
453440
table.insert(sortargs, start)
454441
table.insert(sortargs, stop)
455442
end
456-
if alpha == 'ALPHA' then
457-
table.insert(sortargs, alpha)
443+
if order.method == 'ALPHA' then
444+
table.insert(sortargs, 'ALPHA')
458445
end
459-
if desc == 'DESC' then
460-
table.insert(sortargs, desc)
446+
if order.desc then
447+
table.insert(sortargs, 'DESC')
461448
end
462-
ids = redis.call('sort', rkey, unpack(sortargs))
449+
ids = odm.redis.call('sort', key, unpack(sortargs))
463450
redis_delete(tkeys)
451+
return ids
464452
end,
465453
--
466454
_load_related = function (self, result, related)

stdnet/lib/lua/odmrun.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,23 @@ local scripts = {
66
end,
77
-- Build a query and store results on a new set. Returns the set id
88
query = function(self, model, keys, field, ...)
9-
if # keys == 1 then
9+
if # keys > 0 then
1010
return model:query(field, keys[1], arg)
1111
else
1212
error('Script query requires 1 key for the id set')
1313
end
1414
end,
1515
-- Load a query
1616
load = function(self, model, keys, options)
17-
if # keys == 1 then
17+
if # keys > 0 then
1818
return model:load(keys[1], cjson.decode(options))
1919
else
2020
error('Script load requires 1 key for the id set')
2121
end
2222
end,
2323
-- delete a query
2424
delete = function(self, model, keys)
25-
if # keys == 1 then
25+
if # keys > 0 then
2626
return model:delete(keys[1])
2727
else
2828
error('Script delete requires 1 key for the id set')

stdnet/odm/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ class Meta:
135135
136136
.. attribute:: ordering
137137
138-
Optional name of a :class:`stdnet.odm.Field` in the :attr:`model`.
138+
Optional name of a :class:`Field` in the :attr:`model`.
139139
If provided, model indices will be sorted with respect to the value of the
140140
specified field. It can also be a :class:`autoincrement` instance.
141141
Check the :ref:`sorting <sorting>` documentation for more details.
@@ -144,7 +144,7 @@ class Meta:
144144
145145
.. attribute:: dfields
146146
147-
dictionary of :class:`stdnet.odm.Field` instances.
147+
dictionary of :class:`Field` instances.
148148
149149
.. attribute:: fields
150150

tests/regression/meta.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ def testEqual(self):
3636
self.assertTrue(inst != f)
3737

3838
def testNotEqual(self):
39-
inst = Instrument(name = 'erz12', type = 'future', ccy = 'EUR').save()
40-
inst2 = Instrument(name = 'edz14', type = 'future', ccy = 'USD').save()
39+
inst = Instrument(name='erz12', type='future', ccy='EUR').save()
40+
inst2 = Instrument(name='edz14', type='future', ccy='USD').save()
4141
id = inst.id
4242
b = Instrument.objects.get(id = id)
4343
self.assertEqual(b.id,id)

tests/regression/query/instruments.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,10 @@ def testDoubleInFilter(self):
8181

8282
def testSimpleExcludeFilter(self):
8383
session = self.session()
84-
qs = session.query(self.model).exclude(ccy = 'JPY')
84+
qs = session.query(self.model).exclude(ccy='JPY')
85+
self.assertTrue(qs)
8586
for inst in qs:
86-
self.assertNotEqual(inst.ccy,'JPY')
87+
self.assertNotEqual(inst.ccy, 'JPY')
8788

8889
def testExcludeFilterIn(self):
8990
CCYS = ('EUR','GBP','JPY')
@@ -161,7 +162,7 @@ def testChangeFilter(self):
161162

162163
def testFilterWithSpace(self):
163164
session = self.session()
164-
insts = session.query(self.model).filter(type = 'bond option')
165+
insts = session.query(self.model).filter(type='bond option')
165166
self.assertTrue(insts)
166167
for inst in insts:
167168
self.assertEqual(inst.type,'bond option')

tests/regression/sorting.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def fill(self):
3131
self.assertEqual(qs.count(),NUM_DATES)
3232
return qs
3333

34-
def checkOrder(self, qs, attr, desc = None):
34+
def checkOrder(self, qs, attr, desc=None):
3535
self.assertTrue(qs)
3636
desc = desc if desc is not None else self.desc
3737
at0 = qs[0].get_attr_value(attr)
@@ -64,9 +64,9 @@ def testSimpleSortError(self):
6464

6565
def testFilter(self):
6666
qs = self.fill().filter(name='rugby').sort_by('dt')
67-
self.checkOrder(qs,'dt')
67+
self.checkOrder(qs, 'dt')
6868
for v in qs:
69-
self.assertEqual(v.name,'rugby')
69+
self.assertEqual(v.name, 'rugby')
7070

7171
def _slicingTest(self, attr, desc, start = 0, stop = 10,
7272
expected_len = 10):
@@ -149,14 +149,12 @@ def testSimple(self):
149149
self.checkOrder(self.fill(),'dt')
150150

151151
def testFilter(self):
152-
# Require zdiffstore
153-
qs = self.fill().filter(name__in = ('football','rugby'))
152+
qs = self.fill().filter(name=('football','rugby'))
154153
self.checkOrder(qs,'dt')
155154

156155
def testExclude(self):
157-
# Require zdiffstore
158156
qs = self.fill().exclude(name='rugby')
159-
self.checkOrder(qs,'dt')
157+
self.checkOrder(qs, 'dt')
160158

161159

162160
class TestOrderingModelDesc(TestOrderingModel):

tests/regression/unique.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ def setUp(self):
1414

1515
def testAddNew(self):
1616
session = self.session()
17-
m = session.add(self.model(code = 'me', group = 'bla'))
18-
self.assertEqual(m.id,1)
17+
m = session.add(self.model(code='me', group='bla'))
18+
self.assertEqual(m.id, 1)
1919
# Try to create another one
20-
s = self.model(code = 'me', group = 'foo')
20+
s = self.model(code='me', group='foo')
2121
self.assertRaises(CommitException, s.save)
2222
query = session.query(self.model)
2323
self.assertEqual(query.count(),1)

0 commit comments

Comments
 (0)