Add schema utility
This commit is contained in:
74
api/schema.py
Normal file
74
api/schema.py
Normal file
@@ -0,0 +1,74 @@
|
||||
from typing import Any
|
||||
|
||||
|
||||
float_type = type(0.0).__name__
|
||||
str_type = type('').__name__
|
||||
server_point_type = type((0.0,0.0)).__name__
|
||||
client_point_type = type({'x': 0.0, 'y': 0.0}).__name__
|
||||
str_list_type = type(['']).__name__
|
||||
|
||||
|
||||
def define_property(type: str, optional: bool = False, readonly: bool = False) -> dict[str, Any]:
|
||||
return { 'type': type, 'optional': optional, 'readonly': readonly }
|
||||
|
||||
|
||||
class Serialize(object):
|
||||
def __init__(self, row, schema) -> None:
|
||||
self.row = row
|
||||
self.schema = schema
|
||||
|
||||
def to_execution(self, name) -> str:
|
||||
value = self.row[name]
|
||||
type = self.schema[name]['type']
|
||||
|
||||
if value == None:
|
||||
return 'null'
|
||||
|
||||
if type == float_type:
|
||||
return value
|
||||
|
||||
if type == str_type:
|
||||
return f"'{value}'"
|
||||
|
||||
raise Exception(f"Fail to serialize {name} for execution!")
|
||||
|
||||
def to_storage(self, name) -> str:
|
||||
value = self.row[name]
|
||||
type = self.schema[name]['type']
|
||||
|
||||
if value == None:
|
||||
return 'null'
|
||||
|
||||
if type == float_type:
|
||||
return value
|
||||
|
||||
if type == str_type:
|
||||
return f"''{value}''"
|
||||
|
||||
raise Exception(f"Fail to serialize {name} for storage!")
|
||||
|
||||
def to_execution(self):
|
||||
row = self.row.copy()
|
||||
|
||||
for key, value in row.items():
|
||||
if value == None:
|
||||
row[key] = 'null'
|
||||
elif self.schema[key]['type'] == str_type:
|
||||
row[key] = f"'{row[key]}'"
|
||||
elif self.schema[key]['type'] == client_point_type:
|
||||
row[key] = f"'({value['x']},{value['y']})'"
|
||||
|
||||
return row
|
||||
|
||||
def to_storage(self):
|
||||
row = self.row.copy()
|
||||
|
||||
for key, value in row.items():
|
||||
if value == None:
|
||||
row[key] = 'null'
|
||||
elif self.schema[key] == str_type:
|
||||
row[key] = f"''{row[key]}''"
|
||||
elif self.schema[key]['type'] == client_point_type:
|
||||
row[key] = f"''({value['x']},{value['y']})''"
|
||||
|
||||
return row
|
||||
Reference in New Issue
Block a user