ormnomnom
Advanced tools
Comparing version 5.2.1 to 5.2.2
@@ -37,26 +37,35 @@ 'use strict' | ||
const filterChildren = query => { | ||
const q = Object.assign({}, { [`${column}:isNull`]: true }, query) | ||
for (const key in q) { | ||
const path = key.split(':')[0] | ||
const bits = path.split('.') | ||
let ddl = wrappedDao[privateAPISym].ddl | ||
for (let i = 0; i < bits.length - 1; ++i) { | ||
const reference = bits[i] | ||
if (!(reference in ddl) || !(softDeleteSym in ddl[reference].cls[clsToDAOSym])) { | ||
continue | ||
} | ||
const segment = bits.slice(0, i + 1) | ||
q[`${segment.join('.')}.${ddl[reference].cls[clsToDAOSym][softDeleteSym]}:isNull`] = true | ||
ddl = ddl[reference].cls[clsToDAOSym][privateAPISym].ddl | ||
} | ||
} | ||
return q | ||
} | ||
const queryBuilder = query => | ||
Array.isArray(query) | ||
? query.map(q => filterChildren(q)) | ||
: filterChildren(query) | ||
class SoftDeleteQuerySet extends queryset.constructor { | ||
get (query) { | ||
return super.get(Object.assign({}, {[`${column}:isNull`]: true}, query)) | ||
return super.get(queryBuilder(query)) | ||
} | ||
filter (query) { | ||
const q = Object.assign({}, {[`${column}:isNull`]: true}, query) | ||
for (const key in q) { | ||
const path = key.split(':')[0] | ||
const bits = path.split('.') | ||
let ddl = wrappedDao[privateAPISym].ddl | ||
for (let i = 0; i < bits.length - 1; ++i) { | ||
const reference = bits[i] | ||
if (!(reference in ddl) || !(softDeleteSym in ddl[reference].cls[clsToDAOSym])) { | ||
continue | ||
} | ||
const segment = bits.slice(0, i + 1) | ||
q[`${segment.join('.')}.${ddl[reference].cls[clsToDAOSym][softDeleteSym]}:isNull`] = true | ||
ddl = ddl[reference].cls[clsToDAOSym][privateAPISym].ddl | ||
} | ||
} | ||
return super.filter(q) | ||
return super.filter(queryBuilder(query)) | ||
} | ||
@@ -63,0 +72,0 @@ |
{ | ||
"name": "ormnomnom", | ||
"version": "5.2.1", | ||
"version": "5.2.2", | ||
"description": "a lightweight orm to silence the orm-y beast", | ||
@@ -5,0 +5,0 @@ "main": "lib/ormnomnom.js", |
@@ -313,5 +313,4 @@ 'use strict' | ||
test('softdelete: filter() extends queries to filter soft deleted objects', assert => { | ||
test('softdelete: filter() extends queries to filter soft deleted objects and arrays', assert => { | ||
Item.wrappedObjects = softDelete(Item.objects, {column: 'deleted'}) | ||
return Item.objects.create({name: 'test'}).then(item => { | ||
@@ -327,6 +326,12 @@ return Item.wrappedObjects.delete({name: 'test'}) | ||
assert.equals(items.length, 0, 'should return no rows') | ||
return Item.wrappedObjects.filter([ | ||
{name: 'test'}, | ||
{name: 'not a name of any item'} | ||
]) | ||
}).then(items => { | ||
assert.equals(items.length, 0, 'should return no rows with OR query') | ||
}) | ||
}) | ||
test('softdelete: get() extends queries to filter soft deleted objects', assert => { | ||
test('softdelete: get() extends queries to filter soft deleted objects and arrays', assert => { | ||
Item.wrappedObjects = softDelete(Item.objects, {column: 'deleted'}) | ||
@@ -338,6 +343,22 @@ | ||
assert.equals(deleted, 1, 'should have soft deleted one row') | ||
test('get on softdelete should reject', assert => { | ||
assert.plan(1) | ||
assert.rejects( | ||
Item.wrappedObjects.get({name: 'test'}), | ||
Item.objects.NotFound | ||
) | ||
}) | ||
test('get on softdelete should reject with OR query', assert => { | ||
assert.plan(1) | ||
assert.rejects( | ||
Item.wrappedObjects.get([ | ||
{name: 'test'}, | ||
{name: 'not a name of any item'} | ||
]), | ||
Item.objects.NotFound | ||
) | ||
}) | ||
return Item.objects.get({name: 'test'}) | ||
}).then(item => { | ||
assert.notEqual(item.deleted, null, 'deleted column should be set') | ||
assert.rejects(Item.wrappedObjects.get({name: 'test'}), Item.objects.NotFound) | ||
}) | ||
@@ -360,3 +381,10 @@ }) | ||
}).then(details => { | ||
assert.equals(details.length, 0, 'should find no results due to deleted item') | ||
assert.equals(details.length, 0, 'filter should find no results due to deleted item') | ||
test('get should find no results due to deleted item', assert => { | ||
assert.plan(1) | ||
assert.rejects( | ||
ItemDetail.wrappedObjects.get({'item.name': 'test'}), | ||
ItemDetail.objects.NotFound | ||
) | ||
}) | ||
return ItemDetail.wrappedObjects.filter({'item_prices.price:gt': 5}) | ||
@@ -366,2 +394,5 @@ }).then(details => { | ||
assert.equals(details[0].id, detail.id, 'should have found the correct item detail') | ||
return ItemDetail.wrappedObjects.get({'item_prices.price:gt': 5}) | ||
}).then(d => { | ||
assert.equals(d.id, detail.id, 'get() should find one result') | ||
}) | ||
@@ -368,0 +399,0 @@ }) |
191139
3776