add sqlite loader

simu_flags
clemens 2017-07-26 18:05:25 +02:00
parent b5f522ad8b
commit 3c5e6c3ce3
5 changed files with 60 additions and 16 deletions

View File

@ -1,3 +1,5 @@
from collections import defaultdict
from log_analyzer import LogSettings from log_analyzer import LogSettings
@ -5,7 +7,7 @@ class Analyzer:
def __init__(self, settings: LogSettings): def __init__(self, settings: LogSettings):
self.settings = settings self.settings = settings
def process(self, entry: object) -> bool: def process(self, entry: dict) -> bool:
raise NotImplementedError() raise NotImplementedError()
def result(self) -> object: def result(self) -> object:
@ -13,12 +15,30 @@ class Analyzer:
class LocationAnalyzer(Analyzer): class LocationAnalyzer(Analyzer):
entries = []
def __init__(self, settings: LogSettings): def __init__(self, settings: LogSettings):
super().__init__(settings) super().__init__(settings)
def result(self) -> object: def result(self) -> object:
return self.settings.spatials return self.entries
def process(self, entry: dict) -> bool:
if entry[self.settings.entry_type] in self.settings.spatials:
self.entries.append(entry)
return False
class LogEntryCountAnalyzer(Analyzer):
def result(self) -> object:
return self.store
def process(self, entry: dict) -> bool:
self.store[entry[self.settings.entry_type]] += 1
return False
def __init__(self, settings: LogSettings):
super().__init__(settings)
self.store = defaultdict(lambda: 0)
def process(self, entry: object) -> bool:
pass

View File

@ -9,8 +9,8 @@ class BoardDurationAnalyzer(Analyzer):
def result(self) -> object: def result(self) -> object:
return self.store return self.store
def process(self, entry: object) -> bool: def process(self, entry: dict) -> bool:
self.store[entry] += 1 self.store[entry[self.settings.entry_type]] += 1
return False return False
def __init__(self, settings: LogSettings): def __init__(self, settings: LogSettings):

14
biogames2.json Normal file
View File

@ -0,0 +1,14 @@
{
"logFormat": "sqlite",
"entryType": "@class",
"spatials":["de.findevielfalt.games.game2.instance.log.entry.LogEntryLocation"],
"actions":["...QuestionAnswerEvent", "...SimuAnswerEvent"],
"analyzers": {
"analyzer": [
"LocationAnalyzer"
],
"analyzer.biogames": [
"BoardDurationAnalyzer"
]
}
}

23
load.py
View File

@ -1,4 +1,7 @@
import json import json
import sqlite3
from json import loads as json_loads
class Loader: class Loader:
@ -15,19 +18,25 @@ class JSONLoader(Loader):
def load(self, file: str): def load(self, file: str):
self.data = json.load(open(file)) self.data = json.load(open(file))
def get_entry(self): def get_entry(self) -> dict:
for entry in self.data: for entry in self.data:
yield entry yield entry
class SQLiteLoader(Loader):
def load(self, file: str):
pass
def get_entry(self) -> object: class SQLiteLoader(Loader):
pass conn = None
def load(self, file: str):
self.conn = sqlite3.connect(file)
def get_entry(self) -> dict:
cursor = self.conn.cursor()
cursor.execute("SELECT * FROM log_entry")
for seq, timestamp, json in cursor.fetchall():
yield json_loads(json)
LOADERS = { LOADERS = {
"json": JSONLoader, "json": JSONLoader,
"sqlite": SQLiteLoader "sqlite": SQLiteLoader
} }

View File

@ -35,9 +35,9 @@ def load_settings(file:str) -> LogSettings:
if __name__ == '__main__': if __name__ == '__main__':
settings = load_settings("biogames.json") settings = load_settings("biogames2.json")
print(settings) print(settings)
logfile = "sample.json" logfile = "data/inst_56d9b64144ab44e7b90bf766f3be32e3/instance_log.sqlite"
loader = LOADERS[settings.log_format]() loader = LOADERS[settings.log_format]()
try: try:
loader.load(logfile) loader.load(logfile)
@ -48,7 +48,8 @@ if __name__ == '__main__':
analyzers.append(analyzer(settings)) analyzers.append(analyzer(settings))
for entry in loader.get_entry(): for entry in loader.get_entry():
for analyzer in analyzers: for analyzer in analyzers:
analyzer.process(entry) if analyzer.process(entry):
break
for analyzer in analyzers: for analyzer in analyzers:
print("* Result for " + str(type(analyzer))) print("* Result for " + str(type(analyzer)))
print(analyzer.result()) print(analyzer.result())