Fixed #68: Implement SheerkaQL
Fixed #70: SheerkaFilterManager : Pipe functions Fixed #71: SheerkaFilterManager : filter_objects Fixed #75: SheerkaMemory: Enhance memory() to use the filtering capabilities Fixed #76: SheerkaEvaluateConcept: Concepts that modify the state of the system must not be evaluated during question
This commit is contained in:
@@ -10,6 +10,7 @@ from core.sheerka.services.sheerka_service import BaseService, ServiceObj
|
||||
|
||||
@dataclass
|
||||
class MemoryObject(ServiceObj):
|
||||
timestamp: float
|
||||
obj: object
|
||||
|
||||
def __eq__(self, other):
|
||||
@@ -21,6 +22,9 @@ class MemoryObject(ServiceObj):
|
||||
def __hash__(self):
|
||||
return hash((self.event_id, self.obj))
|
||||
|
||||
def __repr__(self):
|
||||
return f"MemoryObject({self.obj}, timestamp={self.timestamp})"
|
||||
|
||||
|
||||
class SheerkaMemory(BaseService):
|
||||
NAME = "Memory"
|
||||
@@ -38,7 +42,7 @@ class SheerkaMemory(BaseService):
|
||||
self.sheerka.bind_service_method(self.get_all_short_term_memory, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.add_to_short_term_memory, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.remove_context, True, as_name="clear_short_term_memory", visible=False)
|
||||
self.sheerka.bind_service_method(self.add_to_memory, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.add_to_memory, True)
|
||||
self.sheerka.bind_service_method(self.add_many_to_short_term_memory, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.get_from_memory, False)
|
||||
self.sheerka.bind_service_method(self.get_last_from_memory, False)
|
||||
@@ -125,20 +129,31 @@ class SheerkaMemory(BaseService):
|
||||
"""
|
||||
last = self.sheerka.om.get(SheerkaMemory.OBJECTS_ENTRY, key)
|
||||
if last is NotFound:
|
||||
self.sheerka.om.put(SheerkaMemory.OBJECTS_ENTRY, key, MemoryObject(context.event.get_digest(), concept))
|
||||
self.sheerka.om.put(SheerkaMemory.OBJECTS_ENTRY, key, MemoryObject(context.event.get_digest(),
|
||||
context.event.date.timestamp(),
|
||||
concept))
|
||||
return
|
||||
|
||||
if not isinstance(last, list) and last.obj == concept:
|
||||
# replace with the new one
|
||||
self.sheerka.om.delete(SheerkaMemory.OBJECTS_ENTRY, key, last)
|
||||
self.sheerka.om.put(SheerkaMemory.OBJECTS_ENTRY, key, MemoryObject(context.event.get_digest(), concept))
|
||||
self.sheerka.om.put(SheerkaMemory.OBJECTS_ENTRY, key, MemoryObject(context.event.get_digest(),
|
||||
context.event.date.timestamp(),
|
||||
concept))
|
||||
return
|
||||
|
||||
if isinstance(last, list) and last[-1].obj == concept:
|
||||
# replace with the new one
|
||||
self.sheerka.om.delete(SheerkaMemory.OBJECTS_ENTRY, key, last[-1])
|
||||
self.sheerka.om.put(SheerkaMemory.OBJECTS_ENTRY, key, MemoryObject(context.event.get_digest(), concept))
|
||||
self.sheerka.om.put(SheerkaMemory.OBJECTS_ENTRY, key, MemoryObject(context.event.get_digest(),
|
||||
context.event.date.timestamp(),
|
||||
concept))
|
||||
return
|
||||
|
||||
self.sheerka.om.put(SheerkaMemory.OBJECTS_ENTRY, key, MemoryObject(context.event.get_digest(), concept))
|
||||
# append the new one
|
||||
self.sheerka.om.put(SheerkaMemory.OBJECTS_ENTRY, key, MemoryObject(context.event.get_digest(),
|
||||
context.event.date.timestamp(),
|
||||
concept))
|
||||
|
||||
def get_from_memory(self, context, key):
|
||||
""""
|
||||
@@ -207,14 +222,35 @@ class SheerkaMemory(BaseService):
|
||||
"""
|
||||
name_to_use = name.name if isinstance(name, Concept) else name
|
||||
self.unregister_object(context, name_to_use)
|
||||
obj = self.get_from_memory(context, name_to_use)
|
||||
if obj is NotFound:
|
||||
return self.sheerka.new(BuiltinConcepts.NOT_FOUND, body={"#name": name})
|
||||
obj = self.get_last_from_memory(context, name_to_use)
|
||||
if obj is not NotFound:
|
||||
return obj.obj
|
||||
|
||||
if isinstance(obj, list):
|
||||
obj = obj[-1]
|
||||
all_objects = self.sheerka.om.list(SheerkaMemory.OBJECTS_ENTRY)
|
||||
all_objects_copy = []
|
||||
for obj in all_objects:
|
||||
if isinstance(obj, list):
|
||||
all_objects_copy.append(obj.copy())
|
||||
else:
|
||||
all_objects_copy.append([obj])
|
||||
|
||||
return obj.obj
|
||||
while len(all_objects_copy) > 0:
|
||||
current_list = []
|
||||
temp = []
|
||||
for obj in all_objects_copy:
|
||||
current_list.append(obj.pop(-1))
|
||||
if len(obj) > 0:
|
||||
temp.append(obj)
|
||||
|
||||
all_objects_copy = temp
|
||||
current_list = sorted(current_list, key=lambda o: o.timestamp, reverse=True)
|
||||
current_objects = [o.obj for o in current_list]
|
||||
|
||||
res = self.sheerka.filter_objects(context, current_objects, name)
|
||||
if len(res) > 0:
|
||||
return res[0] # only the first, as it should have a better timestamp
|
||||
|
||||
return self.sheerka.new(BuiltinConcepts.NOT_FOUND, body={"#name": name})
|
||||
|
||||
def mem(self):
|
||||
keys = sorted([k for k in self.sheerka.om.list(SheerkaMemory.OBJECTS_ENTRY)])
|
||||
|
||||
Reference in New Issue
Block a user