import json
from uuid import uuid4
from enum import Enum, unique
from typing import Optional, List
from dataclasses import dataclass, field, asdict
from flask_sqlalchemy import SQLAlchemy
from delphi.apps.rest_api import db
from sqlalchemy import PickleType
from sqlalchemy.inspection import inspect
from sqlalchemy.ext import mutable
from sqlalchemy.sql import operators
from sqlalchemy.types import TypeDecorator
[docs]class JsonEncodedList(db.TypeDecorator):
"""Enables list storage by encoding and decoding on the fly."""
impl = db.Text
[docs] def process_bind_param(self, value, dialect):
if value is None:
return "[]"
else:
return str(value)
[docs] def process_result_value(self, value, dialect):
if value is None:
return []
else:
return json.loads(value.replace("'", '"'))
mutable.MutableList.associate_with(JsonEncodedList)
[docs]class JsonEncodedDict(db.TypeDecorator):
"""Enables JsonEncodedDict storage by encoding and decoding on the fly."""
impl = db.Text
[docs] def process_bind_param(self, value, dialect):
if value is None:
return "{}"
else:
return json.dumps(value)
[docs] def process_result_value(self, value, dialect):
if value is None:
return {}
else:
return json.loads(value)
mutable.MutableDict.associate_with(JsonEncodedDict)
[docs]class Serializable(object):
[docs] def deserialize(self):
return {c: getattr(self, c) for c in inspect(self).attrs.keys()}
[docs] @staticmethod
def deserialize_list(l):
return [m.serialize() for m in l]
[docs]class DelphiModel(db.Model, Serializable):
""" Delphi AnalysisGraph Model """
__tablename__ = "delphimodel"
id = db.Column(db.String, primary_key=True)
model = db.Column(db.String)
[docs]class ExperimentResult(db.Model, Serializable):
""" Notional model of experiment results """
__tablename__ = "experimentresult"
baseType = db.Column(db.String)
id = db.Column(db.String, primary_key=True, default=str(uuid4()))
__mapper_args__ = {
"polymorphic_identity": "ExperimentResult",
"polymorphic_on": baseType,
}
[docs]class CauseMosAsyncExperimentResult(ExperimentResult):
""" Placeholder docstring for class CauseMosAsyncExperimentResult. """
__tablename__ = "causemosasyncexperimentresult"
id = db.Column(
db.String,
db.ForeignKey("experimentresult.id"),
primary_key=True,
default=str(uuid4()),
)
status = db.Column(db.String, nullable=True)
experimentType = db.Column(db.String, nullable=True)
results = db.Column(JsonEncodedDict, nullable=True)
__mapper_args__ = {"polymorphic_identity": "CauseMosAsyncExperimentResult"}