def test_should_delete_by_query(): udb = Udb({ 'a': UdbBtreeIndex(['a']), 'ab': UdbBtreeIndex(['a', 'b']), 'b': UdbBtreeIndex(['b']), }) a = {'a': 1, 'b': 1} b = {'a': 2, 'b': 2} c = {'a': 3, 'b': 3} udb.insert(a) udb.insert(b) udb.insert(c) delete_count = udb.delete({'a': 2}) assert delete_count == 1 assert list(udb.select()) == [{ 'a': 1, 'b': 1, '__rev__': 0 }, { 'a': 3, 'b': 3, '__rev__': 2 }] assert len(udb.indexes['a']) == 2 assert len(udb.indexes['ab']) == 2 assert len(udb.indexes['b']) == 2
def test_should_insert(): udb = Udb({ 'a': UdbBtreeIndex(['a']), 'ab': UdbBtreeIndex(['a', 'b']), 'b': UdbBtreeIndex(['b']), }) a = {'a': 1, 'b': 1} b = {'a': 2, 'b': 2} c = {'a': 3, 'b': 3} udb.insert(a) udb.insert(b) udb.insert(c) assert list(udb.select()) == [ { 'a': 1, 'b': 1, '__rev__': 0 }, { 'a': 2, 'b': 2, '__rev__': 1 }, { 'a': 3, 'b': 3, '__rev__': 2 }, ] assert len(udb.indexes['a']) == 3 assert len(udb.indexes['ab']) == 3 assert len(udb.indexes['b']) == 3
def test_should_update_all(): udb = Udb({ 'a': UdbBtreeIndex(['a']), 'ab': UdbBtreeIndex(['a', 'b']), 'b': UdbBtreeIndex(['b']), }) a = {'a': 1, 'b': 1} b = {'a': 2, 'b': 2} c = {'a': 3, 'b': 3} udb.insert(a) udb.insert(b) udb.insert(c) update_count = udb.update({'a': 1}) assert update_count == 3 assert list(udb.select()) == [{ 'a': 1, 'b': 1, '__rev__': 4 }, { 'a': 1, 'b': 2, '__rev__': 4 }, { 'a': 1, 'b': 3, '__rev__': 4 }] assert len(udb.indexes['a']) == 1 assert len(udb.indexes['ab']) == 3 assert len(udb.indexes['b']) == 3
def test_should_insert_with_default_value_as_current_timestamp(): udb = Udb(schema={'b': current_timestamp()}) a = {'a': 1, 'c': 1} udb.insert(a) assert list(udb.select()) == [{'a': 1, 'b': a['b'], 'c': 1, '__rev__': 0}]
def test_should_insert_with_default_value_as_callable(): udb = Udb(schema={'b': lambda key, values: 2}) a = {'a': 1, 'c': 1} udb.insert(a) assert list(udb.select()) == [{'a': 1, 'b': 2, 'c': 1, '__rev__': 0}]
def test_should_insert_with_initial_value_instead_of_default(): udb = Udb(schema={'b': 2}) a = {'a': 1, 'b': 3, 'c': 1} udb.insert(a) assert list(udb.select()) == [{'a': 1, 'b': 3, 'c': 1, '__rev__': 0}]
def test_should_delete_rotating_delete_buffer(): udb = Udb({ 'a': UdbBtreeIndex(['a']), }) for i in range(0, 10000): udb.insert({'a': i}) delete_count = udb.delete({'a': {'$lte': 4999}}) assert delete_count == 5000 for i, r in enumerate(udb.select({})): assert r['a'] == i + 5000
def test_should_select_by_full_covered_query(): udb = Udb({ 'a': UdbBtreeIndex(['a']), 'ab': UdbBtreeIndex(['a', 'b']), 'b': UdbBtreeIndex(['b']), }) a = {'a': 1, 'b': 1, 'c': 1} b = {'a': 2, 'b': 2, 'c': 2} c = {'a': 3, 'b': 3, 'c': 3} udb.insert(a) udb.insert(b) udb.insert(c) records = list(udb.select({'a': 2, 'b': 2})) assert len(records) == 1 assert records[0] == {'a': 2, 'b': 2, 'c': 2, '__rev__': 1} records = list(udb.select({'a': 0, 'b': 0})) assert len(records) == 0
def test_should_select_by_subset_using_indexes(): udb = Udb({ 'a': UdbBtreeIndex(['a']), 'ab': UdbBtreeIndex(['a', 'b']), 'b': UdbBtreeIndex(['b']), }) a = {'a': 1, 'b': 1, 'c': 1} b = {'a': 1, 'b': 2, 'c': 2} c = {'a': 3, 'b': 3, 'c': 3} udb.insert(a) udb.insert(b) udb.insert(c) records = list(udb.select({'a': 1}, offset=1, limit=5, use_indexes=['ab'])) assert len(records) == 1 assert records[0] == {'a': 1, 'b': 2, 'c': 2, '__rev__': 1} records = list(udb.select({'a': 1}, offset=9, limit=5, use_indexes=['ab'])) assert len(records) == 0
def test_should_select_using_seq_scan_by_gt_operator(): udb = Udb() a = {'a': None, '__rev__': 0} b = {'a': False, '__rev__': 1} c = {'a': True, '__rev__': 2} d = {'a': -1, '__rev__': 3} e = {'a': 1, '__rev__': 4} f = {'a': '1', '__rev__': 5} udb.insert(a) udb.insert(b) udb.insert(c) udb.insert(d) udb.insert(e) udb.insert(f) records = list(udb.select({'a': {'$gt': None}})) assert records == [b, c, d, e, f]
def test_should_select_using_reverse_sort(): udb = Udb() a = {'a': 6, '__rev__': 0} b = {'a': 1, '__rev__': 1} c = {'a': 5, '__rev__': 2} d = {'a': 2, '__rev__': 3} e = {'a': 4, '__rev__': 4} f = {'a': 3, '__rev__': 5} udb.insert(a) udb.insert(b) udb.insert(c) udb.insert(d) udb.insert(e) udb.insert(f) records = list(udb.select(sort='-a')) assert records == [a, c, e, f, d, b]
def test_should_delete_all(): udb = Udb({ 'a': UdbBtreeIndex(['a']), 'ab': UdbBtreeIndex(['a', 'b']), 'b': UdbBtreeIndex(['b']), }) a = {'a': 1, 'b': 1} b = {'a': 2, 'b': 2} c = {'a': 3, 'b': 3} udb.insert(a) udb.insert(b) udb.insert(c) delete_count = udb.delete() assert delete_count == 3 assert list(udb.select()) == [] assert len(udb.indexes['a']) == 0 assert len(udb.indexes['ab']) == 0 assert len(udb.indexes['b']) == 0
def test_should_select_using_btree_index_by_range(): udb = Udb(indexes={'a': UdbBtreeIndex(['a', 'b', 'c'])}) udb.insert({'a': 1, 'b': 0, 'c': 0}) udb.insert({'a': 1, 'b': 1, 'c': 1}) udb.insert({'a': 1, 'b': 1, 'c': 2}) udb.insert({'a': 1, 'b': 2, 'c': 3}) assert list(udb.select({ 'a': 1, 'b': 1, 'c': { '$gt': 1 } })) == [ { '__rev__': 2, 'a': 1, 'b': 1, 'c': 2 }, ] assert list(udb.select({ 'a': 1, 'b': 1, 'c': { '$gte': 1 } })) == [ { '__rev__': 1, 'a': 1, 'b': 1, 'c': 1 }, { '__rev__': 2, 'a': 1, 'b': 1, 'c': 2 }, ] assert list(udb.select({ 'a': 1, 'b': 1, 'c': { '$lt': 2 } })) == [ { '__rev__': 1, 'a': 1, 'b': 1, 'c': 1 }, ] assert list(udb.select({ 'a': 1, 'b': 1, 'c': { '$lte': 2 } })) == [ { '__rev__': 1, 'a': 1, 'b': 1, 'c': 1 }, { '__rev__': 2, 'a': 1, 'b': 1, 'c': 2 }, ]
def test_should_select_by_range(): udb = Udb() udb.insert({'a': 1, 'b': 0, 'c': 0}) udb.insert({'a': 1, 'b': 1, 'c': 1}) udb.insert({'a': 1, 'b': 1, 'c': 2}) udb.insert({'a': 1, 'b': 2, 'c': 3}) assert list(udb.select({ 'a': 1, 'b': 1, 'c': { '$gt': 1 } })) == [ { '__rev__': 2, 'a': 1, 'b': 1, 'c': 2 }, ] assert list(udb.select({ 'a': 1, 'b': 1, 'c': { '$gte': 1 } })) == [ { '__rev__': 1, 'a': 1, 'b': 1, 'c': 1 }, { '__rev__': 2, 'a': 1, 'b': 1, 'c': 2 }, ] assert list(udb.select({ 'a': 1, 'b': 1, 'c': { '$lt': 2 } })) == [ { '__rev__': 1, 'a': 1, 'b': 1, 'c': 1 }, ] assert list(udb.select({ 'a': 1, 'b': 1, 'c': { '$lte': 2 } })) == [ { '__rev__': 1, 'a': 1, 'b': 1, 'c': 1 }, { '__rev__': 2, 'a': 1, 'b': 1, 'c': 2 }, ]