commit e8a61eb888a6e46416a40e215de582db55411550
parent 8c12346c5991f6cfacac33114506916efbf01ab1
Author: lash <dev@holbrook.no>
Date: Thu, 28 May 2026 09:52:59 -0600
Enable march search valkey
Diffstat:
3 files changed, 54 insertions(+), 2 deletions(-)
diff --git a/setup.py b/setup.py
@@ -6,7 +6,7 @@ f.close()
setup(
name='wheepy',
- version='0.0.6a1',
+ version='0.0.7a1',
description='Unified interface to key value with locking and transactions.',
author='Louis Holbrook',
author_email='dev@holbrook.no',
diff --git a/tests/test_valkey.py b/tests/test_valkey.py
@@ -11,7 +11,7 @@ class TestValkey(unittest.TestCase):
def setUp(self):
self.store = ValkeyStore(124)
- def test_get_put(self):
+ def test_valkey_get_put(self):
# remove the initial delete once we are creating temporary test dbs
try:
self.store.delete(b'foo')
@@ -34,5 +34,24 @@ class TestValkey(unittest.TestCase):
self.store.delete(b'foo')
+ def test_valkey_fs_match(self):
+ self.store.put(b'afoo', b'inky')
+ self.store.put(b'abar', b'pinky')
+ self.store.put(b'abaz', b'blinky')
+ self.store.put(b'barbarbar', b'blinky')
+ self.store.match(b'a')
+ r = list(self.store)
+ self.assertEqual(len(r), 3)
+
+ self.store.match(b'ab')
+ r = list(self.store)
+ self.assertEqual(len(r), 2)
+
+ self.store.delete(b'afoo')
+ self.store.delete(b'abar')
+ self.store.delete(b'abaz')
+ self.store.delete(b'barbarbar')
+
+
if __name__ == '__main__':
unittest.main()
diff --git a/whee/valkey/__init__.py b/whee/valkey/__init__.py
@@ -20,6 +20,9 @@ class ValkeyStore(Interface):
if user != None:
self.db.auth(user, passphrase)
self.db.ping()
+ self.it = None
+ self.crsr = 0
+ self.i = 0
def have(self, k):
@@ -53,3 +56,33 @@ class ValkeyStore(Interface):
raise FileNotFoundError
logg.debug('valkeystore delete {}'.format(k))
self.db.delete(k)
+
+
+ def match(self, k):
+ k = ensure_bytes_key(k)
+ self.crsr, self.it = self.db.scan(cursor=self.crsr, match=k + b'*')
+ self.i = 0
+
+
+ def __iter__(self):
+ if self.it != None:
+ return self
+
+
+ # TODO: example shows use both cursor and key match for iteration?
+ def __next__(self):
+ if self.crsr > 0:
+ raise StopIteration()
+ try:
+ v = self.it[self.i]
+ except IndexError:
+ self.i = -1
+ self.it = None
+ self.crsr = 0
+ raise StopIteration()
+ self.i += 1
+ return v
+
+
+ def iter(self):
+ return self.__iter__()